diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryHeader/GlossaryHeader.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryHeader/GlossaryHeader.component.tsx index 62c7f3b8556c..839f32a7c3e3 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryHeader/GlossaryHeader.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryHeader/GlossaryHeader.component.tsx @@ -138,8 +138,10 @@ const GlossaryHeader = ({ Operation.EditAll, ResourceEntity.GLOSSARY_TERM, globalPermissions - ), - [globalPermissions] + ) || + permissions[Operation.All] || + permissions[Operation.EditAll], + [globalPermissions, permissions] ); // To fetch the latest glossary data diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryHeader/GlossaryHeader.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryHeader/GlossaryHeader.test.tsx index cbbf48cbce70..8775a942093c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryHeader/GlossaryHeader.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryHeader/GlossaryHeader.test.tsx @@ -322,4 +322,57 @@ describe('GlossaryHeader component', () => { screen.queryByText('ChangeParentHierarchyComponent') ).not.toBeInTheDocument(); }); + + describe('import/export visibility with conditional policies', () => { + it('should show import/export when globalPermissions denies but entity-level permissions allow (isOwner condition satisfied)', async () => { + // Simulate a conditional policy: resource-level check returns false because + // the backend cannot evaluate isOwner() without entity context. + mockGlossaryTermPermission.All = false; + mockGlossaryTermPermission.EditAll = false; + + // Entity-level permissions are fetched with the glossary ID so the backend + // correctly evaluates isOwner() and returns Allow. + mockContext.type = EntityType.GLOSSARY; + mockContext.permissions = { ...DEFAULT_ENTITY_PERMISSION, EditAll: true }; + + render( + + ); + + await act(async () => { + fireEvent.click(screen.getByTestId('manage-button')); + }); + + expect(screen.queryByText('label.import')).toBeInTheDocument(); + expect(screen.queryByText('label.export')).toBeInTheDocument(); + }); + + it('should hide import/export when both globalPermissions and entity-level permissions deny', async () => { + // Both resource-level and entity-level permissions deny — user is not the + // owner and no other condition grants access. + mockGlossaryTermPermission.All = false; + mockGlossaryTermPermission.EditAll = false; + + mockContext.type = EntityType.GLOSSARY; + mockContext.permissions = { + ...DEFAULT_ENTITY_PERMISSION, + All: false, + EditAll: false, + }; + + render( + + ); + + expect(screen.queryByTestId('manage-button')).not.toBeInTheDocument(); + }); + }); });