diff --git a/awx_collection/plugins/modules/tower_workflow_job_template.py b/awx_collection/plugins/modules/tower_workflow_job_template.py index f6d972e76f..7836b42cc4 100644 --- a/awx_collection/plugins/modules/tower_workflow_job_template.py +++ b/awx_collection/plugins/modules/tower_workflow_job_template.py @@ -151,7 +151,15 @@ import json def update_survey(module, last_request): spec_endpoint = last_request.get('related', {}).get('survey_spec') - module.post_endpoint(spec_endpoint, **{'data': module.params.get('survey_spec')}) + if module.params.get('survey_spec') == {}: + response = module.delete_endpoint(spec_endpoint) + if response['status_code'] != 200: + # Not sure how to make this actually return a non 200 to test what to dump in the respinse + module.fail_json(msg="Failed to delete survey: {0}".format(response['json'])) + else: + response = module.post_endpoint(spec_endpoint, **{'data': module.params.get('survey_spec')}) + if response['status_code'] != 200: + module.fail_json(msg="Failed to update survey: {0}".format(response['json']['error'])) module.exit_json(**module.json_output) diff --git a/awx_collection/test/awx/test_job_template.py b/awx_collection/test/awx/test_job_template.py index 80b3cd9529..5d4100dac1 100644 --- a/awx_collection/test/awx/test_job_template.py +++ b/awx_collection/test/awx/test_job_template.py @@ -177,6 +177,38 @@ def test_job_template_with_survey_spec(run_module, admin_user, project, inventor assert ActivityStream.objects.count() == prior_ct +@pytest.mark.django_db +def test_job_template_with_wrong_survey_spec(run_module, admin_user, project, inventory, survey_spec): + result = run_module('tower_job_template', dict( + name='foo', + playbook='helloworld.yml', + project=project.name, + inventory=inventory.name, + survey_spec=survey_spec, + survey_enabled=True + ), admin_user) + assert not result.get('failed', False), result.get('msg', result) + assert result.get('changed', False), result + jt = JobTemplate.objects.get(pk=result['id']) + + assert jt.survey_spec == survey_spec + + prior_ct = ActivityStream.objects.count() + + del survey_spec['description'] + + result = run_module('tower_job_template', dict( + name='foo', + playbook='helloworld.yml', + project=project.name, + inventory=inventory.name, + survey_spec=survey_spec, + survey_enabled=True + ), admin_user) + assert result.get('failed', True) + assert result.get('msg') == "Failed to update survey: Field 'description' is missing from survey spec." + + @pytest.mark.django_db def test_job_template_with_survey_encrypted_default(run_module, admin_user, project, inventory, silence_warning): spec = { diff --git a/awx_collection/test/awx/test_workflow_job_template.py b/awx_collection/test/awx/test_workflow_job_template.py index a125b01249..9e5d914cfb 100644 --- a/awx_collection/test/awx/test_workflow_job_template.py +++ b/awx_collection/test/awx/test_workflow_job_template.py @@ -81,6 +81,34 @@ def test_survey_spec_only_changed(run_module, admin_user, organization, survey_s assert wfjt.survey_spec == survey_spec +@pytest.mark.django_db +def test_survey_spec_only_changed(run_module, admin_user, organization, survey_spec): + wfjt = WorkflowJobTemplate.objects.create( + organization=organization, name='foo-workflow', + survey_enabled=True, survey_spec=survey_spec + ) + result = run_module('tower_workflow_job_template', { + 'name': 'foo-workflow', + 'organization': organization.name, + 'state': 'present' + }, admin_user) + assert not result.get('failed', False), result.get('msg', result) + assert not result.get('changed', True), result + wfjt.refresh_from_db() + assert wfjt.survey_spec == survey_spec + + del survey_spec['description'] + + result = run_module('tower_workflow_job_template', { + 'name': 'foo-workflow', + 'organization': organization.name, + 'survey_spec': survey_spec, + 'state': 'present' + }, admin_user) + assert result.get('failed', True) + assert result.get('msg') == "Failed to update survey: Field 'description' is missing from survey spec." + + @pytest.mark.django_db def test_associate_only_on_success(run_module, admin_user, organization, project): wfjt = WorkflowJobTemplate.objects.create(