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