mirror of
https://github.com/simplex-chat/simplexmq.git
synced 2026-04-03 11:26:47 +00:00
* Revert "Revert "agent: do not create user record in new databases (#957)" (#963)"
This reverts commit aee9088417.
* tests
* remove logging
99 lines
3.8 KiB
Haskell
99 lines
3.8 KiB
Haskell
{-# LANGUAGE NamedFieldPuns #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
module AgentTests.SchemaDump where
|
|
|
|
import Control.DeepSeq
|
|
import Control.Monad (unless, void)
|
|
import Data.List (dropWhileEnd)
|
|
import Data.Maybe (fromJust, isJust)
|
|
import Database.SQLite.Simple (Only (..))
|
|
import qualified Database.SQLite.Simple as SQL
|
|
import Simplex.Messaging.Agent.Store.SQLite
|
|
import Simplex.Messaging.Agent.Store.SQLite.Common (withTransaction')
|
|
import Simplex.Messaging.Agent.Store.SQLite.Migrations (Migration (..), MigrationsToRun (..), toDownMigration)
|
|
import qualified Simplex.Messaging.Agent.Store.SQLite.Migrations as Migrations
|
|
import Simplex.Messaging.Util (ifM)
|
|
import System.Directory (doesFileExist, removeFile)
|
|
import System.Process (readCreateProcess, shell)
|
|
import Test.Hspec
|
|
|
|
testDB :: FilePath
|
|
testDB = "tests/tmp/test_agent_schema.db"
|
|
|
|
appSchema :: FilePath
|
|
appSchema = "src/Simplex/Messaging/Agent/Store/SQLite/Migrations/agent_schema.sql"
|
|
|
|
testSchema :: FilePath
|
|
testSchema = "tests/tmp/test_agent_schema.sql"
|
|
|
|
schemaDumpTest :: Spec
|
|
schemaDumpTest = do
|
|
it "verify and overwrite schema dump" testVerifySchemaDump
|
|
it "verify schema down migrations" testSchemaMigrations
|
|
it "should NOT create user record for new database" testUsersMigrationNew
|
|
it "should create user record for old database" testUsersMigrationOld
|
|
|
|
testVerifySchemaDump :: IO ()
|
|
testVerifySchemaDump = do
|
|
savedSchema <- ifM (doesFileExist appSchema) (readFile appSchema) (pure "")
|
|
savedSchema `deepseq` pure ()
|
|
void $ createSQLiteStore testDB "" False Migrations.app MCConsole
|
|
getSchema testDB appSchema `shouldReturn` savedSchema
|
|
removeFile testDB
|
|
|
|
testSchemaMigrations :: IO ()
|
|
testSchemaMigrations = do
|
|
let noDownMigrations = dropWhileEnd (\Migration {down} -> isJust down) Migrations.app
|
|
Right st <- createSQLiteStore testDB "" False noDownMigrations MCError
|
|
mapM_ (testDownMigration st) $ drop (length noDownMigrations) Migrations.app
|
|
closeSQLiteStore st
|
|
removeFile testDB
|
|
removeFile testSchema
|
|
where
|
|
testDownMigration st m = do
|
|
putStrLn $ "down migration " <> name m
|
|
let downMigr = fromJust $ toDownMigration m
|
|
schema <- getSchema testDB testSchema
|
|
Migrations.run st $ MTRUp [m]
|
|
schema' <- getSchema testDB testSchema
|
|
schema' `shouldNotBe` schema
|
|
Migrations.run st $ MTRDown [downMigr]
|
|
unless (name m `elem` skipComparisonForDownMigrations) $ do
|
|
schema'' <- getSchema testDB testSchema
|
|
schema'' `shouldBe` schema
|
|
Migrations.run st $ MTRUp [m]
|
|
schema''' <- getSchema testDB testSchema
|
|
schema''' `shouldBe` schema'
|
|
|
|
testUsersMigrationNew :: IO ()
|
|
testUsersMigrationNew = do
|
|
Right st <- createSQLiteStore testDB "" False Migrations.app MCError
|
|
withTransaction' st (`SQL.query_` "SELECT user_id FROM users;")
|
|
`shouldReturn` ([] :: [Only Int])
|
|
closeSQLiteStore st
|
|
|
|
testUsersMigrationOld :: IO ()
|
|
testUsersMigrationOld = do
|
|
let beforeUsers = takeWhile (("m20230110_users" /=) . name) Migrations.app
|
|
Right st <- createSQLiteStore testDB "" False beforeUsers MCError
|
|
withTransaction' st (`SQL.query_` "SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'users';")
|
|
`shouldReturn` ([] :: [Only String])
|
|
closeSQLiteStore st
|
|
Right st' <- createSQLiteStore testDB "" False Migrations.app MCYesUp
|
|
withTransaction' st' (`SQL.query_` "SELECT user_id FROM users;")
|
|
`shouldReturn` ([Only (1 :: Int)])
|
|
closeSQLiteStore st'
|
|
|
|
skipComparisonForDownMigrations :: [String]
|
|
skipComparisonForDownMigrations =
|
|
[ -- on down migration idx_messages_internal_snd_id_ts index moves down to the end of the file
|
|
"m20230814_indexes"
|
|
]
|
|
|
|
getSchema :: FilePath -> FilePath -> IO String
|
|
getSchema dpPath schemaPath = do
|
|
void $ readCreateProcess (shell $ "sqlite3 " <> dpPath <> " '.schema --indent' > " <> schemaPath) ""
|
|
sch <- readFile schemaPath
|
|
sch `deepseq` pure sch
|