@defra-fish/pocl-job
Version:
Post Office Counter Licence sales processor
214 lines (191 loc) • 7.5 kB
JavaScript
import { Transaction, convertDateTime } from '../transaction.bindings.js'
import { POST_OFFICE_DATASOURCE, DIRECT_DEBIT_DATASOURCE } from '../../../../../staging/constants.js'
jest.mock('@defra-fish/connectors-lib', () => ({
salesApi: {
...Object.keys(jest.requireActual('@defra-fish/connectors-lib').salesApi).reduce((acc, k) => ({ ...acc, [k]: jest.fn() }), {}),
...['permits', 'concessions'].reduce(
(acc, m) => ({ ...acc, [m]: { find: jest.fn(() => ({ id: `${m}-id`, isForFulfilment: false })) } }),
{}
)
}
}))
describe('transaction.bindings', () => {
describe('transaction transforms', () => {
it('transforms a POCL record - gmt time, no concession, email contact', async () => {
const result = await Transaction.transform(generateInputJSON())
expect(result).toMatchSnapshot()
})
it('transforms a POCL record - bst time, senior concession, sms contact', async () => {
const result = await Transaction.transform(
generateInputJSON({
DOB: { value: '12/03/1931' },
SENIOR_ID: { value: 'Uncancelled Passport' },
NOTIFY_EMAIL_ADDRESS: { value: '' },
COMMS_EMAIL_ADDRESS: { value: '' },
NOTIFY_SMS_NUMBER: { value: '07124567890' },
COMMS_SMS_NUMBER: { value: '07124567891' },
NOTIFY_EMAIL: { value: 'N' },
NOTIFY_SMS: { value: 'Y' },
COMMS_EMAIL: { value: 'N' },
COMMS_SMS: { value: 'Y' },
START_DATE: { value: '01/06/2020' },
SYSTEM_DATE: { value: '01/06/2020' },
SYSTEM_TIME: { value: '09:00:00' },
MOPEX: { value: 'UNKNOWN' }
})
)
expect(result).toMatchSnapshot()
})
it('transforms a POCL record - disabled concession (both), letter contact', async () => {
const result = await Transaction.transform(
generateInputJSON({
DOB: { value: '12/03/1931' },
SENIOR_ID: { value: '' },
DISABLED_ID_1: { value: '12ABCD01234X5678' },
DISABLED_ID_2: { value: 'QQ123456C' },
NOTIFY_EMAIL_ADDRESS: { value: '' },
COMMS_EMAIL_ADDRESS: { value: '' },
NOTIFY_SMS_NUMBER: { value: '' },
COMMS_SMS_NUMBER: { value: '' },
NOTIFY_EMAIL: { value: 'N' },
NOTIFY_POST: { value: 'Y' },
COMMS_EMAIL: { value: 'N' },
COMMS_POST: { value: 'Y' }
})
)
expect(result).toMatchSnapshot()
})
it('transforms a POCL record - disabled concession (blue badge only), no contact', async () => {
const result = await Transaction.transform(
generateInputJSON({
DOB: { value: '12/03/1931' },
SENIOR_ID: { value: '' },
DISABLED_ID_1: { value: '12ABCD01234X5678' },
DISABLED_ID_2: { value: '' },
NOTIFY_EMAIL_ADDRESS: { value: '' },
COMMS_EMAIL_ADDRESS: { value: '' },
NOTIFY_SMS_NUMBER: { value: '' },
COMMS_SMS_NUMBER: { value: '' },
NOTIFY_EMAIL: { value: 'N' },
COMMS_EMAIL: { value: 'N' }
})
)
expect(result).toMatchSnapshot()
})
it('transforms a POCL record - disabled concession (pip only), multiple contact', async () => {
const result = await Transaction.transform(
generateInputJSON({
DOB: { value: '12/03/1931' },
SENIOR_ID: { value: '' },
DISABLED_ID_1: { value: '' },
DISABLED_ID_2: { value: 'QQ123456C' },
NOTIFY_EMAIL_ADDRESS: { value: '' },
COMMS_EMAIL_ADDRESS: { value: 'festerthetester456@email.com' },
COMMS_SMS_NUMBER: { value: '07124567891' },
NOTIFY_EMAIL: { value: 'N' },
NOTIFY_SMS: { value: 'Y' }
})
)
expect(result).toMatchSnapshot()
})
it('transforms a DDE record - gmt time, no concession, email contact', async () => {
const result = await Transaction.transform(
generateInputJSON({
DATA_SOURCE: { value: DIRECT_DEBIT_DATASOURCE },
MOPEX: { value: '6' }
})
)
expect(result).toMatchSnapshot()
})
it('ignores invalid datasource', async () => {
const result = await Transaction.transform(
generateInputJSON({
DATA_SOURCE: { value: 'Any old rubbish' }
})
)
expect(result).toEqual(
expect.objectContaining({
createTransactionPayload: expect.objectContaining({
dataSource: POST_OFFICE_DATASOURCE
}),
finaliseTransactionPayload: {
payment: expect.objectContaining({
source: POST_OFFICE_DATASOURCE
})
}
})
)
})
it("ignores journal id if it's not provided", async () => {
const { createTransactionPayload } = await Transaction.transform(generateInputJSON())
expect(Object.keys(createTransactionPayload).includes('journalId')).toBeFalsy()
})
it.each([['123456'], ['654321'], ['A6B7C9']])('transforms a DDE record - includes DD_ID %s', async DD_ID => {
const {
createTransactionPayload: { journalId }
} = await Transaction.transform(
generateInputJSON({
DATA_SOURCE: { value: DIRECT_DEBIT_DATASOURCE },
MOPEX: { value: '6' },
DD_ID: { value: DD_ID }
})
)
expect(journalId).toBe(DD_ID)
})
})
describe('convertDateTime', () => {
const FORMATS = ['DD/MM/YYYYHH:mm', 'DD/MM/YYYYHH:mm:ss']
it.each([
['01/04/202200:00:00', '2022-03-31T23:00:00.000Z'],
['01/01/202203:00:00', '2022-01-01T03:00:00.000Z'],
['02/02/202216:00:00', '2022-02-02T16:00:00.000Z'],
['01/04/202200:00', '2022-03-31T23:00:00.000Z'],
['01/01/202203:00', '2022-01-01T03:00:00.000Z'],
['02/02/202216:00', '2022-02-02T16:00:00.000Z']
])('should convert %s to %s', (input, output) => {
expect(convertDateTime(input, FORMATS)).toBe(output)
})
it.each([[null], ['01/01/202203:00:00:00'], ['02/02/2022-16:00:00']])('should return null if it cannot convert %s', input => {
expect(convertDateTime(input, FORMATS)).toBe(null)
})
})
})
const generateInputJSON = (overrides = {}) => ({
children: {
LICENSEE_FORENAME: { value: 'Fester' },
LICENSEE_SURNAME: { value: 'Tester' },
DOB: { value: '12/03/1981' },
NOTIFY_EMAIL_ADDRESS: { value: 'festerthetester123@email.com' },
COMMS_EMAIL_ADDRESS: { value: 'festerthetester456@email.com' },
NOTIFY_EMAIL: { value: 'Y' },
NOTIFY_SMS: { value: 'N' },
NOTIFY_POST: { value: 'N' },
COMMS_EMAIL: { value: 'Y' },
COMMS_SMS: { value: 'N' },
COMMS_POST: { value: 'N' },
LICENSEE_ADDRESS: {
children: {
POBox: { value: 'PO Box 123' },
Subprem: { value: 'Flat 5' },
Buildname: { value: 'Angling House' },
Buildnum: { value: '123' },
Depthoro: { value: 'Redhill Park' },
Thoro: { value: 'Redhill Lane' },
Deplocal: { value: 'Lower Denton' },
Local: { value: 'Denton' },
Town: { value: 'Manchester' },
Postcode: { value: 'AB123CD' }
}
},
ITEM_ID: { value: '123456' },
START_DATE: { value: '01/01/2020' },
START_TIME: { value: '00:01' },
SYSTEM_DATE: { value: '01/01/2020' },
SYSTEM_TIME: { value: '15:03:17' },
AMOUNT: { value: '3.75' },
MOPEX: { value: '1' },
SERIAL_NO: { value: '559136-2-27950' },
CHANNEL_ID: { value: '123456' },
...overrides
}
})