/* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ import { render, fireEvent, act, RenderResult } from '@testing-library/react'; import { BrowserRouter } from 'react-router-dom'; import ControlTechniqueForm, { ControlTechniqueFormData } from '.'; export const fixtureCreateControlTechniqueRestType: ControlTechniqueFormData = { name: 'Test Control Technique', description: 'Description Test Control Technique', controlType: 'DETECTIVE', techniqueDetails: { integrationType: 'REST', policyId: 'policy-12345', bundleName: 'policyundle', namespace: 'namespace', restEndpoint: 'https://xyz.com', }, }; export const fixtureInitialFormValues: ControlTechniqueFormData = { ...fixtureCreateControlTechniqueRestType, enabled: true, status: 'ACTIVE', }; export const fixtureUpdateControlTechniqueRestType: ControlTechniqueFormData = { ...fixtureCreateControlTechniqueRestType, name: 'Updated Test Control Technique', description: 'Updated Description Test Control Technique', controlType: 'CORRECTIVE', }; export const controlTechniqueUpdateFormNavigateAndAssert = async ( renderResult: RenderResult ) => { const { getByText, getAllByRole, getAllByTestId, getAllByText, findByText, getByDisplayValue, } = renderResult; expect(getByText('Update Control Technique')).toBeInTheDocument(); expect(getAllByText('Control Technique Details').length).toBe(2); expect( getByDisplayValue(fixtureCreateControlTechniqueRestType.name!) ).toBeInTheDocument(); expect( getByText(fixtureCreateControlTechniqueRestType.description!) ).toBeInTheDocument(); expect(getByText(/DETECTIVE/i)).toBeInTheDocument(); act(() => { fireEvent.change( getAllByRole('textbox').filter((element) => element.id === 'name')[0], { target: { value: fixtureUpdateControlTechniqueRestType.name } } ); fireEvent.change( getAllByRole('textbox').filter((element) => element.id === 'description')[0], { target: { value: fixtureUpdateControlTechniqueRestType.description } } ); fireEvent.change(getAllByTestId('select')[0].children[1], { target: { value: fixtureUpdateControlTechniqueRestType.controlType }, }); fireEvent.click(getByText('Next')); }); expect( getByDisplayValue( fixtureCreateControlTechniqueRestType.techniqueDetails?.policyId! ) ).toBeInTheDocument(); act(() => { fireEvent.click(getByText('Next')); }); expect(getByText('REST API')).toBeInTheDocument(); expect( getByDisplayValue( fixtureCreateControlTechniqueRestType.techniqueDetails?.restEndpoint! ) ).toBeInTheDocument(); act(() => { fireEvent.click(getByText('Next')); }); expect(getByText(fixtureUpdateControlTechniqueRestType.name!)).toBeVisible(); expect(getByText(fixtureUpdateControlTechniqueRestType.description!)).toBeVisible(); expect(getByText(fixtureUpdateControlTechniqueRestType.controlType!)).toBeVisible(); expect( getByText(fixtureCreateControlTechniqueRestType.techniqueDetails?.policyId!) ).toBeVisible(); expect(getByText('Integration (REST)')).toBeVisible(); expect( getByText(fixtureCreateControlTechniqueRestType.techniqueDetails?.restEndpoint!) ).toBeVisible(); expect(await findByText('Submit')).toBeVisible(); act(() => { fireEvent.click(getByText('Submit')); }); }; export const controlTechniqueCreateFormNavigateAndAssert = async ( renderResult: RenderResult ) => { const { getByText, getAllByTestId, getAllByRole, getAllByText, findByText } = renderResult; expect(getByText('Create Control Technique')).toBeInTheDocument(); // Control technique details page expect(getAllByText('Control Technique Details').length).toBe(2); act(() => { fireEvent.change( getAllByRole('textbox').filter((element) => element.id === 'name')[0], { target: { value: fixtureCreateControlTechniqueRestType.name } } ); fireEvent.change( getAllByRole('textbox').filter((element) => element.id === 'description')[0], { target: { value: fixtureCreateControlTechniqueRestType.description } } ); fireEvent.change(getAllByTestId('select')[0].children[1], { target: { value: fixtureCreateControlTechniqueRestType.controlType }, }); fireEvent.change( getAllByRole('checkbox').filter((element) => element.id === 'enabled')[0], { target: { checked: true } } ); fireEvent.click(getByText('Next')); }); // Policy settings page expect(await findByText('Policy ID')).toBeVisible(); act(() => { fireEvent.change( getAllByRole('textbox').filter( (element) => element.id === 'techniqueDetails.policyId' )[0], { target: { value: fixtureCreateControlTechniqueRestType.techniqueDetails ?.policyId, }, } ); fireEvent.change( getAllByRole('textbox').filter( (element) => element.id === 'techniqueDetails.bundleName' )[0], { target: { value: fixtureCreateControlTechniqueRestType.techniqueDetails ?.bundleName, }, } ); fireEvent.change( getAllByRole('textbox').filter( (element) => element.id === 'techniqueDetails.namespace' )[0], { target: { value: fixtureCreateControlTechniqueRestType.techniqueDetails ?.namespace, }, } ); }); act(() => { fireEvent.click(getByText('Next')); }); // Control integration page expect(await findByText('Integration Type')).toBeVisible(); act(() => { fireEvent.change(getAllByTestId('select')[0].children[1], { target: { value: fixtureCreateControlTechniqueRestType.techniqueDetails ?.integrationType, }, }); }); expect(await findByText('REST Endpoint')).toBeVisible(); act(() => { fireEvent.change( getAllByRole('textbox').filter( (element) => element.id === 'techniqueDetails.restEndpoint' )[0], { target: { value: fixtureCreateControlTechniqueRestType.techniqueDetails ?.restEndpoint, }, } ); fireEvent.click(getByText('Next')); }); // Review page expect(getByText(fixtureCreateControlTechniqueRestType.name!)).toBeVisible(); expect(getByText(fixtureCreateControlTechniqueRestType.description!)).toBeVisible(); expect(getByText(fixtureCreateControlTechniqueRestType.controlType!)).toBeVisible(); expect( getByText(fixtureCreateControlTechniqueRestType.techniqueDetails?.policyId!) ).toBeVisible(); expect( getByText(fixtureCreateControlTechniqueRestType.techniqueDetails?.bundleName!) ).toBeVisible(); expect( getByText(fixtureCreateControlTechniqueRestType.techniqueDetails?.namespace!) ).toBeVisible(); expect(getByText('Integration (REST)')).toBeVisible(); expect( getByText(fixtureCreateControlTechniqueRestType.techniqueDetails?.restEndpoint!) ).toBeVisible(); act(() => { fireEvent.click(getByText('Submit')); }); }; describe('ControlTechniqueForm', () => { test('render create', async () => { const mockOnSubmit = jest.fn(); const mockOnCancel = jest.fn(); const renderResult = render( ); await controlTechniqueCreateFormNavigateAndAssert(renderResult); expect(mockOnSubmit).toBeCalledWith( fixtureCreateControlTechniqueRestType, expect.any(Object), expect.any(Function) ); }); test('render create for AWS CONFIG control', async () => { const mockOnSubmit = jest.fn(); const mockOnCancel = jest.fn(); const { getByText, getAllByTestId, getAllByRole, findByText } = render( ); act(() => { fireEvent.change( getAllByRole('textbox').filter((element) => element.id === 'name')[0], { target: { value: 'Test Name' } } ); fireEvent.change( getAllByRole('textbox').filter( (element) => element.id === 'description' )[0], { target: { value: 'Test Description' } } ); fireEvent.change(getAllByTestId('select')[0].children[1], { target: { value: 'DETECTIVE' }, }); fireEvent.change( getAllByRole('checkbox').filter((element) => element.id === 'enabled')[0], { target: { checked: true } } ); fireEvent.click(getByText('Next')); }); act(() => { fireEvent.click(getByText('Next')); }); expect(await findByText('Integration Type')).toBeVisible(); act(() => { fireEvent.change(getAllByTestId('select')[0].children[1], { target: { value: 'AWS_CONFIG' }, }); }); expect(await findByText('Conformance Pack File URL')).toBeVisible(); act(() => { fireEvent.change( getAllByRole('textbox').filter( (element) => element.id === 'techniqueDetails.cpSourceUrls' )[0], { target: { value: 'https://xyz.com' } } ); fireEvent.click(getByText('Next')); }); expect(getByText('Test Name')).toBeVisible(); expect(getByText('Test Description')).toBeVisible(); expect(getByText('DETECTIVE')).toBeVisible(); expect(getByText('Integration (AWS_CONFIG)')).toBeVisible(); expect(getByText('https://xyz.com')).toBeVisible(); act(() => { fireEvent.click(getByText('Submit')); }); expect(mockOnSubmit).toBeCalledWith( { controlType: 'DETECTIVE', description: 'Test Description', name: 'Test Name', techniqueDetails: { integrationType: 'AWS_CONFIG', cpSourceUrls: 'https://xyz.com', }, }, expect.any(Object), expect.any(Function) ); }); test('render update', async () => { const mockOnSubmit = jest.fn(); const mockOnCancel = jest.fn(); const renderResult = render( ); await controlTechniqueUpdateFormNavigateAndAssert(renderResult); expect(mockOnSubmit).toBeCalledWith( { ...fixtureUpdateControlTechniqueRestType, enabled: true, status: 'ACTIVE', }, expect.any(Object), expect.any(Function) ); }); });