import json from pathlib import Path from unittest.mock import patch import pytest from ldap.convert_ldap_to_db import ( get_ou_subgroups, get_subgroups, print_group_membership, read_ldap_json, read_or_create_selected_groups, set_group_member_of, ) @pytest.fixture def tmp_path(): return Path(__file__).parent / "temp" @pytest.fixture def sample_groups(): return { "cn=group1,ou=groups,dc=example,dc=com": { "cn": "group1", "member": ["cn=group2,ou=groups,dc=example,dc=com"], }, "cn=group2,ou=groups,dc=example,dc=com": { "cn": "group2", "member": ["cn=user1,ou=users,dc=example,dc=com"], }, "cn=user1,ou=users,dc=example,dc=com": {"cn": "user1", "member": []}, } @pytest.fixture def sample_users(): return { "cn=user1,ou=users,dc=example,dc=com": { "sAMAccountName": "user1", "cn": "User One", "mail": "user1@example.com", "memberOf": ["cn=group2,ou=groups,dc=example,dc=com"], }, } def test_read_ldap_json(tmp_path): json_file = tmp_path / "test.json" test_data = { "entries": [ {"dn": "cn=group1,dc=example,dc=com", "attributes": {"cn": "group1"}}, ] } json_file.write_text(json.dumps(test_data), encoding="latin-1") with patch("ldap.convert_ldap_to_db.base_dir", tmp_path): result = read_ldap_json("test.json") assert result == {"cn=group1,dc=example,dc=com": {"cn": "group1"}} def test_read_or_create_selected_groups_existing(tmp_path, sample_groups): json_file = tmp_path / "selected.json" selected = ["cn=group1,ou=groups,dc=example,dc=com"] json_file.write_text(json.dumps(selected), encoding="latin-1") with patch("ldap.convert_ldap_to_db.base_dir", tmp_path): result = read_or_create_selected_groups("selected.json", sample_groups) assert result == selected def test_read_or_create_selected_groups_create_new(tmp_path, sample_groups): with patch("ldap.convert_ldap_to_db.base_dir", tmp_path): result = read_or_create_selected_groups("new_selected.json", sample_groups) assert "cn=group1,ou=groups,dc=example,dc=com" in result assert "cn=group2,ou=groups,dc=example,dc=com" in result def test_get_subgroups(sample_groups): sel_groups = ["cn=group1,ou=groups,dc=example,dc=com"] result = get_subgroups(sample_groups, sel_groups) assert "cn=group1,ou=groups,dc=example,dc=com" in result assert "cn=group2,ou=groups,dc=example,dc=com" in result def test_get_subgroups_missing_group(sample_groups): sel_groups = ["cn=nonexistent,ou=groups,dc=example,dc=com"] result = get_subgroups(sample_groups, sel_groups) assert result == [] def test_set_group_member_of(sample_groups): sel_groups = ["cn=group1,ou=groups,dc=example,dc=com"] set_group_member_of(sample_groups, sel_groups) assert sample_groups["cn=group1,ou=groups,dc=example,dc=com"]["memberOf"] == [] assert sample_groups["cn=group2,ou=groups,dc=example,dc=com"]["memberOf"] == [ "cn=group1,ou=groups,dc=example,dc=com" ] def test_get_ou_subgroups(): group_dn = "cn=group1,ou=sales,ou=departments,dc=example,dc=com" result = get_ou_subgroups(group_dn) assert "ou=sales,ou=departments,dc=example,dc=com" in result assert "ou=departments,dc=example,dc=com" in result def test_get_ou_subgroups_no_ou(): group_dn = "cn=group1,dc=example,dc=com" result = get_ou_subgroups(group_dn) assert result == [] def test_print_group_membership(capsys, sample_groups): sel_groups = ["cn=group1,ou=groups,dc=example,dc=com"] print_group_membership(sample_groups, sel_groups) captured = capsys.readouterr() assert "group1" in captured.out or "cn=group1" in captured.out