Skip to content

Commit

Permalink
ADM-684: [frontend] test: add test for useGenerateReportEffect
Browse files Browse the repository at this point in the history
  • Loading branch information
neomgb authored and Zxx-Ivy committed Dec 27, 2023
1 parent e03ab34 commit d68c114
Showing 1 changed file with 184 additions and 1 deletion.
185 changes: 184 additions & 1 deletion frontend/__tests__/src/hooks/useGenerateReportEffect.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ describe('use generate report effect', () => {
})
})

it.skip('should return error message when calling startToRequestBoardData given pollingReport response return 4xx ', async () => {
it('should return error message when calling startToRequestBoardData given pollingReport response return 4xx ', async () => {
const { result } = renderHook(() => useGenerateReportEffect())
result.current.stopPollingReports = jest.fn()
reportClient.pollingReport = jest.fn().mockImplementation(async () => {
Expand Down Expand Up @@ -148,4 +148,187 @@ describe('use generate report effect', () => {
expect(reportClient.pollingReport).toHaveBeenCalledTimes(1)
})
})

it('should call polling report more than one time when allMetricsReady field in response is false', async () => {
const { result } = renderHook(() => useGenerateReportEffect())
reportClient.pollingReport = jest.fn().mockImplementation(async () => ({
status: HttpStatusCode.NoContent,
response: { ...MOCK_REPORT_RESPONSE, allMetricsReady: false },
}))

reportClient.retrieveReportByUrl = jest
.fn()
.mockImplementation(async () => ({ response: MOCK_RETRIEVE_REPORT_RESPONSE }))

await waitFor(() => {
result.current.startToRequestBoardData(MOCK_GENERATE_REPORT_REQUEST_PARAMS)
})

jest.advanceTimersByTime(10000)

await waitFor(() => {
expect(reportClient.pollingReport).toHaveBeenCalledTimes(2)
})
})

it('should call polling report only once when calling startToRequestBoardData but startToRequestDoraData called before', async () => {
const { result } = renderHook(() => useGenerateReportEffect())
reportClient.pollingReport = jest
.fn()
.mockImplementation(async () => ({ status: HttpStatusCode.NoContent, response: MOCK_REPORT_RESPONSE }))

reportClient.retrieveReportByUrl = jest
.fn()
.mockImplementation(async () => ({ response: MOCK_RETRIEVE_REPORT_RESPONSE }))

await waitFor(() => {
result.current.startToRequestDoraData(MOCK_GENERATE_REPORT_REQUEST_PARAMS)
result.current.startToRequestBoardData(MOCK_GENERATE_REPORT_REQUEST_PARAMS)
})

jest.runOnlyPendingTimers()

await waitFor(() => {
expect(reportClient.pollingReport).toHaveBeenCalledTimes(1)
})
})

it('should set error message when generate report throw error', async () => {
const { result } = renderHook(() => useGenerateReportEffect())
reportClient.retrieveReportByUrl = jest.fn().mockImplementation(async () => {
throw new Error('error')
})
await waitFor(() => {
result.current.startToRequestDoraData(MOCK_GENERATE_REPORT_REQUEST_PARAMS)
expect(result.current.errorMessage).toEqual('generate report: error')
})

jest.advanceTimersByTime(ERROR_MESSAGE_TIME_DURATION)

await waitFor(() => {
expect(result.current.errorMessage).toEqual('')
})
})

it('should set error message when generate report response status 404', async () => {
const { result } = renderHook(() => useGenerateReportEffect())
reportClient.retrieveReportByUrl = jest.fn().mockImplementation(async () => {
throw new NotFoundException('error message')
})
await waitFor(() => {
result.current.startToRequestDoraData(MOCK_GENERATE_REPORT_REQUEST_PARAMS)
expect(result.current.errorMessage).toEqual('generate report: error message')
})

jest.advanceTimersByTime(ERROR_MESSAGE_TIME_DURATION)

await waitFor(() => {
expect(result.current.errorMessage).toEqual('')
})
})

it('should set error message when generate report response status 500', async () => {
const { result } = renderHook(() => useGenerateReportEffect())
reportClient.retrieveReportByUrl = jest.fn().mockImplementation(async () => {
throw new InternalServerException(INTERNAL_SERVER_ERROR_MESSAGE)
})
await waitFor(() => {
result.current.startToRequestDoraData(MOCK_GENERATE_REPORT_REQUEST_PARAMS)
expect(result.current.isServerError).toEqual(true)
})
})

it('should set isServerError is true when throw unknownException', async () => {
const { result } = renderHook(() => useGenerateReportEffect())
reportClient.retrieveReportByUrl = jest.fn().mockImplementation(async () => {
throw new UnknownException()
})

await waitFor(() => {
result.current.startToRequestDoraData(MOCK_GENERATE_REPORT_REQUEST_PARAMS)
expect(result.current.isServerError).toEqual(true)
})
})

it('should return error message when calling startToRequestDoraData given pollingReport response return 5xx ', async () => {
const { result } = renderHook(() => useGenerateReportEffect())
reportClient.pollingReport = jest.fn().mockImplementation(async () => {
throw new InternalServerException('error')
})

reportClient.retrieveReportByUrl = jest
.fn()
.mockImplementation(async () => ({ response: MOCK_RETRIEVE_REPORT_RESPONSE }))

await waitFor(() => {
result.current.startToRequestDoraData(MOCK_GENERATE_REPORT_REQUEST_PARAMS)
expect(reportClient.pollingReport).toBeCalledTimes(1)
expect(result.current.isServerError).toEqual(true)
})
})

it('should return error message when calling startToRequestDoraData given pollingReport response return 4xx ', async () => {
const { result } = renderHook(() => useGenerateReportEffect())
result.current.stopPollingReports = jest.fn()
reportClient.pollingReport = jest.fn().mockImplementation(async () => {
throw new NotFoundException('file not found')
})
reportClient.retrieveReportByUrl = jest
.fn()
.mockImplementation(async () => ({ response: MOCK_RETRIEVE_REPORT_RESPONSE }))

await waitFor(() => {
result.current.startToRequestDoraData(MOCK_GENERATE_REPORT_REQUEST_PARAMS)
expect(result.current.errorMessage).toEqual('generate report: file not found')
})

jest.advanceTimersByTime(ERROR_MESSAGE_TIME_DURATION)

await waitFor(() => {
expect(result.current.errorMessage).toEqual('')
})
})

it('should call polling report and setTimeout when calling startToRequestDoraData given pollingReport response return 204 ', async () => {
const { result } = renderHook(() => useGenerateReportEffect())
reportClient.pollingReport = jest
.fn()
.mockImplementation(async () => ({ status: HttpStatusCode.NoContent, response: MOCK_REPORT_RESPONSE }))

reportClient.retrieveReportByUrl = jest
.fn()
.mockImplementation(async () => ({ response: MOCK_RETRIEVE_REPORT_RESPONSE }))

await waitFor(() => {
result.current.startToRequestDoraData(MOCK_GENERATE_REPORT_REQUEST_PARAMS)
})

jest.runOnlyPendingTimers()

await waitFor(() => {
expect(reportClient.pollingReport).toHaveBeenCalledTimes(1)
})
})

it('should call polling report only once when calling startToRequestDoraData but startToRequestBoardData called before', async () => {
const { result } = renderHook(() => useGenerateReportEffect())
reportClient.pollingReport = jest
.fn()
.mockImplementation(async () => ({ status: HttpStatusCode.NoContent, response: MOCK_REPORT_RESPONSE }))

reportClient.retrieveReportByUrl = jest
.fn()
.mockImplementation(async () => ({ response: MOCK_RETRIEVE_REPORT_RESPONSE }))

await waitFor(() => {
result.current.startToRequestBoardData(MOCK_GENERATE_REPORT_REQUEST_PARAMS)
result.current.startToRequestDoraData(MOCK_GENERATE_REPORT_REQUEST_PARAMS)
})

jest.runOnlyPendingTimers()

await waitFor(() => {
expect(reportClient.pollingReport).toHaveBeenCalledTimes(1)
})
})
})

0 comments on commit d68c114

Please sign in to comment.