diff options
author | Frederick Muriuki Muriithi | 2022-12-08 08:32:26 +0300 |
---|---|---|
committer | Frederick Muriuki Muriithi | 2022-12-08 08:35:42 +0300 |
commit | b408d90f52766861071b6fefe01f8bf9d213432e (patch) | |
tree | 0a410830acdec6e3e25b33bb16a4255d15074fc5 | |
parent | 836924e7dccddaceb036fe3a312ca6811ccf2228 (diff) | |
download | genenetwork3-b408d90f52766861071b6fefe01f8bf9d213432e.tar.gz |
auth: test for `user_resources` function (incomplete)
* gn3/auth/authorisation/resources.py: dummy `user_resources` function
* tests/unit/auth/conftest.py: (incomplete): Add some fixtures for testing the
`user_resources` function
* tests/unit/auth/test_resources.py: test the `user_resources` function
-rw-r--r-- | gn3/auth/authorisation/resources.py | 6 | ||||
-rw-r--r-- | tests/unit/auth/conftest.py | 62 | ||||
-rw-r--r-- | tests/unit/auth/test_resources.py | 22 |
3 files changed, 86 insertions, 4 deletions
diff --git a/gn3/auth/authorisation/resources.py b/gn3/auth/authorisation/resources.py index 095a72c..2c0b72b 100644 --- a/gn3/auth/authorisation/resources.py +++ b/gn3/auth/authorisation/resources.py @@ -3,6 +3,8 @@ from uuid import UUID, uuid4 from typing import Sequence, NamedTuple from gn3.auth import db +from gn3.auth.authentication.users import User + from .checks import authorised_p from .exceptions import AuthorisationError from .groups import Group, authenticated_user_group @@ -70,3 +72,7 @@ def public_resources(conn: db.DbConnection) -> Sequence[Resource]: Resource(groups[row[0]], UUID(row[1]), row[2], categories[row[3]], bool(row[4])) for row in results) + +def user_resources(conn: db.DbConnection, user: User) -> Sequence[Resource]:# pylint: disable=[unused-argument] + """List the resources available to the user""" + return tuple() diff --git a/tests/unit/auth/conftest.py b/tests/unit/auth/conftest.py index e582640..649fad4 100644 --- a/tests/unit/auth/conftest.py +++ b/tests/unit/auth/conftest.py @@ -9,6 +9,8 @@ from yoyo.migrations import Migration, MigrationList from gn3.auth import db from gn3.auth.authentication.users import User from gn3.auth.authorisation.groups import Group +from gn3.auth.authorisation.resources import Resource, ResourceCategory + from gn3.migrations import apply_migrations, rollback_migrations @pytest.fixture(scope="session") @@ -54,16 +56,21 @@ def migrations_up_to(migration, migrations_dir): index = [mig.path for mig in migrations].index(migration) return MigrationList(migrations[0:index]) +TEST_GROUPS = ( + Group(uuid.UUID("9988c21d-f02f-4d45-8966-22c968ac2fbf"), "TheTestGroup"), + Group(uuid.UUID("e37d59d7-c05e-4d67-b479-81e627d8d634"), "TheTestGroup")) + @pytest.fixture(scope="function") def test_group(conn_after_auth_migrations):# pylint: disable=[redefined-outer-name] """Fixture: setup a test group.""" query = "INSERT INTO groups(group_id, group_name) VALUES (?, ?)" - group_id = uuid.UUID("9988c21d-f02f-4d45-8966-22c968ac2fbf") - group_name = "TheTestGroup" with db.cursor(conn_after_auth_migrations) as cursor: - cursor.execute(query, (str(group_id), group_name)) + cursor.executemany( + query, tuple( + (str(group.group_id), group.group_name) + for group in TEST_GROUPS)) - yield (conn_after_auth_migrations, Group(group_id, group_name)) + yield (conn_after_auth_migrations, TEST_GROUPS[0]) TEST_USERS = ( User(uuid.UUID("ecb52977-3004-469e-9428-2a1856725c7f"), "group@lead.er", @@ -121,3 +128,50 @@ def test_users_in_group(test_group, test_users):# pylint: disable=[redefined-out cursor.executemany( "DELETE FROM group_users WHERE group_id=? AND user_id=?", query_params) + +TEST_RESOURCES = ( + Resource(TEST_GROUPS[0], uuid.UUID("26ad1668-29f5-439d-b905-84d551f85955"), + "ResourceG01R01", + ResourceCategory(uuid.UUID("48056f84-a2a6-41ac-8319-0e1e212cba2a"), + "genotype", "Genotype Dataset"), + True), + Resource(TEST_GROUPS[0], uuid.UUID("2130aec0-fefd-434d-92fd-9ca342348b2d"), + "ResourceG01R02", + ResourceCategory(uuid.UUID("548d684b-d4d1-46fb-a6d3-51a56b7da1b3"), + "phenotype", "Phenotype (Publish) Dataset"), + False), + Resource(TEST_GROUPS[0], uuid.UUID("e9a1184a-e8b4-49fb-b713-8d9cbeea5b83"), + "ResourceG01R03", + ResourceCategory(uuid.UUID("fad071a3-2fc8-40b8-992b-cdefe7dcac79"), + "mrna", "mRNA Dataset"), + False), + Resource(TEST_GROUPS[1], uuid.UUID("14496a1c-c234-49a2-978c-8859ea274054"), + "ResourceG02R01", + ResourceCategory(uuid.UUID("48056f84-a2a6-41ac-8319-0e1e212cba2a"), + "genotype", "Genotype Dataset"), + False), + Resource(TEST_GROUPS[1], uuid.UUID("04ad9e09-94ea-4390-8a02-11f92999806b"), + "ResourceG02R02", + ResourceCategory(uuid.UUID("fad071a3-2fc8-40b8-992b-cdefe7dcac79"), + "mrna", "mRNA Dataset"), + True)) + +@pytest.fixture(scope="function") +def test_resources(test_group):# pylint: disable=[redefined-outer-name] + """fixture: setup test resources in the database""" + conn, _group = test_group + with db.cursor(conn) as cursor: + cursor.executemany( + "INSERT INTO resources VALUES (?,?,?,?,?)", + ((str(res.group.group_id), str(res.resource_id), res.resource_name, + str(res.resource_category.resource_category_id), + 1 if res.public else 0) for res in TEST_RESOURCES)) + return (conn, TEST_RESOURCES) + +@pytest.fixture(scope="function") +def fixture_user_resources(test_users_in_group, test_resources):# pylint: disable=[redefined-outer-name, unused-argument] + """fixture: link users to roles and resources""" + conn, _resources = test_resources + ## TODO: setup user roles + ## TODO: attach user roles to specific resources + return conn diff --git a/tests/unit/auth/test_resources.py b/tests/unit/auth/test_resources.py index 6dc0e98..88edc77 100644 --- a/tests/unit/auth/test_resources.py +++ b/tests/unit/auth/test_resources.py @@ -51,3 +51,25 @@ def test_public_resources(test_resources): conn, _res = test_resources assert sorted(public_resources(conn), key=SORTKEY) == sorted(tuple( res for res in conftest.TEST_RESOURCES if res.public), key=SORTKEY) + +PUBLIC_RESOURCES = sorted(conftest.TEST_RESOURCES, key=SORTKEY) + +@pytest.mark.skip # REMOVE THIS LINE!!! +@pytest.mark.unit_test +@pytest.mark.parametrize( + "user,expected", + tuple(zip( + conftest.TEST_USERS, + (sorted(conftest.TEST_RESOURCES, key=SORTKEY), + sorted(res for res in conftest.TEST_RESOURCES + if str(res.resource_id) not in + ("2130aec0-fefd-434d-92fd-9ca342348b2d", + "14496a1c-c234-49a2-978c-8859ea274054")), + PUBLIC_RESOURCES, PUBLIC_RESOURCES)))) +def test_user_resources(fixture_user_resources, user, expected): + """ + GIVEN: some resources in the database + WHEN: a particular user's resources are requested + THEN: list only the resources for which the user can access + """ + assert user_resources(fixture_user_resources, user) == expected |