import pytest from auth.scopes import (scopes_from_scope_string, validate_scope_string, ALL_SCOPES, is_subset_string) @pytest.mark.parametrize('scopes_string, expected', [ # Valid single scopes. ('repo:read', ['repo:read']), ('repo:admin', ['repo:admin']), # Invalid scopes. ('not:valid', []), ('repo:admins', []), # Valid scope strings. ('repo:read repo:admin', ['repo:read', 'repo:admin']), ('repo:read,repo:admin', ['repo:read', 'repo:admin']), ('repo:read,repo:admin repo:write', ['repo:read', 'repo:admin', 'repo:write']), # Partially invalid scopes. ('repo:read,not:valid', []), ('repo:read repo:admins', []), # Invalid scope strings. ('repo:read|repo:admin', []), # Mixture of delimiters. ('repo:read, repo:admin', []), ]) def test_parsing(scopes_string, expected): expected_scope_set = {ALL_SCOPES[scope_name] for scope_name in expected} parsed_scope_set = scopes_from_scope_string(scopes_string) assert parsed_scope_set == expected_scope_set assert validate_scope_string(scopes_string) == bool(expected) @pytest.mark.parametrize('superset, subset, result', [ ('repo:read', 'repo:read', True), ('repo:read repo:admin', 'repo:read', True), ('repo:read,repo:admin', 'repo:read', True), ('repo:read,repo:admin', 'repo:admin', True), ('repo:read,repo:admin', 'repo:admin repo:read', True), ('', 'repo:read', False), ('unknown:tag', 'repo:read', False), ('repo:read unknown:tag', 'repo:read', False), ('repo:read,unknown:tag', 'repo:read', False), ]) def test_subset_string(superset, subset, result): assert is_subset_string(superset, subset) == result