--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("test_1.sql", 0, test_db_schema) lu.assertEquals(migration.up("test_1.sql", scripts, 1), migration.retcode.OK) lu.assertEquals(migration.get_db_version("test_1.sql"), 1) -- Migrate from version 1 to 2 lu.assertEquals(migration.up("test_1.sql", scripts, 2), migration.retcode.OK) lu.assertEquals(migration.get_db_version("test_1.sql"), 2) --- Migrate from version 0 to 5 spawn_db("test_1.sql", 0, test_db_schema) lu.assertEquals(migration.up("test_1.sql", scripts, 5), migration.retcode.OK) lu.assertEquals(migration.get_db_version("test_1.sql"), 5) end function test_migration_up_db_errors() scripts = {} --- Trigger DB error by trying to operate on empty database spawn_db("test_1.sql", 1, "") scripts[1] = "ALTER TABLE test_1 ADD new_column TEXT;" lu.assertError(migration.up, "test_1.sql", scripts, 2) --- Target version set to the same value as the current DB version spawn_db("test_1.sql", 1, test_db_schema) lu.assertEquals(migration.up("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("test_1.sql", 2, test_db_schema) lu.assertEquals(migration.up("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("test_1.sql", 2, test_db_schema) lu.assertEquals(migration.down("test_1.sql", scripts, 1), migration.retcode.OK) lu.assertEquals(migration.get_db_version("test_1.sql"), 1) -- Migrate from version 1 to 0 lu.assertEquals(migration.down("test_1.sql", scripts, 0), migration.retcode.OK) lu.assertEquals(migration.get_db_version("test_1.sql"), 0) --- Migrate from version 5 to 0 spawn_db("test_1.sql", 5, test_db_schema) lu.assertEquals(migration.down("test_1.sql", scripts, 0), migration.retcode.OK) lu.assertEquals(migration.get_db_version("test_1.sql"), 0) end function test_migration_down_errors() scripts = {} --- Trigger DB error by trying to operate on empty database spawn_db("test_1.sql", 2, "") scripts[1] = "ALTER TABLE test_1 ADD new_column TEXT;" lu.assertError(migration.down, "test_1.sql", scripts, 1) --- Target version set to the same value as the current DB version spawn_db("test_1.sql", 1, test_db_schema) lu.assertEquals(migration.down("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("test_1.sql", 2, test_db_schema) lu.assertEquals(migration.down("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 = 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())