diff --git a/awx/ui_next/src/screens/Credential/CredentialAdd/CredentialAdd.test.jsx b/awx/ui_next/src/screens/Credential/CredentialAdd/CredentialAdd.test.jsx index 3f6e562434..24c7e9df0a 100644 --- a/awx/ui_next/src/screens/Credential/CredentialAdd/CredentialAdd.test.jsx +++ b/awx/ui_next/src/screens/Credential/CredentialAdd/CredentialAdd.test.jsx @@ -6,7 +6,11 @@ import { waitForElement, } from '../../../../testUtils/enzymeHelpers'; -import { CredentialsAPI, CredentialTypesAPI } from '../../../api'; +import { + CredentialsAPI, + CredentialInputSourcesAPI, + CredentialTypesAPI, +} from '../../../api'; import CredentialAdd from './CredentialAdd'; jest.mock('../../../api'); @@ -14,58 +18,6 @@ jest.mock('../../../api'); CredentialTypesAPI.read.mockResolvedValue({ data: { results: [ - { - id: 2, - type: 'credential_type', - url: '/api/v2/credential_types/2/', - related: { - credentials: '/api/v2/credential_types/2/credentials/', - activity_stream: '/api/v2/credential_types/2/activity_stream/', - }, - summary_fields: { - user_capabilities: { - edit: false, - delete: false, - }, - }, - created: '2020-02-12T19:42:43.551238Z', - modified: '2020-02-12T19:43:03.164800Z', - name: 'Source Control', - description: '', - kind: 'scm', - namespace: 'scm', - managed_by_tower: true, - inputs: { - fields: [ - { - id: 'username', - label: 'Username', - type: 'string', - }, - { - id: 'password', - label: 'Password', - type: 'string', - secret: true, - }, - { - id: 'ssh_key_data', - label: 'Source Control Private Key', - type: 'string', - format: 'ssh_private_key', - secret: true, - multiline: true, - }, - { - id: 'ssh_key_unlock', - label: 'Private Key Passphrase', - type: 'string', - secret: true, - }, - ], - }, - injectors: {}, - }, { id: 1, type: 'credential_type', @@ -156,59 +108,98 @@ describe('', () => { let wrapper; let history; - beforeEach(async () => { - history = createMemoryHistory({ initialEntries: ['/credentials'] }); - await act(async () => { - wrapper = mountWithContexts(, { - context: { router: { history } }, + describe('Initial GET request succeeds', () => { + beforeEach(async () => { + history = createMemoryHistory({ initialEntries: ['/credentials'] }); + await act(async () => { + wrapper = mountWithContexts(, { + context: { router: { history } }, + }); }); }); - }); - afterEach(() => { - wrapper.unmount(); - }); + afterEach(() => { + wrapper.unmount(); + }); - test('Initially renders successfully', () => { - expect(wrapper.length).toBe(1); - }); - test('handleSubmit should call the api and redirect to details page', async () => { - await waitForElement(wrapper, 'isLoading', el => el.length === 0); - await act(async () => { - wrapper.find('CredentialForm').prop('onSubmit')({ + test('handleSubmit should call the api and redirect to details page', async () => { + await waitForElement(wrapper, 'isLoading', el => el.length === 0); + await act(async () => { + wrapper.find('CredentialForm').prop('onSubmit')({ + user: 1, + organization: null, + name: 'foo', + description: 'bar', + credential_type: '1', + inputs: { + username: { + credential: { + id: 1, + name: 'Some cred', + }, + inputs: { + foo: 'bar', + }, + }, + password: 'foo', + ssh_key_data: 'bar', + ssh_public_key_data: 'baz', + ssh_key_unlock: 'foobar', + become_method: '', + become_username: '', + become_password: '', + }, + passwordPrompts: { + become_password: true, + }, + }); + }); + expect(CredentialsAPI.create).toHaveBeenCalledWith({ user: 1, organization: null, name: 'foo', description: 'bar', - credential_type: '2', + credential_type: '1', inputs: { - username: '', - password: '', - ssh_key_data: '', - ssh_key_unlock: '', + password: 'foo', + ssh_key_data: 'bar', + ssh_public_key_data: 'baz', + ssh_key_unlock: 'foobar', + become_method: '', + become_username: '', + become_password: 'ASK', }, - passwordPrompts: {}, }); + expect(CredentialInputSourcesAPI.create).toHaveBeenCalledWith({ + input_field_name: 'username', + metadata: { + foo: 'bar', + }, + source_credential: 1, + target_credential: 13, + }); + expect(history.location.pathname).toBe('/credentials/13/details'); }); - expect(CredentialsAPI.create).toHaveBeenCalledWith({ - user: 1, - organization: null, - name: 'foo', - description: 'bar', - credential_type: '2', - inputs: { - username: '', - password: '', - ssh_key_data: '', - ssh_key_unlock: '', - }, + + test('handleCancel should return the user back to the inventories list', async () => { + await waitForElement(wrapper, 'isLoading', el => el.length === 0); + wrapper.find('Button[aria-label="Cancel"]').simulate('click'); + expect(history.location.pathname).toEqual('/credentials'); }); - expect(history.location.pathname).toBe('/credentials/13/details'); }); - test('handleCancel should return the user back to the inventories list', async () => { - await waitForElement(wrapper, 'isLoading', el => el.length === 0); - wrapper.find('Button[aria-label="Cancel"]').simulate('click'); - expect(history.location.pathname).toEqual('/credentials'); + describe('Initial GET request fails', () => { + test('shows error when initial GET request fails', async () => { + CredentialTypesAPI.read.mockRejectedValue(new Error()); + history = createMemoryHistory({ initialEntries: ['/credentials'] }); + await act(async () => { + wrapper = mountWithContexts(, { + context: { router: { history } }, + }); + }); + wrapper.update(); + expect(wrapper.find('ContentError').length).toBe(1); + wrapper.unmount(); + }); }); }); diff --git a/awx/ui_next/src/screens/Credential/CredentialEdit/CredentialEdit.test.jsx b/awx/ui_next/src/screens/Credential/CredentialEdit/CredentialEdit.test.jsx index b586735035..daa772cd3b 100644 --- a/awx/ui_next/src/screens/Credential/CredentialEdit/CredentialEdit.test.jsx +++ b/awx/ui_next/src/screens/Credential/CredentialEdit/CredentialEdit.test.jsx @@ -6,7 +6,11 @@ import { waitForElement, } from '../../../../testUtils/enzymeHelpers'; -import { CredentialsAPI, CredentialTypesAPI } from '../../../api'; +import { + CredentialsAPI, + CredentialInputSourcesAPI, + CredentialTypesAPI, +} from '../../../api'; import CredentialEdit from './CredentialEdit'; jest.mock('../../../api'); @@ -107,58 +111,6 @@ const mockCredential = { CredentialTypesAPI.read.mockResolvedValue({ data: { results: [ - { - id: 2, - type: 'credential_type', - url: '/api/v2/credential_types/2/', - related: { - credentials: '/api/v2/credential_types/2/credentials/', - activity_stream: '/api/v2/credential_types/2/activity_stream/', - }, - summary_fields: { - user_capabilities: { - edit: false, - delete: false, - }, - }, - created: '2020-02-12T19:42:43.551238Z', - modified: '2020-02-12T19:43:03.164800Z', - name: 'Source Control', - description: '', - kind: 'scm', - namespace: 'scm', - managed_by_tower: true, - inputs: { - fields: [ - { - id: 'username', - label: 'Username', - type: 'string', - }, - { - id: 'password', - label: 'Password', - type: 'string', - secret: true, - }, - { - id: 'ssh_key_data', - label: 'Source Control Private Key', - type: 'string', - format: 'ssh_private_key', - secret: true, - multiline: true, - }, - { - id: 'ssh_key_unlock', - label: 'Private Key Passphrase', - type: 'string', - secret: true, - }, - ], - }, - injectors: {}, - }, { id: 1, type: 'credential_type', @@ -244,69 +196,173 @@ CredentialTypesAPI.read.mockResolvedValue({ }); CredentialsAPI.update.mockResolvedValue({ data: { id: 3 } }); -CredentialsAPI.readInputSources.mockResolvedValue({ data: { results: [] } }); +CredentialsAPI.readInputSources.mockResolvedValue({ + data: { + results: [ + { + id: 34, + summary_fields: { + source_credential: { + id: 20, + name: 'CyberArk Conjur Secret Lookup', + description: '', + kind: 'conjur', + cloud: false, + credential_type_id: 20, + }, + }, + input_field_name: 'password', + metadata: { + secret_path: 'a', + secret_version: 'b', + }, + source_credential: 20, + }, + { + id: 35, + summary_fields: { + source_credential: { + id: 20, + name: 'CyberArk Conjur Secret Lookup', + description: '', + kind: 'conjur', + cloud: false, + credential_type_id: 20, + }, + }, + input_field_name: 'become_username', + metadata: { + secret_path: 'foo', + secret_version: 'bar', + }, + source_credential: 20, + }, + ], + }, +}); describe('', () => { let wrapper; let history; - beforeEach(async () => { - history = createMemoryHistory({ initialEntries: ['/credentials'] }); - await act(async () => { - wrapper = mountWithContexts( - , - { - context: { router: { history } }, - } - ); + describe('Initial GET request succeeds', () => { + beforeEach(async () => { + history = createMemoryHistory({ initialEntries: ['/credentials'] }); + await act(async () => { + wrapper = mountWithContexts( + , + { + context: { router: { history } }, + } + ); + }); }); - }); - afterEach(() => { - wrapper.unmount(); - }); + afterEach(() => { + wrapper.unmount(); + }); - test('initially renders successfully', async () => { - expect(wrapper.find('CredentialEdit').length).toBe(1); - }); + test('initially renders successfully', async () => { + expect(wrapper.find('CredentialEdit').length).toBe(1); + }); - test('handleCancel returns the user to credential detail', async () => { - await waitForElement(wrapper, 'isLoading', el => el.length === 0); - wrapper.find('Button[aria-label="Cancel"]').simulate('click'); - expect(history.location.pathname).toEqual('/credentials/3/details'); - }); + test('handleCancel returns the user to credential detail', async () => { + await waitForElement(wrapper, 'isLoading', el => el.length === 0); + wrapper.find('Button[aria-label="Cancel"]').simulate('click'); + expect(history.location.pathname).toEqual('/credentials/3/details'); + }); - test('handleSubmit should post to the api', async () => { - await waitForElement(wrapper, 'isLoading', el => el.length === 0); - await act(async () => { - wrapper.find('CredentialForm').prop('onSubmit')({ + test('handleSubmit should post to the api', async () => { + await waitForElement(wrapper, 'isLoading', el => el.length === 0); + await act(async () => { + wrapper.find('CredentialForm').prop('onSubmit')({ + user: 1, + organization: null, + name: 'foo', + description: 'bar', + credential_type: '1', + inputs: { + username: { + credential: { + id: 1, + name: 'Some cred', + }, + inputs: { + foo: 'bar', + }, + }, + password: 'foo', + ssh_key_data: 'bar', + ssh_public_key_data: 'baz', + ssh_key_unlock: 'foobar', + become_method: '', + become_username: { + credential: { + id: 1, + name: 'Some cred', + }, + inputs: { + secret_path: '/foo/bar', + secret_version: '9000', + }, + touched: true, + }, + become_password: '', + }, + passwordPrompts: { + become_password: true, + }, + }); + }); + expect(CredentialsAPI.update).toHaveBeenCalledWith(3, { user: 1, organization: null, name: 'foo', description: 'bar', - credential_type: '2', + credential_type: '1', inputs: { - username: '', - password: '', - ssh_key_data: '', - ssh_key_unlock: '', + password: 'foo', + ssh_key_data: 'bar', + ssh_public_key_data: 'baz', + ssh_key_unlock: 'foobar', + become_method: '', + become_password: 'ASK', }, - passwordPrompts: {}, }); + expect(CredentialInputSourcesAPI.create).toHaveBeenCalledWith({ + input_field_name: 'username', + metadata: { + foo: 'bar', + }, + source_credential: 1, + target_credential: 3, + }); + expect(CredentialInputSourcesAPI.update).toHaveBeenCalledWith(35, { + metadata: { + secret_path: '/foo/bar', + secret_version: '9000', + }, + source_credential: 1, + }); + expect(CredentialInputSourcesAPI.destroy).toHaveBeenCalledWith(34); + expect(history.location.pathname).toBe('/credentials/3/details'); }); - expect(CredentialsAPI.update).toHaveBeenCalledWith(3, { - user: 1, - organization: null, - name: 'foo', - description: 'bar', - credential_type: '2', - inputs: { - username: '', - password: '', - ssh_key_data: '', - ssh_key_unlock: '', - }, + }); + describe('Initial GET request fails', () => { + test('shows error when initial GET request fails', async () => { + CredentialTypesAPI.read.mockRejectedValue(new Error()); + history = createMemoryHistory({ initialEntries: ['/credentials'] }); + await act(async () => { + wrapper = mountWithContexts( + , + { + context: { router: { history } }, + } + ); + }); + wrapper.update(); + expect(wrapper.find('ContentError').length).toBe(1); + wrapper.unmount(); }); - expect(history.location.pathname).toBe('/credentials/3/details'); }); });