From 033c9573215c5f9ae69f5b4bda69544d4278bdb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 7 Oct 2024 14:17:34 +0200 Subject: [PATCH] use the catalog mock in more tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../CustomizableTemplate.stories.tsx | 7 +- .../templates/DefaultTemplate.stories.tsx | 7 +- .../DefaultApiExplorerPage.test.tsx | 14 +- .../ApisCards/ConsumedApisCard.test.tsx | 6 +- .../components/ApisCards/HasApisCard.test.tsx | 6 +- .../ApisCards/ProvidedApisCard.test.tsx | 6 +- .../ConsumingComponentsCard.test.tsx | 6 +- .../ProvidingComponentsCard.test.tsx | 6 +- .../CatalogAuthResolverContext.test.ts | 21 +-- .../src/api/CatalogImportClient.test.ts | 24 +-- .../DefaultImportPage.test.tsx | 4 +- .../components/ImportPage/ImportPage.test.tsx | 4 +- .../StepPrepareSelectLocations.test.tsx | 14 +- .../EntityAutocompletePicker.test.tsx | 22 +-- .../EntityLifecyclePicker.test.tsx | 10 +- .../EntityNamespacePicker.test.tsx | 40 ++--- .../EntityOwnerPicker.test.tsx | 53 +++---- .../useFacetsEntities.test.ts | 44 +++--- .../useQueryEntities.test.ts | 20 +-- .../EntityPeekAheadPopover.stories.tsx | 17 +-- .../EntityPeekAheadPopover.test.tsx | 36 ++--- .../EntityTagPicker/EntityTagPicker.test.tsx | 36 ++--- .../UnregisterEntityDialog.test.tsx | 16 +- .../UserListPicker/UserListPicker.test.tsx | 10 +- .../useAllEntitiesCount.test.tsx | 15 +- .../useOwnedEntitiesCount.test.tsx | 24 ++- .../useStarredEntitiesCount.test.tsx | 14 +- .../src/hooks/useEntityListProvider.test.tsx | 6 +- .../src/hooks/useEntityOwnership.test.tsx | 15 +- .../DefaultEntityPresentationApi.test.ts | 10 +- .../components/AboutCard/AboutCard.test.tsx | 13 +- .../CatalogPage/DefaultCatalogPage.test.tsx | 10 +- .../DependencyOfComponentsCard.test.tsx | 10 +- .../DependsOnComponentsCard.test.tsx | 10 +- .../DependsOnResourcesCard.test.tsx | 10 +- .../EntityLayout/EntityLayout.test.tsx | 45 ++---- .../DeleteEntityDialog.test.tsx | 6 +- .../EntityProcessingErrorsPanel.test.tsx | 12 +- .../EntityRelationWarning.test.tsx | 21 +-- .../HasComponentsCard.test.tsx | 10 +- .../HasResourcesCard.test.tsx | 10 +- .../HasSubcomponentsCard.test.tsx | 10 +- .../HasSubdomainsCard.test.tsx | 10 +- .../HasSystemsCard/HasSystemsCard.test.tsx | 10 +- .../SystemDiagramCard.test.tsx | 83 +++++------ .../FeaturedDocsCard/Content.test.tsx | 21 +-- .../FeaturedDocsCard.stories.tsx | 9 +- .../StarredEntities/Content.test.tsx | 8 +- .../StarredEntities.stories.tsx | 5 +- .../GroupListPicker/GroupListPicker.test.tsx | 8 +- plugins/org/src/__testUtils__/catalogMocks.ts | 6 +- .../MembersList/MembersListCard.test.tsx | 68 +++++---- .../OwnershipCard/OwnershipCard.test.tsx | 68 ++------- .../MyGroupsSidebarItem.test.tsx | 139 ++++++++---------- plugins/org/src/helpers/helpers.test.ts | 7 +- .../TemplateListPage.test.tsx | 32 ++-- .../ListTasksPage/ListTaskPage.test.tsx | 11 +- .../columns/OwnerEntityColumn.test.tsx | 11 +- .../fields/EntityPicker/EntityPicker.test.tsx | 23 +-- .../MultiEntityPicker.test.tsx | 23 +-- .../MyGroupsPicker/MyGroupsPicker.test.tsx | 6 +- .../fields/OwnerPicker/OwnerPicker.test.tsx | 27 +--- .../components/DefaultTechDocsHome.test.tsx | 28 ++-- .../Grids/EntityListDocsGrid.test.tsx | 13 +- .../components/TechDocsCustomHome.test.tsx | 28 ++-- 65 files changed, 525 insertions(+), 799 deletions(-) diff --git a/packages/app/src/components/home/templates/CustomizableTemplate.stories.tsx b/packages/app/src/components/home/templates/CustomizableTemplate.stories.tsx index 33a1bc2012..eb90b1fe84 100644 --- a/packages/app/src/components/home/templates/CustomizableTemplate.stories.tsx +++ b/packages/app/src/components/home/templates/CustomizableTemplate.stories.tsx @@ -25,6 +25,7 @@ import { entityRouteRef, catalogApiRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; import { configApiRef } from '@backstage/core-plugin-api'; import { ConfigReader } from '@backstage/config'; @@ -67,9 +68,7 @@ const entities = [ }, ]; -const mockCatalogApi = { - getEntities: async () => ({ items: entities }), -}; +const catalogApi = catalogApiMock({ entities }); const starredEntitiesApi = new MockStarredEntitiesApi(); starredEntitiesApi.toggleStarred('component:default/example-starred-entity'); @@ -85,7 +84,7 @@ export default { <> Promise.resolve({ results: [] }) }], [ diff --git a/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx b/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx index 64e6a87f60..cb3d684389 100644 --- a/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx +++ b/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx @@ -29,6 +29,7 @@ import { entityRouteRef, catalogApiRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { configApiRef } from '@backstage/core-plugin-api'; import { ConfigReader } from '@backstage/config'; import { HomePageSearchBar, searchPlugin } from '@backstage/plugin-search'; @@ -74,9 +75,7 @@ const entities = [ }, ]; -const mockCatalogApi = { - getEntities: async () => ({ items: entities }), -}; +const catalogApi = catalogApiMock({ entities }); const starredEntitiesApi = new MockStarredEntitiesApi(); starredEntitiesApi.toggleStarred('component:default/example-starred-entity'); @@ -92,7 +91,7 @@ export default { <> Promise.resolve({ results: [] }) }], [ diff --git a/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx b/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx index 7938770c4c..b8d8b07436 100644 --- a/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx +++ b/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx @@ -16,21 +16,17 @@ import { ConfigReader } from '@backstage/core-app-api'; import { TableColumn, TableProps } from '@backstage/core-components'; -import { - ConfigApi, - configApiRef, - storageApiRef, -} from '@backstage/core-plugin-api'; +import { configApiRef, storageApiRef } from '@backstage/core-plugin-api'; import { CatalogTableRow, DefaultStarredEntitiesApi, } from '@backstage/plugin-catalog'; import { - CatalogApi, catalogApiRef, entityRouteRef, starredEntitiesApiRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { MockPermissionApi, MockStorageApi, @@ -45,7 +41,7 @@ import { DefaultApiExplorerPage } from './DefaultApiExplorerPage'; import { permissionApiRef } from '@backstage/plugin-permission-react'; describe('DefaultApiExplorerPage', () => { - const catalogApi: Partial = { + const catalogApi = catalogApiMock.mock({ getEntities: () => Promise.resolve({ items: [ @@ -74,9 +70,9 @@ describe('DefaultApiExplorerPage', () => { pageInfo: {}, totalItems: 0, }), - }; + }); - const configApi: ConfigApi = new ConfigReader({ + const configApi = new ConfigReader({ organization: { name: 'My Company', }, diff --git a/plugins/api-docs/src/components/ApisCards/ConsumedApisCard.test.tsx b/plugins/api-docs/src/components/ApisCards/ConsumedApisCard.test.tsx index 95e279bad5..7ee4e9db97 100644 --- a/plugins/api-docs/src/components/ApisCards/ConsumedApisCard.test.tsx +++ b/plugins/api-docs/src/components/ApisCards/ConsumedApisCard.test.tsx @@ -16,11 +16,11 @@ import { Entity, RELATION_CONSUMES_API } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { waitFor } from '@testing-library/react'; import React from 'react'; @@ -31,9 +31,7 @@ describe('', () => { const apiDocsConfig: jest.Mocked = { getApiDefinitionWidget: jest.fn(), } as any; - const catalogApi: jest.Mocked = { - getEntitiesByRefs: jest.fn(), - } as any; + const catalogApi = catalogApiMock.mock(); let Wrapper: React.ComponentType>; beforeEach(() => { diff --git a/plugins/api-docs/src/components/ApisCards/HasApisCard.test.tsx b/plugins/api-docs/src/components/ApisCards/HasApisCard.test.tsx index 169311d0c8..01f86364c4 100644 --- a/plugins/api-docs/src/components/ApisCards/HasApisCard.test.tsx +++ b/plugins/api-docs/src/components/ApisCards/HasApisCard.test.tsx @@ -16,7 +16,6 @@ import { Entity, RELATION_HAS_PART } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, @@ -26,14 +25,13 @@ import { waitFor } from '@testing-library/react'; import React from 'react'; import { ApiDocsConfig, apiDocsConfigRef } from '../../config'; import { HasApisCard } from './HasApisCard'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; describe('', () => { const apiDocsConfig: jest.Mocked = { getApiDefinitionWidget: jest.fn(), } as any; - const catalogApi: jest.Mocked = { - getEntitiesByRefs: jest.fn(), - } as any; + const catalogApi = catalogApiMock.mock(); let Wrapper: React.ComponentType>; beforeEach(() => { diff --git a/plugins/api-docs/src/components/ApisCards/ProvidedApisCard.test.tsx b/plugins/api-docs/src/components/ApisCards/ProvidedApisCard.test.tsx index 8c4f7dd26b..badc5a6a00 100644 --- a/plugins/api-docs/src/components/ApisCards/ProvidedApisCard.test.tsx +++ b/plugins/api-docs/src/components/ApisCards/ProvidedApisCard.test.tsx @@ -16,7 +16,6 @@ import { Entity, RELATION_PROVIDES_API } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, @@ -26,14 +25,13 @@ import { waitFor } from '@testing-library/react'; import React from 'react'; import { ApiDocsConfig, apiDocsConfigRef } from '../../config'; import { ProvidedApisCard } from './ProvidedApisCard'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; describe('', () => { const apiDocsConfig: jest.Mocked = { getApiDefinitionWidget: jest.fn(), } as any; - const catalogApi: jest.Mocked = { - getEntitiesByRefs: jest.fn(), - } as any; + const catalogApi = catalogApiMock.mock(); let Wrapper: React.ComponentType>; beforeEach(() => { diff --git a/plugins/api-docs/src/components/ComponentsCards/ConsumingComponentsCard.test.tsx b/plugins/api-docs/src/components/ComponentsCards/ConsumingComponentsCard.test.tsx index 20a60562b0..fe29c94793 100644 --- a/plugins/api-docs/src/components/ComponentsCards/ConsumingComponentsCard.test.tsx +++ b/plugins/api-docs/src/components/ComponentsCards/ConsumingComponentsCard.test.tsx @@ -16,20 +16,18 @@ import { Entity, RELATION_API_CONSUMED_BY } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { waitFor } from '@testing-library/react'; import React from 'react'; import { ConsumingComponentsCard } from './ConsumingComponentsCard'; describe('', () => { - const catalogApi: jest.Mocked = { - getEntitiesByRefs: jest.fn(), - } as any; + const catalogApi = catalogApiMock.mock(); let Wrapper: React.ComponentType>; beforeEach(() => { diff --git a/plugins/api-docs/src/components/ComponentsCards/ProvidingComponentsCard.test.tsx b/plugins/api-docs/src/components/ComponentsCards/ProvidingComponentsCard.test.tsx index 0801d7103a..5ec7d623d4 100644 --- a/plugins/api-docs/src/components/ComponentsCards/ProvidingComponentsCard.test.tsx +++ b/plugins/api-docs/src/components/ComponentsCards/ProvidingComponentsCard.test.tsx @@ -16,7 +16,6 @@ import { Entity, RELATION_API_PROVIDED_BY } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, @@ -25,11 +24,10 @@ import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { waitFor } from '@testing-library/react'; import React from 'react'; import { ProvidingComponentsCard } from './ProvidingComponentsCard'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; describe('', () => { - const catalogApi: jest.Mocked = { - getEntitiesByRefs: jest.fn(), - } as any; + const catalogApi = catalogApiMock.mock(); let Wrapper: React.ComponentType>; beforeEach(() => { diff --git a/plugins/auth-backend/src/lib/resolvers/CatalogAuthResolverContext.test.ts b/plugins/auth-backend/src/lib/resolvers/CatalogAuthResolverContext.test.ts index 7fb759200c..a1ca3c53ac 100644 --- a/plugins/auth-backend/src/lib/resolvers/CatalogAuthResolverContext.test.ts +++ b/plugins/auth-backend/src/lib/resolvers/CatalogAuthResolverContext.test.ts @@ -15,34 +15,37 @@ */ import { CatalogAuthResolverContext } from './CatalogAuthResolverContext'; -import { CatalogApi } from '@backstage/catalog-client'; import { mockServices } from '@backstage/backend-test-utils'; import { TokenIssuer } from '../../identity/types'; import { DiscoveryService } from '@backstage/backend-plugin-api'; +import { catalogServiceMock } from '@backstage/plugin-catalog-node/testUtils'; +import { NotFoundError } from '@backstage/errors'; describe('CatalogAuthResolverContext', () => { beforeEach(() => { jest.clearAllMocks(); }); - const mockCatalogApi = { - getEntities: jest.fn().mockResolvedValue({ items: [{}] }), - } as Partial>; + const catalogApi = catalogServiceMock.mock({ + getEntities: jest.fn().mockResolvedValue({ items: [] }), + }); it('adds kind to filter when missing', async () => { const context = CatalogAuthResolverContext.create({ logger: mockServices.logger.mock(), - catalogApi: mockCatalogApi as CatalogApi, + catalogApi, tokenIssuer: {} as TokenIssuer, discovery: {} as DiscoveryService, auth: mockServices.auth(), httpAuth: mockServices.httpAuth(), }); - await context.findCatalogUser({ - filter: [{}, { kind: 'group' }, { KIND: 'USER' }], - }); - expect(mockCatalogApi.getEntities).toHaveBeenCalledWith( + await expect( + context.findCatalogUser({ + filter: [{}, { kind: 'group' }, { KIND: 'USER' }], + }), + ).rejects.toThrow(NotFoundError); + expect(catalogApi.getEntities).toHaveBeenCalledWith( { filter: [{ kind: 'user' }, { kind: 'group' }, { KIND: 'USER' }], }, diff --git a/plugins/catalog-import/src/api/CatalogImportClient.test.ts b/plugins/catalog-import/src/api/CatalogImportClient.test.ts index fa646e3ca4..fb78066ac0 100644 --- a/plugins/catalog-import/src/api/CatalogImportClient.test.ts +++ b/plugins/catalog-import/src/api/CatalogImportClient.test.ts @@ -56,7 +56,7 @@ jest.mock('./AzureRepoApiClient', () => { import { ConfigReader, UrlPatternDiscovery } from '@backstage/core-app-api'; import { ScmIntegrations } from '@backstage/integration'; import { ScmAuthApi } from '@backstage/integration-react'; -import { CatalogApi } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { MockFetchApi, registerMswTestHooks } from '@backstage/test-utils'; import { Octokit } from '@octokit/rest'; import { rest } from 'msw'; @@ -94,19 +94,7 @@ describe('CatalogImportClient', () => { }), ); - const catalogApi = { - getEntities: jest.fn(), - addLocation: jest.fn(), - removeLocationById: jest.fn(), - getEntityByRef: jest.fn(), - getLocationByRef: jest.fn(), - getLocationById: jest.fn(), - removeEntityByUid: jest.fn(), - refreshEntity: jest.fn(), - getEntityAncestors: jest.fn(), - getEntityFacets: jest.fn(), - validateEntity: jest.fn(), - }; + const catalogApi = catalogApiMock.mock(); let catalogImportClient: CatalogImportClient; @@ -116,7 +104,7 @@ describe('CatalogImportClient', () => { scmAuthApi, scmIntegrationsApi, fetchApi, - catalogApi: catalogApi as Partial as CatalogApi, + catalogApi: catalogApi, configApi: new ConfigReader({ app: { baseUrl: 'https://demo.backstage.io/', @@ -462,7 +450,7 @@ describe('CatalogImportClient', () => { scmAuthApi, scmIntegrationsApi, fetchApi, - catalogApi: catalogApi as Partial as CatalogApi, + catalogApi: catalogApi, configApi: new ConfigReader({ catalog: { import: { @@ -720,7 +708,7 @@ describe('CatalogImportClient', () => { scmAuthApi, scmIntegrationsApi, fetchApi, - catalogApi: catalogApi as Partial as CatalogApi, + catalogApi: catalogApi, configApi: new ConfigReader({ catalog: { import: { @@ -806,7 +794,7 @@ describe('CatalogImportClient', () => { scmAuthApi, scmIntegrationsApi, fetchApi, - catalogApi: catalogApi as Partial as CatalogApi, + catalogApi: catalogApi, configApi: new ConfigReader({ catalog: { import: { diff --git a/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.test.tsx b/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.test.tsx index 929594f22a..0e9378543e 100644 --- a/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.test.tsx +++ b/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.test.tsx @@ -14,10 +14,10 @@ * limitations under the License. */ -import { CatalogClient } from '@backstage/catalog-client'; import { ApiProvider, ConfigReader } from '@backstage/core-app-api'; import { configApiRef } from '@backstage/core-plugin-api'; import { catalogApiRef } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; import { screen } from '@testing-library/react'; import React from 'react'; @@ -34,7 +34,7 @@ describe('', () => { beforeEach(() => { apis = TestApiRegistry.from( [configApiRef, new ConfigReader({ integrations: {} })], - [catalogApiRef, new CatalogClient({ discoveryApi: {} as any })], + [catalogApiRef, catalogApiMock()], [ catalogImportApiRef, new CatalogImportClient({ diff --git a/plugins/catalog-import/src/components/ImportPage/ImportPage.test.tsx b/plugins/catalog-import/src/components/ImportPage/ImportPage.test.tsx index e1c4edb896..3f6efeb685 100644 --- a/plugins/catalog-import/src/components/ImportPage/ImportPage.test.tsx +++ b/plugins/catalog-import/src/components/ImportPage/ImportPage.test.tsx @@ -14,10 +14,10 @@ * limitations under the License. */ -import { CatalogClient } from '@backstage/catalog-client'; import { ApiProvider, ConfigReader } from '@backstage/core-app-api'; import { FetchApi, configApiRef } from '@backstage/core-plugin-api'; import { catalogApiRef } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; import { screen } from '@testing-library/react'; import React from 'react'; @@ -40,7 +40,7 @@ describe('', () => { beforeEach(() => { apis = TestApiRegistry.from( [configApiRef, new ConfigReader({ integrations: {} })], - [catalogApiRef, new CatalogClient({ discoveryApi: {} as any })], + [catalogApiRef, catalogApiMock()], [ catalogImportApiRef, new CatalogImportClient({ diff --git a/plugins/catalog-import/src/components/StepPrepareSelectLocations/StepPrepareSelectLocations.test.tsx b/plugins/catalog-import/src/components/StepPrepareSelectLocations/StepPrepareSelectLocations.test.tsx index e5a4174859..88b26b737a 100644 --- a/plugins/catalog-import/src/components/StepPrepareSelectLocations/StepPrepareSelectLocations.test.tsx +++ b/plugins/catalog-import/src/components/StepPrepareSelectLocations/StepPrepareSelectLocations.test.tsx @@ -21,15 +21,13 @@ import React from 'react'; import { AnalyzeResult } from '../../api'; import { StepPrepareSelectLocations } from './StepPrepareSelectLocations'; import { - CatalogApi, catalogApiRef, entityPresentationApiRef, } from '@backstage/plugin-catalog-react'; import { DefaultEntityPresentationApi } from '@backstage/plugin-catalog'; -import { Entity } from '@backstage/catalog-model'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; describe('', () => { - let entities: Entity[]; const analyzeResult = { type: 'locations', locations: [ @@ -61,19 +59,11 @@ describe('', () => { ], } as Extract; - const catalogApi: jest.Mocked = { - getLocationById: jest.fn(), - getEntityByName: jest.fn(), - getEntities: jest.fn(async () => ({ items: entities })), - addLocation: jest.fn(), - getLocationByRef: jest.fn(), - removeEntityByUid: jest.fn(), - } as any; + const catalogApi = catalogApiMock(); let Wrapper: React.ComponentType>; beforeEach(() => { jest.resetAllMocks(); - catalogApi.getEntities.mockResolvedValue({ items: entities }); Wrapper = ({ children }: { children?: React.ReactNode }) => ( > => { - return { +function makeMockCatalogApi(opts: string[] = defaultOptions) { + return catalogApiMock.mock({ getEntityFacets: jest.fn().mockResolvedValue({ facets: { 'spec.options': opts.map((value, idx) => ({ value, count: idx })), }, }), - }; -}; + }); +} describe('', () => { beforeEach(() => { @@ -64,9 +64,9 @@ describe('', () => { }); it('renders all options', async () => { - const mockCatalogApi = makeMockCatalogApi(); + const catalogApi = makeMockCatalogApi(); render( - + label="Options" @@ -82,7 +82,7 @@ describe('', () => { ); // should have called catalog backend without any filters applied - expect(mockCatalogApi.getEntityFacets).toHaveBeenCalledWith({ + expect(catalogApi.getEntityFacets).toHaveBeenCalledWith({ facets: ['spec.options'], filter: {}, }); diff --git a/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.test.tsx b/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.test.tsx index 701e1047c9..77a47185bb 100644 --- a/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.test.tsx @@ -16,17 +16,17 @@ import { fireEvent, screen, waitFor } from '@testing-library/react'; import React from 'react'; -import { MockEntityListContextProvider } from '@backstage/plugin-catalog-react/testUtils'; +import { + MockEntityListContextProvider, + catalogApiMock, +} from '@backstage/plugin-catalog-react/testUtils'; import { EntityLifecycleFilter } from '../../filters'; import { EntityLifecyclePicker } from './EntityLifecyclePicker'; import { TestApiProvider, renderInTestApp } from '@backstage/test-utils'; import { catalogApiRef } from '../../api'; -import { CatalogApi } from '@backstage/catalog-client'; describe('', () => { - const catalogApi = { - getEntityFacets: jest.fn(), - } as unknown as jest.Mocked; + const catalogApi = catalogApiMock.mock(); beforeEach(() => { catalogApi.getEntityFacets.mockResolvedValue({ diff --git a/plugins/catalog-react/src/components/EntityNamespacePicker/EntityNamespacePicker.test.tsx b/plugins/catalog-react/src/components/EntityNamespacePicker/EntityNamespacePicker.test.tsx index 5253dfae28..dfd1636939 100644 --- a/plugins/catalog-react/src/components/EntityNamespacePicker/EntityNamespacePicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityNamespacePicker/EntityNamespacePicker.test.tsx @@ -16,17 +16,19 @@ import { fireEvent, screen, waitFor } from '@testing-library/react'; import React from 'react'; -import { MockEntityListContextProvider } from '@backstage/plugin-catalog-react/testUtils'; +import { + MockEntityListContextProvider, + catalogApiMock, +} from '@backstage/plugin-catalog-react/testUtils'; import { EntityNamespaceFilter } from '../../filters'; import { EntityNamespacePicker } from './EntityNamespacePicker'; import { TestApiProvider, renderInTestApp } from '@backstage/test-utils'; import { catalogApiRef } from '../../api'; -import { CatalogApi } from '@backstage/catalog-client'; const namespaces = ['namespace-1', 'namespace-2', 'namespace-3']; describe('', () => { - const mockCatalogApiRef = { + const catalogApi = catalogApiMock.mock({ getEntityFacets: async () => ({ facets: { 'metadata.namespace': namespaces.map((value, idx) => ({ @@ -35,11 +37,11 @@ describe('', () => { })), }, }), - } as unknown as CatalogApi; + }); it('renders all namespaces', async () => { await renderInTestApp( - + @@ -57,7 +59,7 @@ describe('', () => { it('renders unique namespaces in alphabetical order', async () => { await renderInTestApp( - + @@ -80,7 +82,7 @@ describe('', () => { const updateFilters = jest.fn(); const queryParameters = { namespace: ['namespace-1'] }; await renderInTestApp( - + ', () => { it('adds namespaces to filters', async () => { const updateFilters = jest.fn(); await renderInTestApp( - + ', () => { it('removes namespaces from filters', async () => { const updateFilters = jest.fn(); await renderInTestApp( - + ', () => { it('responds to external queryParameters changes', async () => { const updateFilters = jest.fn(); const rendered = await renderInTestApp( - + ', () => { }), ); rendered.rerender( - + ', () => { }); it('removes namespaces from filters if there are no available namespaces', async () => { const updateFilters = jest.fn(); - const mockCatalogApiRefNoNamespace = { + const mockCatalogApiRefNoNamespace = catalogApiMock.mock({ getEntityFacets: async () => ({ facets: { - 'metadata.namespace': {}, + 'metadata.namespace': [], }, }), - } as unknown as CatalogApi; + }); await renderInTestApp( @@ -217,7 +219,7 @@ describe('', () => { }); it('namespace picker is visible if there are only 1 available option', async () => { const defaultNamespaces = ['default', 'default', 'default']; - const mockCatalogApiRefDefaultNamespace = { + const mockCatalogApiRefDefaultNamespace = catalogApiMock.mock({ getEntityFacets: async () => ({ facets: { 'metadata.namespace': defaultNamespaces.map((value, idx) => ({ @@ -226,7 +228,7 @@ describe('', () => { })), }, }), - } as unknown as CatalogApi; + }); await renderInTestApp( ', () => { ); }); it('namespace picker is invisible if there is zero available option', async () => { - const mockCatalogApiRefDefaultNamespace = { + const mockCatalogApiRefDefaultNamespace = catalogApiMock.mock({ getEntityFacets: async () => ({ facets: { 'metadata.namespace': [], }, }), - } as unknown as CatalogApi; + }); await renderInTestApp( ', () => { }); it('renders initially selected namespaces', async () => { renderInTestApp( - + = - jest.fn(); - -const mockedGetEntitiesByRef: jest.MockedFn = - jest.fn(); - -const mockedGetEntityFacets: jest.MockedFn = - jest.fn(); - -const mockCatalogApi: Partial = { - queryEntities: mockedQueryEntities, - getEntitiesByRefs: mockedGetEntitiesByRef, - getEntityFacets: mockedGetEntityFacets, -}; - +const mockCatalogApi = catalogApiMock.mock(); const mockErrorApi = new MockErrorApi(); describe('', () => { @@ -134,7 +123,7 @@ describe('', () => { beforeEach(() => { jest.resetAllMocks(); - mockedQueryEntities.mockImplementation(async request => { + mockCatalogApi.queryEntities.mockImplementation(async request => { const totalItems = ownerEntitiesBatch1.length + ownerEntitiesBatch2.length; if ((request as QueryEntitiesCursorRequest).cursor) { @@ -178,8 +167,8 @@ describe('', () => { expect(screen.getByText(owner)).toBeInTheDocument(); }); - expect(mockedQueryEntities).toHaveBeenCalledTimes(1); - expect(mockedGetEntitiesByRef).not.toHaveBeenCalled(); + expect(mockCatalogApi.queryEntities).toHaveBeenCalledTimes(1); + expect(mockCatalogApi.getEntitiesByRefs).not.toHaveBeenCalled(); fireEvent.scroll(screen.getByTestId('owner-picker-listbox')); @@ -195,7 +184,7 @@ describe('', () => { expect(screen.getByText(owner)).toBeInTheDocument(); }); - expect(mockedQueryEntities).toHaveBeenCalledTimes(2); + expect(mockCatalogApi.queryEntities).toHaveBeenCalledTimes(2); }); it('respects the query parameter filter value', async () => { @@ -214,7 +203,7 @@ describe('', () => { , ); - expect(mockedGetEntitiesByRef).toHaveBeenCalledWith({ + expect(mockCatalogApi.getEntitiesByRefs).toHaveBeenCalledWith({ entityRefs: ['another-owner'], }); expect(updateFilters).toHaveBeenLastCalledWith({ @@ -226,7 +215,7 @@ describe('', () => { const updateFilters = jest.fn(); const queryParameters = { owners: ['another-owner'] }; - mockedGetEntitiesByRef.mockResolvedValue({ + mockCatalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { metadata: { @@ -260,7 +249,7 @@ describe('', () => { ).toBeInTheDocument(), ); - expect(mockedGetEntitiesByRef).toHaveBeenCalledWith({ + expect(mockCatalogApi.getEntitiesByRefs).toHaveBeenCalledWith({ entityRefs: ['another-owner'], }); @@ -268,7 +257,7 @@ describe('', () => { await waitFor(() => screen.getByText('Some Owner 2')); fireEvent.click(screen.getByText('Some Owner 2')); - expect(mockedGetEntitiesByRef).toHaveBeenCalledTimes(1); + expect(mockCatalogApi.getEntitiesByRefs).toHaveBeenCalledTimes(1); await waitFor(() => expect( @@ -292,7 +281,7 @@ describe('', () => { , ); - expect(mockedGetEntitiesByRef).not.toHaveBeenCalled(); + expect(mockCatalogApi.getEntitiesByRefs).not.toHaveBeenCalled(); expect(updateFilters).toHaveBeenLastCalledWith({ owners: undefined, }); @@ -320,7 +309,7 @@ describe('', () => { , ); - expect(mockedGetEntitiesByRef).toHaveBeenCalledWith({ + expect(mockCatalogApi.getEntitiesByRefs).toHaveBeenCalledWith({ entityRefs: ['group:default/some-owner'], }); expect(updateFilters).toHaveBeenLastCalledWith({ @@ -352,7 +341,7 @@ describe('', () => { , ); - expect(mockedGetEntitiesByRef).toHaveBeenCalledWith({ + expect(mockCatalogApi.getEntitiesByRefs).toHaveBeenCalledWith({ entityRefs: ['team-a'], }); expect(updateFilters).toHaveBeenLastCalledWith({ @@ -385,7 +374,7 @@ describe('', () => { beforeEach(() => { jest.resetAllMocks(); - mockedGetEntityFacets.mockResolvedValue({ + mockCatalogApi.getEntityFacets.mockResolvedValue({ facets: { 'relations.ownedBy': [ ...[...ownerEntitiesBatch1, ...ownerEntitiesBatch2].map(o => ({ @@ -396,7 +385,7 @@ describe('', () => { }, }); - mockedGetEntitiesByRef.mockResolvedValue({ + mockCatalogApi.getEntitiesByRefs.mockResolvedValue({ items: [...ownerEntitiesBatch1, ...ownerEntitiesBatch2], }); }); @@ -425,7 +414,7 @@ describe('', () => { expect(screen.getByText(owner)).toBeInTheDocument(); }); - expect(mockedGetEntityFacets).toHaveBeenCalledTimes(1); + expect(mockCatalogApi.getEntityFacets).toHaveBeenCalledTimes(1); fireEvent.scroll(screen.getByTestId('owner-picker-listbox')); @@ -476,7 +465,7 @@ describe('', () => { , ); - expect(mockedGetEntitiesByRef).toHaveBeenCalledWith({ + expect(mockCatalogApi.getEntitiesByRefs).toHaveBeenCalledWith({ entityRefs: [...ownerEntitiesBatch1, ...ownerEntitiesBatch2].map(entity => stringifyEntityRef(entity), ), diff --git a/plugins/catalog-react/src/components/EntityOwnerPicker/useFacetsEntities.test.ts b/plugins/catalog-react/src/components/EntityOwnerPicker/useFacetsEntities.test.ts index 1d9eaa8af7..a3901825b3 100644 --- a/plugins/catalog-react/src/components/EntityOwnerPicker/useFacetsEntities.test.ts +++ b/plugins/catalog-react/src/components/EntityOwnerPicker/useFacetsEntities.test.ts @@ -13,21 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { renderHook, waitFor } from '@testing-library/react'; import { useFacetsEntities } from './useFacetsEntities'; -import { CatalogApi } from '@backstage/catalog-client'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { Entity, parseEntityRef } from '@backstage/catalog-model'; -const mockedGetEntityFacets: jest.MockedFn = - jest.fn(); - -const mockedGetEntitiesByRefs: jest.MockedFn = - jest.fn(); - -const mockCatalogApi: Partial = { - getEntityFacets: mockedGetEntityFacets, - getEntitiesByRefs: mockedGetEntitiesByRefs, -}; +const mockCatalogApi = catalogApiMock.mock(); jest.mock('@backstage/core-plugin-api', () => ({ ...jest.requireActual('@backstage/core-plugin-api'), @@ -65,16 +57,16 @@ describe('useFacetsEntities', () => { }); it(`should return empty items when facets are loading`, () => { - mockedGetEntityFacets.mockReturnValue(new Promise(() => {})); + mockCatalogApi.getEntityFacets.mockReturnValue(new Promise(() => {})); const { result } = renderHook(() => useFacetsEntities({ enabled: true })); expect(result.current[0]).toEqual({ value: { items: [] }, loading: true }); }); it(`should return empty response when facet is not present`, async () => { - mockedGetEntityFacets.mockResolvedValueOnce({ + mockCatalogApi.getEntityFacets.mockResolvedValueOnce({ facets: { 'metadata.tags': [{ value: 'tag', count: 1 }] }, }); - mockedGetEntitiesByRefs.mockResolvedValueOnce({ items: [] }); + mockCatalogApi.getEntitiesByRefs.mockResolvedValueOnce({ items: [] }); const { result } = renderHook(() => useFacetsEntities({ enabled: true })); result.current[1]({ text: '' }); await waitFor(() => { @@ -87,8 +79,10 @@ describe('useFacetsEntities', () => { it(`should return the owners`, async () => { const entityRefs = ['component:default/e1', 'component:default/e2']; - mockedGetEntityFacets.mockResolvedValue(facetsFromEntityRefs(entityRefs)); - mockedGetEntitiesByRefs.mockResolvedValue( + mockCatalogApi.getEntityFacets.mockResolvedValue( + facetsFromEntityRefs(entityRefs), + ); + mockCatalogApi.getEntitiesByRefs.mockResolvedValue( entitiesFromEntityRefs(entityRefs), ); @@ -152,8 +146,10 @@ describe('useFacetsEntities', () => { }, }; - mockedGetEntityFacets.mockResolvedValue(facetsFromEntityRefs(entityRefs)); - mockedGetEntitiesByRefs.mockResolvedValue( + mockCatalogApi.getEntityFacets.mockResolvedValue( + facetsFromEntityRefs(entityRefs), + ); + mockCatalogApi.getEntitiesByRefs.mockResolvedValue( entitiesFromEntityRefs(entityRefs, enrichedEntities), ); @@ -225,8 +221,10 @@ describe('useFacetsEntities', () => { 'component:default/b', ]; - mockedGetEntityFacets.mockResolvedValue(facetsFromEntityRefs(entityRefs)); - mockedGetEntitiesByRefs.mockResolvedValue( + mockCatalogApi.getEntityFacets.mockResolvedValue( + facetsFromEntityRefs(entityRefs), + ); + mockCatalogApi.getEntitiesByRefs.mockResolvedValue( entitiesFromEntityRefs(entityRefs), ); @@ -336,7 +334,9 @@ describe('useFacetsEntities', () => { 'component:default/nade', ]; - mockedGetEntityFacets.mockResolvedValue(facetsFromEntityRefs(entityRefs)); + mockCatalogApi.getEntityFacets.mockResolvedValue( + facetsFromEntityRefs(entityRefs), + ); const enrichedEntities: { [key: string]: Entity } = { 'group:default/go': { apiVersion: 'backstage.io/v1beta1', @@ -352,7 +352,7 @@ describe('useFacetsEntities', () => { }, }, }; - mockedGetEntitiesByRefs.mockResolvedValue( + mockCatalogApi.getEntitiesByRefs.mockResolvedValue( entitiesFromEntityRefs(entityRefs, enrichedEntities), ); diff --git a/plugins/catalog-react/src/components/EntityOwnerPicker/useQueryEntities.test.ts b/plugins/catalog-react/src/components/EntityOwnerPicker/useQueryEntities.test.ts index 64cc7769a6..2dd905a6e8 100644 --- a/plugins/catalog-react/src/components/EntityOwnerPicker/useQueryEntities.test.ts +++ b/plugins/catalog-react/src/components/EntityOwnerPicker/useQueryEntities.test.ts @@ -13,16 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { renderHook, waitFor } from '@testing-library/react'; -import { CatalogApi } from '@backstage/catalog-client'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { useQueryEntities } from './useQueryEntities'; -const mockedQueryEntities: jest.MockedFn = - jest.fn(); - -const mockCatalogApi: Partial = { - queryEntities: mockedQueryEntities, -}; +const mockCatalogApi = catalogApiMock.mock(); jest.mock('@backstage/core-plugin-api', () => ({ ...jest.requireActual('@backstage/core-plugin-api'), @@ -35,18 +31,18 @@ describe('useQueryEntities', () => { }); it(`should not invoke queryEntities on mount`, () => { - mockedQueryEntities.mockResolvedValue({ + mockCatalogApi.queryEntities.mockResolvedValue({ items: [], pageInfo: {}, totalItems: 0, }); renderHook(() => useQueryEntities()); - expect(mockedQueryEntities).not.toHaveBeenCalled(); + expect(mockCatalogApi.queryEntities).not.toHaveBeenCalled(); }); it(`should fetch the data accordingly`, async () => { - mockedQueryEntities + mockCatalogApi.queryEntities .mockResolvedValueOnce({ items: [ { apiVersion: '1', kind: 'kind', metadata: { name: 'name-1' } }, @@ -74,7 +70,7 @@ describe('useQueryEntities', () => { cursor: 'next', }), ); - expect(mockedQueryEntities).toHaveBeenCalledWith({ + expect(mockCatalogApi.queryEntities).toHaveBeenCalledWith({ filter: { kind: ['User', 'Group'] }, fullTextFilter: { fields: [ @@ -98,7 +94,7 @@ describe('useQueryEntities', () => { ], }), ); - expect(mockedQueryEntities).toHaveBeenCalledWith({ + expect(mockCatalogApi.queryEntities).toHaveBeenCalledWith({ cursor: 'next', limit: 20, }); diff --git a/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.stories.tsx b/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.stories.tsx index d50fdc964b..72480cc72a 100644 --- a/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.stories.tsx +++ b/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.stories.tsx @@ -24,15 +24,16 @@ import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; import { catalogApiRef } from '../../api'; import { CompoundEntityRef, + Entity, parseEntityRef, stringifyEntityRef, } from '@backstage/catalog-model'; import { entityRouteRef } from '../../routes'; -import { CatalogApi } from '@backstage/catalog-client'; import { Table, TableColumn } from '@backstage/core-components'; import { EntityRefLink } from '../EntityRefLink'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; -const mockCatalogApi = { +const mockCatalogApi = catalogApiMock.mock({ getEntityByRef: async (entityRef: string) => { if (entityRef === 'component:default/playback') { return { @@ -42,7 +43,7 @@ const mockCatalogApi = { namespace: 'default', description: 'Details about the playback service', }, - }; + } as unknown as Entity; } if (entityRef === 'user:default/fname.lname') { return { @@ -56,7 +57,7 @@ const mockCatalogApi = { email: 'fname.lname@example.com', }, }, - }; + } as unknown as Entity; } if (entityRef === 'component:default/slow.catalog.item') { await new Promise(resolve => setTimeout(resolve, 3000)); @@ -67,11 +68,11 @@ const mockCatalogApi = { namespace: 'default', description: 'Details about the slow.catalog.item service', }, - }; + } as unknown as Entity; } return undefined; }, -}; +}); const defaultArgs = { entityRef: 'component:default/playback', @@ -83,9 +84,7 @@ export default { (Story: ComponentType>) => wrapInTestApp( <> - + , diff --git a/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.test.tsx b/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.test.tsx index 41df859916..b129d42402 100644 --- a/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.test.tsx +++ b/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.test.tsx @@ -20,30 +20,26 @@ import React from 'react'; import { EntityPeekAheadPopover } from './EntityPeekAheadPopover'; import { ApiProvider } from '@backstage/core-app-api'; import { TestApiRegistry, renderInTestApp } from '@backstage/test-utils'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { catalogApiRef } from '../../api'; -import { Entity } from '@backstage/catalog-model'; -import { CatalogApi } from '@backstage/catalog-client'; import Button from '@material-ui/core/Button'; import { entityRouteRef } from '../../routes'; -const catalogApi: Partial = { - getEntityByRef: async (entityRef: string): Promise => { - if (entityRef === 'component:default/service1') { - return { - apiVersion: '', - kind: 'Component', - metadata: { - namespace: 'default', - name: 'service1', - }, - spec: { - tags: ['java'], - }, - }; - } - return undefined; - }, -}; +const catalogApi = catalogApiMock({ + entities: [ + { + apiVersion: '', + kind: 'Component', + metadata: { + namespace: 'default', + name: 'service1', + }, + spec: { + tags: ['java'], + }, + }, + ], +}); const apis = TestApiRegistry.from([catalogApiRef, catalogApi]); diff --git a/plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.test.tsx b/plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.test.tsx index 9b7fa2d2a3..ca0c242b8b 100644 --- a/plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.test.tsx @@ -16,27 +16,29 @@ import { fireEvent, waitFor, screen, act } from '@testing-library/react'; import React from 'react'; -import { MockEntityListContextProvider } from '@backstage/plugin-catalog-react/testUtils'; +import { + MockEntityListContextProvider, + catalogApiMock, +} from '@backstage/plugin-catalog-react/testUtils'; import { EntityTagFilter } from '../../filters'; import { EntityTagPicker } from './EntityTagPicker'; import { TestApiProvider, renderInTestApp } from '@backstage/test-utils'; import { catalogApiRef } from '../../api'; -import { CatalogApi } from '@backstage/catalog-client'; const tags = ['tag1', 'tag2', 'tag3', 'tag4']; describe('', () => { - const mockCatalogApiRef = { + const catalogApi = catalogApiMock.mock({ getEntityFacets: async () => ({ facets: { 'metadata.tags': tags.map((value, idx) => ({ value, count: idx })), }, }), - } as unknown as CatalogApi; + }); it('renders all tags', async () => { await renderInTestApp( - + @@ -52,7 +54,7 @@ describe('', () => { it('renders unique tags in alphabetical order', async () => { await renderInTestApp( - + @@ -72,7 +74,7 @@ describe('', () => { it('renders tags with counts', async () => { await renderInTestApp( - + @@ -94,7 +96,7 @@ describe('', () => { const updateFilters = jest.fn(); const queryParameters = { tags: ['tag3'] }; await renderInTestApp( - + ', () => { it('adds tags to filters', async () => { const updateFilters = jest.fn(); await renderInTestApp( - + ', () => { it('removes tags from filters', async () => { const updateFilters = jest.fn(); await renderInTestApp( - + ', () => { it('responds to external queryParameters changes', async () => { const updateFilters = jest.fn(); const rendered = await renderInTestApp( - + ', () => { }), ); rendered.rerender( - + ', () => { it('verify that user can select tags after query string has been set', async () => { const updateFilters = jest.fn(); await renderInTestApp( - + ', () => { it('removes tags from filters if there are none available', async () => { const updateFilters = jest.fn(); - const mockCatalogApiRefNoTags = { + const mockCatalogApiRefNoTags = catalogApiMock.mock({ getEntityFacets: async () => ({ - facets: { - 'metadata.tags': {}, - }, + facets: {}, }), - } as unknown as CatalogApi; + }); await renderInTestApp( diff --git a/plugins/catalog-react/src/components/UnregisterEntityDialog/UnregisterEntityDialog.test.tsx b/plugins/catalog-react/src/components/UnregisterEntityDialog/UnregisterEntityDialog.test.tsx index 7c8ddb3afb..1a5553fbb5 100644 --- a/plugins/catalog-react/src/components/UnregisterEntityDialog/UnregisterEntityDialog.test.tsx +++ b/plugins/catalog-react/src/components/UnregisterEntityDialog/UnregisterEntityDialog.test.tsx @@ -20,25 +20,15 @@ import userEvent from '@testing-library/user-event'; import React from 'react'; import { UnregisterEntityDialog } from './UnregisterEntityDialog'; import { ANNOTATION_ORIGIN_LOCATION } from '@backstage/catalog-model'; -import { CatalogClient } from '@backstage/catalog-client'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { catalogApiRef } from '../../api'; import { entityRouteRef } from '../../routes'; import { screen, waitFor } from '@testing-library/react'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import * as state from './useUnregisterEntityDialogState'; - -import { - AlertApi, - alertApiRef, - DiscoveryApi, -} from '@backstage/core-plugin-api'; +import { AlertApi, alertApiRef } from '@backstage/core-plugin-api'; describe('UnregisterEntityDialog', () => { - const discoveryApi: DiscoveryApi = { - async getBaseUrl(pluginId) { - return `http://example.com/${pluginId}`; - }, - }; const alertApi: AlertApi = { post() { return undefined; @@ -68,7 +58,7 @@ describe('UnregisterEntityDialog', () => { const Wrapper = (props: { children?: React.ReactNode }) => ( diff --git a/plugins/catalog-react/src/components/UserListPicker/UserListPicker.test.tsx b/plugins/catalog-react/src/components/UserListPicker/UserListPicker.test.tsx index 5efb7339cf..888940f30b 100644 --- a/plugins/catalog-react/src/components/UserListPicker/UserListPicker.test.tsx +++ b/plugins/catalog-react/src/components/UserListPicker/UserListPicker.test.tsx @@ -18,7 +18,10 @@ import React from 'react'; import { fireEvent, waitFor, screen } from '@testing-library/react'; import { UserEntity } from '@backstage/catalog-model'; import { UserListPicker, UserListPickerProps } from './UserListPicker'; -import { MockEntityListContextProvider } from '@backstage/plugin-catalog-react/testUtils'; +import { + MockEntityListContextProvider, + catalogApiMock, +} from '@backstage/plugin-catalog-react/testUtils'; import { EntityKindFilter, EntityNamespaceFilter, @@ -62,10 +65,7 @@ const mockConfigApi = { getOptionalString: () => 'Test Company', } as Partial; -const mockCatalogApi = { - getEntityByRef: jest.fn(), - queryEntities: jest.fn(), -} as Partial>; +const mockCatalogApi = catalogApiMock.mock(); const mockIdentityApi = { getBackstageIdentity: jest.fn(), diff --git a/plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.test.tsx b/plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.test.tsx index dc3bc5d2bd..2449d47a1c 100644 --- a/plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.test.tsx +++ b/plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.test.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import React, { PropsWithChildren } from 'react'; -import { CatalogApi } from '@backstage/catalog-client'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { useAllEntitiesCount } from './useAllEntitiesCount'; import { renderHook, waitFor } from '@testing-library/react'; import { EntityListProvider, useEntityList } from '../../hooks'; @@ -24,10 +24,7 @@ import { MemoryRouter } from 'react-router-dom'; import { EntityOwnerFilter } from '../../filters'; import { useMountEffect } from '@react-hookz/web'; -const mockQueryEntities: jest.MockedFn = jest.fn(); -const mockCatalogApi: jest.Mocked> = { - queryEntities: mockQueryEntities, -}; +const mockCatalogApi = catalogApiMock.mock(); jest.mock('@backstage/core-plugin-api', () => { const actual = jest.requireActual('@backstage/core-plugin-api'); @@ -44,7 +41,7 @@ describe('useAllEntitiesCount', () => { }); it('should return the count', async () => { - mockQueryEntities.mockResolvedValue({ + mockCatalogApi.queryEntities.mockResolvedValue({ items: [], totalItems: 10, pageInfo: {}, @@ -72,7 +69,7 @@ describe('useAllEntitiesCount', () => { }); await waitFor(() => - expect(mockQueryEntities).toHaveBeenCalledWith({ + expect(mockCatalogApi.queryEntities).toHaveBeenCalledWith({ filter: { 'relations.ownedBy': ['user:default/owner'], }, @@ -83,7 +80,7 @@ describe('useAllEntitiesCount', () => { }); it(`shouldn't invoke the endpoint at startup, when filters are missing`, async () => { - mockQueryEntities.mockResolvedValue({ + mockCatalogApi.queryEntities.mockResolvedValue({ items: [], totalItems: 10, pageInfo: {}, @@ -98,7 +95,7 @@ describe('useAllEntitiesCount', () => { }); await expect( - waitFor(() => expect(mockQueryEntities).toHaveBeenCalled()), + waitFor(() => expect(mockCatalogApi.queryEntities).toHaveBeenCalled()), ).rejects.toThrow(); expect(result.current).toEqual({ count: 0, loading: false }); }); diff --git a/plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.test.tsx b/plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.test.tsx index aeaa20c535..4c620060fe 100644 --- a/plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.test.tsx +++ b/plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.test.tsx @@ -13,8 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import React, { PropsWithChildren } from 'react'; -import { CatalogApi } from '@backstage/catalog-client'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderHook, waitFor } from '@testing-library/react'; import { DefaultEntityFilters, @@ -36,10 +37,7 @@ import { } from '../../filters'; import { useMountEffect } from '@react-hookz/web'; -const mockQueryEntities: jest.MockedFn = jest.fn(); -const mockCatalogApi: jest.Mocked> = { - queryEntities: mockQueryEntities, -}; +const mockCatalogApi = catalogApiMock.mock(); const mockGetBackstageIdentity: jest.MockedFn< IdentityApi['getBackstageIdentity'] @@ -76,7 +74,7 @@ describe('useOwnedEntitiesCount', () => { }); it(`shouldn't invoke queryEntities when filters are loading`, async () => { - mockQueryEntities.mockResolvedValue({ + mockCatalogApi.queryEntities.mockResolvedValue({ items: [], totalItems: 10, pageInfo: {}, @@ -89,7 +87,7 @@ describe('useOwnedEntitiesCount', () => { await waitFor(() => expect(mockGetBackstageIdentity).toHaveBeenCalled()); await expect( - waitFor(() => expect(mockQueryEntities).toHaveBeenCalled()), + waitFor(() => expect(mockCatalogApi.queryEntities).toHaveBeenCalled()), ).rejects.toThrow(); expect(result.current).toEqual({ @@ -104,7 +102,7 @@ describe('useOwnedEntitiesCount', () => { }); it(`should properly apply the filters`, async () => { - mockQueryEntities.mockResolvedValue({ + mockCatalogApi.queryEntities.mockResolvedValue({ items: [], totalItems: 10, pageInfo: {}, @@ -119,7 +117,7 @@ describe('useOwnedEntitiesCount', () => { await waitFor(() => expect(mockGetBackstageIdentity).toHaveBeenCalled()); await waitFor(() => - expect(mockQueryEntities).toHaveBeenCalledWith({ + expect(mockCatalogApi.queryEntities).toHaveBeenCalledWith({ filter: { 'metadata.namespace': ['a-namespace'], 'relations.ownedBy': ['user:default/spiderman', 'user:group/a-group'], @@ -140,7 +138,7 @@ describe('useOwnedEntitiesCount', () => { }); it(`should return count 0 without invoking queryEntities if owners filter doesn't have claims in common with logged in user`, async () => { - mockQueryEntities.mockResolvedValue({ + mockCatalogApi.queryEntities.mockResolvedValue({ items: [], totalItems: 10, pageInfo: {}, @@ -156,7 +154,7 @@ describe('useOwnedEntitiesCount', () => { await waitFor(() => expect(mockGetBackstageIdentity).toHaveBeenCalled()); await expect( - waitFor(() => expect(mockQueryEntities).toHaveBeenCalled()), + waitFor(() => expect(mockCatalogApi.queryEntities).toHaveBeenCalled()), ).rejects.toThrow(); expect(result.current).toEqual({ @@ -171,7 +169,7 @@ describe('useOwnedEntitiesCount', () => { }); it(`should send claims in common between owners filter and logged in user`, async () => { - mockQueryEntities.mockResolvedValue({ + mockCatalogApi.queryEntities.mockResolvedValue({ items: [], totalItems: 10, pageInfo: {}, @@ -190,7 +188,7 @@ describe('useOwnedEntitiesCount', () => { await waitFor(() => expect(mockGetBackstageIdentity).toHaveBeenCalled()); await waitFor(() => - expect(mockQueryEntities).toHaveBeenCalledWith({ + expect(mockCatalogApi.queryEntities).toHaveBeenCalledWith({ filter: { 'metadata.namespace': ['a-namespace'], 'relations.ownedBy': ['user:group/a-group'], diff --git a/plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.test.tsx b/plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.test.tsx index 5fe648e1bc..096ad01ddd 100644 --- a/plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.test.tsx +++ b/plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.test.tsx @@ -13,8 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import React from 'react'; -import { CatalogApi } from '@backstage/catalog-client'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { EntityListProvider, useStarredEntities } from '../../hooks'; import { catalogApiRef } from '../../api'; import { ApiRef } from '@backstage/core-plugin-api'; @@ -22,10 +23,7 @@ import { MemoryRouter } from 'react-router-dom'; import { useStarredEntitiesCount } from './useStarredEntitiesCount'; import { renderHook, waitFor } from '@testing-library/react'; -const mockQueryEntities: jest.MockedFn = jest.fn(); -const mockCatalogApi: jest.Mocked> = { - queryEntities: mockQueryEntities, -}; +const mockCatalogApi = catalogApiMock.mock(); const mockStarredEntities: jest.MockedFn<() => Set> = jest.fn(); @@ -58,7 +56,7 @@ describe('useStarredEntitiesCount', () => { mockStarredEntities.mockReturnValue( new Set(['component:default/favourite1', 'component:default/favourite2']), ); - mockQueryEntities.mockResolvedValue({ + mockCatalogApi.queryEntities.mockResolvedValue({ items: [ { apiVersion: '1', @@ -84,7 +82,7 @@ describe('useStarredEntitiesCount', () => { }); await waitFor(() => { - expect(mockQueryEntities).toHaveBeenCalledWith({ + expect(mockCatalogApi.queryEntities).toHaveBeenCalledWith({ filter: { 'metadata.name': ['favourite1', 'favourite2'], }, @@ -116,7 +114,7 @@ describe('useStarredEntitiesCount', () => { }); await expect( - waitFor(() => expect(mockQueryEntities).toHaveBeenCalled()), + waitFor(() => expect(mockCatalogApi.queryEntities).toHaveBeenCalled()), ).rejects.toThrow(); expect(result.current).toEqual({ count: 0, diff --git a/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx b/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx index 762fba1897..0bda2d19ec 100644 --- a/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx +++ b/plugins/catalog-react/src/hooks/useEntityListProvider.test.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { CatalogApi } from '@backstage/catalog-client'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { Entity } from '@backstage/catalog-model'; import { alertApiRef, @@ -81,7 +81,7 @@ const mockIdentityApi: Partial = { }), getCredentials: async () => ({ token: undefined }), }; -const mockCatalogApi: Partial> = { +const mockCatalogApi = catalogApiMock.mock({ getEntities: jest.fn().mockResolvedValue({ items: entities }), queryEntities: jest.fn().mockResolvedValue({ items: entities, @@ -89,7 +89,7 @@ const mockCatalogApi: Partial> = { totalItems: 10, }), getEntityByRef: jest.fn().mockResolvedValue(undefined), -}; +}); const createWrapper = (options: { location?: string; pagination: EntityListPagination }) => diff --git a/plugins/catalog-react/src/hooks/useEntityOwnership.test.tsx b/plugins/catalog-react/src/hooks/useEntityOwnership.test.tsx index 6c9519eb08..5516a249ea 100644 --- a/plugins/catalog-react/src/hooks/useEntityOwnership.test.tsx +++ b/plugins/catalog-react/src/hooks/useEntityOwnership.test.tsx @@ -14,36 +14,24 @@ * limitations under the License. */ -import { CatalogApi } from '@backstage/catalog-client'; import { ComponentEntity, RELATION_OWNED_BY } from '@backstage/catalog-model'; import { IdentityApi, identityApiRef } from '@backstage/core-plugin-api'; import { TestApiProvider } from '@backstage/test-utils'; import { renderHook, waitFor } from '@testing-library/react'; import React from 'react'; -import { catalogApiRef } from '../api'; import { useEntityOwnership } from './useEntityOwnership'; describe('useEntityOwnership', () => { type MockIdentityApi = jest.Mocked>; - type MockCatalogApi = jest.Mocked>; const mockIdentityApi: MockIdentityApi = { getBackstageIdentity: jest.fn(), }; - const mockCatalogApi: MockCatalogApi = { - getEntityByRef: jest.fn(), - }; const identityApi = mockIdentityApi as unknown as IdentityApi; - const catalogApi = mockCatalogApi as unknown as CatalogApi; const Wrapper = (props: { children?: React.ReactNode }) => ( - + {props.children} ); @@ -81,7 +69,6 @@ describe('useEntityOwnership', () => { userEntityRef: 'user:default/user1', ownershipEntityRefs: ['user:default/user1', 'group:default/group1'], }); - mockCatalogApi.getEntityByRef.mockResolvedValue(undefined); const { result } = renderHook(() => useEntityOwnership(), { wrapper: Wrapper, diff --git a/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.test.ts b/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.test.ts index 2c3fb9352b..c55103b8bc 100644 --- a/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.test.ts +++ b/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.test.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import { CatalogApi } from '@backstage/catalog-client'; import { Entity } from '@backstage/catalog-model'; import { EntityRefPresentation, EntityRefPresentationSnapshot, } from '@backstage/plugin-catalog-react'; import { DefaultEntityPresentationApi } from './DefaultEntityPresentationApi'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; describe('DefaultEntityPresentationApi', () => { it('works in local mode', async () => { @@ -99,12 +99,8 @@ describe('DefaultEntityPresentationApi', () => { }); it('works in catalog mode', async () => { - const catalogApi = { - getEntitiesByRefs: jest.fn(), - }; - const api = DefaultEntityPresentationApi.create({ - catalogApi: catalogApi as Partial as any, - }); + const catalogApi = catalogApiMock.mock(); + const api = DefaultEntityPresentationApi.create({ catalogApi }); catalogApi.getEntitiesByRefs.mockResolvedValueOnce({ items: [ diff --git a/plugins/catalog/src/components/AboutCard/AboutCard.test.tsx b/plugins/catalog/src/components/AboutCard/AboutCard.test.tsx index fcea659fc6..b175593b68 100644 --- a/plugins/catalog/src/components/AboutCard/AboutCard.test.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutCard.test.tsx @@ -15,11 +15,11 @@ */ import { - CatalogApi, EntityProvider, catalogApiRef, entityRouteRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { ScmIntegrationsApi, scmIntegrationsApiRef, @@ -42,16 +42,7 @@ const mockAuthorize = jest.fn(); const mockPermissionApi = { authorize: mockAuthorize }; describe('', () => { - const catalogApi: jest.Mocked = { - getLocationById: jest.fn(), - getEntityByName: jest.fn(), - getEntityByRef: jest.fn(), - getEntities: jest.fn(), - addLocation: jest.fn(), - getLocationByRef: jest.fn(), - removeEntityByUid: jest.fn(), - refreshEntity: jest.fn(), - } as any; + const catalogApi = catalogApiMock.mock(); beforeEach(() => { jest.clearAllMocks(); diff --git a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx index 23c681a145..f5a16e3af3 100644 --- a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx +++ b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx @@ -14,10 +14,7 @@ * limitations under the License. */ -import { - CatalogApi, - QueryEntitiesInitialRequest, -} from '@backstage/catalog-client'; +import { QueryEntitiesInitialRequest } from '@backstage/catalog-client'; import { RELATION_OWNED_BY } from '@backstage/catalog-model'; import { TableColumn, TableProps } from '@backstage/core-components'; import { @@ -48,6 +45,7 @@ import { DefaultCatalogPage } from './DefaultCatalogPage'; import { CatalogTableColumnsFunc } from '../CatalogTable/types'; import { permissionApiRef } from '@backstage/plugin-permission-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; describe('DefaultCatalogPage', () => { const origReplaceState = window.history.replaceState; @@ -60,7 +58,7 @@ describe('DefaultCatalogPage', () => { jest.clearAllMocks(); }); - const catalogApi: jest.Mocked> = { + const catalogApi = catalogApiMock.mock({ getEntities: jest.fn().mockImplementation(() => Promise.resolve({ items: [ @@ -166,7 +164,7 @@ describe('DefaultCatalogPage', () => { // all items return { items: [], totalItems: 2, pageInfo: {} }; }), - }; + }); const testProfile: Partial = { displayName: 'Display Name', diff --git a/plugins/catalog/src/components/DependencyOfComponentsCard/DependencyOfComponentsCard.test.tsx b/plugins/catalog/src/components/DependencyOfComponentsCard/DependencyOfComponentsCard.test.tsx index 0ebda6e64d..464b97126a 100644 --- a/plugins/catalog/src/components/DependencyOfComponentsCard/DependencyOfComponentsCard.test.tsx +++ b/plugins/catalog/src/components/DependencyOfComponentsCard/DependencyOfComponentsCard.test.tsx @@ -16,25 +16,23 @@ import { Entity, RELATION_DEPENDENCY_OF } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { screen, waitFor } from '@testing-library/react'; import React from 'react'; import { DependencyOfComponentsCard } from './DependencyOfComponentsCard'; describe('', () => { - const getEntitiesByRefs: jest.MockedFunction< - CatalogApi['getEntitiesByRefs'] - > = jest.fn(); + const catalogApi = catalogApiMock.mock(); let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -87,7 +85,7 @@ describe('', () => { }, ], }; - getEntitiesByRefs.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/DependsOnComponentsCard/DependsOnComponentsCard.test.tsx b/plugins/catalog/src/components/DependsOnComponentsCard/DependsOnComponentsCard.test.tsx index ee8931143f..9457e329b0 100644 --- a/plugins/catalog/src/components/DependsOnComponentsCard/DependsOnComponentsCard.test.tsx +++ b/plugins/catalog/src/components/DependsOnComponentsCard/DependsOnComponentsCard.test.tsx @@ -16,25 +16,23 @@ import { Entity, RELATION_DEPENDS_ON } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { waitFor, screen } from '@testing-library/react'; import React from 'react'; import { DependsOnComponentsCard } from './DependsOnComponentsCard'; describe('', () => { - const getEntitiesByRefs: jest.MockedFunction< - CatalogApi['getEntitiesByRefs'] - > = jest.fn(); + const catalogApi = catalogApiMock.mock(); let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -87,7 +85,7 @@ describe('', () => { }, ], }; - getEntitiesByRefs.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/DependsOnResourcesCard/DependsOnResourcesCard.test.tsx b/plugins/catalog/src/components/DependsOnResourcesCard/DependsOnResourcesCard.test.tsx index 0e760f9155..163a71206c 100644 --- a/plugins/catalog/src/components/DependsOnResourcesCard/DependsOnResourcesCard.test.tsx +++ b/plugins/catalog/src/components/DependsOnResourcesCard/DependsOnResourcesCard.test.tsx @@ -16,25 +16,23 @@ import { Entity, RELATION_DEPENDS_ON } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { waitFor, screen } from '@testing-library/react'; import React from 'react'; import { DependsOnResourcesCard } from './DependsOnResourcesCard'; describe('', () => { - const getEntitiesByRefs: jest.MockedFunction< - CatalogApi['getEntitiesByRefs'] - > = jest.fn(); + const catalogApi = catalogApiMock.mock(); let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -87,7 +85,7 @@ describe('', () => { }, ], }; - getEntitiesByRefs.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/EntityLayout/EntityLayout.test.tsx b/plugins/catalog/src/components/EntityLayout/EntityLayout.test.tsx index c222c2d7b6..9fb663abc2 100644 --- a/plugins/catalog/src/components/EntityLayout/EntityLayout.test.tsx +++ b/plugins/catalog/src/components/EntityLayout/EntityLayout.test.tsx @@ -14,7 +14,6 @@ * limitations under the License. */ -import { CatalogApi } from '@backstage/catalog-client'; import { ANNOTATION_ORIGIN_LOCATION, Entity, @@ -30,6 +29,7 @@ import { starredEntitiesApiRef, MockStarredEntitiesApi, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { permissionApiRef } from '@backstage/plugin-permission-react'; import { MockPermissionApi, @@ -52,7 +52,7 @@ describe('EntityLayout', () => { } as Entity; const mockApis = TestApiRegistry.from( - [catalogApiRef, {} as CatalogApi], + [catalogApiRef, catalogApiMock()], [alertApiRef, {} as AlertApi], [starredEntitiesApiRef, new MockStarredEntitiesApi()], [permissionApiRef, new MockPermissionApi()], @@ -302,20 +302,13 @@ describe('EntityLayout - CleanUpAfterRemoval', () => { }, ], }; - const getLocationByRef: jest.MockedFunction = - jest.fn(); - const getEntities: jest.MockedFunction = jest.fn(); - const removeEntityByUid: jest.MockedFunction< - CatalogApi['removeEntityByUid'] - > = jest.fn(); - const getEntityFacets: jest.MockedFunction = - jest.fn(); - getLocationByRef.mockResolvedValue(undefined); - getEntities.mockResolvedValue({ items: [{ ...entity }] }); - getEntityFacets.mockResolvedValue({ - facets: { - 'relations.ownedBy': [{ count: 1, value: 'group:default/tools' }], - }, + const catalogApi = catalogApiMock.mock({ + getEntities: async () => ({ items: [{ ...entity }] }), + getEntityFacets: async () => ({ + facets: { + 'relations.ownedBy': [{ count: 1, value: 'group:default/tools' }], + }, + }), }); const alertApi: AlertApi = { @@ -331,15 +324,7 @@ describe('EntityLayout - CleanUpAfterRemoval', () => { await renderInTestApp( { await renderInTestApp( { alert$: jest.fn(), }; - const catalogClient: jest.Mocked = { - removeEntityByUid: jest.fn(), - } as any; + const catalogClient = catalogApiMock.mock(); const entity = { apiVersion: 'backstage.io/v1alpha1', diff --git a/plugins/catalog/src/components/EntityProcessingErrorsPanel/EntityProcessingErrorsPanel.test.tsx b/plugins/catalog/src/components/EntityProcessingErrorsPanel/EntityProcessingErrorsPanel.test.tsx index b21c6292ff..1eabcc6e87 100644 --- a/plugins/catalog/src/components/EntityProcessingErrorsPanel/EntityProcessingErrorsPanel.test.tsx +++ b/plugins/catalog/src/components/EntityProcessingErrorsPanel/EntityProcessingErrorsPanel.test.tsx @@ -18,21 +18,19 @@ import { AlphaEntity } from '@backstage/catalog-model/alpha'; import { stringifyEntityRef } from '@backstage/catalog-model'; import { ApiProvider } from '@backstage/core-app-api'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; import { screen } from '@testing-library/react'; import React from 'react'; import { EntityProcessingErrorsPanel } from './EntityProcessingErrorsPanel'; describe('', () => { - const getEntityAncestors: jest.MockedFunction< - CatalogApi['getEntityAncestors'] - > = jest.fn(); - const apis = TestApiRegistry.from([catalogApiRef, { getEntityAncestors }]); + const catalogApi = catalogApiMock.mock(); + const apis = TestApiRegistry.from([catalogApiRef, catalogApi]); it('renders EntityProcessErrors if the entity has errors', async () => { const entity: AlphaEntity = { @@ -98,7 +96,7 @@ describe('', () => { }, }; - getEntityAncestors.mockResolvedValue({ + catalogApi.getEntityAncestors.mockResolvedValue({ rootEntityRef: stringifyEntityRef(entity), items: [{ entity, parentEntityRefs: [] }], }); @@ -199,7 +197,7 @@ describe('', () => { ], }, }; - getEntityAncestors.mockResolvedValue({ + catalogApi.getEntityAncestors.mockResolvedValue({ rootEntityRef: stringifyEntityRef(entity), items: [ { entity, parentEntityRefs: [stringifyEntityRef(parent)] }, diff --git a/plugins/catalog/src/components/EntityRelationWarning/EntityRelationWarning.test.tsx b/plugins/catalog/src/components/EntityRelationWarning/EntityRelationWarning.test.tsx index 41e5f7e3d5..2808a8397b 100644 --- a/plugins/catalog/src/components/EntityRelationWarning/EntityRelationWarning.test.tsx +++ b/plugins/catalog/src/components/EntityRelationWarning/EntityRelationWarning.test.tsx @@ -16,11 +16,8 @@ import { Entity } from '@backstage/catalog-model'; import { ApiProvider } from '@backstage/core-app-api'; -import { - CatalogApi, - catalogApiRef, - EntityProvider, -} from '@backstage/plugin-catalog-react'; +import { catalogApiRef, EntityProvider } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; import { screen } from '@testing-library/react'; import React from 'react'; @@ -30,10 +27,8 @@ import { } from './EntityRelationWarning'; describe('', () => { - const getEntitiesByRefs: jest.MockedFunction< - CatalogApi['getEntitiesByRefs'] - > = jest.fn(); - const apis = TestApiRegistry.from([catalogApiRef, { getEntitiesByRefs }]); + const catalogApi = catalogApiMock.mock(); + const apis = TestApiRegistry.from([catalogApiRef, catalogApi]); const entityExisting: Entity = { apiVersion: 'v1', @@ -62,7 +57,7 @@ describe('', () => { ], }; - getEntitiesByRefs.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [undefined, entityExisting], }); await renderInTestApp( @@ -102,7 +97,7 @@ describe('', () => { ], }; - getEntitiesByRefs.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [entityExisting], }); await renderInTestApp( @@ -141,7 +136,7 @@ describe('', () => { ], }; - getEntitiesByRefs.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [undefined, entityExisting], }); @@ -165,7 +160,7 @@ describe('', () => { ], }; - getEntitiesByRefs.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [entityExisting], }); diff --git a/plugins/catalog/src/components/HasComponentsCard/HasComponentsCard.test.tsx b/plugins/catalog/src/components/HasComponentsCard/HasComponentsCard.test.tsx index 67c3f6b650..bc00c93815 100644 --- a/plugins/catalog/src/components/HasComponentsCard/HasComponentsCard.test.tsx +++ b/plugins/catalog/src/components/HasComponentsCard/HasComponentsCard.test.tsx @@ -16,7 +16,6 @@ import { Entity, RELATION_HAS_PART } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, @@ -25,16 +24,15 @@ import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { waitFor, screen } from '@testing-library/react'; import React from 'react'; import { HasComponentsCard } from './HasComponentsCard'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; describe('', () => { - const getEntitiesByRefs: jest.MockedFunction< - CatalogApi['getEntitiesByRefs'] - > = jest.fn(); + const catalogApi = catalogApiMock.mock(); let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -87,7 +85,7 @@ describe('', () => { }, ], }; - getEntitiesByRefs.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/HasResourcesCard/HasResourcesCard.test.tsx b/plugins/catalog/src/components/HasResourcesCard/HasResourcesCard.test.tsx index d78d307c96..1d524100f2 100644 --- a/plugins/catalog/src/components/HasResourcesCard/HasResourcesCard.test.tsx +++ b/plugins/catalog/src/components/HasResourcesCard/HasResourcesCard.test.tsx @@ -16,25 +16,23 @@ import { Entity, RELATION_HAS_PART } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { waitFor, screen } from '@testing-library/react'; import React from 'react'; import { HasResourcesCard } from './HasResourcesCard'; describe('', () => { - const getEntitiesByRefs: jest.MockedFunction< - CatalogApi['getEntitiesByRefs'] - > = jest.fn(); + const catalogApi = catalogApiMock.mock(); let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -82,7 +80,7 @@ describe('', () => { }, ], }; - getEntitiesByRefs.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/HasSubcomponentsCard/HasSubcomponentsCard.test.tsx b/plugins/catalog/src/components/HasSubcomponentsCard/HasSubcomponentsCard.test.tsx index 713313b7c6..07193b841f 100644 --- a/plugins/catalog/src/components/HasSubcomponentsCard/HasSubcomponentsCard.test.tsx +++ b/plugins/catalog/src/components/HasSubcomponentsCard/HasSubcomponentsCard.test.tsx @@ -16,25 +16,23 @@ import { Entity, RELATION_HAS_PART } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { waitFor, screen } from '@testing-library/react'; import React from 'react'; import { HasSubcomponentsCard } from './HasSubcomponentsCard'; describe('', () => { - const getEntitiesByRefs: jest.MockedFunction< - CatalogApi['getEntitiesByRefs'] - > = jest.fn(); + const catalogApi = catalogApiMock.mock(); let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -87,7 +85,7 @@ describe('', () => { }, ], }; - getEntitiesByRefs.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.test.tsx b/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.test.tsx index 6c145b3228..0498cacfe3 100644 --- a/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.test.tsx +++ b/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.test.tsx @@ -16,25 +16,23 @@ import { Entity, RELATION_HAS_PART } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { waitFor, screen } from '@testing-library/react'; import React from 'react'; import { HasSubdomainsCard } from './HasSubdomainsCard'; describe('', () => { - const getEntitiesByRefs: jest.MockedFunction< - CatalogApi['getEntitiesByRefs'] - > = jest.fn(); + const catalogApi = catalogApiMock.mock(); let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -87,7 +85,7 @@ describe('', () => { }, ], }; - getEntitiesByRefs.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/HasSystemsCard/HasSystemsCard.test.tsx b/plugins/catalog/src/components/HasSystemsCard/HasSystemsCard.test.tsx index 9844708f85..51b2ce87ee 100644 --- a/plugins/catalog/src/components/HasSystemsCard/HasSystemsCard.test.tsx +++ b/plugins/catalog/src/components/HasSystemsCard/HasSystemsCard.test.tsx @@ -16,25 +16,23 @@ import { Entity, RELATION_HAS_PART } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { waitFor, screen } from '@testing-library/react'; import React from 'react'; import { HasSystemsCard } from './HasSystemsCard'; describe('', () => { - const getEntitiesByRefs: jest.MockedFunction< - CatalogApi['getEntitiesByRefs'] - > = jest.fn(); + const catalogApi = catalogApiMock.mock(); let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -87,7 +85,7 @@ describe('', () => { }, ], }; - getEntitiesByRefs.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/SystemDiagramCard/SystemDiagramCard.test.tsx b/plugins/catalog/src/components/SystemDiagramCard/SystemDiagramCard.test.tsx index 2fcd1c2702..58aa892c5f 100644 --- a/plugins/catalog/src/components/SystemDiagramCard/SystemDiagramCard.test.tsx +++ b/plugins/catalog/src/components/SystemDiagramCard/SystemDiagramCard.test.tsx @@ -16,7 +16,6 @@ import { catalogApiRef, - CatalogApi, EntityProvider, entityRouteRef, } from '@backstage/plugin-catalog-react'; @@ -25,6 +24,7 @@ import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { screen } from '@testing-library/react'; import React from 'react'; import { SystemDiagramCard } from './SystemDiagramCard'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; describe('', () => { beforeAll(() => { @@ -37,12 +37,7 @@ describe('', () => { afterEach(() => jest.resetAllMocks()); it('shows empty list if no relations', async () => { - const catalogApi: Partial = { - getEntities: () => - Promise.resolve({ - items: [] as Entity[], - }), - }; + const catalogApi = catalogApiMock(); const entity: Entity = { apiVersion: 'v1', @@ -73,26 +68,25 @@ describe('', () => { }); it('shows related systems', async () => { - const catalogApi: Partial = { - getEntities: () => - Promise.resolve({ - items: [ - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'entity', - namespace: 'namespace', - }, - spec: { - owner: 'not-tools@example.com', - type: 'service', - system: 'system', - }, + const catalogApi = catalogApiMock.mock({ + getEntities: async () => ({ + items: [ + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'entity', + namespace: 'namespace', }, - ] as Entity[], - }), - }; + spec: { + owner: 'not-tools@example.com', + type: 'service', + system: 'system', + }, + }, + ], + }), + }); const entity: Entity = { apiVersion: 'v1', @@ -128,26 +122,25 @@ describe('', () => { }); it('should truncate long domains, systems or entities', async () => { - const catalogApi: Partial = { - getEntities: () => - Promise.resolve({ - items: [ - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'alongentitythatshouldgettruncated', - namespace: 'namespace', - }, - spec: { - owner: 'not-tools@example.com', - type: 'service', - system: 'system', - }, + const catalogApi = catalogApiMock.mock({ + getEntities: async () => ({ + items: [ + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'alongentitythatshouldgettruncated', + namespace: 'namespace', }, - ] as Entity[], - }), - }; + spec: { + owner: 'not-tools@example.com', + type: 'service', + system: 'system', + }, + }, + ] as Entity[], + }), + }); const entity: Entity = { apiVersion: 'v1', diff --git a/plugins/home/src/homePageComponents/FeaturedDocsCard/Content.test.tsx b/plugins/home/src/homePageComponents/FeaturedDocsCard/Content.test.tsx index c49b41eb18..9a923f2481 100644 --- a/plugins/home/src/homePageComponents/FeaturedDocsCard/Content.test.tsx +++ b/plugins/home/src/homePageComponents/FeaturedDocsCard/Content.test.tsx @@ -18,6 +18,7 @@ import { Content } from './Content'; import React from 'react'; import { catalogApiRef, entityRouteRef } from '@backstage/plugin-catalog-react'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; const docsEntities = [ { @@ -34,20 +35,14 @@ const docsEntities = [ ]; describe('', () => { - const mockCatalogApi = { - getEntities: jest - .fn() - .mockImplementation(async () => ({ items: docsEntities })), - }; - let Wrapper: React.ComponentType>; + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + + {children} + + ); - beforeAll(() => { - Wrapper = ({ children }: { children?: React.ReactNode }) => ( - - {children} - - ); - }); it('should show expected featured doc and title', async () => { const { getByTestId, getByText } = await renderInTestApp( diff --git a/plugins/home/src/homePageComponents/FeaturedDocsCard/FeaturedDocsCard.stories.tsx b/plugins/home/src/homePageComponents/FeaturedDocsCard/FeaturedDocsCard.stories.tsx index 4d04a1788c..c9830f1294 100644 --- a/plugins/home/src/homePageComponents/FeaturedDocsCard/FeaturedDocsCard.stories.tsx +++ b/plugins/home/src/homePageComponents/FeaturedDocsCard/FeaturedDocsCard.stories.tsx @@ -18,6 +18,7 @@ import { FeaturedDocsCard } from '../../plugin'; import React, { ComponentType, PropsWithChildren } from 'react'; import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; import { catalogApiRef, entityRouteRef } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import Grid from '@material-ui/core/Grid'; const docsEntities = [ @@ -36,16 +37,14 @@ const docsEntities = [ }, ]; -const mockCatalogApi = { - getEntities: async () => ({ items: docsEntities }), -}; - export default { title: 'Plugins/Home/Components/FeaturedDocsCard', decorators: [ (Story: ComponentType>) => wrapInTestApp( - + , { diff --git a/plugins/home/src/homePageComponents/StarredEntities/Content.test.tsx b/plugins/home/src/homePageComponents/StarredEntities/Content.test.tsx index c41d7f586c..dab67d0b76 100644 --- a/plugins/home/src/homePageComponents/StarredEntities/Content.test.tsx +++ b/plugins/home/src/homePageComponents/StarredEntities/Content.test.tsx @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { catalogApiRef, @@ -20,6 +21,7 @@ import { MockStarredEntitiesApi, entityRouteRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import React from 'react'; import { Content } from './Content'; @@ -48,11 +50,7 @@ describe('StarredEntitiesContent', () => { mockedApi.toggleStarred('component:default/mock-starred-entity-2'); mockedApi.toggleStarred('component:default/mock-starred-entity-3'); - const mockCatalogApi = { - getEntitiesByRefs: jest - .fn() - .mockImplementation(async () => ({ items: entities })), - }; + const mockCatalogApi = catalogApiMock({ entities }); const { getByText, queryByText } = await renderInTestApp( ({ items: entities }), -}; +const mockCatalogApi = catalogApiMock({ entities }); export default { title: 'Plugins/Home/Components/StarredEntities', diff --git a/plugins/org-react/src/components/GroupListPicker/GroupListPicker.test.tsx b/plugins/org-react/src/components/GroupListPicker/GroupListPicker.test.tsx index 21b85ffe5c..056a91826b 100644 --- a/plugins/org-react/src/components/GroupListPicker/GroupListPicker.test.tsx +++ b/plugins/org-react/src/components/GroupListPicker/GroupListPicker.test.tsx @@ -19,10 +19,10 @@ import { render, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { ApiProvider } from '@backstage/core-app-api'; import { catalogApiRef } from '@backstage/plugin-catalog-react'; -import { CatalogApi } from '@backstage/catalog-client'; import { GroupListPicker } from '../GroupListPicker'; import { GroupEntity } from '@backstage/catalog-model'; import { TestApiRegistry } from '@backstage/test-utils'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; const mockGroups: GroupEntity[] = [ { @@ -57,9 +57,9 @@ const mockGroups: GroupEntity[] = [ }, ]; -const mockCatalogApi = { - getEntities: () => Promise.resolve({ items: mockGroups }), -} as Partial; +const mockCatalogApi = catalogApiMock.mock({ + getEntities: jest.fn(() => Promise.resolve({ items: mockGroups })), +}); const apis = TestApiRegistry.from([catalogApiRef, mockCatalogApi]); diff --git a/plugins/org/src/__testUtils__/catalogMocks.ts b/plugins/org/src/__testUtils__/catalogMocks.ts index a97caa9971..792eeedcc0 100644 --- a/plugins/org/src/__testUtils__/catalogMocks.ts +++ b/plugins/org/src/__testUtils__/catalogMocks.ts @@ -15,7 +15,6 @@ */ import { - CatalogApi, GetEntitiesByRefsRequest, GetEntitiesRequest, } from '@backstage/catalog-client'; @@ -25,6 +24,7 @@ import { GroupEntity, stringifyEntityRef, } from '@backstage/catalog-model'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; export const groupA: GroupEntity = { apiVersion: 'backstage.io/v1alpha1', @@ -308,7 +308,7 @@ const mockedMembersMapping = new Map([ type Nullable = T | undefined; -export const mockedCatalogApiSupportingGroups: Partial = { +export const mockedCatalogApiSupportingGroups = catalogApiMock.mock({ getEntities: async (request?: GetEntitiesRequest) => { const actualFilter = (request?.filter as Nullable<{ 'relations.memberof': string[]; @@ -331,4 +331,4 @@ export const mockedCatalogApiSupportingGroups: Partial = { ); return { items }; }, -}; +}); diff --git a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx index 69d6090687..6b8261e015 100644 --- a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx +++ b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx @@ -14,9 +14,8 @@ * limitations under the License. */ -import { Entity, GroupEntity } from '@backstage/catalog-model'; +import { GroupEntity } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, EntityProvider, entityRouteRef, @@ -35,6 +34,7 @@ import { EntityLayout, catalogPlugin } from '@backstage/plugin-catalog'; import { screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { Observable } from '@backstage/types'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; const mockedStarredEntitiesApi: Partial = { starredEntitie$: () => { @@ -68,38 +68,36 @@ describe('MemberTab Test', () => { }, }; - const catalogApi: Partial = { - getEntities: () => - Promise.resolve({ - items: [ - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'User', - metadata: { - name: 'tara.macgovern', - namespace: 'foo-bar', - uid: 'a5gerth56', - description: 'Super Awesome Developer', - }, - relations: [ - { - type: 'memberOf', - targetRef: 'group:default/team-d', - }, - ], - spec: { - profile: { - displayName: 'Tara MacGovern', - email: 'tara-macgovern@example.com', - picture: 'https://example.com/staff/tara.jpeg', - }, - memberOf: ['team-d'], - }, + const catalogApi = catalogApiMock.mock({ + getEntities: async () => ({ + items: [ + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'User', + metadata: { + name: 'tara.macgovern', + namespace: 'foo-bar', + uid: 'a5gerth56', + description: 'Super Awesome Developer', }, - ] as Entity[], - }), - }; - const getEntitiesSpy = jest.spyOn(catalogApi, 'getEntities'); + relations: [ + { + type: 'memberOf', + targetRef: 'group:default/team-d', + }, + ], + spec: { + profile: { + displayName: 'Tara MacGovern', + email: 'tara-macgovern@example.com', + picture: 'https://example.com/staff/tara.jpeg', + }, + memberOf: ['team-d'], + }, + }, + ], + }), + }); it('Display Profile Card', async () => { await renderInTestApp( @@ -116,7 +114,7 @@ describe('MemberTab Test', () => { }, }, ); - expect(getEntitiesSpy).toHaveBeenCalledWith({ + expect(catalogApi.getEntities).toHaveBeenCalledWith({ filter: { kind: 'User', 'relations.memberof': ['group:default/team-d'], @@ -171,7 +169,7 @@ describe('MemberTab Test', () => { }, ); - expect(getEntitiesSpy).toHaveBeenCalledWith({ + expect(catalogApi.getEntities).toHaveBeenCalledWith({ filter: { kind: 'User', 'relations.leaderof': ['group:default/team-d'], diff --git a/plugins/org/src/components/Cards/OwnershipCard/OwnershipCard.test.tsx b/plugins/org/src/components/Cards/OwnershipCard/OwnershipCard.test.tsx index 004fb8b964..084a14a825 100644 --- a/plugins/org/src/components/Cards/OwnershipCard/OwnershipCard.test.tsx +++ b/plugins/org/src/components/Cards/OwnershipCard/OwnershipCard.test.tsx @@ -19,16 +19,13 @@ import { GetEntitiesResponse, } from '@backstage/catalog-client'; import { Entity, GroupEntity, UserEntity } from '@backstage/catalog-model'; -import { - CatalogApi, - catalogApiRef, - EntityProvider, -} from '@backstage/plugin-catalog-react'; +import { catalogApiRef, EntityProvider } from '@backstage/plugin-catalog-react'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { queryByText } from '@testing-library/react'; import React from 'react'; import { catalogIndexRouteRef } from '../../../routes'; import { OwnershipCard } from './OwnershipCard'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; const items = [ { @@ -161,11 +158,7 @@ describe('OwnershipCard', () => { }; it('displays entity counts', async () => { - const catalogApi: jest.Mocked = { - getEntities: jest.fn(), - } as any; - - catalogApi.getEntities.mockImplementation(getEntitiesMock); + const catalogApi = catalogApiMock.mock({ getEntities: getEntitiesMock }); const { getByText } = await renderInTestApp( @@ -215,11 +208,7 @@ describe('OwnershipCard', () => { }); it('applies CustomFilterDefinition', async () => { - const catalogApi: jest.Mocked = { - getEntities: jest.fn(), - } as any; - - catalogApi.getEntities.mockImplementation(getEntitiesMock); + const catalogApi = catalogApiMock.mock({ getEntities: getEntitiesMock }); const { getByText } = await renderInTestApp( @@ -252,11 +241,7 @@ describe('OwnershipCard', () => { }); it('links to the catalog with the group filter', async () => { - const catalogApi: jest.Mocked = { - getEntities: jest.fn(), - } as any; - - catalogApi.getEntities.mockImplementation(getEntitiesMock); + const catalogApi = catalogApiMock.mock({ getEntities: getEntitiesMock }); const { getByText } = await renderInTestApp( @@ -279,11 +264,7 @@ describe('OwnershipCard', () => { }); it('links to the catalog with the user and groups filters from an user profile', async () => { - const catalogApi: jest.Mocked = { - getEntities: jest.fn(), - } as any; - - catalogApi.getEntities.mockImplementation(getEntitiesMock); + const catalogApi = catalogApiMock.mock({ getEntities: getEntitiesMock }); const { getByText } = await renderInTestApp( @@ -308,11 +289,7 @@ describe('OwnershipCard', () => { describe('OwnershipCard relations', () => { it('shows relations toggle', async () => { - const catalogApi: jest.Mocked = { - getEntities: jest.fn(), - } as any; - - catalogApi.getEntities.mockImplementation(getEntitiesMock); + const catalogApi = catalogApiMock.mock({ getEntities: getEntitiesMock }); const { getByTitle } = await renderInTestApp( @@ -331,11 +308,7 @@ describe('OwnershipCard', () => { }); it('hides relations toggle', async () => { - const catalogApi: jest.Mocked = { - getEntities: jest.fn(), - } as any; - - catalogApi.getEntities.mockImplementation(getEntitiesMock); + const catalogApi = catalogApiMock.mock({ getEntities: getEntitiesMock }); const rendered = await renderInTestApp( @@ -352,12 +325,9 @@ describe('OwnershipCard', () => { expect(rendered.queryByText('Direct Relations')).toBeNull(); }); - it('overrides relation type', async () => { - const catalogApi: jest.Mocked = { - getEntities: jest.fn(), - } as any; - catalogApi.getEntities.mockImplementation(getEntitiesMock); + it('overrides relation type', async () => { + const catalogApi = catalogApiMock.mock({ getEntities: getEntitiesMock }); const { getByTitle } = await renderInTestApp( @@ -376,11 +346,7 @@ describe('OwnershipCard', () => { }); it('defaults to aggregated for User entity kind', async () => { - const catalogApi: jest.Mocked = { - getEntities: jest.fn(), - } as any; - - catalogApi.getEntities.mockImplementation(getEntitiesMock); + const catalogApi = catalogApiMock.mock({ getEntities: getEntitiesMock }); const { getByLabelText } = await renderInTestApp( @@ -399,11 +365,7 @@ describe('OwnershipCard', () => { }); it('defaults to direct for all entity kinds except User', async () => { - const catalogApi: jest.Mocked = { - getEntities: jest.fn(), - } as any; - - catalogApi.getEntities.mockImplementation(getEntitiesMock); + const catalogApi = catalogApiMock.mock({ getEntities: getEntitiesMock }); const { getByLabelText } = await renderInTestApp( @@ -422,11 +384,7 @@ describe('OwnershipCard', () => { }); it('defaults to provided relationsType', async () => { - const catalogApi: jest.Mocked = { - getEntities: jest.fn(), - } as any; - - catalogApi.getEntities.mockImplementation(getEntitiesMock); + const catalogApi = catalogApiMock.mock({ getEntities: getEntitiesMock }); const { getByLabelText } = await renderInTestApp( diff --git a/plugins/org/src/components/MyGroupsSidebarItem/MyGroupsSidebarItem.test.tsx b/plugins/org/src/components/MyGroupsSidebarItem/MyGroupsSidebarItem.test.tsx index bd212bf972..9eb9b3f70f 100644 --- a/plugins/org/src/components/MyGroupsSidebarItem/MyGroupsSidebarItem.test.tsx +++ b/plugins/org/src/components/MyGroupsSidebarItem/MyGroupsSidebarItem.test.tsx @@ -19,9 +19,9 @@ import React from 'react'; import { MyGroupsSidebarItem } from './MyGroupsSidebarItem'; import GroupIcon from '@material-ui/icons/People'; import { IdentityApi, identityApiRef } from '@backstage/core-plugin-api'; -import { CatalogApi } from '@backstage/catalog-client'; import { Entity } from '@backstage/catalog-model'; import { catalogApiRef, entityRouteRef } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; describe('MyGroupsSidebarItem Test', () => { describe('For guests or users with no groups', () => { @@ -33,12 +33,7 @@ describe('MyGroupsSidebarItem Test', () => { ownershipEntityRefs: ['user:default/guest'], }), }; - const catalogApi: Partial = { - getEntities: () => - Promise.resolve({ - items: [] as Entity[], - }), - }; + const catalogApi = catalogApiMock(); const rendered = await renderInTestApp( { ownershipEntityRefs: ['user:default/nigel.manning'], }), }; - const catalogApi: Partial = { - getEntities: () => - Promise.resolve({ - items: [ - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Group', - metadata: { - name: 'team-a', - title: 'Team A', - namespace: 'default', - }, - spec: { - type: 'team', - children: [], - }, + const catalogApi = catalogApiMock.mock({ + getEntities: async () => ({ + items: [ + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + name: 'team-a', + title: 'Team A', + namespace: 'default', }, - ] as Entity[], - }), - }; + spec: { + type: 'team', + children: [], + }, + }, + ] as Entity[], + }), + }); const rendered = await renderInTestApp( { ownershipEntityRefs: ['user:default/nigel.manning'], }), }; - const catalogApi: Partial = { - getEntities: () => - Promise.resolve({ - items: [ - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Group', - metadata: { - name: 'team-a', - title: 'Team A', - namespace: 'default', - }, - spec: { - type: 'team', - children: [], - }, + const catalogApi = catalogApiMock.mock({ + getEntities: async () => ({ + items: [ + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + name: 'team-a', + title: 'Team A', + namespace: 'default', }, - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Group', - metadata: { - name: 'team-b', - title: 'Team B', - namespace: 'default', - }, - spec: { - type: 'team', - children: [], - }, + spec: { + type: 'team', + children: [], }, - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Group', - metadata: { - name: 'team-c', - title: 'Team C', - namespace: 'default', - }, - spec: { - type: 'team', - children: [], - }, + }, + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + name: 'team-b', + title: 'Team B', + namespace: 'default', }, - ] as Entity[], - }), - }; + spec: { + type: 'team', + children: [], + }, + }, + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + name: 'team-c', + title: 'Team C', + namespace: 'default', + }, + spec: { + type: 'team', + children: [], + }, + }, + ] as Entity[], + }), + }); const rendered = await renderInTestApp( { ownershipEntityRefs: ['user:default/guest'], }), }; - const mockCatalogApi: Partial = { - getEntities: jest.fn(), - }; + const mockCatalogApi = catalogApiMock.mock(); await renderInTestApp( { ownershipEntityRefs: ['user:default/guest'], }), }; - const mockCatalogApi: Partial = { - getEntities: jest.fn(), - }; + const mockCatalogApi = catalogApiMock.mock(); await renderInTestApp( { it('getAllDesendantMembersForGroupEntity correctly recursively returns all descendant members', async () => { - const catalogApi = mockedCatalogApiSupportingGroups as CatalogApi; + const catalogApi = mockedCatalogApiSupportingGroups; const actualGroupADescendantMembers = await getAllDesendantMembersForGroupEntity(groupA, catalogApi); @@ -60,7 +59,7 @@ describe('Helper functions', () => { }); it('getMembersFromGroups correctly returns all members of provided groups', async () => { - const catalogApi = mockedCatalogApiSupportingGroups as CatalogApi; + const catalogApi = mockedCatalogApiSupportingGroups; const actualNoGroupsMembers = await getMembersFromGroups([], catalogApi); const actualGroupAMembers = await getMembersFromGroups( @@ -123,7 +122,7 @@ describe('Helper functions', () => { it('getDescendantGroupsFromGroup correctly recursively returns descendant groups, ignoring duplicates', async () => { const actualDescendantGroups = await getDescendantGroupsFromGroup( groupA, - mockedCatalogApiSupportingGroups as CatalogApi, + mockedCatalogApiSupportingGroups, ); expect(actualDescendantGroups).toStrictEqual([ groupBRef, diff --git a/plugins/scaffolder/src/alpha/components/TemplateListPage/TemplateListPage.test.tsx b/plugins/scaffolder/src/alpha/components/TemplateListPage/TemplateListPage.test.tsx index ba00845577..6079ec2e1d 100644 --- a/plugins/scaffolder/src/alpha/components/TemplateListPage/TemplateListPage.test.tsx +++ b/plugins/scaffolder/src/alpha/components/TemplateListPage/TemplateListPage.test.tsx @@ -13,11 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { DefaultStarredEntitiesApi } from '@backstage/plugin-catalog'; import { catalogApiRef, starredEntitiesApiRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { permissionApiRef } from '@backstage/plugin-permission-react'; import { MockStorageApi, @@ -29,26 +31,18 @@ import { rootRouteRef } from '../../../routes'; import { TemplateListPage } from './TemplateListPage'; describe('TemplateListPage', () => { - const mockCatalogApi = { - getEntities: async () => ({ - items: [ - { - apiVersion: 'scaffolder.backstage.io/v1beta3', - kind: 'Template', - metadata: { name: 'blob', tags: ['blob'] }, - spec: { - type: 'service', - }, + const mockCatalogApi = catalogApiMock({ + entities: [ + { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Template', + metadata: { name: 'blob', tags: ['blob'] }, + spec: { + type: 'service', }, - ], - }), - getEntityFacets: async () => ({ - facets: { 'spec.type': [{ value: 'service', count: 1 }] }, - }), - getEntitiesByRefs: async () => ({ - items: [], - }), - }; + }, + ], + }); it('should render the search bar for templates', async () => { const { getByPlaceholderText } = await renderInTestApp( diff --git a/plugins/scaffolder/src/components/ListTasksPage/ListTaskPage.test.tsx b/plugins/scaffolder/src/components/ListTasksPage/ListTaskPage.test.tsx index f7f75bc3e8..96374662a4 100644 --- a/plugins/scaffolder/src/components/ListTasksPage/ListTaskPage.test.tsx +++ b/plugins/scaffolder/src/components/ListTasksPage/ListTaskPage.test.tsx @@ -16,11 +16,8 @@ import { Entity } from '@backstage/catalog-model'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; -import { - CatalogApi, - catalogApiRef, - entityRouteRef, -} from '@backstage/plugin-catalog-react'; +import { catalogApiRef, entityRouteRef } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import React from 'react'; import { identityApiRef } from '@backstage/core-plugin-api'; import { ListTasksPage } from './ListTasksPage'; @@ -32,9 +29,7 @@ import { act, fireEvent } from '@testing-library/react'; import { rootRouteRef } from '../../routes'; describe('', () => { - const catalogApi: jest.Mocked = { - getEntityByRef: jest.fn(), - } as any; + const catalogApi = catalogApiMock.mock(); const identityApi = { getBackstageIdentity: jest.fn(), diff --git a/plugins/scaffolder/src/components/ListTasksPage/columns/OwnerEntityColumn.test.tsx b/plugins/scaffolder/src/components/ListTasksPage/columns/OwnerEntityColumn.test.tsx index 84b86599d5..35eb9ce0b7 100644 --- a/plugins/scaffolder/src/components/ListTasksPage/columns/OwnerEntityColumn.test.tsx +++ b/plugins/scaffolder/src/components/ListTasksPage/columns/OwnerEntityColumn.test.tsx @@ -16,19 +16,14 @@ import { Entity } from '@backstage/catalog-model'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; -import { - CatalogApi, - catalogApiRef, - entityRouteRef, -} from '@backstage/plugin-catalog-react'; +import { catalogApiRef, entityRouteRef } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import React from 'react'; import { OwnerEntityColumn } from './OwnerEntityColumn'; import { identityApiRef } from '@backstage/core-plugin-api'; describe('', () => { - const catalogApi: jest.Mocked = { - getEntityByRef: jest.fn(), - } as any; + const catalogApi = catalogApiMock.mock(); const identityApi = { getBackstageIdentity: jest.fn(), diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx index dcb52a3949..3f8b1adc5a 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx @@ -17,7 +17,6 @@ import { CATALOG_FILTER_EXISTS } from '@backstage/catalog-client'; import { Entity } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, entityPresentationApiRef, } from '@backstage/plugin-catalog-react'; @@ -28,6 +27,7 @@ import { EntityPicker } from './EntityPicker'; import { EntityPickerProps } from './schema'; import { ScaffolderRJSFFieldProps as FieldProps } from '@backstage/plugin-scaffolder-react'; import { DefaultEntityPresentationApi } from '@backstage/plugin-catalog'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; const makeEntity = (kind: string, namespace: string, name: string): Entity => ({ apiVersion: 'scaffolder.backstage.io/v1beta3', @@ -36,7 +36,10 @@ const makeEntity = (kind: string, namespace: string, name: string): Entity => ({ }); describe('', () => { - let entities: Entity[]; + const entities: Entity[] = [ + makeEntity('Group', 'default', 'team-a'), + makeEntity('Group', 'default', 'squad-b'), + ]; const onChange = jest.fn(); const schema = {}; const required = false; @@ -46,23 +49,13 @@ describe('', () => { let props: FieldProps; - const catalogApi: jest.Mocked = { - getLocationById: jest.fn(), - getEntityByName: jest.fn(), + const catalogApi = catalogApiMock.mock({ getEntities: jest.fn(async () => ({ items: entities })), - addLocation: jest.fn(), - getLocationByRef: jest.fn(), - removeEntityByUid: jest.fn(), - } as any; + }); let Wrapper: React.ComponentType>; beforeEach(() => { - entities = [ - makeEntity('Group', 'default', 'team-a'), - makeEntity('Group', 'default', 'squad-b'), - ]; - Wrapper = ({ children }: { children?: React.ReactNode }) => ( ', () => { rawErrors, formData, } as unknown as FieldProps; - - catalogApi.getEntities.mockResolvedValue({ items: entities }); }); it('searches for all entities', async () => { diff --git a/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.test.tsx b/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.test.tsx index edd777652b..74b9dadda3 100644 --- a/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.test.tsx @@ -17,7 +17,6 @@ import { CATALOG_FILTER_EXISTS } from '@backstage/catalog-client'; import { Entity } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, entityPresentationApiRef, } from '@backstage/plugin-catalog-react'; @@ -30,6 +29,7 @@ import { MultiEntityPicker } from './MultiEntityPicker'; import { MultiEntityPickerProps } from './schema'; import { ScaffolderRJSFFieldProps as FieldProps } from '@backstage/plugin-scaffolder-react'; import { DefaultEntityPresentationApi } from '@backstage/plugin-catalog'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; const makeEntity = (kind: string, namespace: string, name: string): Entity => ({ apiVersion: 'scaffolder.backstage.io/v1beta3', @@ -38,7 +38,10 @@ const makeEntity = (kind: string, namespace: string, name: string): Entity => ({ }); describe('', () => { - let entities: Entity[]; + const entities: Entity[] = [ + makeEntity('Group', 'default', 'team-a'), + makeEntity('Group', 'default', 'squad-b'), + ]; const onChange = jest.fn(); const schema = {}; const required = false; @@ -48,22 +51,12 @@ describe('', () => { let props: FieldProps; - const catalogApi: jest.Mocked = { - getLocationById: jest.fn(), - getEntityByName: jest.fn(), + const catalogApi = catalogApiMock.mock({ getEntities: jest.fn(async () => ({ items: entities })), - addLocation: jest.fn(), - getLocationByRef: jest.fn(), - removeEntityByUid: jest.fn(), - } as any; + }); let Wrapper: React.ComponentType>; beforeEach(() => { - entities = [ - makeEntity('Group', 'default', 'team-a'), - makeEntity('Group', 'default', 'squad-b'), - ]; - Wrapper = ({ children }: { children?: React.ReactNode }) => ( ', () => { rawErrors, formData, } as unknown as FieldProps; - - catalogApi.getEntities.mockResolvedValue({ items: entities }); }); it('searches for all entities', async () => { diff --git a/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.test.tsx b/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.test.tsx index 74af578a21..d4a37d0752 100644 --- a/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.test.tsx @@ -16,7 +16,7 @@ import React from 'react'; import { waitFor } from '@testing-library/react'; -import { CatalogApi } from '@backstage/catalog-client'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { MyGroupsPicker } from './MyGroupsPicker'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { @@ -60,9 +60,9 @@ describe('', () => { const schema = {}; const required = false; - const catalogApi: jest.Mocked = { + const catalogApi = catalogApiMock.mock({ getEntities: jest.fn(async () => ({ items: entities })), - } as any; + }); const mockErrorApi: jest.Mocked = { post: jest.fn(), diff --git a/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx b/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx index 79105e05c3..329448b224 100644 --- a/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx @@ -17,10 +17,10 @@ import { type EntityFilterQuery } from '@backstage/catalog-client'; import { Entity } from '@backstage/catalog-model'; import { - CatalogApi, catalogApiRef, entityPresentationApiRef, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { ScaffolderRJSFFieldProps as FieldProps } from '@backstage/plugin-scaffolder-react'; import React from 'react'; @@ -34,7 +34,10 @@ const makeEntity = (kind: string, namespace: string, name: string): Entity => ({ }); describe('', () => { - let entities: Entity[]; + const entities: Entity[] = [ + makeEntity('Group', 'default', 'team-a'), + makeEntity('Group', 'default', 'squad-b'), + ]; const onChange = jest.fn(); const schema = {}; const required = false; @@ -52,22 +55,12 @@ describe('', () => { let props: FieldProps; - const catalogApi: jest.Mocked = { - getLocationById: jest.fn(), - getEntityByName: jest.fn(), + const catalogApi = catalogApiMock.mock({ getEntities: jest.fn(async () => ({ items: entities })), - addLocation: jest.fn(), - getLocationByRef: jest.fn(), - removeEntityByUid: jest.fn(), - } as any; + }); let Wrapper: React.ComponentType>; beforeEach(() => { - entities = [ - makeEntity('Group', 'default', 'team-a'), - makeEntity('Group', 'default', 'squad-b'), - ]; - Wrapper = ({ children }: { children?: React.ReactNode }) => ( ', () => { rawErrors, formData, } as unknown as FieldProps; - - catalogApi.getEntities.mockResolvedValue({ items: entities }); }); it('searches for users and groups', async () => { @@ -134,8 +125,6 @@ describe('', () => { rawErrors, formData, } as unknown as FieldProps; - - catalogApi.getEntities.mockResolvedValue({ items: entities }); }); it('searches for users', async () => { @@ -228,8 +217,6 @@ describe('', () => { rawErrors, formData, } as unknown as FieldProps; - - catalogApi.getEntities.mockResolvedValue({ items: entities }); }); it('searches for users and groups or teams and business units', async () => { diff --git a/plugins/techdocs/src/home/components/DefaultTechDocsHome.test.tsx b/plugins/techdocs/src/home/components/DefaultTechDocsHome.test.tsx index 1f073e184d..513a56265c 100644 --- a/plugins/techdocs/src/home/components/DefaultTechDocsHome.test.tsx +++ b/plugins/techdocs/src/home/components/DefaultTechDocsHome.test.tsx @@ -21,11 +21,11 @@ import { storageApiRef, } from '@backstage/core-plugin-api'; import { - CatalogApi, catalogApiRef, starredEntitiesApiRef, MockStarredEntitiesApi, } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { MockStorageApi, renderInTestApp, @@ -36,22 +36,18 @@ import React from 'react'; import { rootDocsRouteRef } from '../../routes'; import { DefaultTechDocsHome } from './DefaultTechDocsHome'; -const mockCatalogApi: Partial = { - getEntityFacets: async () => ({ facets: { 'relations.ownedBy': [] } }), - getEntitiesByRefs: () => Promise.resolve({ items: [] }), - getEntities: async () => ({ - items: [ - { - apiVersion: 'version', - kind: 'User', - metadata: { - name: 'owned', - namespace: 'default', - }, +const mockCatalogApi = catalogApiMock({ + entities: [ + { + apiVersion: 'version', + kind: 'User', + metadata: { + name: 'owned', + namespace: 'default', }, - ], - }), -}; + }, + ], +}); describe('TechDocs Home', () => { const configApi: ConfigApi = new ConfigReader({ diff --git a/plugins/techdocs/src/home/components/Grids/EntityListDocsGrid.test.tsx b/plugins/techdocs/src/home/components/Grids/EntityListDocsGrid.test.tsx index 1e65efb587..947c81ae85 100644 --- a/plugins/techdocs/src/home/components/Grids/EntityListDocsGrid.test.tsx +++ b/plugins/techdocs/src/home/components/Grids/EntityListDocsGrid.test.tsx @@ -21,12 +21,14 @@ import { storageApiRef, } from '@backstage/core-plugin-api'; import { - CatalogApi, catalogApiRef, starredEntitiesApiRef, MockStarredEntitiesApi, } from '@backstage/plugin-catalog-react'; -import { MockEntityListContextProvider } from '@backstage/plugin-catalog-react/testUtils'; +import { + MockEntityListContextProvider, + catalogApiMock, +} from '@backstage/plugin-catalog-react/testUtils'; import { MockStorageApi, renderInTestApp, @@ -62,12 +64,7 @@ const entities = [ }, ]; -const mockCatalogApi = { - getEntityByRef: () => Promise.resolve(), - getEntities: async () => ({ - items: entities, - }), -} as Partial; +const mockCatalogApi = catalogApiMock({ entities }); describe('Entity List Docs Grid', () => { beforeEach(() => { diff --git a/plugins/techdocs/src/home/components/TechDocsCustomHome.test.tsx b/plugins/techdocs/src/home/components/TechDocsCustomHome.test.tsx index 6f09a70b5e..409d68a593 100644 --- a/plugins/techdocs/src/home/components/TechDocsCustomHome.test.tsx +++ b/plugins/techdocs/src/home/components/TechDocsCustomHome.test.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ -import { CatalogApi, catalogApiRef } from '@backstage/plugin-catalog-react'; +import { catalogApiRef } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; import { screen } from '@testing-library/react'; import React from 'react'; @@ -22,21 +23,18 @@ import { TechDocsCustomHome, PanelType } from './TechDocsCustomHome'; import { ApiProvider } from '@backstage/core-app-api'; import { rootDocsRouteRef } from '../../routes'; -const mockCatalogApi = { - getEntityByRef: jest.fn(), - getEntities: async () => ({ - items: [ - { - apiVersion: 'version', - kind: 'User', - metadata: { - name: 'owned', - namespace: 'default', - }, +const mockCatalogApi = catalogApiMock({ + entities: [ + { + apiVersion: 'version', + kind: 'User', + metadata: { + name: 'owned', + namespace: 'default', }, - ], - }), -} as Partial; + }, + ], +}); describe('TechDocsCustomHome', () => { const apiRegistry = TestApiRegistry.from([catalogApiRef, mockCatalogApi]);