From e0b4cbef78097c323a2aafc7a130ca8f4a6628e9 Mon Sep 17 00:00:00 2001 From: Jared Atkinson Date: Tue, 8 Sep 2026 13:43:32 -0700 Subject: [PATCH 1/2] BED-9686: qualify organization role names --- src/openhound_github/models/org_role.py | 5 +++-- tests/test_org_role_model.py | 28 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 tests/test_org_role_model.py diff --git a/src/openhound_github/models/org_role.py b/src/openhound_github/models/org_role.py index 9193991..d11561a 100644 --- a/src/openhound_github/models/org_role.py +++ b/src/openhound_github/models/org_role.py @@ -221,11 +221,12 @@ def node_id(self) -> str: @property def as_node(self) -> GHNode: + qualified_name = f"{self.org_login}/{self.name}" return GHNode( kinds=[nk.ORG_ROLE, "GH_Role"], properties=GHOrgRoleProperties( - name=self.name, - displayname=f"{self.org_login}/{self.name}", + name=qualified_name, + displayname=qualified_name, node_id=self.node_id, short_name=self.name, type=self.type, diff --git a/tests/test_org_role_model.py b/tests/test_org_role_model.py new file mode 100644 index 0000000..6bea00c --- /dev/null +++ b/tests/test_org_role_model.py @@ -0,0 +1,28 @@ +from datetime import datetime + +from openhound_github.models.org_role import OrgRole + + +def _role(org_node_id: str, org_login: str) -> OrgRole: + return OrgRole( + id=1, + name="owners", + type="default", + base_role="admin", + created_at=datetime.now(), + org_node_id=org_node_id, + org_login=org_login, + ) + + +def test_org_role_name_is_qualified_by_organization() -> None: + acme_role = _role("ORG_1", "acme") + example_role = _role("ORG_2", "example") + + assert acme_role.as_node.properties.name == "acme/owners" + assert acme_role.as_node.properties.displayname == "acme/owners" + assert acme_role.as_node.properties.short_name == "owners" + + assert example_role.as_node.properties.name == "example/owners" + assert example_role.as_node.properties.displayname == "example/owners" + assert example_role.as_node.properties.short_name == "owners" From d1a331de8bee482d9d84c64fe2ef276bff1f7437 Mon Sep 17 00:00:00 2001 From: Jared Atkinson Date: Tue, 8 Sep 2026 15:14:53 -0700 Subject: [PATCH 2/2] BED-9686: clarify organization role source names --- src/openhound_github/models/org_role.py | 2 +- tests/test_org_role_model.py | 46 +++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/openhound_github/models/org_role.py b/src/openhound_github/models/org_role.py index d11561a..995f696 100644 --- a/src/openhound_github/models/org_role.py +++ b/src/openhound_github/models/org_role.py @@ -201,7 +201,7 @@ class OrgRole(BaseAsset): # node_id: int = Field(alias="id") id: int - name: str # full: "my-org/owners" + name: str # role-only name from the API, e.g. "owners" or "Custom Role Manager" created_at: datetime updated_at: datetime | None = None organization: Organization | None = None diff --git a/tests/test_org_role_model.py b/tests/test_org_role_model.py index 6bea00c..f27be23 100644 --- a/tests/test_org_role_model.py +++ b/tests/test_org_role_model.py @@ -1,13 +1,17 @@ from datetime import datetime from openhound_github.models.org_role import OrgRole +from openhound_github.models.org_role_member import OrgRoleMember +from openhound_github.models.org_role_team import OrgRoleTeam -def _role(org_node_id: str, org_login: str) -> OrgRole: +def _role( + org_node_id: str, org_login: str, name: str = "owners", role_type: str = "default" +) -> OrgRole: return OrgRole( id=1, - name="owners", - type="default", + name=name, + type=role_type, base_role="admin", created_at=datetime.now(), org_node_id=org_node_id, @@ -26,3 +30,39 @@ def test_org_role_name_is_qualified_by_organization() -> None: assert example_role.as_node.properties.name == "example/owners" assert example_role.as_node.properties.displayname == "example/owners" assert example_role.as_node.properties.short_name == "owners" + + +def test_custom_org_role_uses_role_only_name_for_assignment_node_ids() -> None: + role = _role("ORG_1", "acme", name="Custom Role Manager", role_type="custom") + member = OrgRoleMember( + id=1, + node_id="USER_1", + login="alice", + type="User", + site_admin=False, + org_role_id=role.id, + org_role_name=role.name, + org_node_id=role.org_node_id, + org_login=role.org_login, + ) + team = OrgRoleTeam( + id=2, + node_id="TEAM_1", + url="https://api.github.com/teams/2", + name="security", + slug="security", + description="Security team", + permission="pull", + members_url="https://api.github.com/teams/2/members{/member}", + repositories_url="https://api.github.com/teams/2/repos", + org_role_id=role.id, + org_role_name=role.name, + org_node_id=role.org_node_id, + org_login=role.org_login, + ) + + assert role.name == "Custom Role Manager" + assert role.node_id == "ORG_1_Custom Role Manager" + assert role.as_node.properties.name == "acme/Custom Role Manager" + assert member.org_role_node_id == role.node_id + assert team.org_role_node_id == role.node_id