55 getFormDefinition ,
66 getFormMetadata ,
77 getFormMetadataById ,
8+ getFormSecret ,
89 getSaveAndExitDetails ,
910 validateSaveAndExitCredentials
1011} from '~/src/server/services/formsService.js'
@@ -16,6 +17,10 @@ const { MANAGER_URL, SUBMISSION_URL } = process.env
1617const magicLinkId = '7ac201b2-bea3-490d-8ccb-2734b2794f7b'
1718
1819jest . mock ( '~/src/server/services/httpService' )
20+ jest . mock ( 'node:crypto' , ( ) => ( {
21+ ...jest . requireActual ( 'node:crypto' ) ,
22+ privateDecrypt : ( ) => 'decrypted-secret'
23+ } ) )
1924
2025describe ( 'Forms service' , ( ) => {
2126 const { definition, metadata } = fixtures . form
@@ -60,6 +65,19 @@ describe('Forms service', () => {
6065 updatedAt : expect . any ( Date )
6166 } )
6267 } )
68+
69+ it ( 'throws when validation error' , async ( ) => {
70+ jest . mocked ( getJson ) . mockResolvedValue ( {
71+ res : /** @type {IncomingMessage } */ ( {
72+ statusCode : StatusCodes . OK
73+ } ) ,
74+ payload : { invalid : '123' }
75+ } )
76+
77+ await expect ( ( ) => getFormMetadata ( metadata . slug ) ) . rejects . toThrow (
78+ '"title" is required'
79+ )
80+ } )
6381 } )
6482
6583 describe ( 'getFormMetadataById' , ( ) => {
@@ -102,6 +120,19 @@ describe('Forms service', () => {
102120 updatedAt : expect . any ( Date )
103121 } )
104122 } )
123+
124+ it ( 'throws when validation error' , async ( ) => {
125+ jest . mocked ( getJson ) . mockResolvedValue ( {
126+ res : /** @type {IncomingMessage } */ ( {
127+ statusCode : StatusCodes . OK
128+ } ) ,
129+ payload : { invalid : '123' }
130+ } )
131+
132+ await expect ( ( ) => getFormMetadataById ( metadata . id ) ) . rejects . toThrow (
133+ '"title" is required'
134+ )
135+ } )
105136 } )
106137
107138 describe ( 'getFormDefinition' , ( ) => {
@@ -168,6 +199,59 @@ describe('Forms service', () => {
168199 { payload : { securityAnswer : 'answer' } }
169200 )
170201 } )
202+
203+ it ( 'throws if no results' , async ( ) => {
204+ // @ts -expect-error - partial mock of payload
205+ jest . mocked ( postJson ) . mockResolvedValue ( {
206+ res : /** @type {IncomingMessage } */ ( {
207+ statusCode : StatusCodes . OK
208+ } ) ,
209+ payload : undefined
210+ } )
211+
212+ await expect ( ( ) =>
213+ validateSaveAndExitCredentials ( magicLinkId , 'answer' )
214+ ) . rejects . toThrow (
215+ 'Unexpected empty response in validateSaveAndExitCredentials'
216+ )
217+ } )
218+ } )
219+
220+ describe ( 'getFormSecret' , ( ) => {
221+ beforeEach ( ( ) => {
222+ // @ts -expect-error - mock fetch
223+ global . fetch = jest . fn ( ( ) =>
224+ Promise . resolve ( {
225+ text : ( ) => Promise . resolve ( 'secret-value' ) ,
226+ statusText : 'OK'
227+ } )
228+ )
229+ } )
230+
231+ it ( 'calls correct url' , async ( ) => {
232+ const res = await getFormSecret ( metadata . id , 'secret-name' )
233+
234+ expect ( fetch ) . toHaveBeenCalledWith (
235+ `${ MANAGER_URL } /forms/${ metadata . id } /secrets/secret-name`
236+ )
237+ expect ( res ) . toBe ( 'decrypted-secret' )
238+ } )
239+
240+ it ( 'handles missing secret' , async ( ) => {
241+ // @ts -expect-error - mock fetch
242+ global . fetch = jest . fn ( ( ) =>
243+ Promise . resolve ( {
244+ text : ( ) => Promise . resolve ( 'secret-value' ) ,
245+ statusText : 'Error'
246+ } )
247+ )
248+ const res = await getFormSecret ( metadata . id , 'secret-name' )
249+
250+ expect ( fetch ) . toHaveBeenCalledWith (
251+ `${ MANAGER_URL } /forms/${ metadata . id } /secrets/secret-name`
252+ )
253+ expect ( res ) . toBe ( '' )
254+ } )
171255 } )
172256} )
173257
0 commit comments