82 lines
2.6 KiB
JavaScript
82 lines
2.6 KiB
JavaScript
|
|
import 'cypress-file-upload';
|
||
|
|
import 'cypress-wait-until';
|
||
|
|
|
||
|
|
Cypress.Commands.add('resetDB', () => {
|
||
|
|
// Although cypress clearly states that a webserver should not be run
|
||
|
|
// from within it, eaglecast is killed, the DB reset, and run again
|
||
|
|
// in the background. If the DB is reset without restarting eaglecast,
|
||
|
|
// the live Postgres connections in the app throw errors because the
|
||
|
|
// schema changes midway.
|
||
|
|
cy.task('resetServer');
|
||
|
|
cy.waitForBackend();
|
||
|
|
});
|
||
|
|
|
||
|
|
Cypress.Commands.add('resetDBBlank', () => {
|
||
|
|
cy.task('resetServer', { blank: true });
|
||
|
|
cy.waitForBackend();
|
||
|
|
});
|
||
|
|
|
||
|
|
// Takes a th class selector of a Buefy table, clicks it sorting the table,
|
||
|
|
// then compares the values of [td.data-id] attri of all the rows in the
|
||
|
|
// table against the given IDs, asserting the expected order of sort.
|
||
|
|
Cypress.Commands.add('sortTable', (theadSelector, ordIDs) => {
|
||
|
|
cy.get(theadSelector).click();
|
||
|
|
cy.wait(250);
|
||
|
|
cy.get('tbody td[data-id]').each(($el, index) => {
|
||
|
|
expect(ordIDs[index]).to.equal(parseInt($el.attr('data-id')));
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
Cypress.Commands.add('loginAndVisit', (url) => {
|
||
|
|
cy.visit(`/admin/login?next=${url}`);
|
||
|
|
|
||
|
|
const username = Cypress.env('EAGLECAST_ADMIN_USER') || 'admin';
|
||
|
|
const password = Cypress.env('EAGLECAST_ADMIN_PASSWORD') || 'eaglecast';
|
||
|
|
|
||
|
|
// Fill the username and passowrd and login.
|
||
|
|
cy.get('input[name=username]').invoke('val', username);
|
||
|
|
cy.get('input[name=password]').invoke('val', password);
|
||
|
|
|
||
|
|
// Submit form.
|
||
|
|
cy.get('button').click();
|
||
|
|
});
|
||
|
|
|
||
|
|
Cypress.Commands.add('clickMenu', (...selectors) => {
|
||
|
|
selectors.forEach((s) => {
|
||
|
|
cy.get(`.menu a[data-cy="${s}"]`).click();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
// https://www.nicknish.co/blog/cypress-targeting-elements-inside-iframes
|
||
|
|
Cypress.Commands.add('iframe', { prevSubject: 'element' }, ($iframe, callback = () => { }) => cy
|
||
|
|
.wrap($iframe)
|
||
|
|
.should((iframe) => expect(iframe.contents().find('body')).to.exist)
|
||
|
|
.then((iframe) => cy.wrap(iframe.contents().find('body')))
|
||
|
|
.within({}, callback));
|
||
|
|
|
||
|
|
Cypress.Commands.add('waitForBackend', () => {
|
||
|
|
// The server restarts after a 500ms delay on settings change.
|
||
|
|
// Wait for the server to go down
|
||
|
|
cy.wait(1000);
|
||
|
|
|
||
|
|
// Keep polling the public /health endpoint until the (new) server
|
||
|
|
// is live. Use fetch() as cy.request() throws on ECONNREFUSED even with failOnStatusCode:false.
|
||
|
|
cy.waitUntil(
|
||
|
|
() => cy.wrap(null, { log: false }).then(() => fetch('/health')
|
||
|
|
.then((res) => res.status === 200)
|
||
|
|
.catch(() => false)),
|
||
|
|
{
|
||
|
|
timeout: 60000,
|
||
|
|
interval: 2000,
|
||
|
|
},
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
Cypress.on('uncaught:exception', (err, runnable) => {
|
||
|
|
if (err.hasOwnProperty('request')) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
return true;
|
||
|
|
});
|