import { OnCallLevel, OnCallProviderResult, } from '@atlassian/forge-graphql-types'; import { OnCallProviderResponse, OnCallProviderValidationErrors, } from '../../builders/on-call-provider-response'; import { MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO } from '../fixtures/mocks'; describe('data provider class tests', () => { const checkErrorTypeByLevelInput = ( input: OnCallLevel[], expectedError: OnCallProviderValidationErrors, ): void => { const onCallProviderResponse = new OnCallProviderResponse() .addScheduleInfo({ ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO, levels: input, }) .build(); const expectedResult: OnCallProviderResult = { success: false, result: {}, error: expectedError, }; expect(onCallProviderResponse).toEqual(expectedResult); }; it('can build a response', () => { const onCallProviderResponse = new OnCallProviderResponse(); expect(onCallProviderResponse.build()).toMatchSnapshot(); }); it('can supply ScheduleInfo data', () => { const onCallProviderResponse = new OnCallProviderResponse() .addScheduleInfo(MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO) .build(); const expectedResult: OnCallProviderResult = { success: true, result: { onCallScheduleInfo: MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO, }, error: undefined, }; expect(onCallProviderResponse).toEqual(expectedResult); }); it('returns error in case no data provided to addScheduleInfo method', () => { const onCallProviderResponse = new OnCallProviderResponse() .addScheduleInfo(null) .build(); const expectedResult: OnCallProviderResult = { success: false, result: {}, error: OnCallProviderValidationErrors.SCHEDULE_INFO_NOT_PROVIDED, }; expect(onCallProviderResponse).toEqual(expectedResult); }); it('returns error in case ScheduleLink is not valid', () => { const onCallProviderResponse = new OnCallProviderResponse() .addScheduleInfo({ ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO, scheduleLink: 'invalid URL', }) .build(); const expectedResult: OnCallProviderResult = { success: false, result: {}, error: OnCallProviderValidationErrors.INVALID_SCHEDULE_LINK, }; expect(onCallProviderResponse).toEqual(expectedResult); }); it('returns error in case levels are empty', () => { checkErrorTypeByLevelInput( [], OnCallProviderValidationErrors.SCHEDULE_LEVEL_NOT_PROVIDED, ); }); it('returns error in case level priority is invalid', () => { const mockLevel: OnCallLevel = { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0], priority: 0, }; checkErrorTypeByLevelInput( [mockLevel], OnCallProviderValidationErrors.INVALID_SCHEDULE_LEVEL_PRIORITY, ); }); it('returns error in case currentOnCall has invalid schedule date format', () => { const mockLevel: OnCallLevel = { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0], currentOnCall: { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0].currentOnCall, timeRange: { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0].currentOnCall .timeRange, scheduleStartTime: 'not a date', }, }, }; checkErrorTypeByLevelInput( [mockLevel], OnCallProviderValidationErrors.INVALID_DATE, ); }); it('returns error in case scheduleEndTime is earlier than scheduleStartTime', () => { const mockLevel: OnCallLevel = { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0], currentOnCall: { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0].currentOnCall, timeRange: { scheduleStartTime: '2022-06-05T17:49:12.664Z', scheduleEndTime: '2022-05-05T17:49:12.664Z', }, }, }; checkErrorTypeByLevelInput( [mockLevel], OnCallProviderValidationErrors.INVALID_SCHEDULE_TIME_RANGE, ); }); it('returns error in case nextOnCall has invalid schedule date format', () => { const mockLevel: OnCallLevel = { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0], nextOnCall: { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0].nextOnCall, timeRange: { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0].currentOnCall .timeRange, scheduleStartTime: 'not a date', }, }, }; checkErrorTypeByLevelInput( [mockLevel], OnCallProviderValidationErrors.INVALID_DATE, ); }); it('returns error in case nextOnCall and currentOnCall schedule times overlap', () => { const mockLevel: OnCallLevel = { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0], currentOnCall: { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0].currentOnCall, timeRange: { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0].currentOnCall .timeRange, scheduleEndTime: '2022-06-05T18:49:12.664Z', }, }, nextOnCall: { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0].nextOnCall, timeRange: { ...MOCK_ON_CALL_PROVIDER_SCHEDULE_INFO.levels[0].currentOnCall .timeRange, scheduleStartTime: '2022-06-05T17:49:12.664Z', }, }, }; checkErrorTypeByLevelInput( [mockLevel], OnCallProviderValidationErrors.SCHEDULE_TIME_RANGES_OVERLAP, ); }); });