Skip to content

Commit d33c980

Browse files
committed
feat: align new and existing e2e tests
1 parent 355ef91 commit d33c980

6 files changed

Lines changed: 678 additions & 304 deletions

File tree

api/prisma/seed-helpers/multiselect-question-factory.ts

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,35 +16,62 @@ export const multiselectQuestionFactory = (
1616
optOut?: boolean;
1717
multiselectQuestion?: Partial<Prisma.MultiselectQuestionsCreateInput>;
1818
},
19+
version2 = false,
1920
): Prisma.MultiselectQuestionsCreateInput => {
2021
const previousMultiselectQuestion = optionalParams?.multiselectQuestion || {};
22+
const name = optionalParams?.multiselectQuestion?.name || randomName();
2123
const text = optionalParams?.multiselectQuestion?.text || randomName();
22-
return {
23-
text: text,
24-
subText: `sub text for ${text}`,
25-
description: `description of ${text}`,
26-
links: [],
27-
options: multiselectOptionFactory(randomInt(1, 3)),
28-
optOutText: optionalParams?.optOut ? "I don't want this preference" : null,
29-
hideFromListing: false,
24+
const baseFields = {
3025
applicationSection:
3126
optionalParams?.multiselectQuestion?.applicationSection ||
3227
multiselectAppSectionAsArray[
3328
randomInt(multiselectAppSectionAsArray.length)
3429
],
35-
36-
// TODO: Temporary until after MSQ refactor
37-
isExclusive: optionalParams?.multiselectQuestion?.isExclusive ?? false,
38-
multiselectOptions: undefined,
39-
name: text,
40-
status: MultiselectQuestionsStatusEnum.draft,
41-
42-
...previousMultiselectQuestion,
30+
hideFromListing: false,
4331
jurisdiction: {
4432
connect: {
4533
id: jurisdictionId,
4634
},
4735
},
36+
links: [],
37+
};
38+
39+
const v1Fields = {
40+
description: `description of ${text}`,
41+
isExclusive: false,
42+
name: text,
43+
options: multiselectOptionFactory(randomInt(1, 3)),
44+
optOutText: optionalParams?.optOut ? "I don't want this preference" : null,
45+
status: MultiselectQuestionsStatusEnum.draft,
46+
subText: `sub text for ${text}`,
47+
text: text,
48+
};
49+
const v2Fields = {
50+
description: `description of ${name}`,
51+
isExclusive: optionalParams?.multiselectQuestion?.isExclusive ?? false,
52+
multiselectOptions: {
53+
createMany: {
54+
data: multiselectOptionFactoryV2(randomInt(1, 3)),
55+
},
56+
},
57+
name: name,
58+
subText: `sub text for ${name}`,
59+
status: MultiselectQuestionsStatusEnum.draft,
60+
// TODO: Can be removed after MSQ refactor
61+
text: name,
62+
};
63+
64+
if (version2) {
65+
return {
66+
...v2Fields,
67+
...previousMultiselectQuestion,
68+
...baseFields,
69+
};
70+
}
71+
return {
72+
...v1Fields,
73+
...previousMultiselectQuestion,
74+
...baseFields,
4875
};
4976
};
5077

@@ -58,3 +85,11 @@ const multiselectOptionFactory = (
5885
collectAddress: index % 2 === 0,
5986
}));
6087
};
88+
89+
const multiselectOptionFactoryV2 = (numberToMake: number) => {
90+
if (!numberToMake) return [];
91+
return [...new Array(numberToMake)].map((_, index) => ({
92+
name: randomNoun(),
93+
ordinal: index,
94+
}));
95+
};
Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
1-
import { OmitType } from '@nestjs/swagger';
1+
import { ApiPropertyOptional, OmitType } from '@nestjs/swagger';
22
import { MultiselectOption } from './multiselect-option.dto';
3+
import { Expose } from 'class-transformer';
4+
import { IsString, IsUUID } from 'class-validator';
5+
import { ValidationsGroupsEnum } from '../../enums/shared/validation-groups-enum';
36

