{-# LANGUAGE OverloadedStrings #-} import Test.Hspec import UserManager import Database.SQLite.Simple import Control.Exception (bracket_) import System.Directory (removeFile, doesFileExist) import Data.String (fromString) main :: IO () main = hspec $ do describe "UserManager" $ do beforeAll_ setupDB $ afterAll_ cleanupDB $ do it "initializes the database" $ do conn <- open "users.db" tables <- query_ conn "SELECT name FROM sqlite_master WHERE type='table' AND name='users';" :: IO [Only String] close conn tables `shouldBe` [Only "users"] it "adds a user" $ do addUser "test_user" "test@example.com" "password" users <- findUsers "test_user" users `shouldBe` [User "test_user" "test@example.com" "password"] it "lists users" $ do addUser "test_user1" "test1@example.com" "password1" users <- listUsers users `shouldBe` [User "test_user" "test@example.com" "password", User "test_user1" "test1@example.com" "password1" ] it "finds users by name" $ do addUser "unique_user" "unique@example.com" "password" users <- findUsers "unique_user" users `shouldBe` [User "unique_user" "unique@example.com" "password"] it "finds users by email" $ do addUser "another_user" "another@example.com" "password" users <- findUsers "another@example.com" users `shouldBe` [User "another_user" "another@example.com" "password"] it "deletes a user" $ do addUser "delete_user" "delete@example.com" "password" deleteUser "delete_user" users <- listUsers users `shouldSatisfy` all (\user -> userName user /= "delete_user") setupDB :: IO () setupDB = do conn <- open "users.db" execute_ conn "CREATE TABLE IF NOT EXISTS users (name TEXT PRIMARY KEY, email TEXT, password TEXT)" close conn cleanupDB :: IO () cleanupDB = removeFile "users.db"