import pytest def read_lines(path): with path.open("r") as fh: content = fh.read().strip() lines = content.splitlines() return [line.strip() for line in lines] @pytest.mark.parametrize( "value, expected", [ ("no line break", "KEY = no line break"), ("with\nline\nbreak", "KEY = with\n\tline\n\tbreak"), ], ) def test_authz_format_ini_option(value, expected): from elab_users.authz import format_ini_option result = format_ini_option("KEY", value) assert result == expected def test_authz_parser_init(): import configparser from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser() assert isinstance(parser, configparser.ConfigParser) assert parser.elab_users == {} assert parser.original_path is None def test_authz_parser_optionxfrom(): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser() assert parser.optionxform(123) == "123" def test_authz_parser_read(example_authz): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser() parser.read(example_authz) assert parser.original_path == example_authz assert parser.elab_users != {} def test_authz_parser_from_file(example_authz): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser.from_file(example_authz) assert isinstance(parser, AuthzConfigParser) assert parser.original_path == example_authz assert parser.elab_users != {} def test_authz_parser_write_to_file_raises_error(): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser() with pytest.raises(IOError): parser.write_to_file(path=None) def test_authz_parser_write_to_file_uses_original_path( example_authz, example_empty_file ): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser.from_file(example_authz) parser.original_path = example_empty_file parser.write_to_file(path=None) assert example_empty_file.is_file() def test_authz_parser_write_to_file_custom_path( example_authz, example_empty_file ): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser.from_file(example_authz) parser.write_to_file(path=example_empty_file) assert example_empty_file.is_file() def test_authz_parser_write(example_authz, example_empty_file): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser.from_file(example_authz) with open(example_empty_file, "w") as fh: parser.write(fh) original = read_lines(example_authz) created = read_lines(example_empty_file) assert original == created def test_authz_parser_extract_user_info_from_config(example_authz): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser() super(type(parser), parser).read(example_authz) assert parser.elab_users == {} parser._extract_user_info_from_config() assert parser.elab_users != {} @pytest.mark.parametrize( "name, group", [ ("OswaldPrucker", "administrators"), ("AlexanderDietz", "users"), ("UrmilShah", "restricted"), ("CamillaOestevold", "alumni"), ], ) def test_authz_parser_extract_group_definitions(name, group, example_authz): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser() super(type(parser), parser).read(example_authz) parser._extract_group_definitions() user = parser.elab_users[name] assert user.group == group @pytest.mark.parametrize( "name, read, write", [ ("OswaldPrucker", [], ["OswaldPrucker"]), ("AlexanderDietz", [], ["AlexanderDietz"]), ("UrmilShah", ["AndreasEvers"], ["UrmilShah"]), ], ) def test_authz_parser_extract_individual_acls( name, read, write, example_authz ): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser() super(type(parser), parser).read(example_authz) parser._extract_group_definitions() parser._extract_individual_acls() user = parser.elab_users[name] assert user.read_acl == set(read) assert user.write_acl == set(write) def test_authz_parser_group_users(example_authz): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser.from_file(example_authz) groups = parser.group_users() assert len(groups) == 4 assert len(groups["administrators"]) == 2 assert len(groups["users"]) == 54 assert len(groups["restricted"]) == 5 assert len(groups["alumni"]) == 62 def test_authz_parser_add_journal_acl_for(example_authz): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser.from_file(example_authz) user = parser.add_journal_acl_for("JaneDoe", "users") assert user.name == "JaneDoe" assert user.group == "users" assert parser.elab_users["JaneDoe"] == user assert "JaneDoe:/" in parser.sections() items = parser.items("JaneDoe:/") assert sorted(items) == [ ("@administrators", "rw"), ("@alumni", ""), ("@restricted", ""), ("@users", "r"), ("JaneDoe", "rw"), ] def test_authz_parser_move_user_to_alumni(example_authz): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser.from_file(example_authz) user = parser.move_user_to_alumni("UrmilShah") assert user.name == "UrmilShah" assert user.group == "alumni" assert user.write_acl == set() assert user.read_acl == set() for group, userlist in parser.items("groups"): if group == "alumni": assert "UrmilShah" in userlist else: assert "UrmilShah" not in userlist def test_authz_parser_update_user_group_config(example_authz): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser.from_file(example_authz) parser.elab_users["UrmilShah"].group = "alumni" parser._update_user_group_config() for group, userlist in parser.items("groups"): if group == "alumni": assert "UrmilShah" in userlist else: assert "UrmilShah" not in userlist @pytest.mark.parametrize( "elab, read, write", [ ("AlexeyKopyshev:/", ["@users"], ["@administrators"]), ( "AndreasEvers:/", ["@users", "UrmilShah"], ["@administrators"], ), ( "UrmilShah:/", ["@users"], ["@administrators", "UrmilShah"], ), ], ) def test_authz_parser_get_journal_info(elab, read, write, example_authz): from elab_users.authz import AuthzConfigParser parser = AuthzConfigParser.from_file(example_authz) info = parser.get_journal_info(elab) assert info == {"r": read, "rw": write}