mirror of
https://github.com/status-im/consul.git
synced 2025-01-09 13:26:07 +00:00
03a1a86dfe
* v3.20.2...v3.24.0 * Fix handle undefined outlet in route component * Don't use template helper for optional modal.open Using the optional-helper here will trigger a computation in the same runloop error. This is because we are setting the `modal`-property when the `<Ref>` component gets rendered which will update the `this.modal`-property which will then recompute the `optional`-helper leading to this error. Instead we will create an action that will call the `open`-method on the modal when it is defined. This gets rid of the double computation error as we will not access the modal property twice in the same runloop when `modal` is getting set. * Fix - fn needs to be passed function tab-nav We create functions in the component file instead so that fn-helper stops complaining about the need to pass a function. * Update ember-exam to 6.1 version "Makes it compatible" with ember-qunit v5 * scheduleOnce setMaxHeight paged-collection We need to schedule to get around double-computation error. * Fix - model.data is removed from ember-data This has been private API all along - we need to work around the removal. Reference: https://github.com/emberjs/data/pull/7338/files#diff-9a8746fc5c86fd57e6122f00fef3155f76f0f3003a24b53fb7c4621d95dcd9bfL1310 * Fix `propContains` instead of `deepEqual` policy Recent model.data works differently than iterating attributes. We use `propContains` instead of `deepEqual`. We are only interested in the properties we assert against and match the previous behavior with this change. * Fix `propContains` instead of `deepEqual` token * Better handling single-records repo test-helper `model.data` has been removed we need to handle proxies and model instances differently. * Fix remaining repository tests with propContains We don't want to match entire objects - we don't care about properties we haven't defined in the assertion. * Don't use template helper for optional modal.open Using a template helper will give us a recomputation error - we work around it by creating an explicit action on the component instead. * Await `I $verb the $pageObject object` step * Fix no more customization ember-can No need to customize, the helper handles destruction fine on its own. * Fix - don't pass `optional` functions to fn We will declare the functions on the component instead. This gives us the same behavior but no error from `fn`, which expects a function to be passed. * Fix - handle `undefined` state on validate modifier StateChart can yield out an undefined `state` we need to handle that in the validate modifier * Fix linting errors tests directory * Warn / turn off new ember linting issues We will tackle them one by one and don't want to autofix issues that could be dangerous to auto-fix. * Auto-fix linting issues * More linting configuration * Fix remaining linting issues * Fix linting issues new files after rebase * ui: Remove ember-cli-uglify config now we are using terser (#14574) Co-authored-by: John Cowen <johncowen@users.noreply.github.com>
222 lines
7.6 KiB
JavaScript
222 lines
7.6 KiB
JavaScript
/*eslint no-console: "off", ember/no-jquery: "off", ember/no-global-jquery: "off"*/
|
|
|
|
const elementNotFound = 'Element not found';
|
|
// this error comes from our pageObject `find `function
|
|
const pageObjectNotFound = 'PageObject not found';
|
|
const cannotDestructure = "Cannot destructure property 'context'";
|
|
const cannotReadContext = "Cannot read property 'context' of undefined";
|
|
|
|
// checking for existence of pageObjects is pretty difficult
|
|
// errors are thrown but we should check to make sure its the error that we
|
|
// want and not another real error
|
|
// to make things more difficult depending on how you reference the pageObject
|
|
// an error with a different message is thrown for example:
|
|
|
|
// pageObject[thing]() will give you a Element not found error
|
|
|
|
// whereas:
|
|
|
|
// const obj = pageObject[thing]; obj() will give you a 'cannot destructure error'
|
|
// and in CI it will give you a 'cannot read property' error
|
|
|
|
// the difference in CI could be a difference due to headless vs headed browser
|
|
// or difference in Chrome/browser versions
|
|
|
|
// ideally we wouldn't be checking on error messages at all, but we want to make sure
|
|
// that real errors are picked up by the tests, so if this gets unmanageable at any point
|
|
// look at checking for the instance of e being TypeError or similar
|
|
const isExpectedError = function (e) {
|
|
return [pageObjectNotFound, elementNotFound, cannotDestructure, cannotReadContext].some((item) =>
|
|
e.message.startsWith(item)
|
|
);
|
|
};
|
|
const dont = `( don't| shouldn't| can't)?`;
|
|
export default function (scenario, assert, find, currentPage, $) {
|
|
scenario
|
|
.then(
|
|
[`I${dont} $verb the $pageObject object`],
|
|
async function (negative, verb, element, next) {
|
|
let res = element[verb];
|
|
if (typeof res === 'function') {
|
|
res = res.call(element);
|
|
}
|
|
assert[negative ? 'notOk' : 'ok'](res, this.step);
|
|
|
|
await res;
|
|
|
|
setTimeout(() => next());
|
|
}
|
|
)
|
|
.then(
|
|
[
|
|
`I${dont} $verb the $pageObject object with value "$value"`,
|
|
`I${dont} $verb the $pageObject object from $yaml`,
|
|
],
|
|
function (negative, verb, element, data, next) {
|
|
assert[negative ? 'notOk' : 'ok'](element[verb](data));
|
|
setTimeout(() => next());
|
|
}
|
|
)
|
|
.then(`the $pageObject object is(n't)? $state`, function (element, negative, state, next) {
|
|
assert[negative ? 'notOk' : 'ok'](element[state]);
|
|
setTimeout(() => next());
|
|
})
|
|
.then(`I${dont} see $num of the $pageObject objects`, function (negative, num, element, next) {
|
|
assert[negative ? 'notEqual' : 'equal'](
|
|
element.length,
|
|
num,
|
|
`Expected to${negative ? ' not' : ''} see ${num} ${element.key}`
|
|
);
|
|
setTimeout(() => next());
|
|
})
|
|
.then(['I see $num of the $component object'], function (num, component) {
|
|
assert.equal(
|
|
currentPage()[component].length,
|
|
num,
|
|
`Expected to see ${num} items in the ${component} object`
|
|
);
|
|
})
|
|
.then(
|
|
'I see $property on the $component like yaml\n$yaml',
|
|
function (property, component, yaml) {
|
|
const _component = currentPage()[component];
|
|
const iterator = new Array(_component.length).fill(true);
|
|
// this will catch if we get aren't managing to select a component
|
|
assert.ok(iterator.length > 0);
|
|
iterator.forEach(function (item, i, arr) {
|
|
const actual =
|
|
typeof _component.objectAt(i)[property] === 'undefined'
|
|
? null
|
|
: _component.objectAt(i)[property];
|
|
|
|
// anything coming from the DOM is going to be text/strings
|
|
// if the yaml has numbers, cast them to strings
|
|
// TODO: This would get problematic for deeper objects
|
|
// will have to look to do this recursively
|
|
const expected = typeof yaml[i] === 'number' ? yaml[i].toString() : yaml[i];
|
|
|
|
assert.deepEqual(
|
|
actual,
|
|
expected,
|
|
`Expected to see ${property} on ${component}[${i}] as ${JSON.stringify(
|
|
expected
|
|
)}, was ${JSON.stringify(actual)}`
|
|
);
|
|
});
|
|
}
|
|
)
|
|
.then(
|
|
'I see $property on the $component vertically like yaml\n$yaml',
|
|
function (property, component, yaml) {
|
|
const _component = find(component);
|
|
const iterator = new Array(_component.length).fill(true);
|
|
assert.ok(iterator.length > 0);
|
|
|
|
const items = _component.toArray().sort((a, b) => {
|
|
return (
|
|
$(a.scope).get(0).getBoundingClientRect().top -
|
|
$(b.scope).get(0).getBoundingClientRect().top
|
|
);
|
|
});
|
|
|
|
iterator.forEach(function (item, i, arr) {
|
|
const actual = typeof items[i][property] === 'undefined' ? null : items[i][property];
|
|
|
|
const expected = typeof yaml[i] === 'number' ? yaml[i].toString() : yaml[i];
|
|
|
|
assert.deepEqual(
|
|
actual,
|
|
expected,
|
|
`Expected to see ${property} on ${component}[${i}] as ${JSON.stringify(
|
|
expected
|
|
)}, was ${JSON.stringify(actual)}`
|
|
);
|
|
});
|
|
}
|
|
)
|
|
.then(
|
|
[`I${dont} see $property`, `I${dont} see $property on the $component`],
|
|
function (negative, property, component) {
|
|
const isNegative = typeof negative !== 'undefined';
|
|
let message = `Expected to${isNegative ? ' not' : ''} see ${property}`;
|
|
let target;
|
|
try {
|
|
if (typeof component === 'string') {
|
|
property = `${component}.${property}`;
|
|
message = `${message} on ${component}`;
|
|
}
|
|
target = find(property);
|
|
} catch (e) {
|
|
if (isNegative) {
|
|
if (isExpectedError(e)) {
|
|
assert.ok(true, message);
|
|
return Promise.resolve();
|
|
} else {
|
|
console.error(e);
|
|
throw e;
|
|
}
|
|
} else {
|
|
console.error(e);
|
|
throw e;
|
|
}
|
|
}
|
|
if (typeof target === 'function') {
|
|
if (isNegative) {
|
|
assert.throws(
|
|
function () {
|
|
target();
|
|
},
|
|
function (e) {
|
|
return isExpectedError(e);
|
|
},
|
|
message
|
|
);
|
|
return Promise.resolve();
|
|
} else {
|
|
try {
|
|
target = target();
|
|
} catch (e) {
|
|
console.error(e);
|
|
throw new Error(`The '${property}' page object doesn't exist`);
|
|
}
|
|
}
|
|
}
|
|
assert[isNegative ? 'notOk' : 'ok'](target, message);
|
|
|
|
// always return promise and handle the fact that `target` could be async
|
|
return Promise.resolve().then(() => target);
|
|
}
|
|
)
|
|
.then(
|
|
[
|
|
`I see $property on the $component (contains|like) "$value"`,
|
|
`I see $property on the $component (contains|like) '$value'`,
|
|
],
|
|
function (property, component, containsLike, value) {
|
|
let target;
|
|
|
|
if (typeof component === 'string') {
|
|
property = `${component}.${property}`;
|
|
}
|
|
target = find(property);
|
|
|
|
if (containsLike === 'like') {
|
|
assert.equal(
|
|
target,
|
|
value,
|
|
`Expected to see ${property} on ${component} as ${value}, was ${target}`
|
|
);
|
|
} else {
|
|
assert.ok(
|
|
target.indexOf(value) !== -1,
|
|
`Expected to see ${property} on ${component} within ${value}, was ${target}`
|
|
);
|
|
}
|
|
}
|
|
)
|
|
.then(['I see $property like "$value"'], function (property, value) {
|
|
const target = currentPage()[property];
|
|
assert.equal(target, value, `Expected to see ${property} as ${value}, was ${target}`);
|
|
});
|
|
}
|