From 9ae08d07e2b88253a42822cb65427f125c566486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 20 Apr 2026 14:21:57 +0200 Subject: [PATCH] Add thorough facets tests for predicate queries and compound filters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds standalone test coverage for the facets method in DefaultEntitiesCatalog to ensure it works correctly with: - Predicate query filtering (simple key match) - Predicate query filtering using $in operator - Compound allOf filters - Compound anyOf filters - Both filter and query combined Signed-off-by: Fredrik Adelöw Made-with: Cursor --- .../service/DefaultEntitiesCatalog.test.ts | 240 ++++++++++++++++++ 1 file changed, 240 insertions(+) diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index 3a184676df..ad931dca61 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -2437,6 +2437,246 @@ describe('DefaultEntitiesCatalog', () => { }); }, ); + + it.each(databases.eachSupportedId())( + 'filters with a predicate query, %p', + async databaseId => { + await createDatabase(databaseId); + + await addEntityToSearch({ + apiVersion: 'a', + kind: 'Component', + metadata: { name: 'one' }, + spec: { type: 'service' }, + }); + await addEntityToSearch({ + apiVersion: 'a', + kind: 'Component', + metadata: { name: 'two' }, + spec: { type: 'library' }, + }); + await addEntityToSearch({ + apiVersion: 'a', + kind: 'API', + metadata: { name: 'three' }, + spec: { type: 'openapi' }, + }); + + const catalog = new DefaultEntitiesCatalog({ + database: knex, + logger: mockServices.logger.mock(), + stitcher, + }); + + await expect( + catalog.facets({ + facets: ['spec.type'], + query: { kind: 'component' }, + credentials: mockCredentials.none(), + }), + ).resolves.toEqual({ + facets: { + 'spec.type': expect.arrayContaining([ + { value: 'service', count: 1 }, + { value: 'library', count: 1 }, + ]), + }, + }); + }, + ); + + it.each(databases.eachSupportedId())( + 'filters with a predicate query using $in, %p', + async databaseId => { + await createDatabase(databaseId); + + await addEntityToSearch({ + apiVersion: 'a', + kind: 'Component', + metadata: { name: 'one' }, + spec: { type: 'service' }, + }); + await addEntityToSearch({ + apiVersion: 'a', + kind: 'API', + metadata: { name: 'two' }, + spec: { type: 'openapi' }, + }); + await addEntityToSearch({ + apiVersion: 'a', + kind: 'System', + metadata: { name: 'three' }, + spec: {}, + }); + + const catalog = new DefaultEntitiesCatalog({ + database: knex, + logger: mockServices.logger.mock(), + stitcher, + }); + + await expect( + catalog.facets({ + facets: ['kind'], + query: { kind: { $in: ['component', 'api'] } }, + credentials: mockCredentials.none(), + }), + ).resolves.toEqual({ + facets: { + kind: expect.arrayContaining([ + { value: 'Component', count: 1 }, + { value: 'API', count: 1 }, + ]), + }, + }); + }, + ); + + it.each(databases.eachSupportedId())( + 'filters with compound allOf filter, %p', + async databaseId => { + await createDatabase(databaseId); + + await addEntityToSearch({ + apiVersion: 'a', + kind: 'Component', + metadata: { name: 'one' }, + spec: { type: 'service' }, + }); + await addEntityToSearch({ + apiVersion: 'a', + kind: 'Component', + metadata: { name: 'two' }, + spec: { type: 'library' }, + }); + await addEntityToSearch({ + apiVersion: 'a', + kind: 'API', + metadata: { name: 'three' }, + spec: { type: 'openapi' }, + }); + + const catalog = new DefaultEntitiesCatalog({ + database: knex, + logger: mockServices.logger.mock(), + stitcher, + }); + + await expect( + catalog.facets({ + facets: ['metadata.name'], + filter: { + allOf: [ + { key: 'kind', values: ['component'] }, + { key: 'spec.type', values: ['service'] }, + ], + }, + credentials: mockCredentials.none(), + }), + ).resolves.toEqual({ + facets: { + 'metadata.name': [{ value: 'one', count: 1 }], + }, + }); + }, + ); + + it.each(databases.eachSupportedId())( + 'filters with compound anyOf filter, %p', + async databaseId => { + await createDatabase(databaseId); + + await addEntityToSearch({ + apiVersion: 'a', + kind: 'Component', + metadata: { name: 'one' }, + spec: { type: 'service' }, + }); + await addEntityToSearch({ + apiVersion: 'a', + kind: 'API', + metadata: { name: 'two' }, + spec: { type: 'openapi' }, + }); + await addEntityToSearch({ + apiVersion: 'a', + kind: 'System', + metadata: { name: 'three' }, + spec: {}, + }); + + const catalog = new DefaultEntitiesCatalog({ + database: knex, + logger: mockServices.logger.mock(), + stitcher, + }); + + await expect( + catalog.facets({ + facets: ['metadata.name'], + filter: { + anyOf: [ + { key: 'kind', values: ['component'] }, + { key: 'kind', values: ['api'] }, + ], + }, + credentials: mockCredentials.none(), + }), + ).resolves.toEqual({ + facets: { + 'metadata.name': expect.arrayContaining([ + { value: 'one', count: 1 }, + { value: 'two', count: 1 }, + ]), + }, + }); + }, + ); + + it.each(databases.eachSupportedId())( + 'filters with both filter and query combined, %p', + async databaseId => { + await createDatabase(databaseId); + + await addEntityToSearch({ + apiVersion: 'a', + kind: 'Component', + metadata: { name: 'one' }, + spec: { type: 'service' }, + }); + await addEntityToSearch({ + apiVersion: 'a', + kind: 'Component', + metadata: { name: 'two' }, + spec: { type: 'library' }, + }); + await addEntityToSearch({ + apiVersion: 'a', + kind: 'API', + metadata: { name: 'three' }, + spec: { type: 'openapi' }, + }); + + const catalog = new DefaultEntitiesCatalog({ + database: knex, + logger: mockServices.logger.mock(), + stitcher, + }); + + await expect( + catalog.facets({ + facets: ['spec.type'], + filter: { key: 'kind', values: ['component'] }, + query: { 'metadata.name': 'one' }, + credentials: mockCredentials.none(), + }), + ).resolves.toEqual({ + facets: { + 'spec.type': [{ value: 'service', count: 1 }], + }, + }); + }, + ); }); });