60 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | import {PreviewServerError} from '../../lib/preview-server/preview-error'; | ||
|  | 
 | ||
|  | 
 | ||
|  | // Matchers
 | ||
|  | const toBeRejectedWithPreviewServerError: jasmine.CustomAsyncMatcherFactory = () => { | ||
|  |   return { | ||
|  |     async compare(actualPromise: Promise<never>, expectedStatus: number, expectedMessage?: string | RegExp) { | ||
|  |       if (!(actualPromise instanceof Promise)) { | ||
|  |         throw new Error(`Expected '${toBeRejectedWithPreviewServerError.name}()' to be called on a promise.`); | ||
|  |       } | ||
|  | 
 | ||
|  |       try { | ||
|  |         await actualPromise; | ||
|  | 
 | ||
|  |         return { | ||
|  |           pass: false, | ||
|  |           message: `Expected a promise to be rejected with a '${PreviewServerError.name}', but it was resolved.`, | ||
|  |         }; | ||
|  |       } catch (actualError) { | ||
|  |         const actualPrintValue = stringify(actualError); | ||
|  |         const expectedPrintValue = | ||
|  |             stringify(new PreviewServerError(expectedStatus, expectedMessage && `${expectedMessage}`)); | ||
|  | 
 | ||
|  |         const pass = errorMatches(actualError, expectedStatus, expectedMessage); | ||
|  |         const message = | ||
|  |             `Expected a promise ${pass ? 'not ' : ''}to be rejected with ${expectedPrintValue}, but is was` + | ||
|  |             `${pass ? '' : ` rejected with ${actualPrintValue}`}.`; | ||
|  | 
 | ||
|  |         return {pass, message}; | ||
|  |       } | ||
|  |     }, | ||
|  |   }; | ||
|  | 
 | ||
|  |   // Helpers
 | ||
|  |   function errorMatches(actualErr: unknown, expectedStatus: number, expectedMsg?: string | RegExp): boolean { | ||
|  |     if (!(actualErr instanceof PreviewServerError)) return false; | ||
|  |     if (actualErr.status !== expectedStatus) return false; | ||
|  |     return messageMatches(actualErr.message, expectedMsg); | ||
|  |   } | ||
|  | 
 | ||
|  |   function messageMatches(actualMsg: string, expectedMsg?: string | RegExp): boolean { | ||
|  |     if (typeof expectedMsg === 'undefined') return true; | ||
|  |     if (typeof expectedMsg === 'string') return actualMsg === expectedMsg; | ||
|  |     return expectedMsg.test(actualMsg); | ||
|  |   } | ||
|  | 
 | ||
|  |   function stringify(value: unknown): string { | ||
|  |     if (value instanceof PreviewServerError) { | ||
|  |       return `${PreviewServerError.name}(${value.status}${value.message ? `, ${value.message}` : ''})`; | ||
|  |     } | ||
|  | 
 | ||
|  |     return jasmine.pp(value); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | // Exports
 | ||
|  | export const customAsyncMatchers: jasmine.CustomAsyncMatcherFactories = { | ||
|  |   toBeRejectedWithPreviewServerError, | ||
|  | }; |