mirror of
https://github.com/ansible/awx.git
synced 2026-01-13 19:10:07 -03:30
Merge pull request #502 from jakemcdermott/update_test_config
test config cleanup and tooling updates
This commit is contained in:
commit
1fe9f43690
@ -24,7 +24,7 @@
|
||||
"test": "karma start test/spec/karma.spec.js",
|
||||
"jshint": "grunt jshint:source --no-color",
|
||||
"test:ci": "npm run test -- --single-run --reporter junit,dots --browsers=PhantomJS",
|
||||
"e2e": "./test/e2e/runner.js --config ./test/e2e/nightwatch.conf.js",
|
||||
"e2e": "./test/e2e/runner.js --config ./test/e2e/nightwatch.conf.js --suiteRetries=2",
|
||||
"unit": "karma start test/unit/karma.unit.js",
|
||||
"lint": "eslint .",
|
||||
"dev": "webpack --config build/webpack.development.js --progress",
|
||||
|
||||
@ -7,17 +7,26 @@ docker exec -i tools_awx_1 sh <<-EOSH
|
||||
make --directory=/awx_devel DATA_GEN_PRESET=e2e bulk_data
|
||||
EOSH
|
||||
|
||||
# run with with a live browser
|
||||
npm --prefix awx/ui run e2e -- --env=debug
|
||||
# run all of the tests with a live browser
|
||||
npm --prefix awx/ui run e2e
|
||||
|
||||
# run a subset of the tests
|
||||
npm --prefix awx/ui run e2e -- --filter="test-credentials*"
|
||||
|
||||
# setup a local webdriver cluster for test development
|
||||
docker-compose \
|
||||
-f awx/ui/client/test/e2e/cluster/docker-compose.yml \
|
||||
-f awx/ui/client/test/e2e/cluster/devel-override.yml \
|
||||
up --scale chrome=2 --scale firefox=0
|
||||
-f awx/ui/test/e2e/cluster/docker-compose.yml \
|
||||
-f awx/ui/test/e2e/cluster/docker-compose.devel-override.yml \
|
||||
up --scale chrome=2 hub chrome
|
||||
|
||||
# run headlessly with multiple workers on the cluster
|
||||
AWX_E2E_LAUNCH_URL='https://awx:8043' AWX_E2E_WORKERS=2 npm --prefix awx/ui run e2e
|
||||
# run headlessly on the cluster
|
||||
AWX_E2E_LAUNCH_URL='https://awx:8043' npm --prefix awx/ui run e2e -- --env=cluster
|
||||
|
||||
# run with multiple workers
|
||||
AWX_E2E_LAUNCH_URL='https://awx:8043' AWX_E2E_CLUSTER_WORKERS=2 \
|
||||
npm --prefix awx/ui run e2e -- --env=cluster --filter="test-*"
|
||||
```
|
||||
|
||||
**Note:** Unless overridden in [settings](settings.js), tests will run against `localhost:8043`.
|
||||
**Note:**
|
||||
- Unless overridden in [settings](settings.js), tests will run against `localhost:8043`.
|
||||
- Use `npm --prefix awx/ui run e2e -- --help` to see additional usage information for the test runner.
|
||||
|
||||
@ -3,15 +3,15 @@ import https from 'https';
|
||||
import axios from 'axios';
|
||||
|
||||
import {
|
||||
awxURL,
|
||||
awxUsername,
|
||||
awxPassword
|
||||
AWX_E2E_URL,
|
||||
AWX_E2E_USERNAME,
|
||||
AWX_E2E_PASSWORD
|
||||
} from './settings';
|
||||
|
||||
let authenticated;
|
||||
|
||||
const session = axios.create({
|
||||
baseURL: awxURL,
|
||||
baseURL: AWX_E2E_URL,
|
||||
xsrfHeaderName: 'X-CSRFToken',
|
||||
xsrfCookieName: 'csrftoken',
|
||||
httpsAgent: new https.Agent({
|
||||
@ -24,7 +24,7 @@ const getEndpoint = location => {
|
||||
return location;
|
||||
}
|
||||
|
||||
return `${awxURL}/api/v2${location}`;
|
||||
return `${AWX_E2E_URL}/api/v2${location}`;
|
||||
};
|
||||
|
||||
const authenticate = () => {
|
||||
@ -35,8 +35,8 @@ const authenticate = () => {
|
||||
const uri = getEndpoint('/authtoken/');
|
||||
|
||||
const credentials = {
|
||||
username: awxUsername,
|
||||
password: awxPassword
|
||||
username: AWX_E2E_USERNAME,
|
||||
password: AWX_E2E_PASSWORD
|
||||
};
|
||||
|
||||
return session.post(uri, credentials).then(res => {
|
||||
|
||||
21
awx/ui/test/e2e/cluster/Dockerfile
Normal file
21
awx/ui/test/e2e/cluster/Dockerfile
Normal file
@ -0,0 +1,21 @@
|
||||
FROM centos:7
|
||||
|
||||
RUN yum install -y epel-release
|
||||
|
||||
RUN yum install -y \
|
||||
bzip2 \
|
||||
gcc-c++ \
|
||||
git \
|
||||
make \
|
||||
nodejs \
|
||||
npm
|
||||
|
||||
WORKDIR /awx
|
||||
|
||||
COPY awx/ui/package.json awx/ui/package.json
|
||||
|
||||
RUN npm --prefix=awx/ui install
|
||||
|
||||
COPY awx/ui/test/e2e awx/ui/test/e2e
|
||||
|
||||
ENTRYPOINT ["npm", "--prefix=awx/ui", "run", "e2e", "--", "--env=cluster"]
|
||||
@ -1,13 +0,0 @@
|
||||
---
|
||||
version: '2'
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: tools_default
|
||||
services:
|
||||
chrome:
|
||||
external_links:
|
||||
- 'tools_awx_1:awx'
|
||||
firefox:
|
||||
external_links:
|
||||
- 'tools_awx_1:awx'
|
||||
18
awx/ui/test/e2e/cluster/docker-compose.devel-override.yml
Normal file
18
awx/ui/test/e2e/cluster/docker-compose.devel-override.yml
Normal file
@ -0,0 +1,18 @@
|
||||
---
|
||||
version: '2'
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: tools_default
|
||||
services:
|
||||
chrome:
|
||||
external_links:
|
||||
- tools_awx_1:awx
|
||||
firefox:
|
||||
external_links:
|
||||
- tools_awx_1:awx
|
||||
e2e:
|
||||
external_links:
|
||||
- tools_awx_1:awx
|
||||
environment:
|
||||
AWX_E2E_URL: https://awx:8043
|
||||
@ -4,7 +4,7 @@ services:
|
||||
hub:
|
||||
image: selenium/hub
|
||||
ports:
|
||||
- '4444:4444'
|
||||
- 4444:4444
|
||||
chrome:
|
||||
image: selenium/node-chrome
|
||||
links:
|
||||
@ -21,3 +21,17 @@ services:
|
||||
environment:
|
||||
HUB_PORT_4444_TCP_ADDR: hub
|
||||
HUB_PORT_4444_TCP_PORT: 4444
|
||||
e2e:
|
||||
image: awx_e2e
|
||||
build:
|
||||
context: ../../../../../
|
||||
dockerfile: awx/ui/test/e2e/cluster/Dockerfile
|
||||
depends_on:
|
||||
- chrome
|
||||
links:
|
||||
- hub
|
||||
volumes:
|
||||
- ..:/awx/awx/ui/test/e2e
|
||||
environment:
|
||||
AWX_E2E_CLUSTER_HOST: hub
|
||||
AWX_E2E_CLUSTER_PORT: 4444
|
||||
|
||||
@ -1,6 +1,12 @@
|
||||
import { EventEmitter } from 'events';
|
||||
import { inherits } from 'util';
|
||||
|
||||
import {
|
||||
AWX_E2E_USERNAME,
|
||||
AWX_E2E_PASSWORD,
|
||||
AWX_E2E_TIMEOUT_LONG
|
||||
} from '../settings';
|
||||
|
||||
function Login () {
|
||||
EventEmitter.call(this);
|
||||
}
|
||||
@ -8,14 +14,14 @@ function Login () {
|
||||
inherits(Login, EventEmitter);
|
||||
|
||||
Login.prototype.command = function command (username, password) {
|
||||
username = username || this.api.globals.awxUsername;
|
||||
password = password || this.api.globals.awxPassword;
|
||||
username = username || AWX_E2E_USERNAME;
|
||||
password = password || AWX_E2E_PASSWORD;
|
||||
|
||||
const loginPage = this.api.page.login();
|
||||
|
||||
loginPage
|
||||
.navigate()
|
||||
.waitForElementVisible('@submit', this.api.globals.longWait)
|
||||
.waitForElementVisible('@submit', AWX_E2E_TIMEOUT_LONG)
|
||||
.waitForElementNotVisible('div.spinny')
|
||||
.setValue('@username', username)
|
||||
.setValue('@password', password)
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
import { AWX_E2E_TIMEOUT_ASYNC } from '../settings';
|
||||
|
||||
exports.command = function waitForAngular (callback) {
|
||||
this.timeoutsAsyncScript(this.globals.asyncHookTimeout, () => {
|
||||
this.timeoutsAsyncScript(AWX_E2E_TIMEOUT_ASYNC, () => {
|
||||
this.executeAsync(done => {
|
||||
if (angular && angular.getTestability) {
|
||||
angular.getTestability(document.body).whenStable(done);
|
||||
|
||||
@ -2,46 +2,55 @@ import path from 'path';
|
||||
|
||||
import chromedriver from 'chromedriver';
|
||||
|
||||
import { test_workers } from './settings.js';
|
||||
|
||||
import {
|
||||
AWX_E2E_CLUSTER_HOST,
|
||||
AWX_E2E_CLUSTER_PORT,
|
||||
AWX_E2E_CLUSTER_WORKERS,
|
||||
AWX_E2E_LAUNCH_URL,
|
||||
AWX_E2E_TIMEOUT_ASYNC,
|
||||
AWX_E2E_TIMEOUT_MEDIUM
|
||||
} from './settings';
|
||||
|
||||
const resolve = location => path.resolve(__dirname, location);
|
||||
|
||||
|
||||
module.exports = {
|
||||
src_folders: [resolve('tests')],
|
||||
output_folder: resolve('reports'),
|
||||
custom_commands_path: resolve('commands'),
|
||||
page_objects_path: resolve('objects'),
|
||||
globals_path: resolve('settings.js'),
|
||||
test_settings: {
|
||||
default: {
|
||||
test_workers,
|
||||
skip_testcases_on_fail: false,
|
||||
desiredCapabilities: {
|
||||
browserName: 'chrome'
|
||||
}
|
||||
},
|
||||
smoke: {
|
||||
disable_colors: true,
|
||||
skip_testcases_on_fail: true,
|
||||
filter: 'smoke.js'
|
||||
},
|
||||
debug: {
|
||||
selenium_port: 9515,
|
||||
selenium_host: 'localhost',
|
||||
selenium_port: 9515,
|
||||
default_path_prefix: '',
|
||||
desiredCapabilities: { browserName: 'chrome' },
|
||||
test_workers: { enabled: false },
|
||||
globals: {
|
||||
before(done) {
|
||||
chromedriver.start();
|
||||
launch_url: AWX_E2E_LAUNCH_URL,
|
||||
retryAssertionTimeout: AWX_E2E_TIMEOUT_MEDIUM,
|
||||
waitForConditionTimeout: AWX_E2E_TIMEOUT_MEDIUM,
|
||||
asyncHookTimeout: AWX_E2E_TIMEOUT_ASYNC,
|
||||
before (done) {
|
||||
chromedriver.start(['--port=9515']);
|
||||
done();
|
||||
},
|
||||
after(done) {
|
||||
after (done) {
|
||||
chromedriver.stop();
|
||||
done();
|
||||
}
|
||||
}
|
||||
},
|
||||
// Note: These are environment-specific overrides to the default
|
||||
// test settings defined above.
|
||||
cluster: {
|
||||
selenium_host: AWX_E2E_CLUSTER_HOST,
|
||||
selenium_port: AWX_E2E_CLUSTER_PORT,
|
||||
default_path_prefix: '/wd/hub',
|
||||
test_workers: {
|
||||
enabled: (AWX_E2E_CLUSTER_WORKERS > 0),
|
||||
workers: AWX_E2E_CLUSTER_WORKERS
|
||||
},
|
||||
globals: { before: {}, after: {} }
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@ -1,30 +1,25 @@
|
||||
const AWX_E2E_CLUSTER_HOST = process.env.AWX_E2E_CLUSTER_HOST || 'localhost';
|
||||
const AWX_E2E_CLUSTER_PORT = process.env.AWX_E2E_CLUSTER_PORT || 4444;
|
||||
const AWX_E2E_CLUSTER_WORKERS = process.env.AWX_E2E_CLUSTER_WORKERS || 0;
|
||||
const AWX_E2E_PASSWORD = process.env.AWX_E2E_PASSWORD || 'password';
|
||||
const AWX_E2E_URL = process.env.AWX_E2E_URL || 'https://localhost:8043';
|
||||
const AWX_E2E_USERNAME = process.env.AWX_E2E_USERNAME || 'awx-e2e';
|
||||
const AWX_E2E_PASSWORD = process.env.AWX_E2E_PASSWORD || 'password';
|
||||
const AWX_E2E_SELENIUM_HOST = process.env.AWX_E2E_SELENIUM_HOST || 'localhost';
|
||||
const AWX_E2E_SELENIUM_PORT = process.env.AWX_E2E_SELENIUM_PORT || 4444;
|
||||
const AWX_E2E_LAUNCH_URL = process.env.AWX_E2E_LAUNCH_URL || AWX_E2E_URL;
|
||||
const AWX_E2E_TIMEOUT_SHORT = process.env.AWX_E2E_TIMEOUT_SHORT || 1000;
|
||||
const AWX_E2E_TIMEOUT_MEDIUM = process.env.AWX_E2E_TIMEOUT_MEDIUM || 5000;
|
||||
const AWX_E2E_TIMEOUT_LONG = process.env.AWX_E2E_TIMEOUT_LONG || 10000;
|
||||
const AWX_E2E_TIMEOUT_ASYNC = process.env.AWX_E2E_TIMEOUT_ASYNC || 30000;
|
||||
const AWX_E2E_WORKERS = process.env.AWX_E2E_WORKERS || 0;
|
||||
const AWX_E2E_TIMEOUT_LONG = process.env.AWX_E2E_TIMEOUT_LONG || 10000;
|
||||
const AWX_E2E_TIMEOUT_MEDIUM = process.env.AWX_E2E_TIMEOUT_MEDIUM || 5000;
|
||||
const AWX_E2E_TIMEOUT_SHORT = process.env.AWX_E2E_TIMEOUT_SHORT || 1000;
|
||||
const AWX_E2E_LAUNCH_URL = process.env.AWX_E2E_LAUNCH_URL || AWX_E2E_URL;
|
||||
|
||||
module.exports = {
|
||||
awxURL: AWX_E2E_URL,
|
||||
awxUsername: AWX_E2E_USERNAME,
|
||||
awxPassword: AWX_E2E_PASSWORD,
|
||||
asyncHookTimeout: AWX_E2E_TIMEOUT_ASYNC,
|
||||
longTmeout: AWX_E2E_TIMEOUT_LONG,
|
||||
mediumTimeout: AWX_E2E_TIMEOUT_MEDIUM,
|
||||
retryAssertionTimeout: AWX_E2E_TIMEOUT_MEDIUM,
|
||||
selenium_host: AWX_E2E_SELENIUM_HOST,
|
||||
selenium_port: AWX_E2E_SELENIUM_PORT,
|
||||
launch_url: AWX_E2E_LAUNCH_URL,
|
||||
shortTimeout: AWX_E2E_TIMEOUT_SHORT,
|
||||
waitForConditionTimeout: AWX_E2E_TIMEOUT_MEDIUM,
|
||||
test_workers: {
|
||||
enabled: (AWX_E2E_WORKERS > 0),
|
||||
workers: AWX_E2E_WORKERS
|
||||
}
|
||||
AWX_E2E_CLUSTER_HOST,
|
||||
AWX_E2E_CLUSTER_PORT,
|
||||
AWX_E2E_CLUSTER_WORKERS,
|
||||
AWX_E2E_LAUNCH_URL,
|
||||
AWX_E2E_PASSWORD,
|
||||
AWX_E2E_URL,
|
||||
AWX_E2E_USERNAME,
|
||||
AWX_E2E_TIMEOUT_ASYNC,
|
||||
AWX_E2E_TIMEOUT_LONG,
|
||||
AWX_E2E_TIMEOUT_MEDIUM,
|
||||
AWX_E2E_TIMEOUT_SHORT
|
||||
};
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
import uuid from 'uuid';
|
||||
|
||||
import { AWX_E2E_TIMEOUT_LONG } from '../settings';
|
||||
|
||||
const testID = uuid().substr(0, 8);
|
||||
|
||||
const store = {
|
||||
@ -161,7 +163,7 @@ module.exports = {
|
||||
const row = '#credentials_table tbody tr';
|
||||
|
||||
credentials.section.list.section.search
|
||||
.waitForElementVisible('@input', client.globals.longWait)
|
||||
.waitForElementVisible('@input', AWX_E2E_TIMEOUT_LONG)
|
||||
.setValue('@input', `name:${store.credential.name}`)
|
||||
.click('@searchButton');
|
||||
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
import uuid from 'uuid';
|
||||
|
||||
import { AWX_E2E_TIMEOUT_LONG } from '../settings';
|
||||
|
||||
const testID = uuid().substr(0, 8);
|
||||
|
||||
const store = {
|
||||
@ -123,7 +125,7 @@ module.exports = {
|
||||
const row = '#credentials_table tbody tr';
|
||||
|
||||
credentials.section.list.section.search
|
||||
.waitForElementVisible('@input', client.globals.longWait)
|
||||
.waitForElementVisible('@input', AWX_E2E_TIMEOUT_LONG)
|
||||
.setValue('@input', `name:${store.credential.name}`)
|
||||
.click('@searchButton');
|
||||
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
import uuid from 'uuid';
|
||||
|
||||
import { AWX_E2E_TIMEOUT_LONG } from '../settings';
|
||||
|
||||
const testID = uuid().substr(0, 8);
|
||||
|
||||
const store = {
|
||||
@ -169,7 +171,7 @@ module.exports = {
|
||||
const row = '#credentials_table tbody tr';
|
||||
|
||||
credentials.section.list.section.search
|
||||
.waitForElementVisible('@input', client.globals.longWait)
|
||||
.waitForElementVisible('@input', AWX_E2E_TIMEOUT_LONG)
|
||||
.setValue('@input', `name:${store.credential.name}`)
|
||||
.click('@searchButton');
|
||||
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
import uuid from 'uuid';
|
||||
|
||||
import { AWX_E2E_TIMEOUT_LONG } from '../settings';
|
||||
|
||||
const testID = uuid().substr(0, 8);
|
||||
|
||||
const store = {
|
||||
@ -194,7 +196,7 @@ module.exports = {
|
||||
const row = '#credentials_table tbody tr';
|
||||
|
||||
credentials.section.list.section.search
|
||||
.waitForElementVisible('@input', client.globals.longWait)
|
||||
.waitForElementVisible('@input', AWX_E2E_TIMEOUT_LONG)
|
||||
.setValue('@input', `name:${store.credential.name}`)
|
||||
.click('@searchButton');
|
||||
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
import uuid from 'uuid';
|
||||
|
||||
import { AWX_E2E_TIMEOUT_LONG } from '../settings';
|
||||
|
||||
const testID = uuid().substr(0, 8);
|
||||
|
||||
const store = {
|
||||
@ -163,7 +165,7 @@ module.exports = {
|
||||
const row = '#credentials_table tbody tr';
|
||||
|
||||
credentials.section.list.section.search
|
||||
.waitForElementVisible('@input', client.globals.longWait)
|
||||
.waitForElementVisible('@input', AWX_E2E_TIMEOUT_LONG)
|
||||
.setValue('@input', `name:${store.credential.name}`)
|
||||
.click('@searchButton');
|
||||
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
import uuid from 'uuid';
|
||||
|
||||
import { AWX_E2E_TIMEOUT_LONG } from '../settings';
|
||||
|
||||
const testID = uuid().substr(0, 8);
|
||||
|
||||
const store = {
|
||||
organization: {
|
||||
name: `org-${testID}`
|
||||
@ -123,7 +126,7 @@ module.exports = {
|
||||
const row = '#credentials_table tbody tr';
|
||||
|
||||
credentials.section.list.section.search
|
||||
.waitForElementVisible('@input', client.globals.longWait)
|
||||
.waitForElementVisible('@input', AWX_E2E_TIMEOUT_LONG)
|
||||
.setValue('@input', `name:${store.credential.name}`)
|
||||
.click('@searchButton');
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user