Skip to content

Commit 73709bc

Browse files
committed
CCM-11474: null tests
1 parent 8e80410 commit 73709bc

File tree

3 files changed

+162
-12
lines changed

3 files changed

+162
-12
lines changed

lambdas/backend-client/src/__tests__/schemas/routing-config.test.ts

Lines changed: 88 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ import {
44
$ListRoutingConfigFilters,
55
} from '../../schemas/routing-config';
66

7+
const cascadeItemDefault = {
8+
cascadeGroups: ['standard'],
9+
channel: 'LETTER',
10+
channelType: 'primary',
11+
defaultTemplateId: '90e46ece-4a3b-47bd-b781-f986b42a5a09',
12+
};
13+
714
const baseInput = {
815
campaignId: 'campaign-1',
9-
cascade: [
10-
{
11-
cascadeGroups: ['standard'],
12-
channel: 'LETTER',
13-
channelType: 'primary',
14-
defaultTemplateId: '90e46ece-4a3b-47bd-b781-f986b42a5a09',
15-
},
16-
],
16+
cascade: [cascadeItemDefault],
1717
cascadeGroupOverrides: [
1818
{ name: 'standard' },
1919
{ name: 'translations', language: ['ar', 'zh'] },
@@ -61,6 +61,14 @@ describe('CreateUpdateRoutingConfig schema', () => {
6161
expect(res.success).toBe(true);
6262
});
6363

64+
test('valid with defaultTemplateId set to null', () => {
65+
const res = $CreateUpdateRoutingConfig.safeParse({
66+
...baseInput,
67+
cascade: [{ ...cascadeItemDefault, defaultTemplateId: null }],
68+
});
69+
expect(res.success).toBe(true);
70+
});
71+
6472
test('valid with translations conditional cascade item', () => {
6573
const res = $CreateUpdateRoutingConfig.safeParse({
6674
...baseInput,
@@ -77,6 +85,33 @@ describe('CreateUpdateRoutingConfig schema', () => {
7785
expect(res.success).toBe(true);
7886
});
7987

88+
test('valid with conditional template ids set to null', () => {
89+
const res = $CreateUpdateRoutingConfig.safeParse({
90+
...baseInput,
91+
cascade: [
92+
{
93+
...cascadeCondAcc,
94+
conditionalTemplates: [
95+
{
96+
accessibleFormat: 'x1',
97+
templateId: null,
98+
},
99+
],
100+
},
101+
{
102+
...cascadeCondLang,
103+
conditionalTemplates: [
104+
{
105+
language: 'ar',
106+
templateId: null,
107+
},
108+
],
109+
},
110+
],
111+
});
112+
expect(res.success).toBe(true);
113+
});
114+
80115
test('snapshot full error', () => {
81116
const res = $CreateUpdateRoutingConfig.safeParse({});
82117

@@ -93,6 +128,50 @@ describe('CreateUpdateRoutingConfig schema', () => {
93128
expect(res.success).toBe(false);
94129
});
95130

131+
test('defaultTemplateId cannot be empty string', () => {
132+
const res = $CreateUpdateRoutingConfig.safeParse({
133+
...baseInput,
134+
cascade: [{ ...cascadeItemDefault, defaultTemplateId: '' }],
135+
});
136+
expect(res.success).toBe(false);
137+
});
138+
139+
test('conditional language template ids cannot be empty string', () => {
140+
const res = $CreateUpdateRoutingConfig.safeParse({
141+
...baseInput,
142+
cascade: [
143+
{
144+
...cascadeCondLang,
145+
conditionalTemplates: [
146+
{
147+
language: 'ar',
148+
templateId: '',
149+
},
150+
],
151+
},
152+
],
153+
});
154+
expect(res.success).toBe(false);
155+
});
156+
157+
test('conditional accessible template ids cannot be empty string', () => {
158+
const res = $CreateUpdateRoutingConfig.safeParse({
159+
...baseInput,
160+
cascade: [
161+
{
162+
...cascadeCondAcc,
163+
conditionalTemplates: [
164+
{
165+
accessibleFormat: 'x1',
166+
templateId: '',
167+
},
168+
],
169+
},
170+
],
171+
});
172+
expect(res.success).toBe(false);
173+
});
174+
96175
test('cascadeGroupOverrides must be nonempty', () => {
97176
const res = $CreateUpdateRoutingConfig.safeParse({
98177
...baseInput,
@@ -117,7 +196,7 @@ describe('CreateUpdateRoutingConfig schema', () => {
117196
expect(res.success).toBe(false);
118197
});
119198

120-
test('accessible cascade group must does accept "language"', () => {
199+
test('accessible cascade group does not accept "language"', () => {
121200
const res = $CreateUpdateRoutingConfig.safeParse({
122201
...baseInput,
123202
cascadeGroupOverrides: [

lambdas/backend-client/src/schemas/routing-config.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,15 @@ const $ChannelType = schemaFor<ChannelType>()(z.enum(CHANNEL_TYPE_LIST));
6666
const $ConditionalTemplateLanguage = schemaFor<ConditionalTemplateLanguage>()(
6767
z.object({
6868
language: $Language,
69-
templateId: z.string().nullable(),
69+
templateId: z.string().nonempty().nullable(),
7070
})
7171
);
7272

7373
const $ConditionalTemplateAccessible =
7474
schemaFor<ConditionalTemplateAccessible>()(
7575
z.object({
7676
accessibleFormat: $LetterType,
77-
templateId: z.string().nullable(),
77+
templateId: z.string().nonempty().nullable(),
7878
})
7979
);
8080

@@ -88,7 +88,7 @@ const $CascadeItemBase = schemaFor<CascadeItemBase>()(
8888

8989
const $CascadeItemWithDefault = schemaFor<CascadeItemWithDefault>()(
9090
$CascadeItemBase.extend({
91-
defaultTemplateId: z.string().nullable(),
91+
defaultTemplateId: z.string().nonempty().nullable(),
9292
})
9393
).strict();
9494

tests/test-team/template-mgmt-api-tests/create-routing-configuration.api.spec.ts

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,77 @@ test.describe('POST /v1/routing-configuration', () => {
6969
expect(created.data.createdAt).toEqual(created.data.updatedAt);
7070
});
7171

72+
test('returns 201 if routing config input is valid - allows null templateIds', async ({
73+
request,
74+
}) => {
75+
const payload = RoutingConfigFactory.create(user1, {
76+
cascadeGroupOverrides: [
77+
{ name: 'standard' },
78+
{ name: 'translations', language: ['ar'] },
79+
{ name: 'accessible', accessibleFormat: ['x0'] },
80+
],
81+
cascade: [
82+
{
83+
cascadeGroups: ['standard'],
84+
channel: 'NHSAPP',
85+
channelType: 'primary',
86+
defaultTemplateId: null,
87+
},
88+
{
89+
cascadeGroups: ['accessible'],
90+
channel: 'LETTER',
91+
channelType: 'primary',
92+
defaultTemplateId: null,
93+
},
94+
{
95+
cascadeGroups: ['translations'],
96+
channel: 'LETTER',
97+
channelType: 'primary',
98+
defaultTemplateId: null,
99+
},
100+
],
101+
}).apiPayload;
102+
103+
const start = new Date();
104+
105+
const response = await request.post(
106+
`${process.env.API_BASE_URL}/v1/routing-configuration`,
107+
{
108+
headers: {
109+
Authorization: await user1.getAccessToken(),
110+
},
111+
data: payload,
112+
}
113+
);
114+
115+
expect(response.status()).toBe(201);
116+
117+
const created = await response.json();
118+
119+
storageHelper.addAdHocKey({
120+
id: created.data.id,
121+
clientId: user1.clientId,
122+
});
123+
124+
expect(created).toEqual({
125+
statusCode: 201,
126+
data: {
127+
clientId: user1.clientId,
128+
campaignId: payload.campaignId,
129+
cascade: payload.cascade,
130+
cascadeGroupOverrides: payload.cascadeGroupOverrides,
131+
createdAt: expect.stringMatching(isoDateRegExp),
132+
name: payload.name,
133+
id: expect.stringMatching(uuidRegExp),
134+
status: 'DRAFT',
135+
updatedAt: expect.stringMatching(isoDateRegExp),
136+
},
137+
});
138+
139+
expect(created.data.createdAt).toBeDateRoughlyBetween([start, new Date()]);
140+
expect(created.data.createdAt).toEqual(created.data.updatedAt);
141+
});
142+
72143
test('returns 401 if no auth token', async ({ request }) => {
73144
const response = await request.post(
74145
`${process.env.API_BASE_URL}/v1/routing-configuration`

0 commit comments

Comments
 (0)