aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2022-11-17 09:07:51 +0300
committerFrederick Muriuki Muriithi2022-11-17 09:07:51 +0300
commit4ad8763086197422266841b106c7da08d480f249 (patch)
tree5c691bcf6eb3dfb45dd68861021b1509aee1faa6
parent73667aa26b6726735f9b7e458aee6d8a37333b8a (diff)
downloadgenenetwork3-4ad8763086197422266841b106c7da08d480f249.tar.gz
Migrations: Add column `group_role_id` to `group_roles` table
* migrations/auth/20221117_01_RDlfx-modify-group-roles-add-group-role-id.py: new migration * tests/unit/auth/test_migrations_add_remove_columns.py: test new migration
-rw-r--r--migrations/auth/20221117_01_RDlfx-modify-group-roles-add-group-role-id.py47
-rw-r--r--tests/unit/auth/test_migrations_add_remove_columns.py29
2 files changed, 68 insertions, 8 deletions
diff --git a/migrations/auth/20221117_01_RDlfx-modify-group-roles-add-group-role-id.py b/migrations/auth/20221117_01_RDlfx-modify-group-roles-add-group-role-id.py
new file mode 100644
index 0000000..7115bc3
--- /dev/null
+++ b/migrations/auth/20221117_01_RDlfx-modify-group-roles-add-group-role-id.py
@@ -0,0 +1,47 @@
+"""
+Modify 'group_roles': add 'group_role_id'
+
+At this point, there is no data in the `group_roles` table and therefore, it
+should be safe to simply recreate it.
+"""
+
+from yoyo import step
+
+__depends__ = {'20221116_01_nKUmX-add-privileges-to-group-leader-role'}
+
+steps = [
+ step(
+ "DROP INDEX IF EXISTS idx_tbl_group_roles_cols_group_id",
+ """
+ CREATE INDEX IF NOT EXISTS idx_tbl_group_roles_cols_group_id
+ ON group_roles(group_id)
+ """),
+ step(
+ "DROP TABLE IF EXISTS group_roles",
+ """
+ CREATE TABLE IF NOT EXISTS group_roles(
+ group_id TEXT NOT NULL,
+ role_id TEXT NOT NULL,
+ PRIMARY KEY(group_id, role_id),
+ FOREIGN KEY(group_id) REFERENCES groups(group_id),
+ FOREIGN KEY(role_id) REFERENCES roles(role_id)
+ ) WITHOUT ROWID
+ """),
+ step(
+ """
+ CREATE TABLE IF NOT EXISTS group_roles(
+ group_role_id TEXT PRIMARY KEY,
+ group_id TEXT NOT NULL,
+ role_id TEXT NOT NULL,
+ FOREIGN KEY(group_id) REFERENCES groups(group_id),
+ FOREIGN KEY(role_id) REFERENCES roles(role_id)
+ ) WITHOUT ROWID
+ """,
+ "DROP TABLE IF EXISTS group_roles"),
+ step(
+ """
+ CREATE INDEX IF NOT EXISTS idx_tbl_group_roles_cols_group_id
+ ON group_roles(group_id)
+ """,
+ "DROP INDEX IF EXISTS idx_tbl_group_roles_cols_group_id")
+]
diff --git a/tests/unit/auth/test_migrations_add_remove_columns.py b/tests/unit/auth/test_migrations_add_remove_columns.py
index 89948b3..d149c64 100644
--- a/tests/unit/auth/test_migrations_add_remove_columns.py
+++ b/tests/unit/auth/test_migrations_add_remove_columns.py
@@ -16,7 +16,9 @@ TEST_PARAMS = (
"privileges", "privilege_category TEXT", True),
(("20221110_08_23psB-add-privilege-category-and-privilege-description-"
"columns-to-privileges-table.py"),
- "privileges", "privilege_description TEXT", True))
+ "privileges", "privilege_description TEXT", True),
+ ("20221117_01_RDlfx-modify-group-roles-add-group-role-id.py", "group_roles",
+ "group_role_id", True))
def found(haystack: str, needle: str) -> bool:
"""Check whether `needle` is found in `haystack`"""
@@ -37,6 +39,13 @@ def applied_successfully(adding: bool, result_str: str, column: str) -> bool:
return col_was_found
return not col_was_found
+def rolled_back_successfully(adding: bool, result_str: str, column: str) -> bool:
+ """Check that the migration ran successfully"""
+ col_was_found = found(result_str, column)
+ if adding:
+ return not col_was_found
+ return col_was_found
+
@pytest.mark.unit_test
@pytest.mark.parametrize(
"migration_file,the_table,the_column,adding", TEST_PARAMS)
@@ -64,7 +73,9 @@ def test_apply_add_remove_column(# pylint: disable=[too-many-arguments]
assert pristine_before_migration(
adding, results_before_migration[0], the_column), (
- "Database inconsistent before applying migration.")
+ f"Column `{the_column}` exists before migration and should not"
+ if adding else
+ f"Column `{the_column}` doesn't exist before migration and it should")
assert applied_successfully(
adding, results_after_migration[0], the_column), "Migration failed"
@@ -87,15 +98,17 @@ def test_rollback_add_remove_column(# pylint: disable=[too-many-arguments]
apply_single_migration(backend, the_migration)
with db.connection(auth_testdb_path) as conn, db.cursor(conn) as cursor:
cursor.execute(QUERY, (the_table,))
- results_before_migration = cursor.fetchone()
+ results_before_rollback = cursor.fetchone()
rollback_single_migration(backend, the_migration)
cursor.execute(QUERY, (the_table,))
- results_after_migration = cursor.fetchone()
+ results_after_rollback = cursor.fetchone()
rollback_migrations(backend, older_migrations + [the_migration])
assert pristine_before_migration(
- not adding, results_before_migration[0], the_column), (
- "Database inconsistent before applying migration.")
- assert applied_successfully(
- not adding, results_after_migration[0], the_column), "Migration failed"
+ not adding, results_before_rollback[0], the_column), (
+ f"Column `{the_column}` doesn't exist before rollback and it should"
+ if adding else
+ f"Column `{the_column}` exists before rollback and should not")
+ assert rolled_back_successfully(
+ adding, results_after_rollback[0], the_column), "Rollback failed"