Skip to content

Commit 267e1ea

Browse files
committed
Add failing test for merged migration that merges itself
1 parent 18497b6 commit 267e1ea

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

Tests/GRDBTests/DatabaseMigratorTests.swift

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1282,6 +1282,122 @@ class DatabaseMigratorTests : GRDBTestCase {
12821282
}
12831283
}
12841284

1285+
func test_merged_migrations_named_like_the_last_that_includes_itself_in_the_list_of_merged_migrations() throws {
1286+
// Original migrator
1287+
var oldMigrator = DatabaseMigrator()
1288+
oldMigrator.registerMigration("v1") { db in
1289+
try db.execute(sql: "CREATE TABLE t1(a)")
1290+
}
1291+
oldMigrator.registerMigration("v2") { db in
1292+
try db.execute(sql: "CREATE TABLE t2(a)")
1293+
}
1294+
oldMigrator.registerMigration("v3") { db in
1295+
try db.execute(sql: "CREATE TABLE t3(a)")
1296+
}
1297+
oldMigrator.registerMigration("v4") { db in
1298+
try db.execute(sql: "CREATE TABLE t4(a)")
1299+
}
1300+
oldMigrator.registerMigration("v5") { db in
1301+
try db.execute(sql: "CREATE TABLE t5(a)")
1302+
}
1303+
1304+
// New migrator merges v2, v3, and v4 into v4
1305+
var newMigrator = DatabaseMigrator()
1306+
newMigrator.registerMigration("v1") { db in
1307+
try db.execute(sql: "CREATE TABLE t1(a)")
1308+
}
1309+
// SUT: the migration identifier is included in the list of merged identifiers.
1310+
newMigrator.registerMigration("v4", merging: ["v2", "v3", "v4"]) { db, appliedIDs in
1311+
if !appliedIDs.contains("v2") {
1312+
try db.execute(sql: "CREATE TABLE t2(a)")
1313+
}
1314+
if !appliedIDs.contains("v3") {
1315+
try db.execute(sql: "CREATE TABLE t3(a)")
1316+
}
1317+
try db.execute(sql: "CREATE TABLE t4(a)")
1318+
}
1319+
newMigrator.registerMigration("v5") { db in
1320+
try db.execute(sql: "CREATE TABLE t5(a)")
1321+
}
1322+
1323+
do {
1324+
let dbQueue = try makeDatabaseQueue()
1325+
1326+
try newMigrator.migrate(dbQueue)
1327+
try dbQueue.read { db in
1328+
try XCTAssertEqual(newMigrator.appliedIdentifiers(db), ["v1", "v4", "v5"])
1329+
try XCTAssertTrue(String
1330+
.fetchSet(db, sql: "SELECT name FROM sqlite_master")
1331+
.isSuperset(of: ["t1", "t2", "t3", "t4", "t5"]))
1332+
}
1333+
}
1334+
1335+
do {
1336+
let dbQueue = try makeDatabaseQueue()
1337+
try oldMigrator.migrate(dbQueue, upTo: "v1")
1338+
1339+
try newMigrator.migrate(dbQueue)
1340+
try dbQueue.read { db in
1341+
try XCTAssertEqual(newMigrator.appliedIdentifiers(db), ["v1", "v4", "v5"])
1342+
try XCTAssertTrue(String
1343+
.fetchSet(db, sql: "SELECT name FROM sqlite_master")
1344+
.isSuperset(of: ["t1", "t2", "t3", "t4", "t5"]))
1345+
}
1346+
}
1347+
1348+
do {
1349+
let dbQueue = try makeDatabaseQueue()
1350+
try oldMigrator.migrate(dbQueue, upTo: "v2")
1351+
1352+
try newMigrator.migrate(dbQueue)
1353+
try dbQueue.read { db in
1354+
try XCTAssertEqual(newMigrator.appliedIdentifiers(db), ["v1", "v4", "v5"])
1355+
try XCTAssertTrue(String
1356+
.fetchSet(db, sql: "SELECT name FROM sqlite_master")
1357+
.isSuperset(of: ["t1", "t2", "t3", "t4", "t5"]))
1358+
}
1359+
}
1360+
1361+
do {
1362+
let dbQueue = try makeDatabaseQueue()
1363+
try oldMigrator.migrate(dbQueue, upTo: "v3")
1364+
1365+
try newMigrator.migrate(dbQueue)
1366+
try dbQueue.read { db in
1367+
try XCTAssertEqual(newMigrator.appliedIdentifiers(db), ["v1", "v4", "v5"])
1368+
try XCTAssertTrue(String
1369+
.fetchSet(db, sql: "SELECT name FROM sqlite_master")
1370+
.isSuperset(of: ["t1", "t2", "t3", "t4", "t5"]))
1371+
}
1372+
}
1373+
1374+
do {
1375+
let dbQueue = try makeDatabaseQueue()
1376+
try oldMigrator.migrate(dbQueue, upTo: "v4")
1377+
1378+
try newMigrator.migrate(dbQueue)
1379+
try dbQueue.read { db in
1380+
try XCTAssertEqual(newMigrator.appliedIdentifiers(db), ["v1", "v4", "v5"])
1381+
try XCTAssertTrue(String
1382+
.fetchSet(db, sql: "SELECT name FROM sqlite_master")
1383+
.isSuperset(of: ["t1", "t2", "t3", "t4", "t5"]))
1384+
}
1385+
}
1386+
1387+
do {
1388+
let dbQueue = try makeDatabaseQueue()
1389+
try oldMigrator.migrate(dbQueue, upTo: "v5")
1390+
1391+
try newMigrator.migrate(dbQueue)
1392+
try dbQueue.read { db in
1393+
try XCTAssertEqual(newMigrator.appliedIdentifiers(db), ["v1", "v4", "v5"])
1394+
try XCTAssertTrue(String
1395+
.fetchSet(db, sql: "SELECT name FROM sqlite_master")
1396+
.isSuperset(of: ["t1", "t2", "t3", "t4", "t5"]))
1397+
}
1398+
}
1399+
}
1400+
12851401
func test_merged_migrations_with_a_new_name() throws {
12861402
// Original migrator
12871403
var oldMigrator = DatabaseMigrator()

0 commit comments

Comments
 (0)