Skip to content

Commit

Permalink
plugin-flow-builder: handoff test (#2821)
Browse files Browse the repository at this point in the history
## Description

- Refactor create QueuesApi class and then create a
mockQueueAvailability for testing
- Add test to check conditional queue and handoff nodes

## Testing

Add tests for conditional queue and handoff nodes
  • Loading branch information
Iru89 committed May 14, 2024
1 parent 0a04c04 commit 33612c9
Show file tree
Hide file tree
Showing 4 changed files with 350 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,32 @@ export async function conditionalQueueStatus({
return data.open ? QueueStatusResult.OPEN : QueueStatusResult.CLOSED
}

interface AvailabilityData {
export class HubtypeQueuesApi {
public queueId: string
public checkAvailableAgents: boolean

constructor(queueId: string, checkAvailableAgents?: boolean) {
this.queueId = queueId
this.checkAvailableAgents = checkAvailableAgents || false
}

async getAvailability(): Promise<AvailabilityData> {
const response = await axios.get(
`${HUBTYPE_API_URL}/public/v1/queues/${this.queueId}/availability/`,
// TODO: Make it configurable in the future
{
params: {
check_queue_schedule: true,
check_waiting_cases: false,
check_available_agents: this.checkAvailableAgents,
},
}
)
return response.data
}
}

export interface AvailabilityData {
available: boolean
waiting_cases: number
availability_threshold_waiting_cases: number
Expand All @@ -40,16 +65,6 @@ export async function getQueueAvailability(
queueId: string,
checkAvailableAgents = false
): Promise<AvailabilityData> {
const response = await axios.get(
`${HUBTYPE_API_URL}/public/v1/queues/${queueId}/availability/`,
// TODO: Make it configurable in the future
{
params: {
check_queue_schedule: true,
check_waiting_cases: false,
check_available_agents: checkAvailableAgents,
},
}
)
return response.data
const queuesApi = new HubtypeQueuesApi(queueId, checkAvailableAgents)
return await queuesApi.getAvailability()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { jest } from '@jest/globals'

import {
AvailabilityData,
HubtypeQueuesApi,
} from '../../src/functions/conditional-queue-status'

interface QueueAvailabilityMockOptions {
availableAgents?: number
isOpen?: boolean
name: string
}

export function mockQueueAvailability({
availableAgents = 0,
isOpen = false,
name,
}: QueueAvailabilityMockOptions) {
const getQueueAvailabilitySpy = jest.spyOn(
HubtypeQueuesApi.prototype as any,
'getAvailability'
)

getQueueAvailabilitySpy.mockImplementation(
async (): Promise<AvailabilityData> => {
return {
available: true,
waiting_cases: 0,
availability_threshold_waiting_cases: 0,
open: isOpen,
name,
available_agents: availableAgents,
}
}
)
}
67 changes: 67 additions & 0 deletions packages/botonic-plugin-flow-builder/tests/handoff.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { INPUT } from '@botonic/core'
import { describe, test } from '@jest/globals'

import { FlowText } from '../src/index'
import { ProcessEnvNodeEnvs } from '../src/types'
// eslint-disable-next-line jest/no-mocks-import
import { mockQueueAvailability } from './__mocks__/conditional-queue'
import { basicFlow } from './helpers/flows/basic'
import {
createFlowBuilderPlugin,
createRequest,
getContentsAfterPreAndBotonicInit,
} from './helpers/utils'

describe('Check the content returned by the plugin, when the queue is open', () => {
process.env.NODE_ENV = ProcessEnvNodeEnvs.PRODUCTION
const flowBuilderPlugin = createFlowBuilderPlugin(basicFlow)

beforeEach(() => mockQueueAvailability({ isOpen: true, name: 'General' }))

test('The content connected to the status queue open is displayed and a handoff is done', async () => {
const request = createRequest({
input: { data: 'agent', type: INPUT.TEXT },
plugins: {
// @ts-ignore
flowBuilderPlugin,
},
})

const { contents } = await getContentsAfterPreAndBotonicInit(
request,
flowBuilderPlugin
)

expect((contents[0] as FlowText).text).toBe(
'Soon you will be served by a human agent'
)
expect(request.session._botonic_action).toBeDefined()
})
})

describe('The content connected to the closed queue status is displayed and the handoff is not done', () => {
process.env.NODE_ENV = ProcessEnvNodeEnvs.PRODUCTION
const flowBuilderPlugin = createFlowBuilderPlugin(basicFlow)

beforeEach(() => mockQueueAvailability({ isOpen: false, name: 'General' }))

test('The content connected to the node before the handoff node is displayed and a handoff is done.', async () => {
const request = createRequest({
input: { data: 'agent', type: INPUT.TEXT },
plugins: {
// @ts-ignore
flowBuilderPlugin,
},
})

const { contents } = await getContentsAfterPreAndBotonicInit(
request,
flowBuilderPlugin
)

expect((contents[0] as FlowText).text).toBe(
'At the moment we are out of office hours'
)
expect(request.session._botonic_action).toBeUndefined()
})
})

0 comments on commit 33612c9

Please sign in to comment.