diff --git a/awx/ui_next/src/components/CopyButton/CopyButton.jsx b/awx/ui_next/src/components/CopyButton/CopyButton.jsx index 30927f22c5..2856c69c0c 100644 --- a/awx/ui_next/src/components/CopyButton/CopyButton.jsx +++ b/awx/ui_next/src/components/CopyButton/CopyButton.jsx @@ -3,7 +3,7 @@ import { withI18n } from '@lingui/react'; import { t } from '@lingui/macro'; import PropTypes from 'prop-types'; -import { Button, Tooltip } from '@patternfly/react-core'; +import { Button } from '@patternfly/react-core'; import { CopyIcon } from '@patternfly/react-icons'; import useRequest, { useDismissableError } from '../../util/useRequest'; import AlertModal from '../AlertModal'; @@ -15,7 +15,7 @@ function CopyButton({ isDisabled, onCopyStart, onCopyFinish, - helperText, + errorMessage, i18n, }) { const { isLoading, error: copyError, request: copyItemToAPI } = useRequest( @@ -33,17 +33,15 @@ function CopyButton({ return ( <> - - - + - {helperText.errorMessage} + {errorMessage} @@ -62,10 +60,7 @@ CopyButton.propTypes = { copyItem: PropTypes.func.isRequired, onCopyStart: PropTypes.func.isRequired, onCopyFinish: PropTypes.func.isRequired, - helperText: PropTypes.shape({ - tooltip: PropTypes.string.isRequired, - errorMessage: PropTypes.string.isRequired, - }).isRequired, + errorMessage: PropTypes.string.isRequired, isDisabled: PropTypes.bool, }; diff --git a/awx/ui_next/src/components/CopyButton/CopyButton.test.jsx b/awx/ui_next/src/components/CopyButton/CopyButton.test.jsx index f81c0eab1d..894431bc2d 100644 --- a/awx/ui_next/src/components/CopyButton/CopyButton.test.jsx +++ b/awx/ui_next/src/components/CopyButton/CopyButton.test.jsx @@ -1,36 +1,44 @@ import React from 'react'; +import { act } from 'react-dom/test-utils'; import { mountWithContexts } from '../../../testUtils/enzymeHelpers'; import CopyButton from './CopyButton'; jest.mock('../../api'); +let wrapper; + describe('', () => { - test('shold mount properly', () => { - const wrapper = mountWithContexts( - {}} - onCopyFinish={() => {}} - copyItem={() => {}} - helperText={{ - tooltip: `Copy Template`, - errorMessage: `Failed to copy template.`, - }} - /> - ); + afterEach(() => { + wrapper.unmount(); + }); + test('should mount properly', async () => { + await act(async () => { + wrapper = mountWithContexts( + {}} + onCopyFinish={() => {}} + copyItem={() => {}} + errorMessage="Failed to copy template." + /> + ); + }); expect(wrapper.find('CopyButton').length).toBe(1); }); - test('should render proper tooltip', () => { - const wrapper = mountWithContexts( - {}} - onCopyFinish={() => {}} - copyItem={() => {}} - helperText={{ - tooltip: `Copy Template`, - errorMessage: `Failed to copy template.`, - }} - /> - ); - expect(wrapper.find('Tooltip').prop('content')).toBe('Copy Template'); + test('should call the correct function on button click', async () => { + const copyItem = jest.fn(); + await act(async () => { + wrapper = mountWithContexts( + {}} + onCopyFinish={() => {}} + copyItem={copyItem} + errorMessage="Failed to copy template." + /> + ); + }); + await act(async () => { + wrapper.find('button').simulate('click'); + }); + expect(copyItem).toHaveBeenCalledTimes(1); }); }); diff --git a/awx/ui_next/src/components/PaginatedTable/ActionItem.jsx b/awx/ui_next/src/components/PaginatedTable/ActionItem.jsx index a6c5e2b239..f9c423fee3 100644 --- a/awx/ui_next/src/components/PaginatedTable/ActionItem.jsx +++ b/awx/ui_next/src/components/PaginatedTable/ActionItem.jsx @@ -14,7 +14,7 @@ export default function ActionItem({ column, tooltip, visible, children }) { `} > - {children} +
{children}
); diff --git a/awx/ui_next/src/components/PaginatedTable/ActionItem.test.jsx b/awx/ui_next/src/components/PaginatedTable/ActionItem.test.jsx index 202e556e83..d38653802f 100644 --- a/awx/ui_next/src/components/PaginatedTable/ActionItem.test.jsx +++ b/awx/ui_next/src/components/PaginatedTable/ActionItem.test.jsx @@ -12,7 +12,7 @@ describe('', () => { const tooltip = wrapper.find('Tooltip'); expect(tooltip.prop('content')).toEqual('a tooltip'); - expect(tooltip.prop('children')).toEqual('foo'); + expect(tooltip.prop('children')).toEqual(
foo
); }); test('should render null if not visible', async () => { diff --git a/awx/ui_next/src/components/TemplateList/TemplateListItem.jsx b/awx/ui_next/src/components/TemplateList/TemplateListItem.jsx index dc53622737..5638b8d123 100644 --- a/awx/ui_next/src/components/TemplateList/TemplateListItem.jsx +++ b/awx/ui_next/src/components/TemplateList/TemplateListItem.jsx @@ -177,13 +177,13 @@ function TemplateListItem({
- + - + diff --git a/awx/ui_next/src/screens/Inventory/InventoryList/InventoryListItem.jsx b/awx/ui_next/src/screens/Inventory/InventoryList/InventoryListItem.jsx index 099fd78767..2b2f660efd 100644 --- a/awx/ui_next/src/screens/Inventory/InventoryList/InventoryListItem.jsx +++ b/awx/ui_next/src/screens/Inventory/InventoryList/InventoryListItem.jsx @@ -28,7 +28,7 @@ function InventoryListItem({ isSelected: bool.isRequired, onSelect: func.isRequired, }; - const [isDisabled, setIsDisabled] = useState(false); + const [isCopying, setIsCopying] = useState(false); const copyInventory = useCallback(async () => { await InventoriesAPI.copy(inventory.id, { @@ -38,11 +38,11 @@ function InventoryListItem({ }, [inventory.id, inventory.name, fetchInventories]); const handleCopyStart = useCallback(() => { - setIsDisabled(true); + setIsCopying(true); }, []); const handleCopyFinish = useCallback(() => { - setIsDisabled(false); + setIsCopying(false); }, []); const labelId = `check-action-${inventory.id}`; @@ -115,7 +115,7 @@ function InventoryListItem({ tooltip={i18n._(t`Edit Inventory`)} > - + diff --git a/awx_collection/plugins/modules/tower_settings.py b/awx_collection/plugins/modules/tower_settings.py index c2e8ed1ae5..b0f39126c3 100644 --- a/awx_collection/plugins/modules/tower_settings.py +++ b/awx_collection/plugins/modules/tower_settings.py @@ -133,7 +133,7 @@ def main(): existing_settings = module.get_endpoint('settings/all')['json'] # Begin a json response - json_response = {'changed': False, 'old_values': {}} + json_output = {'changed': False, 'old_values': {}, 'new_values': {}} # Check any of the settings to see if anything needs to be updated needs_update = False @@ -141,18 +141,29 @@ def main(): if a_setting not in existing_settings or existing_settings[a_setting] != new_settings[a_setting]: # At least one thing is different so we need to patch needs_update = True - json_response['old_values'][a_setting] = existing_settings[a_setting] + json_output['old_values'][a_setting] = existing_settings[a_setting] + json_output['new_values'][a_setting] = new_settings[a_setting] + + if module._diff: + json_output['diff'] = { + 'before': json_output['old_values'], + 'after': json_output['new_values'] + } # If nothing needs an update we can simply exit with the response (as not changed) if not needs_update: - module.exit_json(**json_response) + module.exit_json(**json_output) + + if module.check_mode and module._diff: + json_output['changed'] = True + module.exit_json(**json_output) # Make the call to update the settings response = module.patch_endpoint('settings/all', **{'data': new_settings}) if response['status_code'] == 200: # Set the changed response to True - json_response['changed'] = True + json_output['changed'] = True # To deal with the old style values we need to return 'value' in the response new_values = {} @@ -161,11 +172,11 @@ def main(): # If we were using a name we will just add a value of a string, otherwise we will return an array in values if name is not None: - json_response['value'] = new_values[name] + json_output['value'] = new_values[name] else: - json_response['values'] = new_values + json_output['values'] = new_values - module.exit_json(**json_response) + module.exit_json(**json_output) elif 'json' in response and '__all__' in response['json']: module.fail_json(msg=response['json']['__all__']) else: