@@ -11,6 +11,14 @@ jest.mock(
1111 { virtual : true } ,
1212) ;
1313
14+ jest . mock ( '../frameworks/frameworks-timeline.helper' , ( ) => ( {
15+ checkAutoCompletePhases : jest . fn ( ) ,
16+ } ) ) ;
17+
18+ jest . mock ( '../timelines/timelines.service' , ( ) => ( {
19+ TimelinesService : class TimelinesService { } ,
20+ } ) ) ;
21+
1422jest . mock ( '@db' , ( ) => {
1523 const evidenceFormTypeEnum = {
1624 board_meeting : 'board_meeting' ,
@@ -23,24 +31,36 @@ jest.mock('@db', () => {
2331 rbac_matrix : 'rbac_matrix' ,
2432 infrastructure_inventory : 'infrastructure_inventory' ,
2533 employee_performance_evaluation : 'employee_performance_evaluation' ,
34+ network_diagram : 'network_diagram' ,
35+ tabletop_exercise : 'tabletop_exercise' ,
2636 } ;
2737
2838 return {
2939 EvidenceFormType : evidenceFormTypeEnum ,
3040 db : {
3141 evidenceSubmission : {
3242 findFirst : jest . fn ( ) ,
43+ groupBy : jest . fn ( ) ,
3344 update : jest . fn ( ) ,
3445 } ,
46+ evidenceFormSetting : {
47+ findMany : jest . fn ( ) ,
48+ upsert : jest . fn ( ) ,
49+ } ,
3550 } ,
3651 } ;
3752} ) ;
3853
3954type MockDb = {
4055 evidenceSubmission : {
4156 findFirst : jest . Mock ;
57+ groupBy : jest . Mock ;
4258 update : jest . Mock ;
4359 } ;
60+ evidenceFormSetting : {
61+ findMany : jest . Mock ;
62+ upsert : jest . Mock ;
63+ } ;
4464} ;
4565
4666describe ( 'EvidenceFormsService' , ( ) => {
@@ -59,15 +79,114 @@ describe('EvidenceFormsService', () => {
5979 getPresignedDownloadUrl : jest . fn ( ) ,
6080 } as unknown as AttachmentsService ;
6181
62- const timelinesServiceMock = { } as unknown as import ( '../timelines/timelines.service' ) . TimelinesService ;
82+ const timelinesServiceMock =
83+ { } as unknown as import ( '../timelines/timelines.service' ) . TimelinesService ;
6384
64- const service = new EvidenceFormsService ( attachmentsServiceMock , timelinesServiceMock ) ;
85+ const service = new EvidenceFormsService (
86+ attachmentsServiceMock ,
87+ timelinesServiceMock ,
88+ ) ;
6589 const mockedDb = db as unknown as MockDb ;
6690
6791 beforeEach ( ( ) => {
6892 jest . clearAllMocks ( ) ;
6993 } ) ;
7094
95+ describe ( 'getFormStatuses' , ( ) => {
96+ it ( 'includes relevance settings alongside latest submission dates' , async ( ) => {
97+ mockedDb . evidenceSubmission . groupBy . mockResolvedValue ( [
98+ {
99+ formType : 'meeting' ,
100+ _max : { submittedAt : new Date ( '2026-01-01T00:00:00.000Z' ) } ,
101+ } ,
102+ ] ) ;
103+ mockedDb . evidenceFormSetting . findMany . mockResolvedValue ( [
104+ { formType : 'meeting' , isNotRelevant : true } ,
105+ ] ) ;
106+
107+ const result = await service . getFormStatuses ( 'org_123' ) ;
108+
109+ expect ( mockedDb . evidenceFormSetting . findMany ) . toHaveBeenCalledWith ( {
110+ where : { organizationId : 'org_123' } ,
111+ select : { formType : true , isNotRelevant : true } ,
112+ } ) ;
113+ expect ( result . meeting ) . toEqual ( {
114+ lastSubmittedAt : '2026-01-01T00:00:00.000Z' ,
115+ isNotRelevant : true ,
116+ } ) ;
117+ expect ( result [ 'access-request' ] ) . toEqual ( {
118+ lastSubmittedAt : null ,
119+ isNotRelevant : false ,
120+ } ) ;
121+ } ) ;
122+ } ) ;
123+
124+ describe ( 'getFormSettings' , ( ) => {
125+ it ( 'returns one setting entry for every document form' , async ( ) => {
126+ mockedDb . evidenceFormSetting . findMany . mockResolvedValue ( [
127+ {
128+ formType : 'access_request' ,
129+ isNotRelevant : true ,
130+ updatedAt : new Date ( '2026-01-02T00:00:00.000Z' ) ,
131+ } ,
132+ ] ) ;
133+
134+ const result = await service . getFormSettings ( 'org_123' ) ;
135+
136+ expect ( result ) . toContainEqual ( {
137+ formType : 'access-request' ,
138+ isNotRelevant : true ,
139+ updatedAt : '2026-01-02T00:00:00.000Z' ,
140+ } ) ;
141+ expect ( result ) . toContainEqual ( {
142+ formType : 'meeting' ,
143+ isNotRelevant : false ,
144+ updatedAt : null ,
145+ } ) ;
146+ } ) ;
147+ } ) ;
148+
149+ describe ( 'updateFormSetting' , ( ) => {
150+ it ( 'upserts a document relevance setting' , async ( ) => {
151+ mockedDb . evidenceFormSetting . upsert . mockResolvedValue ( {
152+ formType : 'meeting' ,
153+ isNotRelevant : true ,
154+ updatedAt : new Date ( '2026-01-03T00:00:00.000Z' ) ,
155+ } ) ;
156+
157+ const result = await service . updateFormSetting ( {
158+ organizationId : 'org_123' ,
159+ formType : 'meeting' ,
160+ payload : { isNotRelevant : true } ,
161+ } ) ;
162+
163+ expect ( mockedDb . evidenceFormSetting . upsert ) . toHaveBeenCalledWith ( {
164+ where : {
165+ organizationId_formType : {
166+ organizationId : 'org_123' ,
167+ formType : 'meeting' ,
168+ } ,
169+ } ,
170+ create : {
171+ organizationId : 'org_123' ,
172+ formType : 'meeting' ,
173+ isNotRelevant : true ,
174+ } ,
175+ update : { isNotRelevant : true } ,
176+ select : {
177+ formType : true ,
178+ isNotRelevant : true ,
179+ updatedAt : true ,
180+ } ,
181+ } ) ;
182+ expect ( result ) . toEqual ( {
183+ formType : 'meeting' ,
184+ isNotRelevant : true ,
185+ updatedAt : '2026-01-03T00:00:00.000Z' ,
186+ } ) ;
187+ } ) ;
188+ } ) ;
189+
71190 describe ( 'reviewSubmission' , ( ) => {
72191 it ( 'includes submittedBy and reviewedBy relations on review update' , async ( ) => {
73192 mockedDb . evidenceSubmission . findFirst . mockResolvedValue ( {
0 commit comments