import unittest import sys from pathlib import Path import psycopg code_path = Path(__file__).parent.parent / "ca_core" sys.path.insert(0, str(code_path)) import entity import group_member DBNAME = "ca" def get_last_log(cursor): cursor.execute("SELECT entry FROM log ORDER BY id DESC LIMIT 1") row = cursor.fetchone() return row["entry"] if row else "" class TestGroupFunctions(unittest.TestCase): @classmethod def setUpClass(cls): cls.conn = psycopg.connect(f"dbname={DBNAME}") cls.cur = cls.conn.cursor(row_factory=psycopg.rows.dict_row) @classmethod def tearDownClass(cls): cls.cur.close() cls.conn.close() def setUp(self): self.conn.rollback() def tearDown(self): self.conn.rollback() def test_add_and_get_members(self): creator_id = entity.insert_creator(self.cur, "Creator1", "pubkey1") person_id = entity.enroll_person(self.cur, "Person1", "pubkey_person", creator_id) group_id = entity.create_group(self.cur, "Group1", "pubkey_group", creator_id) group_member.add_group_member(self.cur, group_id, person_id, "member") members = group_member.get_members_of_group(self.cur, group_id) self.assertTrue( any(m["member_id"] == person_id and m["role"] == "member" for m in members) ) log_entry = get_last_log(self.cur).lower() self.assertIn("added member", log_entry) self.assertIn(str(group_id), log_entry) def test_nested_groups(self): creator_id = entity.insert_creator(self.cur, "Creator2", "pubkey2") parent_group = entity.create_group(self.cur, "ParentGroup", "pubkey_parent", creator_id) child_group = entity.create_group(self.cur, "ChildGroup", "pubkey_child", creator_id) group_member.add_group_member(self.cur, parent_group, child_group, "subgroup") members = group_member.get_members_of_group(self.cur, parent_group) self.assertTrue( any(m["member_id"] == child_group and m["role"] == "subgroup" for m in members) ) def test_revoked_group_cannot_accept_members(self): creator_id = entity.insert_creator(self.cur, "Creator3", "pubkey3") group_id = entity.create_group(self.cur, "RevokedGroup", "pubkey_group", creator_id) person_id = entity.enroll_person(self.cur, "Person2", "pubkey_person", creator_id) entity.set_entity_status(self.cur, group_id, "revoked", creator_id) with self.assertRaises(ValueError): group_member.add_group_member(self.cur, group_id, person_id, "member") def test_revoked_member_cannot_be_added(self): creator_id = entity.insert_creator(self.cur, "Creator4", "pubkey4") group_id = entity.create_group(self.cur, "ActiveGroup", "pubkey_group", creator_id) person_id = entity.enroll_person(self.cur, "RevokedPerson", "pubkey_person", creator_id) entity.set_entity_status(self.cur, person_id, "revoked", creator_id) with self.assertRaises(ValueError): group_member.add_group_member(self.cur, group_id, person_id, "member")