~aleteoryx/muditaos

ref: master muditaos/scripts/lua/migration/test/test.lua -rw-r--r-- 6.2 KiB
2cd0e472 — Lefucjusz [BH-000] Update Harmony 2.10.0 changelog 2 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
-- 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())