diff options
| author | 2021-01-23 04:11:20 +0100 | |
|---|---|---|
| committer | 2021-01-24 01:23:09 +0100 | |
| commit | c11112972fcea3a6ac39fdfa2acb94df211b2f30 (patch) | |
| tree | 9a9c96d2e09344dcf3ba38d890b63f16fa134abc /sqlite.zig | |
| parent | ci: disable the bundled test on Debian (diff) | |
| download | zig-sqlite-c11112972fcea3a6ac39fdfa2acb94df211b2f30.tar.gz zig-sqlite-c11112972fcea3a6ac39fdfa2acb94df211b2f30.tar.xz zig-sqlite-c11112972fcea3a6ac39fdfa2acb94df211b2f30.zip | |
rework of the test database initialization
The hardcoded path we used is invalid on Windows, instead use a temp
directory from std.testing.tmpDir.
Need to do some refactoring too because now we compute the database file
path and therefore need an allocator while the Mode is in use in Db.init.
Diffstat (limited to 'sqlite.zig')
| -rw-r--r-- | sqlite.zig | 93 |
1 files changed, 48 insertions, 45 deletions
| @@ -973,17 +973,14 @@ fn addTestData(db: *Db) !void { | |||
| 973 | } | 973 | } |
| 974 | 974 | ||
| 975 | test "sqlite: db init" { | 975 | test "sqlite: db init" { |
| 976 | var db: Db = undefined; | 976 | var db = try getTestDb(); |
| 977 | try db.init(initOptions()); | ||
| 978 | try db.init(.{}); | ||
| 979 | } | 977 | } |
| 980 | 978 | ||
| 981 | test "sqlite: db pragma" { | 979 | test "sqlite: db pragma" { |
| 982 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 980 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 983 | defer arena.deinit(); | 981 | defer arena.deinit(); |
| 984 | 982 | ||
| 985 | var db: Db = undefined; | 983 | var db = try getTestDb(); |
| 986 | try db.init(initOptions()); | ||
| 987 | 984 | ||
| 988 | const foreign_keys = try db.pragma(usize, .{}, "foreign_keys", .{}); | 985 | const foreign_keys = try db.pragma(usize, .{}, "foreign_keys", .{}); |
| 989 | testing.expect(foreign_keys != null); | 986 | testing.expect(foreign_keys != null); |
| @@ -1019,8 +1016,7 @@ test "sqlite: db pragma" { | |||
| 1019 | } | 1016 | } |
| 1020 | 1017 | ||
| 1021 | test "sqlite: statement exec" { | 1018 | test "sqlite: statement exec" { |
| 1022 | var db: Db = undefined; | 1019 | var db = try getTestDb(); |
| 1023 | try db.init(initOptions()); | ||
| 1024 | try addTestData(&db); | 1020 | try addTestData(&db); |
| 1025 | 1021 | ||
| 1026 | // Test with a Blob struct | 1022 | // Test with a Blob struct |
| @@ -1046,8 +1042,7 @@ test "sqlite: read a single user into a struct" { | |||
| 1046 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1042 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1047 | defer arena.deinit(); | 1043 | defer arena.deinit(); |
| 1048 | 1044 | ||
| 1049 | var db: Db = undefined; | 1045 | var db = try getTestDb(); |
| 1050 | try db.init(initOptions()); | ||
| 1051 | try addTestData(&db); | 1046 | try addTestData(&db); |
| 1052 | 1047 | ||
| 1053 | var stmt = try db.prepare("SELECT name, id, age, weight FROM user WHERE id = ?{usize}"); | 1048 | var stmt = try db.prepare("SELECT name, id, age, weight FROM user WHERE id = ?{usize}"); |
| @@ -1108,8 +1103,7 @@ test "sqlite: read all users into a struct" { | |||
| 1108 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1103 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1109 | defer arena.deinit(); | 1104 | defer arena.deinit(); |
| 1110 | 1105 | ||
| 1111 | var db: Db = undefined; | 1106 | var db = try getTestDb(); |
| 1112 | try db.init(initOptions()); | ||
| 1113 | try addTestData(&db); | 1107 | try addTestData(&db); |
| 1114 | 1108 | ||
| 1115 | var stmt = try db.prepare("SELECT name, id, age, weight FROM user"); | 1109 | var stmt = try db.prepare("SELECT name, id, age, weight FROM user"); |
| @@ -1130,8 +1124,7 @@ test "sqlite: read in an anonymous struct" { | |||
| 1130 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1124 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1131 | defer arena.deinit(); | 1125 | defer arena.deinit(); |
| 1132 | 1126 | ||
| 1133 | var db: Db = undefined; | 1127 | var db = try getTestDb(); |
| 1134 | try db.init(initOptions()); | ||
| 1135 | try addTestData(&db); | 1128 | try addTestData(&db); |
| 1136 | 1129 | ||
| 1137 | var stmt = try db.prepare("SELECT name, id, name, age, id, weight FROM user WHERE id = ?{usize}"); | 1130 | var stmt = try db.prepare("SELECT name, id, name, age, id, weight FROM user WHERE id = ?{usize}"); |
| @@ -1165,8 +1158,7 @@ test "sqlite: read in a Text struct" { | |||
| 1165 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1158 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1166 | defer arena.deinit(); | 1159 | defer arena.deinit(); |
| 1167 | 1160 | ||
| 1168 | var db: Db = undefined; | 1161 | var db = try getTestDb(); |
| 1169 | try db.init(initOptions()); | ||
| 1170 | try addTestData(&db); | 1162 | try addTestData(&db); |
| 1171 | 1163 | ||
| 1172 | var stmt = try db.prepare("SELECT name, id, age FROM user WHERE id = ?{usize}"); | 1164 | var stmt = try db.prepare("SELECT name, id, age FROM user WHERE id = ?{usize}"); |
| @@ -1194,8 +1186,7 @@ test "sqlite: read a single text value" { | |||
| 1194 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1186 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1195 | defer arena.deinit(); | 1187 | defer arena.deinit(); |
| 1196 | 1188 | ||
| 1197 | var db: Db = undefined; | 1189 | var db = try getTestDb(); |
| 1198 | try db.init(initOptions()); | ||
| 1199 | try addTestData(&db); | 1190 | try addTestData(&db); |
| 1200 | 1191 | ||
| 1201 | const types = &[_]type{ | 1192 | const types = &[_]type{ |
| @@ -1245,8 +1236,7 @@ test "sqlite: read a single text value" { | |||
| 1245 | } | 1236 | } |
| 1246 | 1237 | ||
| 1247 | test "sqlite: read a single integer value" { | 1238 | test "sqlite: read a single integer value" { |
| 1248 | var db: Db = undefined; | 1239 | var db = try getTestDb(); |
| 1249 | try db.init(initOptions()); | ||
| 1250 | try addTestData(&db); | 1240 | try addTestData(&db); |
| 1251 | 1241 | ||
| 1252 | const types = &[_]type{ | 1242 | const types = &[_]type{ |
| @@ -1279,8 +1269,7 @@ test "sqlite: read a single integer value" { | |||
| 1279 | } | 1269 | } |
| 1280 | 1270 | ||
| 1281 | test "sqlite: read a single value into void" { | 1271 | test "sqlite: read a single value into void" { |
| 1282 | var db: Db = undefined; | 1272 | var db = try getTestDb(); |
| 1283 | try db.init(initOptions()); | ||
| 1284 | try addTestData(&db); | 1273 | try addTestData(&db); |
| 1285 | 1274 | ||
| 1286 | const query = "SELECT age FROM user WHERE id = ?{usize}"; | 1275 | const query = "SELECT age FROM user WHERE id = ?{usize}"; |
| @@ -1294,8 +1283,7 @@ test "sqlite: read a single value into void" { | |||
| 1294 | } | 1283 | } |
| 1295 | 1284 | ||
| 1296 | test "sqlite: read a single value into bool" { | 1285 | test "sqlite: read a single value into bool" { |
| 1297 | var db: Db = undefined; | 1286 | var db = try getTestDb(); |
| 1298 | try db.init(initOptions()); | ||
| 1299 | try addTestData(&db); | 1287 | try addTestData(&db); |
| 1300 | 1288 | ||
| 1301 | const query = "SELECT id FROM user WHERE id = ?{usize}"; | 1289 | const query = "SELECT id FROM user WHERE id = ?{usize}"; |
| @@ -1311,8 +1299,7 @@ test "sqlite: read a single value into bool" { | |||
| 1311 | } | 1299 | } |
| 1312 | 1300 | ||
| 1313 | test "sqlite: insert bool and bind bool" { | 1301 | test "sqlite: insert bool and bind bool" { |
| 1314 | var db: Db = undefined; | 1302 | var db = try getTestDb(); |
| 1315 | try db.init(initOptions()); | ||
| 1316 | try addTestData(&db); | 1303 | try addTestData(&db); |
| 1317 | 1304 | ||
| 1318 | try db.exec("INSERT INTO article(id, author_id, is_published) VALUES(?{usize}, ?{usize}, ?{bool})", .{ | 1305 | try db.exec("INSERT INTO article(id, author_id, is_published) VALUES(?{usize}, ?{usize}, ?{bool})", .{ |
| @@ -1334,8 +1321,7 @@ test "sqlite: insert bool and bind bool" { | |||
| 1334 | } | 1321 | } |
| 1335 | 1322 | ||
| 1336 | test "sqlite: bind string literal" { | 1323 | test "sqlite: bind string literal" { |
| 1337 | var db: Db = undefined; | 1324 | var db = try getTestDb(); |
| 1338 | try db.init(initOptions()); | ||
| 1339 | try addTestData(&db); | 1325 | try addTestData(&db); |
| 1340 | 1326 | ||
| 1341 | try db.exec("INSERT INTO article(id, data) VALUES(?, ?)", .{ | 1327 | try db.exec("INSERT INTO article(id, data) VALUES(?, ?)", .{ |
| @@ -1357,8 +1343,7 @@ test "sqlite: bind pointer" { | |||
| 1357 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1343 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1358 | defer arena.deinit(); | 1344 | defer arena.deinit(); |
| 1359 | 1345 | ||
| 1360 | var db: Db = undefined; | 1346 | var db = try getTestDb(); |
| 1361 | try db.init(initOptions()); | ||
| 1362 | try addTestData(&db); | 1347 | try addTestData(&db); |
| 1363 | 1348 | ||
| 1364 | const query = "SELECT name FROM user WHERE id = ?"; | 1349 | const query = "SELECT name FROM user WHERE id = ?"; |
| @@ -1379,8 +1364,7 @@ test "sqlite: read pointers" { | |||
| 1379 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1364 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1380 | defer arena.deinit(); | 1365 | defer arena.deinit(); |
| 1381 | 1366 | ||
| 1382 | var db: Db = undefined; | 1367 | var db = try getTestDb(); |
| 1383 | try db.init(initOptions()); | ||
| 1384 | try addTestData(&db); | 1368 | try addTestData(&db); |
| 1385 | 1369 | ||
| 1386 | const query = "SELECT id, name, age, weight FROM user"; | 1370 | const query = "SELECT id, name, age, weight FROM user"; |
| @@ -1414,8 +1398,7 @@ test "sqlite: optional" { | |||
| 1414 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1398 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1415 | defer arena.deinit(); | 1399 | defer arena.deinit(); |
| 1416 | 1400 | ||
| 1417 | var db: Db = undefined; | 1401 | var db = try getTestDb(); |
| 1418 | try db.init(initOptions()); | ||
| 1419 | try addTestData(&db); | 1402 | try addTestData(&db); |
| 1420 | 1403 | ||
| 1421 | try db.exec("INSERT INTO article(author_id, data, is_published) VALUES(?, ?, ?)", .{ 1, null, true }); | 1404 | try db.exec("INSERT INTO article(author_id, data, is_published) VALUES(?, ?, ?)", .{ 1, null, true }); |
| @@ -1438,8 +1421,7 @@ test "sqlite: optional" { | |||
| 1438 | } | 1421 | } |
| 1439 | 1422 | ||
| 1440 | test "sqlite: statement reset" { | 1423 | test "sqlite: statement reset" { |
| 1441 | var db: Db = undefined; | 1424 | var db = try getTestDb(); |
| 1442 | try db.init(initOptions()); | ||
| 1443 | try addTestData(&db); | 1425 | try addTestData(&db); |
| 1444 | 1426 | ||
| 1445 | // Add data | 1427 | // Add data |
| @@ -1467,8 +1449,7 @@ test "sqlite: statement iterator" { | |||
| 1467 | defer arena.deinit(); | 1449 | defer arena.deinit(); |
| 1468 | var allocator = &arena.allocator; | 1450 | var allocator = &arena.allocator; |
| 1469 | 1451 | ||
| 1470 | var db: Db = undefined; | 1452 | var db = try getTestDb(); |
| 1471 | try db.init(initOptions()); | ||
| 1472 | try addTestData(&db); | 1453 | try addTestData(&db); |
| 1473 | 1454 | ||
| 1474 | // Cleanup first | 1455 | // Cleanup first |
| @@ -1560,8 +1541,7 @@ test "sqlite: failing open" { | |||
| 1560 | } | 1541 | } |
| 1561 | 1542 | ||
| 1562 | test "sqlite: failing prepare statement" { | 1543 | test "sqlite: failing prepare statement" { |
| 1563 | var db: Db = undefined; | 1544 | var db = try getTestDb(); |
| 1564 | try db.init(initOptions()); | ||
| 1565 | 1545 | ||
| 1566 | const result = db.prepare("SELECT id FROM foobar"); | 1546 | const result = db.prepare("SELECT id FROM foobar"); |
| 1567 | testing.expectError(error.SQLiteError, result); | 1547 | testing.expectError(error.SQLiteError, result); |
| @@ -1571,21 +1551,44 @@ test "sqlite: failing prepare statement" { | |||
| 1571 | testing.expectEqualStrings("no such table: foobar", detailed_err.message); | 1551 | testing.expectEqualStrings("no such table: foobar", detailed_err.message); |
| 1572 | } | 1552 | } |
| 1573 | 1553 | ||
| 1574 | fn initOptions() InitOptions { | 1554 | fn getTestDb() !Db { |
| 1575 | return .{ | 1555 | var buf: [1024]u8 = undefined; |
| 1556 | var fba = std.heap.FixedBufferAllocator.init(&buf); | ||
| 1557 | |||
| 1558 | var mode = dbMode(&fba.allocator); | ||
| 1559 | |||
| 1560 | var db: Db = undefined; | ||
| 1561 | try db.init(.{ | ||
| 1576 | .open_flags = .{ | 1562 | .open_flags = .{ |
| 1577 | .write = true, | 1563 | .write = true, |
| 1578 | .create = true, | 1564 | .create = true, |
| 1579 | }, | 1565 | }, |
| 1580 | .mode = dbMode(), | 1566 | .mode = mode, |
| 1581 | }; | 1567 | }); |
| 1568 | |||
| 1569 | return db; | ||
| 1570 | } | ||
| 1571 | |||
| 1572 | fn tmpDbPath(allocator: *mem.Allocator) ![:0]const u8 { | ||
| 1573 | const tmp_dir = testing.tmpDir(.{}); | ||
| 1574 | |||
| 1575 | const path = try std.fs.path.join(allocator, &[_][]const u8{ | ||
| 1576 | "zig-cache", | ||
| 1577 | "tmp", | ||
| 1578 | &tmp_dir.sub_path, | ||
| 1579 | "zig-sqlite.db", | ||
| 1580 | }); | ||
| 1581 | defer allocator.free(path); | ||
| 1582 | |||
| 1583 | return allocator.dupeZ(u8, path); | ||
| 1582 | } | 1584 | } |
| 1583 | 1585 | ||
| 1584 | fn dbMode() Db.Mode { | 1586 | fn dbMode(allocator: *mem.Allocator) Db.Mode { |
| 1585 | return if (build_options.in_memory) blk: { | 1587 | return if (build_options.in_memory) blk: { |
| 1586 | break :blk .{ .Memory = {} }; | 1588 | break :blk .{ .Memory = {} }; |
| 1587 | } else blk: { | 1589 | } else blk: { |
| 1588 | const path = "/tmp/zig-sqlite.db"; | 1590 | const path = tmpDbPath(allocator) catch unreachable; |
| 1591 | |||
| 1589 | std.fs.cwd().deleteFile(path) catch {}; | 1592 | std.fs.cwd().deleteFile(path) catch {}; |
| 1590 | break :blk .{ .File = path }; | 1593 | break :blk .{ .File = path }; |
| 1591 | }; | 1594 | }; |