catalog-react: add useFacetsEntities tests

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>
This commit is contained in:
Vincenzo Scamporlino
2023-06-09 23:20:14 +02:00
parent fbfbd829df
commit 31bdcbc81a
@@ -0,0 +1,244 @@
/*
* Copyright 2023 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { renderHook } from '@testing-library/react-hooks';
import { useFacetsEntities } from './useFacetsEntities';
import { CatalogApi } from '@backstage/catalog-client';
const mockedGetEntityFacets: jest.MockedFn<CatalogApi['getEntityFacets']> =
jest.fn();
const mockCatalogApi: Partial<CatalogApi> = {
getEntityFacets: mockedGetEntityFacets,
};
jest.mock('@backstage/core-plugin-api', () => ({
...jest.requireActual('@backstage/core-plugin-api'),
useApi: () => mockCatalogApi,
}));
describe('useFacetsEntities', () => {
afterEach(() => {
jest.resetAllMocks();
});
it(`should return empty items when facets are loading`, () => {
mockedGetEntityFacets.mockReturnValue(new Promise(() => {}));
const { result } = renderHook(() => useFacetsEntities({ enabled: true }));
expect(result.current[0]).toEqual({ value: { items: [] }, loading: true });
});
it(`should return the owners`, async () => {
mockedGetEntityFacets.mockResolvedValue({
facets: {
'relations.ownedBy': [
{ count: 1, value: 'component:default/e2' },
{ count: 1, value: 'component:default/e1' },
],
},
});
const { result, waitFor } = renderHook(() =>
useFacetsEntities({ enabled: true }),
);
result.current[1]({ text: '' });
await waitFor(() => {
expect(result.current[0]).toEqual({
value: {
items: [
{
apiVersion: 'backstage.io/v1beta1',
kind: 'component',
metadata: { name: 'e1', namespace: 'default' },
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'component',
metadata: { name: 'e2', namespace: 'default' },
},
],
},
loading: false,
});
});
});
it(`should return the owners sorted by namespace, name and kind`, async () => {
const entityRefs = [
'group:namespace/team-b',
'component:default/c',
'group:default/a',
'component:default/a',
'component:default/b',
];
mockedGetEntityFacets.mockResolvedValue({
facets: {
'relations.ownedBy': entityRefs.map(value => ({ count: 1, value })),
},
});
const { result, waitFor } = renderHook(() =>
useFacetsEntities({ enabled: true }),
);
result.current[1]({ text: '' });
await waitFor(() => {
expect(result.current[0]).toEqual({
value: {
items: [
{
apiVersion: 'backstage.io/v1beta1',
kind: 'component',
metadata: { name: 'a', namespace: 'default' },
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'group',
metadata: { name: 'a', namespace: 'default' },
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'component',
metadata: { name: 'b', namespace: 'default' },
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'component',
metadata: { name: 'c', namespace: 'default' },
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'group',
metadata: { name: 'team-b', namespace: 'namespace' },
},
],
},
loading: false,
});
});
});
it(`should paginate the data accordingly`, async () => {
const entityRefs = [
'group:namespace/team-b',
'component:default/c',
'group:default/a',
'component:default/a',
'component:default/b',
];
mockedGetEntityFacets.mockResolvedValue({
facets: {
'relations.ownedBy': entityRefs.map(value => ({ count: 1, value })),
},
});
const { result, waitFor } = renderHook(() =>
useFacetsEntities({ enabled: true }),
);
result.current[1]({ text: '' }, { limit: 2 });
await waitFor(() => {
expect(result.current[0]).toEqual({
value: {
items: [
{
apiVersion: 'backstage.io/v1beta1',
kind: 'component',
metadata: { name: 'a', namespace: 'default' },
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'group',
metadata: { name: 'a', namespace: 'default' },
},
],
cursor: 'eyJ0ZXh0IjoiIiwic3RhcnQiOjJ9',
},
loading: false,
});
});
result.current[1](result.current[0].value!, { limit: 2 });
await waitFor(() => {
expect(result.current[0]).toEqual({
value: {
items: [
{
apiVersion: 'backstage.io/v1beta1',
kind: 'component',
metadata: { name: 'a', namespace: 'default' },
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'group',
metadata: { name: 'a', namespace: 'default' },
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'component',
metadata: { name: 'b', namespace: 'default' },
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'component',
metadata: { name: 'c', namespace: 'default' },
},
],
cursor: 'eyJ0ZXh0IjoiIiwic3RhcnQiOjR9',
},
loading: false,
});
});
result.current[1](result.current[0].value!, { limit: 2 });
await waitFor(() => {
expect(result.current[0]).toEqual({
value: {
items: [
{
apiVersion: 'backstage.io/v1beta1',
kind: 'component',
metadata: { name: 'a', namespace: 'default' },
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'group',
metadata: { name: 'a', namespace: 'default' },
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'component',
metadata: { name: 'b', namespace: 'default' },
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'component',
metadata: { name: 'c', namespace: 'default' },
},
{
apiVersion: 'backstage.io/v1beta1',
kind: 'group',
metadata: { name: 'team-b', namespace: 'namespace' },
},
],
},
loading: false,
});
});
});
});