mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-04-02 07:15:56 +00:00
* core: auto increment chat item ids (#5088)
* core: auto increment chat item ids
* file name
* down name
* update schema
* ignore down migration on schema dump test
* fix testDirectMessageDelete test
* fix testNotes test
* core: initial api support for items around a given item (#5092)
* core: initial api support for items around a given item
* implementation and tests for local messages
* pass entities down
* unused
* getAllChatItems implementation and tests
* pagination for getting chat and tests
* remove unused import
* group implementation and tests
* refactor
* order by created at for local and direct chats
* core: initial landing api for chat and gaps (#5104)
* initial work on initial param for loading chat
* support for initial
* controller parse
* fixed sqls
* refactor names
* fix ChatLandingSection serialized type
* total accuracy on landing section
* descriptive view message
* foldr
* refactor to make landingSection reusable
* refactor: use foldr everywhere
* propagate search
* Revert "propagate search"
This reverts commit 01611fd719.
* throw when search is sent for initial
* gap size wip (needs testing)
* final
* remove order by
* remove index
---------
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
* core: fix initial api latest chat items ordering (#5151)
* core: fix one item missing from latest in initial and wrong check (#5153)
* core: fix one item missing from latest in initial and wrong check
* final fixes and tests
* clearer tests
* core: remove gaps and make sure page size is always the same (#5163)
* remove gaps
* consistent pagination size
* proper fix and around fix too
* optimize
* refactor
* core: simplify pagination
* core: first unread queries (#5174)
* core: pagination nav info (#5175)
* core: pagination nav info
* wip
* rework
* rework
* group, local
* fix
* rename
* fix tests
* just
---------
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
121 lines
4.9 KiB
Haskell
121 lines
4.9 KiB
Haskell
{-# LANGUAGE NamedFieldPuns #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
module SchemaDump where
|
|
|
|
import ChatClient (withTmpFiles)
|
|
import Control.DeepSeq
|
|
import Control.Monad (unless, void)
|
|
import Data.List (dropWhileEnd)
|
|
import Data.Maybe (fromJust, isJust)
|
|
import Simplex.Chat.Store (createChatStore)
|
|
import qualified Simplex.Chat.Store as Store
|
|
import Simplex.Messaging.Agent.Store.SQLite (MigrationConfirmation (..), closeSQLiteStore, createSQLiteStore)
|
|
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, whenM)
|
|
import System.Directory (doesFileExist, removeFile)
|
|
import System.Process (readCreateProcess, shell)
|
|
import Test.Hspec
|
|
|
|
testDB :: FilePath
|
|
testDB = "tests/tmp/test_chat.db"
|
|
|
|
appSchema :: FilePath
|
|
appSchema = "src/Simplex/Chat/Migrations/chat_schema.sql"
|
|
|
|
-- Some indexes found by `.lint fkey-indexes` are not added to schema, explanation:
|
|
--
|
|
-- - CREATE INDEX 'chat_items_group_id' ON 'chat_items'('group_id'); --> groups(group_id)
|
|
--
|
|
-- Covering index is used instead. See for example:
|
|
-- EXPLAIN QUERY PLAN DELETE FROM groups;
|
|
-- (uses idx_chat_items_groups_item_status)
|
|
--
|
|
-- - CREATE INDEX 'connections_group_member_id' ON 'connections'('group_member_id'); --> group_members(group_member_id)
|
|
--
|
|
-- Covering index is used instead. See for example:
|
|
-- EXPLAIN QUERY PLAN DELETE FROM group_members;
|
|
-- (uses idx_connections_group_member)
|
|
appLint :: FilePath
|
|
appLint = "src/Simplex/Chat/Migrations/chat_lint.sql"
|
|
|
|
testSchema :: FilePath
|
|
testSchema = "tests/tmp/test_agent_schema.sql"
|
|
|
|
schemaDumpTest :: Spec
|
|
schemaDumpTest = do
|
|
it "verify and overwrite schema dump" testVerifySchemaDump
|
|
it "verify .lint fkey-indexes" testVerifyLintFKeyIndexes
|
|
it "verify schema down migrations" testSchemaMigrations
|
|
|
|
testVerifySchemaDump :: IO ()
|
|
testVerifySchemaDump = withTmpFiles $ do
|
|
savedSchema <- ifM (doesFileExist appSchema) (readFile appSchema) (pure "")
|
|
savedSchema `deepseq` pure ()
|
|
void $ createChatStore testDB "" False MCError
|
|
getSchema testDB appSchema `shouldReturn` savedSchema
|
|
removeFile testDB
|
|
|
|
testVerifyLintFKeyIndexes :: IO ()
|
|
testVerifyLintFKeyIndexes = withTmpFiles $ do
|
|
savedLint <- ifM (doesFileExist appLint) (readFile appLint) (pure "")
|
|
savedLint `deepseq` pure ()
|
|
void $ createChatStore testDB "" False MCError
|
|
getLintFKeyIndexes testDB "tests/tmp/chat_lint.sql" `shouldReturn` savedLint
|
|
removeFile testDB
|
|
|
|
testSchemaMigrations :: IO ()
|
|
testSchemaMigrations = withTmpFiles $ do
|
|
let noDownMigrations = dropWhileEnd (\Migration {down} -> isJust down) Store.migrations
|
|
Right st <- createSQLiteStore testDB "" False noDownMigrations MCError
|
|
mapM_ (testDownMigration st) $ drop (length noDownMigrations) Store.migrations
|
|
closeSQLiteStore st
|
|
removeFile testDB
|
|
whenM (doesFileExist testSchema) $ 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'
|
|
|
|
skipComparisonForDownMigrations :: [String]
|
|
skipComparisonForDownMigrations =
|
|
[ -- on down migration msg_delivery_events table moves down to the end of the file
|
|
"20230504_recreate_msg_delivery_events_cleanup_messages",
|
|
-- on down migration idx_chat_items_timed_delete_at index moves down to the end of the file
|
|
"20230529_indexes",
|
|
-- table and index definitions move down the file, so fields are re-created as not unique
|
|
"20230914_member_probes",
|
|
-- on down migration idx_connections_via_contact_uri_hash index moves down to the end of the file
|
|
"20231019_indexes",
|
|
-- table and indexes move down to the end of the file
|
|
"20231215_recreate_msg_deliveries",
|
|
-- on down migration idx_msg_deliveries_agent_ack_cmd_id index moves down to the end of the file
|
|
"20240313_drop_agent_ack_cmd_id",
|
|
-- on down migration chat_item_autoincrement_id makes sequence table creation move down on the file
|
|
"20241023_chat_item_autoincrement_id"
|
|
]
|
|
|
|
getSchema :: FilePath -> FilePath -> IO String
|
|
getSchema dbPath schemaPath = do
|
|
void $ readCreateProcess (shell $ "sqlite3 " <> dbPath <> " '.schema --indent' > " <> schemaPath) ""
|
|
sch <- readFile schemaPath
|
|
sch `deepseq` pure sch
|
|
|
|
getLintFKeyIndexes :: FilePath -> FilePath -> IO String
|
|
getLintFKeyIndexes dbPath lintPath = do
|
|
void $ readCreateProcess (shell $ "sqlite3 " <> dbPath <> " '.lint fkey-indexes' > " <> lintPath) ""
|
|
lint <- readFile lintPath
|
|
lint `deepseq` pure lint
|