From 524de8f7d3af994093d03be3a18a46d2fc5ac79b Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Wed, 7 Jun 2023 20:55:29 +0200 Subject: [PATCH] catalog-react: add tests for owners-only mode Signed-off-by: Vincenzo Scamporlino --- .../EntityOwnerPicker.test.tsx | 179 +++++++++++++++++- 1 file changed, 178 insertions(+), 1 deletion(-) diff --git a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx index c6aad7d1bd..a7b98e890f 100644 --- a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.test.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Entity } from '@backstage/catalog-model'; +import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; import { fireEvent, screen, waitFor } from '@testing-library/react'; import React from 'react'; import { MockEntityListContextProvider } from '../../testUtils/providers'; @@ -114,9 +114,13 @@ const mockedQueryEntities: jest.MockedFn = const mockedGetEntitiesByRef: jest.MockedFn = jest.fn(); +const mockedGetEntityFacets: jest.MockedFn = + jest.fn(); + const mockCatalogApi: Partial = { queryEntities: mockedQueryEntities, getEntitiesByRefs: mockedGetEntitiesByRef, + getEntityFacets: mockedGetEntityFacets, }; const mockErrorApi = new MockErrorApi(); @@ -371,3 +375,176 @@ describe('', () => { }); }); }); + +describe('', () => { + const mockApis = TestApiRegistry.from( + [catalogApiRef, mockCatalogApi], + [errorApiRef, mockErrorApi], + ); + + beforeEach(() => { + jest.resetAllMocks(); + + mockedGetEntityFacets.mockResolvedValue({ + facets: { + 'relations.ownedBy': [ + ...[...ownerEntitiesBatch1, ...ownerEntitiesBatch2].map(o => ({ + count: 1, + value: stringifyEntityRef(o), + })), + ], + }, + }); + }); + + it('renders all users and groups', async () => { + await renderWithEffects( + + + + + , + ); + expect(screen.getByText('Owner')).toBeInTheDocument(); + + fireEvent.click(screen.getByTestId('owner-picker-expand')); + + await waitFor(() => + expect(screen.getByText('another-owner')).toBeInTheDocument(), + ); + + ['some-owner', 'some-owner-2', 'test-namespace/another-owner-2'].forEach( + owner => { + expect(screen.getByText(owner)).toBeInTheDocument(); + }, + ); + + expect(mockedGetEntityFacets).toHaveBeenCalledTimes(1); + + fireEvent.scroll(screen.getByTestId('owner-picker-listbox')); + + await waitFor(() => + expect(screen.getByText('some-owner-batch-2')).toBeInTheDocument(), + ); + + [ + 'some-owner-batch-2', + 'some-owner-2-batch-2', + 'test-namespace/another-owner-2-batch-2', + ].forEach(owner => { + expect(screen.getByText(owner)).toBeInTheDocument(); + }); + }); + + it('respects the query parameter filter value', async () => { + const updateFilters = jest.fn(); + const queryParameters = { owners: ['another-owner'] }; + await renderWithEffects( + + + + + , + ); + + expect(updateFilters).toHaveBeenLastCalledWith({ + owners: new EntityOwnerFilter(['group:default/another-owner']), + }); + }); + + it('adds owners to filters', async () => { + const updateFilters = jest.fn(); + await renderWithEffects( + + + + + , + ); + expect(mockedGetEntitiesByRef).not.toHaveBeenCalled(); + expect(updateFilters).toHaveBeenLastCalledWith({ + owners: undefined, + }); + + fireEvent.click(screen.getByTestId('owner-picker-expand')); + await waitFor(() => screen.getByText('some-owner')); + + fireEvent.click(screen.getByText('some-owner')); + expect(updateFilters).toHaveBeenLastCalledWith({ + owners: new EntityOwnerFilter(['group:default/some-owner']), + }); + }); + + it('removes owners from filters', async () => { + const updateFilters = jest.fn(); + await renderWithEffects( + + + + + , + ); + expect(updateFilters).toHaveBeenLastCalledWith({ + owners: new EntityOwnerFilter(['group:default/some-owner']), + }); + fireEvent.click(screen.getByTestId('owner-picker-expand')); + + await waitFor(() => + expect(screen.getByLabelText('some-owner')).toBeChecked(), + ); + + fireEvent.click(screen.getByLabelText('some-owner')); + expect(updateFilters).toHaveBeenLastCalledWith({ + owner: undefined, + }); + }); + + it('responds to external queryParameters changes', async () => { + const updateFilters = jest.fn(); + const rendered = await renderWithEffects( + + + + + , + ); + + expect(updateFilters).toHaveBeenLastCalledWith({ + owners: new EntityOwnerFilter(['group:default/team-a']), + }); + rendered.rerender( + + + + + , + ); + expect(updateFilters).toHaveBeenLastCalledWith({ + owners: new EntityOwnerFilter(['group:default/team-b']), + }); + }); +});