diff --git a/lib/events/EventsOfInterestHelper.js b/lib/events/EventsOfInterestHelper.js index ef952c0..ac8ed6c 100644 --- a/lib/events/EventsOfInterestHelper.js +++ b/lib/events/EventsOfInterestHelper.js @@ -9,16 +9,23 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ -const { selectEventMetadataForProvider, selectProviderForProviderMetadata } = require('./ProviderHelper') +const { getAllEntitledProvidersForOrg, selectEventMetadataForProvider, selectProviderForProviderMetadata } = require('./ProviderHelper') const { getEntitledProviderMetadataForOrg, getProviderMetadata } = require('./ProviderMetadataHelper') async function promptForEventsOfInterest (eventsClient, obj, options) { + // get all entitled provider metadata for the org const providerMetadataList = await getEntitledProviderMetadataForOrg(eventsClient) - // get all providers filtered by the selected provider metadata ids - const providerMetadataIds = await getProviderMetadata(obj, providerMetadataList, options) - // get a map of provider_metadata_id -> providers - const providerMetadataToProvidersMap = await getProviderMetadataToProvidersMap(obj.projectConfig.org.id, eventsClient, providerMetadataIds) - // get the existing map of provider_metadata_id -> provider_id from the .env file + // get all entitled providers for the org + const allProvidersForOrgList = await getAllEntitledProvidersForOrg(eventsClient, obj.projectConfig.org.id) + // get a map of provider_metadata_id -> List of providers with valid event metadata + const providerMetadataToProvidersMap = getProviderMetadataToProvidersMap(obj.projectConfig.org.id, eventsClient, allProvidersForOrgList) + // filter provider metadata that do not have associated providers + const filteredProviderMetadataList = filterProviderMetadataWithInvalidProviders(providerMetadataList, + providerMetadataToProvidersMap) + // get user selected provider metadata ids + const providerMetadataIds = await getProviderMetadata(obj, filteredProviderMetadataList, options) + + // get user selected providers and associated event metadata const selectedProvidersToEventMetadata = new Map() for (const providerMetadataId of providerMetadataIds) { const providerSelected = await selectProviderForProviderMetadata( @@ -34,26 +41,35 @@ async function promptForEventsOfInterest (eventsClient, obj, options) { return selectedProvidersToEventMetadata } +/** @private + * Filter provider metadata that do not have any providers + */ +function filterProviderMetadataWithInvalidProviders (providerMetadataList, providerMetadataToProvidersMap) { + const filteredProviderMetadataList = [] + for (const providerMetadata of providerMetadataList) { + const providerMetadataId = providerMetadata.id + if (providerMetadataToProvidersMap[providerMetadataId]?.length > 0) { + filteredProviderMetadataList.push(providerMetadata) + } + } + return filteredProviderMetadataList +} + /** @private */ -async function getProviderMetadataToProvidersMap (consumerId, eventsClient, providerMetadataIds) { - const providersHalModel = await eventsClient.getAllProviders(consumerId, { - fetchEventMetadata: true, - filterBy: { - providerMetadataIds +function getProviderMetadataToProvidersMap (consumerId, eventsClient, allProvidersForOrgList) { + const providerMetadataToProvidersMap = {} + for (const provider of allProvidersForOrgList) { + if (provider._embedded?.eventmetadata?.length > 0) { + providerMetadataToProvidersMap[provider.provider_metadata] = providerMetadataToProvidersMap[provider.provider_metadata] || [] + providerMetadataToProvidersMap[provider.provider_metadata].push({ + id: provider.id, + label: provider.label, + description: provider.description, + provider_metadata: provider.provider_metadata, + eventmetadata: provider._embedded.eventmetadata + }) } - }) - const providers = providersHalModel._embedded.providers - const providerMetadataToProvidersMap = providers.reduce((providerMetadataToProvidersMap, provider) => { - providerMetadataToProvidersMap[provider.provider_metadata] = providerMetadataToProvidersMap[provider.provider_metadata] || [] - providerMetadataToProvidersMap[provider.provider_metadata].push({ - id: provider.id, - label: provider.label, - description: provider.description, - provider_metadata: provider.provider_metadata, - eventmetadata: provider._embedded.eventmetadata - }) - return providerMetadataToProvidersMap - }, []) + } return providerMetadataToProvidersMap } diff --git a/lib/events/ProviderHelper.js b/lib/events/ProviderHelper.js index 4444b35..16c4e5b 100644 --- a/lib/events/ProviderHelper.js +++ b/lib/events/ProviderHelper.js @@ -9,6 +9,11 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ +async function getAllEntitledProvidersForOrg (eventsClient, consumerId) { + const providerCollectionHalModels = await eventsClient.getAllProviders(consumerId, { fetchEventMetadata: true }) + return providerCollectionHalModels._embedded.providers +} + async function selectProviderForProviderMetadata (providerMetadataToProvidersMap, providerMetadata, obj) { const providerChoices = [] @@ -64,6 +69,7 @@ async function selectEventMetadataForProvider (providerSelected, eventMetadataCh } module.exports = { + getAllEntitledProvidersForOrg, selectProviderForProviderMetadata, selectEventMetadataForProvider } diff --git a/test/lib/events/EventsOfInterestHelper.test.js b/test/lib/events/EventsOfInterestHelper.test.js index c77ae83..4afd5d1 100644 --- a/test/lib/events/EventsOfInterestHelper.test.js +++ b/test/lib/events/EventsOfInterestHelper.test.js @@ -12,14 +12,16 @@ governing permissions and limitations under the License. const eventsSdk = require('@adobe/aio-lib-events') const mockData = require('../mock') const { promptForEventsOfInterest, getProviderMetadataToProvidersExistingMap } = require('../../../lib/events/EventsOfInterestHelper') -const { selectEventMetadataForProvider, selectProviderForProviderMetadata } = require('../../../lib/events/ProviderHelper') +const { getAllEntitledProvidersForOrg, selectEventMetadataForProvider, selectProviderForProviderMetadata } = require('../../../lib/events/ProviderHelper') const EventsGenerator = require('../../../lib/EventsGenerator') +const { getProviderMetadata } = require('../../../lib/events/ProviderMetadataHelper') jest.mock('yeoman-generator') jest.mock('../../../lib/EventsGenerator') jest.mock('@adobe/aio-lib-events') jest.mock('../../../lib/events/ProviderHelper', () => ({ selectEventMetadataForProvider: jest.fn(), - selectProviderForProviderMetadata: jest.fn() + selectProviderForProviderMetadata: jest.fn(), + getAllEntitledProvidersForOrg: jest.fn() })) jest.mock('../../../lib/events/ProviderMetadataHelper', () => ({ @@ -45,17 +47,6 @@ const getTestProvider = (index, numberOfEvents) => { } } -const mockEventsSdkInstance = { - getAllProviders: jest.fn().mockResolvedValue({ - _embedded: { - providers: [ - getTestProvider(1, 2), - getTestProvider(2, 1) - ] - } - }) -} - const getTestSelectedProvider = (index, numberOfEvents) => { const eventMetadatas = [] for (let number = 1; number <= numberOfEvents; number++) { @@ -76,10 +67,6 @@ const getTestSelectedProvider = (index, numberOfEvents) => { const aioEventsMappingEnvVariableDotEnv = 'provider-metadata-1:provider-id-1,provider-metadata-2:provider-id-2' -beforeEach(() => { - eventsSdk.init.mockResolvedValue(mockEventsSdkInstance) -}) - describe('test prompt for events of interest', () => { let eventsGenerator let eventsClient @@ -93,10 +80,28 @@ describe('test prompt for events of interest', () => { selectProviderForProviderMetadata .mockReturnValueOnce(getTestSelectedProvider(1, 2)) .mockReturnValueOnce(getTestSelectedProvider(2, 1)) + getAllEntitledProvidersForOrg.mockReturnValue([ + getTestProvider(1, 2), + getTestProvider(2, 1), + getTestProvider(3, 0) + ]) }) test('successfully fetch providers to event metadata map', async () => { const eventsOfInterest = await promptForEventsOfInterest(eventsClient, eventsGenerator) + expect(getProviderMetadata).toHaveBeenCalledWith(eventsGenerator, [{ + description: 'provider-metadata-desc-1', + group: 'provider-metadata-group-1', + has_multiple_providers: true, + id: 'provider-metadata-1', + label: 'provider-metadata-label-1' + }, { + description: 'provider-metadata-desc-2', + group: 'provider-metadata-group-2', + has_multiple_providers: false, + id: 'provider-metadata-2', + label: 'provider-metadata-label-2' + }], undefined) expect(eventsOfInterest['provider-metadata-1']).toBeTruthy() expect(eventsOfInterest['provider-metadata-2']).toBeTruthy() expect(eventsOfInterest['provider-metadata-1'].provider.id).toContain('provider-id-1') diff --git a/test/lib/events/ProviderHelper.test.js b/test/lib/events/ProviderHelper.test.js index cd2391c..2292052 100644 --- a/test/lib/events/ProviderHelper.test.js +++ b/test/lib/events/ProviderHelper.test.js @@ -10,10 +10,15 @@ governing permissions and limitations under the License. */ const mockData = require('../mock') -const { selectEventMetadataForProvider, selectProviderForProviderMetadata } = require('../../../lib/events/ProviderHelper') +const { + selectEventMetadataForProvider, selectProviderForProviderMetadata, + getAllEntitledProvidersForOrg +} = require('../../../lib/events/ProviderHelper') const EventsGenerator = require('../../../lib/EventsGenerator') +const eventsSdk = require('@adobe/aio-lib-events') jest.mock('yeoman-generator') +jest.mock('@adobe/aio-lib-events') jest.mock('../../../lib/EventsGenerator') jest.mock('../../../lib/events/ProviderMetadataHelper', () => ({ @@ -21,6 +26,26 @@ jest.mock('../../../lib/events/ProviderMetadataHelper', () => ({ getProviderMetadata: jest.fn().mockResolvedValue(['provider-metadata-1', 'provider-metadata-2']) })) +const mockEventsSdkInstance = { + getAllProviders: jest.fn().mockResolvedValue({ + _embedded: { + providers: [{ + id: 'provider-id-1', + label: 'provider-label-1', + description: 'provider-description-1', + provider_metadata: 'provider-metadata-1' + }, + { + id: 'provider-id-2', + label: 'provider-label-2', + description: 'provider-description-2', + provider_metadata: 'provider-metadata-2' + } + ] + } + }) +} + const getTestProvider = (index, numberOfEvents, providerMetadata) => { const eventMetadatas = [] for (let number = 1; number <= numberOfEvents; number++) { @@ -46,11 +71,16 @@ const providerMetadataToProvidersMap = { getTestProvider(3, 1, 'provider-metadata-2')] } +beforeEach(() => { + eventsSdk.init.mockResolvedValue(mockEventsSdkInstance) +}) describe('test provider selection helper', () => { let eventsGenerator let promptSpy - beforeEach(() => { + let eventsClient + beforeEach(async () => { promptSpy = jest.spyOn(EventsGenerator.prototype, 'prompt') + eventsClient = await eventsSdk.init('orgid', 'api-key', 'token') EventsGenerator.prototype.projectConfig = mockData.data.projectConfig eventsGenerator = new EventsGenerator() }) @@ -96,6 +126,11 @@ describe('test provider selection helper', () => { expect(eventMetadataSelection).toContain('event-code-2') }) + test('get all entitled providers for org', async () => { + const providerListResponse = await getAllEntitledProvidersForOrg(eventsClient, 'consumerId') + expect(providerListResponse.length).toBe(2) + }) + test('validates empty for event metadata selection', async () => { promptSpy.mockResolvedValue('') await selectEventMetadataForProvider(getTestProvider(1, 2, 'provider-metadata-1'), [], eventsGenerator)