Skip to content

Commit

Permalink
Filter and show only those providers that have valid event metadata o…
Browse files Browse the repository at this point in the history
…n provider selection (#49)
  • Loading branch information
sangeetha5491 committed Oct 12, 2023
1 parent 95efc2a commit 1c04d53
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 43 deletions.
64 changes: 40 additions & 24 deletions lib/events/EventsOfInterestHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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
}

Expand Down
6 changes: 6 additions & 0 deletions lib/events/ProviderHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
Expand Down Expand Up @@ -64,6 +69,7 @@ async function selectEventMetadataForProvider (providerSelected, eventMetadataCh
}

module.exports = {
getAllEntitledProvidersForOrg,
selectProviderForProviderMetadata,
selectEventMetadataForProvider
}
39 changes: 22 additions & 17 deletions test/lib/events/EventsOfInterestHelper.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => ({
Expand All @@ -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++) {
Expand All @@ -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
Expand All @@ -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')
Expand Down
39 changes: 37 additions & 2 deletions test/lib/events/ProviderHelper.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,42 @@ 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', () => ({
getEntitledProviderMetadataForOrg: jest.fn().mockResolvedValue(mockData.data.providerMetadataList),
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++) {
Expand All @@ -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()
})
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 1c04d53

Please sign in to comment.