47
export class MultiselectOptionUpdate extends OmitType(MultiselectOption, [
8+
// TODO: Temporarily optional until after MSQ refactor
9+
'id',
510
'createdAt',
611
'updatedAt',
712
'untranslatedName',
813
'untranslatedText',
9-
]) {}
14+
]) {
15+
@Expose()
16+
@IsString({ groups: [ValidationsGroupsEnum.default] })
17+
@IsUUID(4, { groups: [ValidationsGroupsEnum.default] })
18+
// TODO: Temporarily optional until after MSQ refactor
19+
// @IsDefined({ groups: [ValidationsGroupsEnum.default] })
20+
@ApiPropertyOptional()
21+
id?: string;
22+
}

api/src/dtos/multiselect-questions/multiselect-question.dto.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,12 @@ class MultiselectQuestion extends AbstractDTO {
9494
@ApiPropertyOptional()
9595
optOutText?: string;
9696

97-
// TODO: Temporarily optional until after MSQ refactor
9897
@Expose()
99-
// @IsDefined({ groups: [ValidationsGroupsEnum.default] })
98+
@IsDefined({ groups: [ValidationsGroupsEnum.default] })
10099
@IsEnum(MultiselectQuestionsStatusEnum, {
101100
groups: [ValidationsGroupsEnum.default],
102101
})
103-
@ApiPropertyOptional({
102+
@ApiProperty({
104103
enum: MultiselectQuestionsStatusEnum,
105104
enumName: 'MultiselectQuestionsStatusEnum',
106105
example: 'draft',
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Logger, Module } from '@nestjs/common';
2+
import { SchedulerRegistry } from '@nestjs/schedule';
23
import { PermissionModule } from './permission.module';
34
import { PrismaModule } from './prisma.module';
45
import { MultiselectQuestionController } from '../controllers/multiselect-question.controller';
@@ -7,7 +8,7 @@ import { MultiselectQuestionService } from '../services/multiselect-question.ser
78
@Module({
89
imports: [PrismaModule, PermissionModule],
910
controllers: [MultiselectQuestionController],
10-
providers: [Logger, MultiselectQuestionService],
11+
providers: [Logger, MultiselectQuestionService, SchedulerRegistry],
1112
exports: [MultiselectQuestionService],
1213
})
1314
export class MultiselectQuestionModule {}

api/src/services/multiselect-question.service.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import { FeatureFlagEnum } from '../enums/feature-flags/feature-flags-enum';
2222
import { MultiselectQuestionFilterKeys } from '../enums/multiselect-questions/filter-key-enum';
2323
import { MultiselectQuestionViews } from '../enums/multiselect-questions/view-enum';
2424
import { buildFilter } from '../utilities/build-filter';
25+
import { startCronJob } from '../utilities/cron-job-starter';
2526
import { doJurisdictionHaveFeatureFlagSet } from '../utilities/feature-flag-utilities';
2627
import { mapTo } from '../utilities/mapTo';
27-
import { startCronJob } from 'src/utilities/cron-job-starter';
2828

2929
export const includeViews: Partial<
3030
Record<MultiselectQuestionViews, Prisma.MultiselectQuestionsInclude>
@@ -530,6 +530,17 @@ export class MultiselectQuestionService {
530530
async activateMany(
531531
multiselectQuestions: MultiselectQuestion[],
532532
): Promise<SuccessDTO> {
533+
if (
534+
multiselectQuestions.some(
535+
(multiselectQuestion) =>
536+
multiselectQuestion.status === MultiselectQuestionsStatusEnum.draft ||
537+
multiselectQuestion.status === MultiselectQuestionsStatusEnum.retired,
538+
)
539+
) {
540+
throw new BadRequestException(
541+
'only multiselect questions in visible, active or toRetire status can be associated with a listing being published',
542+
);
543+
}
533544
// What if one fails?
534545
for (const multiselectQuestion of multiselectQuestions) {
535546
if (

0 commit comments

Comments
 (0)