/* 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 { RenderResult, act, fireEvent, render, within } from '@testing-library/react'; import ApplicationForm from '.'; import { ApplicationFormData } from './types'; import { BrowserRouter } from 'react-router-dom'; import { Estate } from '@ags/webclient-application-release-core/types'; export const fixtureListEstatesData: Estate[] = [ { id: 'est-1111111', name: 'test_estate', environments: [ { awsAccountId: '111122223333', estateId: 'est-1111111', name: 'env1', isManualApprovalRequired: false, id: 'env-11111111', envClasses: ['nonprod'], mandatory: true, }, { awsAccountId: '555555555555', estateId: 'est-1111111', name: 'env2', isManualApprovalRequired: false, id: 'env-22222222', envClasses: ['prod'], mandatory: false, }, ], }, ]; export const fixtureListAttributesData = { dataClassification: [ { name: 'dataClassification:group', description: 'dataClassification', key: 'dataClassification', value: 'group', metadata: { key1: 'value1', }, createTime: '2021-11-17T06:01:51.389Z', lastUpdateTime: '2021-11-17T06:01:51.389Z', isMandatory: true, }, { name: 'dataClassification:confidential', description: 'dataClassification', key: 'dataClassification', value: 'confidential', metadata: { key1: 'value1', }, createTime: '2021-11-17T06:01:59.024Z', lastUpdateTime: '2021-11-17T06:01:59.024Z', isMandatory: true, }, ], hostingConstruct: [ { name: 'hostingConstruct:lambda', description: 'hostingConstruct', key: 'hostingConstruct', value: 'lambda', metadata: { key1: 'value1', }, createTime: '2021-11-17T06:02:15.035Z', lastUpdateTime: '2021-11-17T06:02:15.035Z', isMandatory: true, }, { name: 'hostingConstruct:ec2', description: 'hostingConstruct', key: 'hostingConstruct', value: 'ec2', metadata: { key1: 'value1', }, createTime: '2021-11-17T06:02:19.232Z', lastUpdateTime: '2021-11-17T06:02:19.232Z', isMandatory: true, }, ], testAttribute: [ { name: 'testAttribute:testAttrValue', description: 'testAttribute', key: 'testAttribute', value: 'testAttrValue', metadata: { key1: 'value1', }, createTime: '2021-11-17T06:02:52.748Z', lastUpdateTime: '2021-11-17T06:02:52.748Z', isMandatory: false, }, ], }; const fixtureInitialFormValues: ApplicationFormData = { name: '', applicationOwner: '', estate: '', environments: [], attributes: [ { key: 'dataClassification', value: '', }, { key: 'hostingConstruct', value: '', }, ], }; export const fixtureCreateAppFormValues: ApplicationFormData = { name: 'TestApplication', applicationOwner: 'Test Application Owner', description: 'Test Description', estate: 'test_estate:est-1111111', environments: [ { label: 'env1', value: 'env-11111111', }, ], attributes: [ { key: 'dataClassification', value: 'group', }, { key: 'hostingConstruct', value: 'lambda', }, ], metadata: [ { key: 'test-metadata-key', value: 'test-metadata-value', }, ], }; export const fixtureUpdateAppFormValues: ApplicationFormData = { ...fixtureCreateAppFormValues, description: 'Updated Test Description', attributes: [ { key: 'dataClassification', value: 'confidential', }, { key: 'hostingConstruct', value: 'lambda', }, ], metadata: [ { key: 'test-metadata-key-new', value: 'test-metadata-value-new', }, ], }; export const appCreateFormNavigateAndAssert = async (renderResult: RenderResult) => { const { getAllByRole, getByDisplayValue, getByLabelText, getByText, getAllByText, getAllByTestId, findAllByRole, findByRole, } = renderResult; expect(getByText('Create Application')).toBeInTheDocument(); expect(getByText('Name')).toBeInTheDocument(); expect(getByText('Description')).toBeInTheDocument(); expect(getByText('Application Owner')).toBeInTheDocument(); expect(getByText('Estate')).toBeInTheDocument(); expect( getByText('Environments (To be selected in the order of deployment)') ).toBeInTheDocument(); await act(async () => { fireEvent.change(getByLabelText('Name'), { target: { value: fixtureCreateAppFormValues.name }, }); fireEvent.change(getByLabelText('Description'), { target: { value: fixtureCreateAppFormValues.description }, }); fireEvent.change(getByLabelText('Application Owner'), { target: { value: fixtureCreateAppFormValues.applicationOwner }, }); fireEvent.change(getAllByTestId('select')[0].children[1], { target: { value: fixtureCreateAppFormValues.estate }, }); fireEvent.mouseDown( getAllByTestId('multiselect')[0].children[0].children[0].children[1] ); const listbox = within(await findByRole('listbox')); fireEvent.click( listbox.getByText(fixtureCreateAppFormValues.environments[0].label) ); fireEvent.click(getByText('Next')); }); // Select Attribute page expect(getByText('Add new item')).toBeVisible(); expect(getAllByText('Select Attribute')).toHaveLength(2); expect(getByDisplayValue('dataClassification')).toBeInTheDocument(); expect(getByDisplayValue('hostingConstruct')).toBeInTheDocument(); act(() => { fireEvent.change(getAllByTestId('select')[1].children[1], { target: { value: fixtureCreateAppFormValues.attributes[0].value }, }); fireEvent.change(getAllByTestId('select')[3].children[1], { target: { value: fixtureCreateAppFormValues.attributes[1].value }, }); fireEvent.click(getByText('Next')); }); // Application Metadata page expect(getByText('Add new item')).toBeVisible(); expect(getAllByText('Application Metadata')).toHaveLength(2); await act(async () => { fireEvent.click(getByText('Add new item')); fireEvent.change( (await findAllByRole('textbox')).filter( (element) => element.id === 'metadata[0].key' )[0], { target: { value: fixtureCreateAppFormValues.metadata![0].key } } ); fireEvent.change( getAllByRole('textbox').filter( (element) => element.id === 'metadata[0].value' )[0], { target: { value: fixtureCreateAppFormValues.metadata![0].value } } ); fireEvent.click(getByText('Next')); }); // Review page expect(getByText(fixtureCreateAppFormValues.name)).toBeInTheDocument(); expect(getByText(fixtureCreateAppFormValues.description!)).toBeInTheDocument(); expect(getByText(fixtureCreateAppFormValues.applicationOwner)).toBeInTheDocument(); expect( getByText(fixtureCreateAppFormValues.estate.split(':')[0]) ).toBeInTheDocument(); expect( getByText(fixtureCreateAppFormValues.environments[0].label) ).toBeInTheDocument(); expect(getByText(fixtureCreateAppFormValues.attributes[0].key)).toBeInTheDocument(); expect(getByText(fixtureCreateAppFormValues.attributes[0].value)).toBeInTheDocument(); expect(getByText(fixtureCreateAppFormValues.attributes[1].key)).toBeInTheDocument(); expect(getByText(fixtureCreateAppFormValues.attributes[1].value)).toBeInTheDocument(); expect(getByText(fixtureCreateAppFormValues.metadata![0].key)).toBeInTheDocument(); expect(getByText(fixtureCreateAppFormValues.metadata![0].value)).toBeInTheDocument(); expect(getByText('Submit')).toBeInTheDocument(); act(() => { fireEvent.click(getByText('Submit')); }); }; export const appUpdateFormNavigateAndAssert = async (renderResult: RenderResult) => { const { getAllByRole, getByDisplayValue, getByLabelText, getByText, getAllByText, findAllByRole, findAllByTestId, } = renderResult; expect(getByText('Update Application')).toBeInTheDocument(); expect(getByDisplayValue(fixtureCreateAppFormValues.name)).toBeInTheDocument(); expect( getByDisplayValue(fixtureCreateAppFormValues.description!) ).toBeInTheDocument(); expect( getByDisplayValue(fixtureCreateAppFormValues.applicationOwner) ).toBeInTheDocument(); expect( getByText(fixtureCreateAppFormValues.estate.split(':')[0]) ).toBeInTheDocument(); expect( getByText(fixtureCreateAppFormValues.environments[0].label) ).toBeInTheDocument(); act(() => { fireEvent.change(getByLabelText('Description'), { target: { value: fixtureUpdateAppFormValues.description }, }); fireEvent.click(getByText('Next')); }); // Select Attribute page expect(getByText('Add new item')).toBeVisible(); expect(getAllByText('Select Attribute')).toHaveLength(2); expect( getByDisplayValue(fixtureCreateAppFormValues.attributes[0].key) ).toBeInTheDocument(); expect( getByDisplayValue(fixtureCreateAppFormValues.attributes[0].value) ).toBeInTheDocument(); expect( getByDisplayValue(fixtureCreateAppFormValues.attributes[1].key) ).toBeInTheDocument(); expect( getByDisplayValue(fixtureCreateAppFormValues.attributes[1].value) ).toBeInTheDocument(); await act(async () => { fireEvent.change((await findAllByTestId('select'))[1].children[1], { target: { value: fixtureUpdateAppFormValues.attributes[0].value }, }); fireEvent.click(getByText('Next')); }); // Application Metadata page expect(getByText('Add new item')).toBeVisible(); expect(getAllByText('Application Metadata')).toHaveLength(2); expect( getByDisplayValue(fixtureCreateAppFormValues.metadata![0].key) ).toBeInTheDocument(); expect( getByDisplayValue(fixtureCreateAppFormValues.metadata![0].value) ).toBeInTheDocument(); await act(async () => { fireEvent.change( (await findAllByRole('textbox')).filter( (element) => element.id === 'metadata[0].key' )[0], { target: { value: fixtureUpdateAppFormValues.metadata![0].key } } ); fireEvent.change( getAllByRole('textbox').filter( (element) => element.id === 'metadata[0].value' )[0], { target: { value: fixtureUpdateAppFormValues.metadata![0].value } } ); fireEvent.click(getByText('Next')); }); // Review page expect(getByText(fixtureCreateAppFormValues.name)).toBeInTheDocument(); expect( getByText(fixtureUpdateAppFormValues.description as string) ).toBeInTheDocument(); expect(getByText(fixtureCreateAppFormValues.applicationOwner)).toBeInTheDocument(); expect( getByText(fixtureCreateAppFormValues.estate.split(':')[0]) ).toBeInTheDocument(); expect( getByText(fixtureCreateAppFormValues.environments[0].label) ).toBeInTheDocument(); expect(getByText(fixtureCreateAppFormValues.attributes[0].key)).toBeInTheDocument(); expect(getByText(fixtureUpdateAppFormValues.attributes[0].value)).toBeInTheDocument(); expect(getByText(fixtureCreateAppFormValues.attributes[1].key)).toBeInTheDocument(); expect(getByText(fixtureCreateAppFormValues.attributes[1].value)).toBeInTheDocument(); expect(getByText(fixtureUpdateAppFormValues.metadata![0].key)).toBeInTheDocument(); expect(getByText(fixtureUpdateAppFormValues.metadata![0].key)).toBeInTheDocument(); expect(getByText('Submit')).toBeInTheDocument(); act(() => { fireEvent.click(getByText('Submit')); }); }; describe('ApplicationForm', () => { test('render create', async () => { const mockOnSubmit = jest.fn(); const mockOnCancel = jest.fn(); const renderResult = render( ); await appCreateFormNavigateAndAssert(renderResult); expect(mockOnSubmit).toHaveBeenCalledWith( fixtureCreateAppFormValues, expect.any(Object), expect.any(Function) ); }, 20000); test('render update', async () => { const mockOnSubmit = jest.fn(); const mockOnCancel = jest.fn(); const renderResult = render( ); await appUpdateFormNavigateAndAssert(renderResult); expect(mockOnSubmit).toBeCalledWith( fixtureUpdateAppFormValues, expect.any(Object), expect.any(Function) ); }, 20000); });