2dec484724
* ui: Reduce discovery-chain log spam Currently the only way that the UI can know whether connect is enabled or not is whether we get 500 errors from certain endpoints. One of these endpoints we already use, so aswell as recovering from a 500 error, we also remember that connect is disabled for the rest of the page 'session' (so until the page is refreshed), and make no further http requests to the endpoint for that specific datacenter. This means that log spam is reduced to only 1 log per page refresh/dc instead of 1 log per service navigation. Longer term we'll need some way to dynamically discover whether connect is enabled per datacenter without relying on something that will add error logs to consul.
150 lines
4.3 KiB
JavaScript
150 lines
4.3 KiB
JavaScript
import pages from 'consul-ui/tests/pages';
|
|
import Inflector from 'ember-inflector';
|
|
import utils from '@ember/test-helpers';
|
|
|
|
import api from 'consul-ui/tests/helpers/api';
|
|
|
|
import models from './steps/doubles/model';
|
|
import http from './steps/doubles/http';
|
|
import visit from './steps/interactions/visit';
|
|
import click from './steps/interactions/click';
|
|
import form from './steps/interactions/form';
|
|
import debug from './steps/debug/index';
|
|
import assertHttp from './steps/assertions/http';
|
|
import assertModel from './steps/assertions/model';
|
|
import assertPage from './steps/assertions/page';
|
|
import assertDom from './steps/assertions/dom';
|
|
import assertForm from './steps/assertions/form';
|
|
|
|
// const dont = `( don't| shouldn't| can't)?`;
|
|
|
|
const pluralize = function(str) {
|
|
return Inflector.inflector.pluralize(str);
|
|
};
|
|
const getLastNthRequest = function(getRequests) {
|
|
return function(n, method) {
|
|
let requests = getRequests()
|
|
.slice(0)
|
|
.reverse();
|
|
if (method) {
|
|
requests = requests.filter(function(item) {
|
|
return item.method === method;
|
|
});
|
|
}
|
|
if (n == null) {
|
|
return requests;
|
|
}
|
|
return requests[n];
|
|
};
|
|
};
|
|
const mb = function(path) {
|
|
return function(obj) {
|
|
return (
|
|
path.map(function(prop) {
|
|
obj = obj || {};
|
|
if (isNaN(parseInt(prop))) {
|
|
return (obj = obj[prop]);
|
|
} else {
|
|
return (obj = obj.objectAt(parseInt(prop)));
|
|
}
|
|
}) && obj
|
|
);
|
|
};
|
|
};
|
|
export default function(assert, library) {
|
|
const pauseUntil = function(run, message = 'assertion timed out') {
|
|
return new Promise(function(r) {
|
|
let count = 0;
|
|
let resolved = false;
|
|
const retry = function() {
|
|
return Promise.resolve();
|
|
};
|
|
const reject = function() {
|
|
return Promise.reject();
|
|
};
|
|
const resolve = function(str = message) {
|
|
resolved = true;
|
|
assert.ok(resolved, str);
|
|
r();
|
|
return Promise.resolve();
|
|
};
|
|
(function tick() {
|
|
run(resolve, reject, retry).then(function() {
|
|
if (!resolved) {
|
|
setTimeout(function() {
|
|
if (++count >= 50) {
|
|
assert.ok(false, message);
|
|
reject();
|
|
return;
|
|
}
|
|
tick();
|
|
}, 100);
|
|
}
|
|
});
|
|
})();
|
|
});
|
|
};
|
|
const lastNthRequest = getLastNthRequest(() => api.server.history);
|
|
const create = function(number, name, value) {
|
|
// don't return a promise here as
|
|
// I don't need it to wait
|
|
api.server.createList(name, number, value);
|
|
};
|
|
const respondWith = function(url, data) {
|
|
api.server.respondWith(url.split('?')[0], data);
|
|
};
|
|
const setCookie = function(key, value) {
|
|
api.server.setCookie(key, value);
|
|
};
|
|
let currentPage;
|
|
const getCurrentPage = function() {
|
|
return currentPage;
|
|
};
|
|
const setCurrentPage = function(page) {
|
|
api.server.clearHistory();
|
|
currentPage = page;
|
|
return page;
|
|
};
|
|
|
|
const find = function(path) {
|
|
const page = getCurrentPage();
|
|
const parts = path.split('.');
|
|
const last = parts.pop();
|
|
let obj;
|
|
let parent = mb(parts)(page) || page;
|
|
if (typeof parent.objectAt === 'function') {
|
|
parent = parent.objectAt(0);
|
|
}
|
|
obj = parent[last];
|
|
if (typeof obj === 'undefined') {
|
|
throw new Error(`PageObject not found: The '${path}' object doesn't exist`);
|
|
}
|
|
if (typeof obj === 'function') {
|
|
obj = obj.bind(parent);
|
|
}
|
|
return obj;
|
|
};
|
|
const clipboard = function() {
|
|
return window.localStorage.getItem('clipboard');
|
|
};
|
|
models(library, create);
|
|
http(library, respondWith, setCookie);
|
|
visit(library, pages, setCurrentPage);
|
|
click(library, find, utils.click);
|
|
form(library, find, utils.fillIn, utils.triggerKeyEvent, getCurrentPage);
|
|
debug(library, assert, utils.currentURL);
|
|
assertHttp(library, assert, lastNthRequest);
|
|
assertModel(library, assert, find, getCurrentPage, pauseUntil, pluralize);
|
|
assertPage(library, assert, find, getCurrentPage);
|
|
assertDom(library, assert, pauseUntil, utils.find, utils.currentURL, clipboard);
|
|
assertForm(library, assert, find, getCurrentPage);
|
|
|
|
return library.given(["I'm using a legacy token"], function(number, model, data) {
|
|
window.localStorage['consul:token'] = JSON.stringify({
|
|
Namespace: 'default',
|
|
AccessorID: null,
|
|
SecretID: 'id',
|
|
});
|
|
});
|
|
}
|