Skip to content

Commit

Permalink
Fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Esteban Beltran committed Jun 7, 2022
1 parent c02acac commit 4b5dab6
Showing 1 changed file with 20 additions and 175 deletions.
195 changes: 20 additions & 175 deletions x-pack/plugins/cases/public/containers/use_get_cases.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,10 @@
* 2.0.
*/

import React from 'react';
import { renderHook, act } from '@testing-library/react-hooks';
import { CaseSeverity, CaseStatuses } from '../../common/api';
import { SECURITY_SOLUTION_OWNER } from '../../common/constants';
import {
DEFAULT_FILTER_OPTIONS,
DEFAULT_QUERY_PARAMS,
initialData,
useGetCases,
UseGetCases,
} from './use_get_cases';
import { allCases, basicCase } from './mock';
import { renderHook } from '@testing-library/react-hooks';
import { DEFAULT_FILTER_OPTIONS, DEFAULT_QUERY_PARAMS, useFetchCases } from './use_get_cases';
import * as api from './api';
import { TestProviders } from '../common/mock';
import { AppMockRenderer, createAppMockRenderer } from '../common/mock';
import { useToasts } from '../common/lib/kibana';

jest.mock('./api');
Expand All @@ -29,184 +19,39 @@ describe('useGetCases', () => {
const addSuccess = jest.fn();
(useToasts as jest.Mock).mockReturnValue({ addSuccess, addError: jest.fn() });

let appMockRender: AppMockRenderer;

beforeEach(() => {
appMockRender = createAppMockRenderer();
jest.clearAllMocks();
});

it('init', async () => {
const { result } = renderHook<string, UseGetCases>(() => useGetCases(), {
wrapper: ({ children }) => <TestProviders>{children}</TestProviders>,
});

await act(async () => {
expect(result.current).toEqual({
data: initialData,
filterOptions: DEFAULT_FILTER_OPTIONS,
isError: false,
loading: ['cases'],
queryParams: DEFAULT_QUERY_PARAMS,
refetchCases: result.current.refetchCases,
selectedCases: [],
setFilters: result.current.setFilters,
setQueryParams: result.current.setQueryParams,
setSelectedCases: result.current.setSelectedCases,
});
});
});

it('calls getCases with correct arguments', async () => {
const spyOnGetCases = jest.spyOn(api, 'getCases');
await act(async () => {
const { waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases(), {
wrapper: ({ children }) => <TestProviders>{children}</TestProviders>,
});
await waitForNextUpdate();
expect(spyOnGetCases).toBeCalledWith({
filterOptions: { ...DEFAULT_FILTER_OPTIONS },
queryParams: DEFAULT_QUERY_PARAMS,
signal: abortCtrl.signal,
});
});
});

it('fetch cases', async () => {
await act(async () => {
const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases(), {
wrapper: ({ children }) => <TestProviders>{children}</TestProviders>,
});
await waitForNextUpdate();
expect(result.current).toEqual({
data: allCases,
filterOptions: DEFAULT_FILTER_OPTIONS,
isError: false,
loading: [],
queryParams: DEFAULT_QUERY_PARAMS,
refetchCases: result.current.refetchCases,
selectedCases: [],
setFilters: result.current.setFilters,
setQueryParams: result.current.setQueryParams,
setSelectedCases: result.current.setSelectedCases,
});
});
});

it('refetch cases', async () => {
const spyOnGetCases = jest.spyOn(api, 'getCases');
await act(async () => {
const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases(), {
wrapper: ({ children }) => <TestProviders>{children}</TestProviders>,
});
await waitForNextUpdate();
result.current.refetchCases();
expect(spyOnGetCases).toHaveBeenCalledTimes(2);
const { waitForNextUpdate } = renderHook(() => useFetchCases(), {
wrapper: appMockRender.AppWrapper,
});
});

it('set isLoading to true when refetching case', async () => {
await act(async () => {
const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases(), {
wrapper: ({ children }) => <TestProviders>{children}</TestProviders>,
});
await waitForNextUpdate();
result.current.refetchCases();

expect(result.current.loading).toEqual(['cases']);
await waitForNextUpdate();
expect(spyOnGetCases).toBeCalledWith({
filterOptions: { ...DEFAULT_FILTER_OPTIONS },
queryParams: DEFAULT_QUERY_PARAMS,
signal: abortCtrl.signal,
});
});

it('unhappy path', async () => {
it('shows a toast error message when an error occurs in the response', async () => {
const spyOnGetCases = jest.spyOn(api, 'getCases');
spyOnGetCases.mockImplementation(() => {
throw new Error('Something went wrong');
});
const addError = jest.fn();
(useToasts as jest.Mock).mockReturnValue({ addSuccess, addError });

await act(async () => {
const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases(), {
wrapper: ({ children }) => <TestProviders>{children}</TestProviders>,
});
await waitForNextUpdate();

expect(result.current).toEqual({
data: initialData,
filterOptions: DEFAULT_FILTER_OPTIONS,
isError: true,
loading: [],
queryParams: DEFAULT_QUERY_PARAMS,
refetchCases: result.current.refetchCases,
selectedCases: [],
setFilters: result.current.setFilters,
setQueryParams: result.current.setQueryParams,
setSelectedCases: result.current.setSelectedCases,
});
});
});

it('set filters', async () => {
await act(async () => {
const spyOnGetCases = jest.spyOn(api, 'getCases');
const newFilters = {
search: 'new',
severity: CaseSeverity.LOW,
tags: ['new'],
status: CaseStatuses.closed,
owner: [SECURITY_SOLUTION_OWNER],
};

const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases(), {
wrapper: ({ children }) => <TestProviders>{children}</TestProviders>,
});

await waitForNextUpdate();
result.current.setFilters(newFilters);
await waitForNextUpdate();

expect(spyOnGetCases.mock.calls[1][0]).toEqual({
filterOptions: {
...DEFAULT_FILTER_OPTIONS,
...newFilters,
owner: [SECURITY_SOLUTION_OWNER],
},
queryParams: DEFAULT_QUERY_PARAMS,
signal: abortCtrl.signal,
});
const { waitForNextUpdate } = renderHook(() => useFetchCases(), {
wrapper: appMockRender.AppWrapper,
});
});

it('set query params', async () => {
await act(async () => {
const spyOnGetCases = jest.spyOn(api, 'getCases');
const newQueryParams = {
page: 2,
};

const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases(), {
wrapper: ({ children }) => <TestProviders>{children}</TestProviders>,
});

await waitForNextUpdate();
result.current.setQueryParams(newQueryParams);
await waitForNextUpdate();

expect(spyOnGetCases.mock.calls[1][0]).toEqual({
filterOptions: { ...DEFAULT_FILTER_OPTIONS },
queryParams: {
...DEFAULT_QUERY_PARAMS,
...newQueryParams,
},
signal: abortCtrl.signal,
});
});
});

it('set selected cases', async () => {
await act(async () => {
const selectedCases = [basicCase];
const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases(), {
wrapper: ({ children }) => <TestProviders>{children}</TestProviders>,
});
await waitForNextUpdate();
result.current.setSelectedCases(selectedCases);
expect(result.current.selectedCases).toEqual(selectedCases);
});
await waitForNextUpdate();
expect(addError).toHaveBeenCalled();
});
});

0 comments on commit 4b5dab6

Please sign in to comment.