From 5939116b0afdfcdc527e7607204690ee3539ebba Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Thu, 14 Dec 2017 00:47:37 -0500 Subject: [PATCH] update e2e and smoke tests for multivault select --- .../multi-credential-modal.directive.js | 138 +++--------------- awx/ui/test/e2e/objects/credentials.js | 1 + awx/ui/test/e2e/objects/templates.js | 10 +- awx/ui/test/e2e/tests/smoke.js | 51 +++++-- awx/ui/test/e2e/tests/smoke.yml | 31 +++- 5 files changed, 92 insertions(+), 139 deletions(-) diff --git a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js b/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js index 2077bf933e..5603f7f29e 100644 --- a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js +++ b/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js @@ -95,9 +95,6 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile' let extraCredIds = $scope.selectedCredentials.extra.map(cred => cred.id); $scope.credentials.forEach(cred => { cred.checked = (extraCredIds.indexOf(cred.id) > - 1) ? 1 : 0; - // if (cred.credential_type !== $scope.credentialKinds.Machine) { - // cred.checked = (extraCredIds.indexOf(cred.id) > - 1) ? 1 : 0; - //} }); $scope.credTags = MultiCredentialService @@ -105,36 +102,6 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile' $scope.allCredentialTypeOptions); }; - // let updateMachineCredentialList = function() { - // $scope.credentials.forEach(cred => { - // if (cred.credential_type === $scope.credentialKinds.Machine) { - // cred.checked = ($scope.selectedCredentials - // .machine !== null && - // cred.id === $scope.selectedCredentials - // .machine.id) ? 1 : 0; - // } - // }); - - // $scope.credTags = MultiCredentialService - // .updateCredentialTags($scope.selectedCredentials, - // $scope.allCredentialTypeOptions); - // }; - - // let updateVaultCredentialList = function() { - // $scope.credentials.forEach(cred => { - // if (cred.credential_type === $scope.credentialKinds.Vault) { - // cred.checked = ($scope.selectedCredentials - // .vault !== null && - // cred.id === $scope.selectedCredentials - // .vault.id) ? 1 : 0; - // } - // }); - - // $scope.credTags = MultiCredentialService - // .updateCredentialTags($scope.selectedCredentials, - // $scope.allCredentialTypeOptions); - // }; - let uncheckAllCredentials = function() { $scope.credentials.forEach(cred => { cred.checked = 0; @@ -200,108 +167,51 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile' $scope.$watchCollection('credentials', updateExtraCredentialsList); $scope.$watchCollection('selectedCredentials.extra', () => { - //$scope.$watchGroup(['credentials', 'selectedCredentials.extra'], () => { if($scope.credentials && $scope.credentials.length > 0) { if($scope.selectedCredentials.extra && - $scope.selectedCredentials.extra.length > 0){ //&& - // parseInt($scope.credentialKind) !== $scope.credentialKinds.Machine) { + $scope.selectedCredentials.extra.length > 0) { updateExtraCredentialsList(); - } else { //if (parseInt($scope.credentialKind) !== $scope.credentialKinds.Machine) { + } else { uncheckAllCredentials(); } } }); - - // $scope.$watch('selectedCredentials.machine', () => { - // if($scope.selectedCredentials && - // $scope.selectedCredentials.machine && - // parseInt($scope.credentialKind) === $scope.credentialKinds.Machine) { - // updateMachineCredentialList(); - // } else { - // uncheckAllCredentials(); - // } - // }); - - // $scope.$watch('selectedCredentials.vault', () => { - // if($scope.selectedCredentials && - // $scope.selectedCredentials.vault && - // parseInt($scope.credentialKind) === $scope.credentialKinds.Vault) { - // updateVaultCredentialList(); - // } else { - // uncheckAllCredentials(); - // } - // }); - - // $scope.$watchGroup(['credentials', - // 'selectedCredentials.machine', - // 'selectedCredentials.vault'], () => { - // if($scope.credentials && - // $scope.credentials.length > 0) { - // if($scope.selectedCredentials && - // $scope.selectedCredentials.machine && - // parseInt($scope.credentialKind) === $scope.credentialKinds.Machine) { - // updateMachineCredentialList(); - // } else if($scope.selectedCredentials && - // $scope.selectedCredentials.vault && - // parseInt($scope.credentialKind) === $scope.credentialKinds.Vault) { - // updateVaultCredentialList(); - // } else if($scope.selectedCredentials && - // $scope.selectedCredentials.extra && - // $scope.selectedCredentials.extra.length > 0 && - // parseInt($scope.credentialKind) !== $scope.credentialKinds.Machine) { - // updateExtraCredentialsList(); - // } else { - // uncheckAllCredentials(); - // } - // } - // }); }; $scope.$on('multiCredentialModalLinked', function() { init(); }); + $scope.toggle_credential = id => { + // This is called only when a checkbox input is clicked directly. For clicks anywhere + // else on the row or direct radio button clicks, the toggle_row handler is called + // instead with a slightly different set of arguments. We normalize those arguments + // here and pass them through to the other handler so that the behavior is consistent. + const [credential] = $scope.credentials.filter(credential => credential.id === id); + return $scope.toggle_row(credential); + }; + $scope.toggle_row = function(selectedRow) { - // if(false) { //if(parseInt($scope.credentialKind) === $scope.credentialKinds.Machine) { - // if($scope.selectedCredentials && - // $scope.selectedCredentials.machine && - // $scope.selectedCredentials.machine.id === selectedRow.id) { - // $scope.selectedCredentials.machine = null; - // } else { - // $scope.selectedCredentials.machine = _.cloneDeep(selectedRow); - // } - // }else if (false) { //if(parseInt($scope.credentialKind) === $scope.credentialKinds.Vault) { - // if($scope.selectedCredentials && - // $scope.selectedCredentials.vault && - // $scope.selectedCredentials.vault.id === selectedRow.id) { - // $scope.selectedCredentials.vault = null; - // } else { - // $scope.selectedCredentials.vault = _.cloneDeep(selectedRow); - // } - // } else { - let rowDeselected = false; - for (let i = $scope.selectedCredentials.extra.length - 1; i >= 0; i--) { - if($scope.selectedCredentials.extra[i].id === selectedRow.id) { + let rowDeselected = false; + for (let i = $scope.selectedCredentials.extra.length - 1; i >= 0; i--) { + if($scope.selectedCredentials.extra[i].id === selectedRow.id) { + $scope.selectedCredentials.extra.splice(i, 1); + rowDeselected = true; + } else if(selectedRow.credential_type === $scope.selectedCredentials.extra[i].credential_type) { + if (selectedRow.credential_type !== $scope.credentialKinds.Vault) { $scope.selectedCredentials.extra.splice(i, 1); - rowDeselected = true; - } else if(selectedRow.credential_type === $scope.selectedCredentials.extra[i].credential_type) { - if (selectedRow.credential_type !== $scope.credentialKinds.Vault) { - $scope.selectedCredentials.extra.splice(i, 1); - } } } - if(!rowDeselected) { - $scope.selectedCredentials.extra - .push(_.cloneDeep(selectedRow)); - } - // } + } + if(!rowDeselected) { + $scope.selectedCredentials.extra + .push(_.cloneDeep(selectedRow)); + } }; $scope.selectedCredentialsDirty = function() { if ($scope.originalSelectedCredentials) { - return !($scope.originalSelectedCredentials.machine === null && - $scope.originalSelectedCredentials.vault === null && - $scope.originalSelectedCredentials.extra.length === 0) && + return !($scope.originalSelectedCredentials.extra.length === 0) && !_.isEqual($scope.selectedCredentials, $scope.originalSelectedCredentials); } else { diff --git a/awx/ui/test/e2e/objects/credentials.js b/awx/ui/test/e2e/objects/credentials.js index ad3cd3bb91..d271eb953a 100644 --- a/awx/ui/test/e2e/objects/credentials.js +++ b/awx/ui/test/e2e/objects/credentials.js @@ -39,6 +39,7 @@ const vault = createFormSection({ selector: '.at-InputGroup-inset', labels: { vaultPassword: 'Vault Password', + vaultIdentifier: 'Vault Identifier' } }); diff --git a/awx/ui/test/e2e/objects/templates.js b/awx/ui/test/e2e/objects/templates.js index 073086e8ed..86a5478d3e 100644 --- a/awx/ui/test/e2e/objects/templates.js +++ b/awx/ui/test/e2e/objects/templates.js @@ -226,11 +226,10 @@ module.exports = { .waitForElementVisible('div.spinny') .waitForElementNotVisible('div.spinny') .waitForElementNotPresent('multi-credential-modal tbody tr:nth-child(2)') - .waitForElementVisible('multi-credential-modal tbody tr:nth-child(1) input[type="radio"]') - .click('multi-credential-modal tbody tr:nth-child(1) input[type="radio"]') + .waitForElementVisible('multi-credential-modal tbody tr:nth-child(1) input[type="checkbox"]') + .click('multi-credential-modal tbody tr:nth-child(1) input[type="checkbox"]') .click('multi-credential-modal button[class*="save"]') - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); + .pause(1000); return this; }, @@ -256,8 +255,7 @@ module.exports = { .waitForElementVisible('multi-credential-modal tbody tr:nth-child(1) input[type="radio"]') .click('multi-credential-modal tbody tr:nth-child(1) input[type="radio"]') .click('multi-credential-modal button[class*="save"]') - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); + .pause(1000); return this; } diff --git a/awx/ui/test/e2e/tests/smoke.js b/awx/ui/test/e2e/tests/smoke.js index b65e1d5f8a..6d855794ff 100644 --- a/awx/ui/test/e2e/tests/smoke.js +++ b/awx/ui/test/e2e/tests/smoke.js @@ -6,12 +6,12 @@ const INVENTORY_NAME = `inventory-${id}`; const MACHINE_CREDENTIAL_NAME = `credential-machine-${id}`; const ORGANIZATION_NAME = `organization-${id}`; const PROJECT_NAME = `project-${id}`; -const PROJECT_URL = 'https://github.com/ansible/awx'; -const PROJECT_BRANCH = 'devel'; -const PLAYBOOK_NAME = 'awx/ui/test/e2e/tests/smoke.yml'; +const PROJECT_URL = 'https://github.com/jlaska/ansible-playbooks'; +const PROJECT_BRANCH = 'master'; +const PLAYBOOK_NAME = 'multivault.yml'; const TEMPLATE_NAME = `template-${id}`; -const VAULT_CREDENTIAL_NAME = `credential-vault-${id}`; -const VAULT_CREDENTIAL_PASSWORD = 'VAULT_CREDENTIAL_PASSWORD'; +const VAULT_CREDENTIAL_NAME_1 = `credential-vault-${id}-1`; +const VAULT_CREDENTIAL_NAME_2 = `credential-vault-${id}-2`; module.exports = { 'login to awx': client => { @@ -153,7 +153,7 @@ module.exports = { client.waitForElementVisible('div.spinny'); client.waitForElementNotVisible('div.spinny'); }, - 'create vault credential': client => { + 'create vault credentials': client => { const credentials = client.page.credentials(); const { details } = credentials.section.add.section; @@ -171,9 +171,35 @@ module.exports = { details.waitForElementVisible('@save'); details.clearAndSelectType('Vault'); details.setValue('@organization', ORGANIZATION_NAME); - details.setValue('@name', VAULT_CREDENTIAL_NAME); + details.setValue('@name', VAULT_CREDENTIAL_NAME_1); - details.section.vault.setValue('@vaultPassword', VAULT_CREDENTIAL_PASSWORD); + details.section.vault.setValue('@vaultPassword', 'secret1'); + details.section.vault.setValue('@vaultIdentifier', 'first'); + + details.expect.element('@save').enabled; + details.click('@save'); + + credentials.waitForElementVisible('div.spinny'); + credentials.waitForElementNotVisible('div.spinny'); + + credentials.section.navigation.waitForElementVisible('@credentials'); + credentials.section.navigation.expect.element('@credentials').enabled; + credentials.section.navigation.click('@credentials'); + + credentials.waitForElementVisible('div.spinny'); + credentials.waitForElementNotVisible('div.spinny'); + + credentials.section.list.waitForElementVisible('@add'); + credentials.section.list.expect.element('@add').enabled; + credentials.section.list.click('@add'); + + details.waitForElementVisible('@save'); + details.clearAndSelectType('Vault'); + details.setValue('@organization', ORGANIZATION_NAME); + details.setValue('@name', VAULT_CREDENTIAL_NAME_2); + + details.section.vault.setValue('@vaultPassword', 'secret2'); + details.section.vault.setValue('@vaultIdentifier', 'second'); details.expect.element('@save').enabled; details.click('@save'); @@ -217,7 +243,8 @@ module.exports = { templates.selectAdd('Job Template'); templates.selectInventory(INVENTORY_NAME); templates.selectProject(PROJECT_NAME); - templates.selectVaultCredential(VAULT_CREDENTIAL_NAME); + templates.selectVaultCredential(VAULT_CREDENTIAL_NAME_1); + templates.selectVaultCredential(VAULT_CREDENTIAL_NAME_2); templates.selectMachineCredential(MACHINE_CREDENTIAL_NAME); templates.selectPlaybook(PLAYBOOK_NAME); templates.sendKeys('label[for="name"] + div input', TEMPLATE_NAME); @@ -253,7 +280,8 @@ module.exports = { templates.click('i[class$="launch"]'); }, 'verify expected job results': client => { - const output = './/span[normalize-space(text())=\'"msg": "Hello World!"\']'; + const output1 = './/span[normalize-space(text())=\'"first": "First!"\']'; + const output2 = './/span[normalize-space(text())=\'"second": "Second!"\']'; const running = 'i[class$="icon-job-running"]'; const success = 'i[class$="icon-job-successful"]'; @@ -265,7 +293,8 @@ module.exports = { client.waitForElementVisible(success, 60000); client.useXpath(); - client.waitForElementVisible(output, 60000); + client.waitForElementVisible(output1, 60000); + client.waitForElementVisible(output2, 60000); client.useCss(); client.end(); diff --git a/awx/ui/test/e2e/tests/smoke.yml b/awx/ui/test/e2e/tests/smoke.yml index f85e892dff..10edd0ab0f 100644 --- a/awx/ui/test/e2e/tests/smoke.yml +++ b/awx/ui/test/e2e/tests/smoke.yml @@ -1,10 +1,25 @@ --- -- hosts: all - tasks: - - name: Import Vault Variables - include_vars: smoke-vars.yml - no_log: true +# ansible-playbook multivault.yml --vault-id var1@prompt --vault-id var2@prompt +# Vault password (var1): secret1 +# Vault password (var2): secret2 - - name: Display Vault Message - debug: - msg: '{{ vault_message }}' +- hosts: all + gather_facts: false + vars: + first: !vault | + $ANSIBLE_VAULT;1.2;AES256;first + 30326539376633656433636231653132623266336338316462356132366361653566303364353335 + 6665626463633737666336643334353262373836613332650a353531666262636531383430363935 + 33633465306165393538323336323135393730383563653738666163633835383262396135353765 + 6238333837306332630a336538623333313636353363326666613564353666623635373432386162 + 3562 + second: !vault | + $ANSIBLE_VAULT;1.2;AES256;second + 34653738643565633930336534363230343562343362643432616165373034376565353833366361 + 6264346330376564643262643166623164323433336631360a396336353866323663613935383534 + 33643034373439326435373539323433313832366437303764353562653834623966663533613464 + 3961663934613264360a613763346638636566386461333235366335336564353935356232316265 + 3164 + tasks: + - debug: var=first + - debug: var=second