From 4937d1f75eaca4a0a2193c545a7e534100ec9f6c Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Fri, 20 Jul 2018 10:02:50 -0400 Subject: [PATCH] update copy tests --- awx/ui/test/e2e/fixtures.js | 13 +++ .../tests/test-credentials-list-actions.js | 18 ++++ .../tests/test-inventories-list-actions.js | 89 +++++++++++++++---- .../test-inventory-scripts-list-actions.js | 18 ++++ .../tests/test-notifications-list-actions.js | 18 ++++ .../e2e/tests/test-projects-list-actions.js | 18 ++++ .../e2e/tests/test-templates-list-actions.js | 36 ++++++++ 7 files changed, 192 insertions(+), 18 deletions(-) diff --git a/awx/ui/test/e2e/fixtures.js b/awx/ui/test/e2e/fixtures.js index ddc705cdf7..c3e069ac5e 100644 --- a/awx/ui/test/e2e/fixtures.js +++ b/awx/ui/test/e2e/fixtures.js @@ -57,6 +57,18 @@ const getInventory = (namespace = session) => getOrganization(namespace) variables: JSON.stringify({ ansible_connection: 'local' }), }, ['name', 'inventory']).then(() => inventory))); +const getInventoryNoSource = (namespace = session) => getOrganization(namespace) + .then(organization => getOrCreate('/inventories/', { + name: `${namespace}-inventory-nosource`, + description: namespace, + organization: organization.id + }).then(inventory => getOrCreate('/hosts/', { + name: `${namespace}-host`, + description: namespace, + inventory: inventory.id, + variables: JSON.stringify({ ansible_connection: 'local' }), + }, ['name', 'inventory']).then(() => inventory))); + const getHost = (namespace = session) => getInventory(namespace) .then(inventory => getOrCreate('/hosts/', { name: `${namespace}-host`, @@ -365,6 +377,7 @@ module.exports = { getAuditor, getHost, getInventory, + getInventoryNoSource, getInventoryScript, getInventorySource, getInventorySourceSchedule, diff --git a/awx/ui/test/e2e/tests/test-credentials-list-actions.js b/awx/ui/test/e2e/tests/test-credentials-list-actions.js index dd5c274496..c3b0400802 100644 --- a/awx/ui/test/e2e/tests/test-credentials-list-actions.js +++ b/awx/ui/test/e2e/tests/test-credentials-list-actions.js @@ -38,6 +38,24 @@ module.exports = { credentials.waitForElementVisible('div.spinny'); credentials.waitForElementNotVisible('div.spinny'); + const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; + const activityRow = '#activities_table tr td[class*="description-column"] a'; + const toast = 'div[class="Toast-icon"]'; + + credentials.waitForElementNotPresent(toast); + credentials.expect.element(activityStream).visible; + credentials.expect.element(activityStream).enabled; + credentials.click(activityStream); + credentials.waitForElementVisible('div.spinny'); + credentials.waitForElementNotVisible('div.spinny'); + + client + .waitForElementVisible(activityRow) + .click(activityRow); + + credentials.waitForElementVisible('div.spinny'); + credentials.waitForElementNotVisible('div.spinny'); + credentials.expect.element('div[ui-view="edit"] form').visible; credentials.section.edit.expect.element('@title').visible; credentials.section.edit.expect.element('@title').text.contain(data.credential.name); diff --git a/awx/ui/test/e2e/tests/test-inventories-list-actions.js b/awx/ui/test/e2e/tests/test-inventories-list-actions.js index e705daeacf..97eb260a0f 100644 --- a/awx/ui/test/e2e/tests/test-inventories-list-actions.js +++ b/awx/ui/test/e2e/tests/test-inventories-list-actions.js @@ -1,12 +1,19 @@ -import { getInventory } from '../fixtures'; +import { getInventory, getInventoryNoSource } from '../fixtures'; -const data = {}; +let data; module.exports = { before: (client, done) => { - getInventory('test-actions') - .then(obj => { data.inventory = obj; }) - .then(done); + const resources = [ + getInventory('test-actions'), + getInventoryNoSource('test-actions'), + ]; + + Promise.all(resources) + .then(([inventory, inventoryNoSource]) => { + data = { inventory, inventoryNoSource }; + done(); + }); }, 'copy inventory': client => { const inventories = client.page.inventories(); @@ -23,6 +30,63 @@ module.exports = { inventories.section.list.expect.element('smart-search').visible; inventories.section.list.section.search.expect.element('@input').enabled; + inventories.section.list.section.search + .sendKeys('@input', `id:>${data.inventoryNoSource.id - 1} id:<${data.inventoryNoSource.id + 1}`) + .sendKeys('@input', client.Keys.ENTER); + + inventories.waitForElementVisible('div.spinny'); + inventories.waitForElementNotVisible('div.spinny'); + + inventories.expect.element(`#inventories_table tr[id="${data.inventoryNoSource.id}"]`).visible; + inventories.expect.element('i[class*="copy"]').visible; + inventories.expect.element('i[class*="copy"]').enabled; + + inventories.click('i[class*="copy"]'); + inventories.waitForElementVisible('div.spinny'); + inventories.waitForElementNotVisible('div.spinny'); + + const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; + const activityRow = '#activities_table tr td[class*="description-column"] a'; + const toast = 'div[class="Toast-icon"]'; + + inventories.waitForElementNotPresent(toast); + inventories.expect.element(activityStream).visible; + inventories.expect.element(activityStream).enabled; + inventories.click(activityStream); + inventories.waitForElementVisible('div.spinny'); + inventories.waitForElementNotVisible('div.spinny'); + + client + .waitForElementVisible(activityRow) + .click(activityRow); + + inventories.waitForElementVisible('div.spinny'); + inventories.waitForElementNotVisible('div.spinny'); + + inventories.expect.element('#inventory_form').visible; + inventories.section.editStandardInventory.expect.element('@title').visible; + inventories.section.editStandardInventory.expect.element('@title').text.contain(data.inventoryNoSource.name); + inventories.section.editStandardInventory.expect.element('@title').text.not.equal(data.inventoryNoSource.name); + inventories.expect.element('@save').visible; + inventories.expect.element('@save').enabled; + + client.end(); + }, + 'verify inventories with sources cannot be copied': client => { + const inventories = client.page.inventories(); + + client.useCss(); + client.resizeWindow(1200, 800); + client.login(); + client.waitForAngular(); + + inventories.load(); + inventories.waitForElementVisible('div.spinny'); + inventories.waitForElementNotVisible('div.spinny'); + + inventories.section.list.expect.element('smart-search').visible; + inventories.section.list.section.search.expect.element('@input').enabled; + inventories.section.list.section.search .sendKeys('@input', `id:>${data.inventory.id - 1} id:<${data.inventory.id + 1}`) .sendKeys('@input', client.Keys.ENTER); @@ -31,19 +95,8 @@ module.exports = { inventories.waitForElementNotVisible('div.spinny'); inventories.expect.element(`#inventories_table tr[id="${data.inventory.id}"]`).visible; - inventories.expect.element('i[class*="copy"]').visible; - inventories.expect.element('i[class*="copy"]').enabled; - - inventories.click('i[class*="copy"]'); - inventories.waitForElementVisible('div.spinny'); - inventories.waitForElementNotVisible('div.spinny'); - - inventories.expect.element('#inventory_form').visible; - inventories.section.editStandardInventory.expect.element('@title').visible; - inventories.section.editStandardInventory.expect.element('@title').text.contain(data.inventory.name); - inventories.section.editStandardInventory.expect.element('@title').text.not.equal(data.inventory.name); - inventories.expect.element('@save').visible; - inventories.expect.element('@save').enabled; + inventories.expect.element('#copy-action').visible; + inventories.expect.element('#copy-action[class$="btn-disabled"]').present; client.end(); } diff --git a/awx/ui/test/e2e/tests/test-inventory-scripts-list-actions.js b/awx/ui/test/e2e/tests/test-inventory-scripts-list-actions.js index b75bb73516..9e801f2ecc 100644 --- a/awx/ui/test/e2e/tests/test-inventory-scripts-list-actions.js +++ b/awx/ui/test/e2e/tests/test-inventory-scripts-list-actions.js @@ -38,6 +38,24 @@ module.exports = { inventoryScripts.waitForElementVisible('div.spinny'); inventoryScripts.waitForElementNotVisible('div.spinny'); + const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; + const activityRow = '#activities_table tr td[class*="description-column"] a'; + const toast = 'div[class="Toast-icon"]'; + + inventoryScripts.waitForElementNotPresent(toast); + inventoryScripts.expect.element(activityStream).visible; + inventoryScripts.expect.element(activityStream).enabled; + inventoryScripts.click(activityStream); + inventoryScripts.waitForElementVisible('div.spinny'); + inventoryScripts.waitForElementNotVisible('div.spinny'); + + client + .waitForElementVisible(activityRow) + .click(activityRow); + + inventoryScripts.waitForElementVisible('div.spinny'); + inventoryScripts.waitForElementNotVisible('div.spinny'); + inventoryScripts.expect.element('#inventory_script_form').visible; inventoryScripts.section.edit.expect.element('@title').visible; inventoryScripts.section.edit.expect.element('@title').text.contain(data.inventoryScript.name); diff --git a/awx/ui/test/e2e/tests/test-notifications-list-actions.js b/awx/ui/test/e2e/tests/test-notifications-list-actions.js index 8e126e075d..f87957d3a9 100644 --- a/awx/ui/test/e2e/tests/test-notifications-list-actions.js +++ b/awx/ui/test/e2e/tests/test-notifications-list-actions.js @@ -38,6 +38,24 @@ module.exports = { notifications.waitForElementVisible('div.spinny'); notifications.waitForElementNotVisible('div.spinny'); + const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; + const activityRow = '#activities_table tr td[class*="description-column"] a'; + const toast = 'div[class="Toast-icon"]'; + + notifications.waitForElementNotPresent(toast); + notifications.expect.element(activityStream).visible; + notifications.expect.element(activityStream).enabled; + notifications.click(activityStream); + notifications.waitForElementVisible('div.spinny'); + notifications.waitForElementNotVisible('div.spinny'); + + client + .waitForElementVisible(activityRow) + .click(activityRow); + + notifications.waitForElementVisible('div.spinny'); + notifications.waitForElementNotVisible('div.spinny'); + notifications.expect.element('#notification_template_form').visible; notifications.section.edit.expect.element('@title').visible; notifications.section.edit.expect.element('@title').text.contain(data.notification.name); diff --git a/awx/ui/test/e2e/tests/test-projects-list-actions.js b/awx/ui/test/e2e/tests/test-projects-list-actions.js index 17881ed906..a252160b85 100644 --- a/awx/ui/test/e2e/tests/test-projects-list-actions.js +++ b/awx/ui/test/e2e/tests/test-projects-list-actions.js @@ -39,6 +39,24 @@ module.exports = { projects.waitForElementVisible('div.spinny'); projects.waitForElementNotVisible('div.spinny'); + const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; + const activityRow = '#activities_table tr td[class*="description-column"] a'; + const toast = 'div[class="Toast-icon"]'; + + projects.waitForElementNotPresent(toast); + projects.expect.element(activityStream).visible; + projects.expect.element(activityStream).enabled; + projects.click(activityStream); + projects.waitForElementVisible('div.spinny'); + projects.waitForElementNotVisible('div.spinny'); + + client + .waitForElementVisible(activityRow) + .click(activityRow); + + projects.waitForElementVisible('div.spinny'); + projects.waitForElementNotVisible('div.spinny'); + projects.expect.element('#project_form').visible; projects.section.edit.expect.element('@title').visible; projects.section.edit.expect.element('@title').text.contain(data.project.name); diff --git a/awx/ui/test/e2e/tests/test-templates-list-actions.js b/awx/ui/test/e2e/tests/test-templates-list-actions.js index 93cabeed34..fbebe75d94 100644 --- a/awx/ui/test/e2e/tests/test-templates-list-actions.js +++ b/awx/ui/test/e2e/tests/test-templates-list-actions.js @@ -53,6 +53,24 @@ module.exports = { templates.waitForElementVisible('div.spinny'); templates.waitForElementNotVisible('div.spinny'); + const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; + const activityRow = '#activities_table tr td[class*="description-column"] a'; + const toast = 'div[class="Toast-icon"]'; + + templates.waitForElementNotPresent(toast); + templates.expect.element(activityStream).visible; + templates.expect.element(activityStream).enabled; + templates.click(activityStream); + templates.waitForElementVisible('div.spinny'); + templates.waitForElementNotVisible('div.spinny'); + + client + .waitForElementVisible(activityRow) + .click(activityRow); + + templates.waitForElementVisible('div.spinny'); + templates.waitForElementNotVisible('div.spinny'); + templates.expect.element('#job_template_form').visible; templates.section.addJobTemplate.expect.element('@title').visible; templates.section.addJobTemplate.expect.element('@title').text.contain(data.template.name); @@ -95,6 +113,24 @@ module.exports = { .waitForElementNotVisible('div.spinny') .waitForAngular(); + const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; + const activityRow = '#activities_table tr td[class*="description-column"] a'; + const toast = 'div[class="Toast-icon"]'; + + templates.waitForElementNotPresent(toast); + templates.expect.element(activityStream).visible; + templates.expect.element(activityStream).enabled; + templates.click(activityStream); + templates.waitForElementVisible('div.spinny'); + templates.waitForElementNotVisible('div.spinny'); + + client + .waitForElementVisible(activityRow) + .click(activityRow); + + templates.waitForElementVisible('div.spinny'); + templates.waitForElementNotVisible('div.spinny'); + templates.expect.element('#workflow_job_template_form').visible; templates.section.editWorkflowJobTemplate.expect.element('@title').visible; templates.section.editWorkflowJobTemplate.expect.element('@title').text.contain(data.workflow.name);