"""Fixtures and utilities for group-related tests""" import uuid import pytest from gn_auth.auth.db import sqlite3 as db from gn_auth.auth.authorisation.resources.groups import Group from gn_auth.auth.authorisation.resources import Resource, ResourceCategory from .resource_fixtures import TEST_RESOURCES TEST_GROUP_01 = Group(uuid.UUID("9988c21d-f02f-4d45-8966-22c968ac2fbf"), "TheTestGroup", {}) TEST_GROUP_02 = Group(uuid.UUID("e37d59d7-c05e-4d67-b479-81e627d8d634"), "AnotherTestGroup", {}) TEST_GROUPS = (TEST_GROUP_01, TEST_GROUP_02) GROUP_CATEGORY = ResourceCategory( uuid.UUID("1e0f70ee-add5-4358-8c6c-43de77fa4cce"), "group", "A group resource.") GROUPS_AS_RESOURCES = tuple({ "group_id": str(group.group_id), "resource_id": res_id, "resource_name": group.group_name, "category_id": str(GROUP_CATEGORY.resource_category_id), "public": "0" } for res_id, group in zip( ("38d1807d-105f-44a7-8327-7e2d973b6d8d", "89458ef6-e090-4b53-8c2c-59eaf2785f11"), TEST_GROUPS)) GROUP_RESOURCES = tuple( Resource(uuid.UUID(row["resource_id"]), row["resource_name"], GROUP_CATEGORY, False) for row in GROUPS_AS_RESOURCES) TEST_RESOURCES_GROUP_01 = TEST_RESOURCES[0:3] TEST_RESOURCES_GROUP_02 = TEST_RESOURCES[3:5] def __gtuple__(cursor): return tuple(dict(row) for row in cursor.fetchall()) @pytest.fixture(scope="function") def fxtr_group(conn_after_auth_migrations):# pylint: disable=[redefined-outer-name] """Fixture: setup a test group.""" with db.cursor(conn_after_auth_migrations) as cursor: cursor.executemany( "INSERT INTO groups(group_id, group_name) VALUES (?, ?)", tuple( (str(group.group_id), group.group_name) for group in TEST_GROUPS)) cursor.executemany( "INSERT INTO resources " "VALUES(:resource_id, :resource_name, :category_id, :public)", GROUPS_AS_RESOURCES) cursor.executemany( "INSERT INTO group_resources(resource_id, group_id) " "VALUES(:resource_id, :group_id)", GROUPS_AS_RESOURCES) yield (conn_after_auth_migrations, TEST_GROUPS[0]) with db.cursor(conn_after_auth_migrations) as cursor: resource_id_params = tuple( (str(res["resource_id"]),) for res in GROUPS_AS_RESOURCES) cursor.executemany("DELETE FROM group_resources WHERE resource_id=?", resource_id_params) cursor.executemany("DELETE FROM resources WHERE resource_id=?", resource_id_params) cursor.executemany( "DELETE FROM groups WHERE group_id=?", ((str(group.group_id),) for group in TEST_GROUPS)) @pytest.fixture(scope="function") def fxtr_resource_ownership(# pylint: disable=[redefined-outer-name] fxtr_resources, fxtr_group ): """fixture: Set up group ownership of resources.""" _conn, resources = fxtr_resources conn, groups = fxtr_group ownership = tuple({ "group_id": str(TEST_GROUP_01.group_id), "resource_id": str(res.resource_id) } for res in TEST_RESOURCES_GROUP_01) + tuple({ "group_id": str(TEST_GROUP_02.group_id), "resource_id": str(res.resource_id) } for res in TEST_RESOURCES_GROUP_02) with db.cursor(conn) as cursor: cursor.executemany( "INSERT INTO resource_ownership(group_id, resource_id) " "VALUES (:group_id, :resource_id)", ownership) yield conn, resources, groups, ownership with db.cursor(conn) as cursor: cursor.executemany( "DELETE FROM resource_ownership " "WHERE group_id=:group_id AND resource_id=:resource_id", ownership) @pytest.fixture(scope="function") def fxtr_users_in_group(fxtr_group, fxtr_users):# pylint: disable=[redefined-outer-name, unused-argument] """Link the users to the groups.""" conn, all_users = fxtr_users users = tuple( user for user in all_users if user.email not in ("unaff@iliated.user",)) query_params = tuple( (str(TEST_GROUP_01.group_id), str(user.user_id)) for user in users) with db.cursor(conn) as cursor: cursor.executemany( "INSERT INTO group_users(group_id, user_id) VALUES (?, ?)", query_params) yield (conn, TEST_GROUP_01, users) with db.cursor(conn) as cursor: cursor.executemany( "DELETE FROM group_users WHERE group_id=? AND user_id=?", query_params)