mirror of
https://github.com/mudita/MuditaOS.git
synced 2025-12-26 15:38:24 -05:00
Fixed issues with restoring from legacy backups and cases when the database set fetched from backup package is different than the system one.
149 lines
6.2 KiB
Lua
149 lines
6.2 KiB
Lua
-- Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
|
|
-- For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
|
|
package.path = package.path .. ";../?.lua;../../share/?.lua;../../share/?/?.lua"
|
|
local lu = require("luaunit")
|
|
local sqlite = require("lsqlite3complete")
|
|
local lfs = require("lfs")
|
|
local migration = require("migration")
|
|
|
|
local test_db_schema = [[
|
|
CREATE TABLE IF NOT EXISTS test_1
|
|
(
|
|
_id INTEGER PRIMARY KEY,
|
|
timestamp TEXT,
|
|
duration INTEGER
|
|
);"
|
|
]]
|
|
|
|
function spawn_db(name, version, schema)
|
|
os.remove(name)
|
|
local db = sqlite.open(name)
|
|
db:exec(schema)
|
|
db:exec(string.format("PRAGMA user_version=%u;", version))
|
|
db:close()
|
|
end
|
|
|
|
function spawn_script(name, dir, db_name, version, body)
|
|
lfs.mkdir(dir .. "/" .. db_name)
|
|
lfs.mkdir(dir .. "/" .. db_name .. "/" .. version)
|
|
local fd = io.open(dir .. "/" .. db_name .. "/" .. version .. "/" .. name, "w")
|
|
fd:write(body)
|
|
fd:close()
|
|
end
|
|
|
|
function test_migration_up_success()
|
|
scripts = {}
|
|
scripts[1] = "ALTER TABLE test_1 ADD new_column TEXT;"
|
|
scripts[2] = "ALTER TABLE test_1 ADD new_column2 TEXT;"
|
|
scripts[3] = "ALTER TABLE test_1 ADD new_column3 TEXT;"
|
|
scripts[4] = "ALTER TABLE test_1 ADD new_column4 TEXT;"
|
|
scripts[5] = "ALTER TABLE test_1 ADD new_column5 TEXT;"
|
|
|
|
--- Migrate from version 0 to 1
|
|
spawn_db("databases/test_1.sql", 0, test_db_schema)
|
|
lu.assertEquals(migration.up("databases/test_1.sql", scripts, 1), migration.retcode.OK)
|
|
lu.assertEquals(migration.get_db_version("databases/test_1.sql"), 1)
|
|
|
|
-- Migrate from version 1 to 2
|
|
lu.assertEquals(migration.up("databases/test_1.sql", scripts, 2), migration.retcode.OK)
|
|
lu.assertEquals(migration.get_db_version("databases/test_1.sql"), 2)
|
|
|
|
--- Migrate from version 0 to 5
|
|
spawn_db("databases/test_1.sql", 0, test_db_schema)
|
|
lu.assertEquals(migration.up("databases/test_1.sql", scripts, 5), migration.retcode.OK)
|
|
lu.assertEquals(migration.get_db_version("databases/test_1.sql"), 5)
|
|
end
|
|
|
|
function test_migration_up_db_errors()
|
|
scripts = {}
|
|
|
|
--- Trigger DB error by trying to operate on empty database
|
|
spawn_db("databases/test_1.sql", 1, "")
|
|
scripts[1] = "ALTER TABLE test_1 ADD new_column TEXT;"
|
|
lu.assertError(migration.up, "databases/test_1.sql", scripts, 2)
|
|
|
|
--- Target version set to the same value as the current DB version
|
|
spawn_db("databases/test_1.sql", 1, test_db_schema)
|
|
lu.assertEquals(migration.up("databases/test_1.sql", scripts, 1), migration.retcode.ALREADY_UP_TO_DATE)
|
|
|
|
--- Target version set to the lower number than the current DB version
|
|
spawn_db("databases/test_1.sql", 2, test_db_schema)
|
|
lu.assertEquals(migration.up("databases/test_1.sql", scripts, 1), migration.retcode.WRONG_TARGET_VERSION)
|
|
end
|
|
|
|
function test_migration_down_success()
|
|
scripts = {}
|
|
scripts[1] = "ALTER TABLE test_1 ADD new_column1 TEXT;"
|
|
scripts[2] = "ALTER TABLE test_1 ADD new_column2 TEXT;"
|
|
scripts[3] = "ALTER TABLE test_1 ADD new_column3 TEXT;"
|
|
scripts[4] = "ALTER TABLE test_1 ADD new_column4 TEXT;"
|
|
scripts[5] = "ALTER TABLE test_1 ADD new_column5 TEXT;"
|
|
|
|
--- Migrate from version 2 to 1
|
|
spawn_db("databases/test_1.sql", 2, test_db_schema)
|
|
lu.assertEquals(migration.down("databases/test_1.sql", scripts, 1), migration.retcode.OK)
|
|
lu.assertEquals(migration.get_db_version("databases/test_1.sql"), 1)
|
|
|
|
-- Migrate from version 1 to 0
|
|
lu.assertEquals(migration.down("databases/test_1.sql", scripts, 0), migration.retcode.OK)
|
|
lu.assertEquals(migration.get_db_version("databases/test_1.sql"), 0)
|
|
|
|
--- Migrate from version 5 to 0
|
|
spawn_db("databases/test_1.sql", 5, test_db_schema)
|
|
lu.assertEquals(migration.down("databases/test_1.sql", scripts, 0), migration.retcode.OK)
|
|
lu.assertEquals(migration.get_db_version("databases/test_1.sql"), 0)
|
|
end
|
|
|
|
function test_migration_down_errors()
|
|
scripts = {}
|
|
|
|
--- Trigger DB error by trying to operate on empty database
|
|
spawn_db("databases/test_1.sql", 2, "")
|
|
scripts[1] = "ALTER TABLE test_1 ADD new_column TEXT;"
|
|
lu.assertError(migration.down, "databases/test_1.sql", scripts, 1)
|
|
|
|
--- Target version set to the same value as the current DB version
|
|
spawn_db("databases/test_1.sql", 1, test_db_schema)
|
|
lu.assertEquals(migration.down("databases/test_1.sql", scripts, 1), migration.retcode.ALREADY_UP_TO_DATE)
|
|
|
|
--- Target version set to the higher number than the current DB version
|
|
spawn_db("databases/test_1.sql", 2, test_db_schema)
|
|
lu.assertEquals(migration.down("databases/test_1.sql", scripts, 3), migration.retcode.WRONG_TARGET_VERSION)
|
|
end
|
|
|
|
function test_automatic_migration()
|
|
spawn_db("databases/test_1.db", 0, test_db_schema)
|
|
spawn_db("databases/test_2.db", 0, test_db_schema)
|
|
spawn_script("up.sql", "migrations", "test_1", 1, "insert into test_1 (duration) values(100);")
|
|
spawn_script("up.sql", "migrations", "test_1", 2, "insert into test_1 (duration) values(101);")
|
|
spawn_script("up.sql", "migrations", "test_2", 1, "insert into test_1 (duration) values(100);")
|
|
spawn_script("up.sql", "migrations", "test_2", 2, "insert into test_1 (duration) values(101);")
|
|
spawn_script("down.sql", "migrations", "test_1", 1, "delete from test_1 where _id=1;")
|
|
spawn_script("down.sql", "migrations", "test_1", 2, "delete from test_1 where _id=2;")
|
|
spawn_script("down.sql", "migrations", "test_2", 1, "delete from test_1 where _id=1;")
|
|
spawn_script("down.sql", "migrations", "test_2", 2, "delete from test_1 where _id=2;")
|
|
|
|
migration.migrate("databases", "migrations", {
|
|
test_1 = 0,
|
|
test_2 = 0
|
|
})
|
|
lu.assertEquals(migration.get_db_version("databases/test_1.db"), 0)
|
|
lu.assertEquals(migration.get_db_version("databases/test_2.db"), 0)
|
|
|
|
migration.migrate("databases", "migrations", {
|
|
test_1 = 2,
|
|
test_2 = 2
|
|
})
|
|
lu.assertEquals(migration.get_db_version("databases/test_1.db"), 2)
|
|
lu.assertEquals(migration.get_db_version("databases/test_2.db"), 2)
|
|
|
|
migration.migrate("databases", "migrations", {
|
|
test_1 = 1,
|
|
test_2 = 1
|
|
})
|
|
lu.assertEquals(migration.get_db_version("databases/test_1.db"), 1)
|
|
lu.assertEquals(migration.get_db_version("databases/test_2.db"), 1)
|
|
end
|
|
|
|
os.exit(lu.LuaUnit.run())
|