diff --git a/awx/ui/src/screens/Inventory/shared/InventorySourceSubForms/OpenShiftVirtualizationSubForm.js b/awx/ui/src/screens/Inventory/shared/InventorySourceSubForms/OpenShiftVirtualizationSubForm.js new file mode 100644 index 000000000000..38f57e3ceb5a --- /dev/null +++ b/awx/ui/src/screens/Inventory/shared/InventorySourceSubForms/OpenShiftVirtualizationSubForm.js @@ -0,0 +1,60 @@ +import React, { useCallback } from 'react'; +import { useField, useFormikContext } from 'formik'; +import { t } from '@lingui/macro'; +import { useConfig } from 'contexts/Config'; +import getDocsBaseUrl from 'util/getDocsBaseUrl'; +import CredentialLookup from 'components/Lookup/CredentialLookup'; +import { required } from 'util/validators'; +import { + OptionsField, + VerbosityField, + EnabledVarField, + EnabledValueField, + HostFilterField, + SourceVarsField, +} from './SharedFields'; +import getHelpText from '../Inventory.helptext'; + +const VirtualizationSubForm = ({ autoPopulateCredential }) => { + const helpText = getHelpText(); + const { setFieldValue, setFieldTouched } = useFormikContext(); + const [credentialField, credentialMeta, credentialHelpers] = + useField('credential'); + const config = useConfig(); + + const handleCredentialUpdate = useCallback( + (value) => { + setFieldValue('credential', value); + setFieldTouched('credential', true, false); + }, + [setFieldValue, setFieldTouched] + ); + + const docsBaseUrl = getDocsBaseUrl(config); + return ( + <> + credentialHelpers.setTouched()} + onChange={handleCredentialUpdate} + value={credentialField.value} + required + autoPopulate={autoPopulateCredential} + validate={required(t`Select a value for this field`)} + /> + + + + + + + + ); +}; + +export default OpenShiftVirtualizationSubForm; diff --git a/awx/ui/src/screens/Inventory/shared/InventorySourceSubForms/OpenShiftVirtualizationSubForm.test.js b/awx/ui/src/screens/Inventory/shared/InventorySourceSubForms/OpenShiftVirtualizationSubForm.test.js new file mode 100644 index 000000000000..6b289600a98c --- /dev/null +++ b/awx/ui/src/screens/Inventory/shared/InventorySourceSubForms/OpenShiftVirtualizationSubForm.test.js @@ -0,0 +1,65 @@ +import React from 'react'; +import { act } from 'react-dom/test-utils'; +import { Formik } from 'formik'; +import { CredentialsAPI } from 'api'; +import { mountWithContexts } from '../../../../../testUtils/enzymeHelpers'; +import VirtualizationSubForm from './VirtualizationSubForm'; + +jest.mock('../../../../api'); + +const initialValues = { + credential: null, + overwrite: false, + overwrite_vars: false, + source_path: '', + source_project: null, + source_script: null, + source_vars: '---\n', + update_cache_timeout: 0, + update_on_launch: true, + verbosity: 1, +}; + +describe('', () => { + let wrapper; + + beforeEach(async () => { + CredentialsAPI.read.mockResolvedValue({ + data: { count: 0, results: [] }, + }); + + await act(async () => { + wrapper = mountWithContexts( + + + + ); + }); + }); + + afterAll(() => { + jest.clearAllMocks(); + }); + + test('should render subform fields', () => { + expect(wrapper.find('FormGroup[label="Credential"]')).toHaveLength(1); + expect(wrapper.find('FormGroup[label="Verbosity"]')).toHaveLength(1); + expect(wrapper.find('FormGroup[label="Update options"]')).toHaveLength(1); + expect( + wrapper.find('FormGroup[label="Cache timeout (seconds)"]') + ).toHaveLength(1); + expect( + wrapper.find('VariablesField[label="Source variables"]') + ).toHaveLength(1); + }); + + test('should make expected api calls', () => { + expect(CredentialsAPI.read).toHaveBeenCalledTimes(1); + expect(CredentialsAPI.read).toHaveBeenCalledWith({ + credential_type__namespace: 'rhv', + order_by: 'name', + page: 1, + page_size: 5, + }); + }); +});