@@ -81,7 +81,6 @@ auto catalog_query(boost::asio::any_io_executor executor, vamp_zero::database_co
|
||||
|
||||
auto catalog_bundle(std::string_view title, std::string_view key = "C", std::string_view part = "Lead") -> std::string {
|
||||
auto value = boost::json::parse(R"json({
|
||||
"schema_version":3,
|
||||
"music":{"metadata":{"title":"Fixture","composer":"Composer","key_signature":"C","time_signature":"4/4"},
|
||||
"staves":[{"name":"Lead","measures":[{"voices":[]},{"voices":[]},{"voices":[]}]}]},
|
||||
"presentation":{"width":976,"height":484,"pages":[
|
||||
@@ -388,7 +387,7 @@ BOOST_AUTO_TEST_CASE(catalog_reload_uses_cached_metadata_without_parsing_score_j
|
||||
BOOST_TEST(disagreement.error().message().find("disagree on key") != std::string_view::npos);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(catalog_validation_rejects_missing_legacy_and_corrupt_files_without_repair) {
|
||||
BOOST_AUTO_TEST_CASE(catalog_validation_rejects_missing_incompatible_and_corrupt_files_without_repair) {
|
||||
auto db = catalog_database{};
|
||||
auto validate = [&] { return run_catalog_operation(vamp_zero::async_validate_database, db.config, true); };
|
||||
BOOST_TEST(!validate());
|
||||
@@ -401,14 +400,16 @@ BOOST_AUTO_TEST_CASE(catalog_validation_rejects_missing_legacy_and_corrupt_files
|
||||
BOOST_REQUIRE(practice);
|
||||
BOOST_TEST(songs->parts.empty());
|
||||
BOOST_TEST(practice->exercises.empty());
|
||||
for (auto version : {0, 1, 2}) {
|
||||
db.query("PRAGMA user_version = " + std::to_string(version));
|
||||
for (auto sql : {"ALTER TABLE songs RENAME COLUMN part TO obsolete_part", "ALTER TABLE practice_exercises RENAME COLUMN exercise_id TO obsolete_id", "DROP TABLE songs", "DROP TABLE practice_exercises"}) {
|
||||
db.query(sql);
|
||||
auto snapshot_sql = "SELECT json_group_array(sql) FROM (SELECT sql FROM sqlite_schema ORDER BY name)";
|
||||
auto before = std::get<std::string>(db.query(snapshot_sql).rows[0][0].value);
|
||||
auto result = validate();
|
||||
BOOST_REQUIRE(!result);
|
||||
BOOST_TEST(result.error().message().find("reinstall") != std::string_view::npos);
|
||||
BOOST_TEST(std::get<std::int64_t>(db.query("PRAGMA user_version").rows[0][0].value) == version);
|
||||
BOOST_TEST(std::get<std::string>(db.query(snapshot_sql).rows[0][0].value) == before);
|
||||
BOOST_REQUIRE(db.build());
|
||||
}
|
||||
db.query("PRAGMA user_version = 3");
|
||||
db.query("PRAGMA application_id = 0");
|
||||
BOOST_TEST(!validate());
|
||||
auto output = std::ofstream{db.config.path, std::ios::trunc};
|
||||
@@ -419,6 +420,27 @@ BOOST_AUTO_TEST_CASE(catalog_validation_rejects_missing_legacy_and_corrupt_files
|
||||
BOOST_TEST(!std::filesystem::exists(db.config.path + "-journal"));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(catalog_validation_checks_column_types_constraints_and_table_kind) {
|
||||
auto db = catalog_database{};
|
||||
auto validate = [&] { return run_catalog_operation(vamp_zero::async_validate_database, db.config, false); };
|
||||
for (auto change : {std::pair{"title TEXT NOT NULL", "title BLOB NOT NULL"}, {"title TEXT NOT NULL", "title TEXT"}, {"PRIMARY KEY", ""}, {" STRICT", ""}}) {
|
||||
BOOST_REQUIRE(db.build());
|
||||
auto sql = std::get<std::string>(db.query("SELECT sql FROM sqlite_schema WHERE name = 'songs'").rows[0][0].value);
|
||||
auto position = sql.find(change.first);
|
||||
BOOST_REQUIRE(position != std::string::npos);
|
||||
sql.replace(position, std::string_view{change.first}.size(), change.second);
|
||||
db.query("DROP TABLE songs");
|
||||
db.query(sql);
|
||||
auto timestamp = std::filesystem::last_write_time(db.config.path);
|
||||
BOOST_TEST(!validate());
|
||||
BOOST_TEST((std::filesystem::last_write_time(db.config.path) == timestamp));
|
||||
}
|
||||
BOOST_REQUIRE(db.build());
|
||||
db.query("ALTER TABLE songs RENAME TO underlying_songs");
|
||||
db.query("CREATE VIEW songs AS SELECT * FROM underlying_songs");
|
||||
BOOST_TEST(!validate());
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(catalog_reads_readonly_database_without_json_and_resolves_relocated_assets) {
|
||||
auto db = catalog_database{};
|
||||
db.write("songs/tune.json", catalog_bundle("Relocated"));
|
||||
|
||||
Reference in New Issue
Block a user