Compare commits

...

8 Commits

Author SHA1 Message Date
dependabot[bot]
bd8f3530bd Bump the prod-patch-updates group across 1 directory with 4 updates
Bumps the prod-patch-updates group with 4 updates in the /frontend directory: [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query), [formik](https://github.com/jaredpalmer/formik), [react](https://github.com/facebook/react/tree/HEAD/packages/react) and [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom).


Updates `@tanstack/react-query` from 5.90.6 to 5.90.20
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/react-query@5.90.20/packages/react-query)

Updates `formik` from 2.4.6 to 2.4.9
- [Release notes](https://github.com/jaredpalmer/formik/releases)
- [Commits](https://github.com/jaredpalmer/formik/compare/formik@2.4.6...formik@2.4.9)

Updates `react` from 19.2.3 to 19.2.4
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.4/packages/react)

Updates `react-dom` from 19.2.3 to 19.2.4
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.4/packages/react-dom)

---
updated-dependencies:
- dependency-name: "@tanstack/react-query"
  dependency-version: 5.90.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: formik
  dependency-version: 2.4.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: react
  dependency-version: 19.2.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: react-dom
  dependency-version: 19.2.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-27 11:41:03 +00:00
Jamie Curnow
8ea8286cec More cypress fixes 2026-01-27 14:02:23 +10:00
Jamie Curnow
7ca48f876b Ugh cypress changed their exec result format. 2026-01-27 11:55:54 +10:00
Jamie Curnow
7c3c59c79f Fix cypress logger 2026-01-27 11:41:12 +10:00
Jamie Curnow
ef7f444404 Update docker image to match js version 2026-01-27 11:27:21 +10:00
Jamie Curnow
f509e0bdba Missing export 2026-01-27 11:26:54 +10:00
Jamie Curnow
9b7af474bb Cypress ... 2026-01-27 11:22:16 +10:00
Jamie Curnow
28982b8bc2 Updated config files for cypress 2026-01-27 10:46:30 +10:00
14 changed files with 143 additions and 100 deletions

View File

@@ -109,7 +109,7 @@ services:
- "cypress_logs:/test/results" - "cypress_logs:/test/results"
- "./dev/resolv.conf:/etc/resolv.conf:ro" - "./dev/resolv.conf:/etc/resolv.conf:ro"
- "/etc/localtime:/etc/localtime:ro" - "/etc/localtime:/etc/localtime:ro"
command: cypress run --browser chrome --config-file=cypress/config/ci.js command: cypress run --browser chrome --config-file=cypress/config/ci.mjs
networks: networks:
- fulltest - fulltest

View File

@@ -192,7 +192,7 @@ services:
- "../test/results:/results" - "../test/results:/results"
- "./dev/resolv.conf:/etc/resolv.conf:ro" - "./dev/resolv.conf:/etc/resolv.conf:ro"
- "/etc/localtime:/etc/localtime:ro" - "/etc/localtime:/etc/localtime:ro"
command: cypress run --browser chrome --config-file=cypress/config/ci.js command: cypress run --browser chrome --config-file=cypress/config/ci.mjs
networks: networks:
- nginx_proxy_manager - nginx_proxy_manager

View File

@@ -18,20 +18,20 @@
"dependencies": { "dependencies": {
"@tabler/core": "^1.4.0", "@tabler/core": "^1.4.0",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"@tanstack/react-query": "^5.90.6", "@tanstack/react-query": "^5.90.20",
"@tanstack/react-table": "^8.21.3", "@tanstack/react-table": "^8.21.3",
"@uiw/react-textarea-code-editor": "^3.1.1", "@uiw/react-textarea-code-editor": "^3.1.1",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"country-flag-icons": "^1.5.21", "country-flag-icons": "^1.5.21",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"ez-modal-react": "^1.0.5", "ez-modal-react": "^1.0.5",
"formik": "^2.4.6", "formik": "^2.4.9",
"generate-password-browser": "^1.1.0", "generate-password-browser": "^1.1.0",
"humps": "^2.0.1", "humps": "^2.0.1",
"query-string": "^9.3.1", "query-string": "^9.3.1",
"react": "^19.2.3", "react": "^19.2.4",
"react-bootstrap": "^2.10.10", "react-bootstrap": "^2.10.10",
"react-dom": "^19.2.3", "react-dom": "^19.2.4",
"react-intl": "^7.1.14", "react-intl": "^7.1.14",
"react-markdown": "^10.1.0", "react-markdown": "^10.1.0",
"react-router-dom": "^7.9.5", "react-router-dom": "^7.9.5",
@@ -48,7 +48,7 @@
"@testing-library/react": "^16.3.0", "@testing-library/react": "^16.3.0",
"@types/country-flag-icons": "^1.2.2", "@types/country-flag-icons": "^1.2.2",
"@types/humps": "^2.0.6", "@types/humps": "^2.0.6",
"@types/react": "^19.2.7", "@types/react": "^19.2.9",
"@types/react-dom": "^19.2.3", "@types/react-dom": "^19.2.3",
"@types/react-table": "^7.7.20", "@types/react-table": "^7.7.20",
"@vitejs/plugin-react": "^5.1.2", "@vitejs/plugin-react": "^5.1.2",

View File

@@ -825,10 +825,10 @@
resolved "https://registry.npmjs.org/@tabler/icons/-/icons-3.35.0.tgz" resolved "https://registry.npmjs.org/@tabler/icons/-/icons-3.35.0.tgz"
integrity sha512-yYXe+gJ56xlZFiXwV9zVoe3FWCGuZ/D7/G4ZIlDtGxSx5CGQK110wrnT29gUj52kEZoxqF7oURTk97GQxELOFQ== integrity sha512-yYXe+gJ56xlZFiXwV9zVoe3FWCGuZ/D7/G4ZIlDtGxSx5CGQK110wrnT29gUj52kEZoxqF7oURTk97GQxELOFQ==
"@tanstack/query-core@5.90.6": "@tanstack/query-core@5.90.20":
version "5.90.6" version "5.90.20"
resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.6.tgz" resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.90.20.tgz#e12128e39210715d4ce4fb299c33498ac297771e"
integrity sha512-AnZSLF26R8uX+tqb/ivdrwbVdGemdEDm1Q19qM6pry6eOZ6bEYiY7mWhzXT1YDIPTNEVcZ5kYP9nWjoxDLiIVw== integrity sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==
"@tanstack/query-devtools@5.92.0": "@tanstack/query-devtools@5.92.0":
version "5.92.0" version "5.92.0"
@@ -842,12 +842,12 @@
dependencies: dependencies:
"@tanstack/query-devtools" "5.92.0" "@tanstack/query-devtools" "5.92.0"
"@tanstack/react-query@^5.90.6": "@tanstack/react-query@^5.90.20":
version "5.90.6" version "5.90.20"
resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.6.tgz" resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.90.20.tgz#42bb7018bfedc72f216b6e9b4052c919063f350b"
integrity sha512-gB1sljYjcobZKxjPbKSa31FUTyr+ROaBdoH+wSSs9Dk+yDCmMs+TkTV3PybRRVLC7ax7q0erJ9LvRWnMktnRAw== integrity sha512-vXBxa+qeyveVO7OA0jX1z+DeyCA4JKnThKv411jd5SORpBKgkcVnYKCiBgECvADvniBX7tobwBmg01qq9JmMJw==
dependencies: dependencies:
"@tanstack/query-core" "5.90.6" "@tanstack/query-core" "5.90.20"
"@tanstack/react-table@^8.21.3": "@tanstack/react-table@^8.21.3":
version "8.21.3" version "8.21.3"
@@ -1045,10 +1045,10 @@
resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz" resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz"
integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
"@types/react@*", "@types/react@16 || 17 || 18 || 19", "@types/react@>=16.9.11", "@types/react@^19.2.7": "@types/react@*", "@types/react@16 || 17 || 18 || 19", "@types/react@>=16.9.11", "@types/react@^19.2.9":
version "19.2.7" version "19.2.9"
resolved "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz" resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.9.tgz#84ec7669742bb3e7e2e8d6a5258d95ead7764200"
integrity sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg== integrity sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA==
dependencies: dependencies:
csstype "^3.2.2" csstype "^3.2.2"
@@ -1524,10 +1524,10 @@ find-root@^1.1.0:
resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"
integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
formik@^2.4.6: formik@^2.4.9:
version "2.4.6" version "2.4.9"
resolved "https://registry.npmjs.org/formik/-/formik-2.4.6.tgz" resolved "https://registry.yarnpkg.com/formik/-/formik-2.4.9.tgz#7e5b81e9c9e215d0ce2ac8fed808cf7fba0cd204"
integrity sha512-A+2EI7U7aG296q2TLGvNapDNTZp1khVt5Vk0Q/fyfSROss0V/V6+txt2aJnwEos44IxTCW/LYAi/zgWzlevj+g== integrity sha512-5nI94BMnlFDdQRBY4Sz39WkhxajZJ57Fzs8wVbtsQlm5ScKIR1QLYqv/ultBnobObtlUyxpxoLodpixrsf36Og==
dependencies: dependencies:
"@types/hoist-non-react-statics" "^3.3.1" "@types/hoist-non-react-statics" "^3.3.1"
deepmerge "^2.1.1" deepmerge "^2.1.1"
@@ -2418,10 +2418,10 @@ react-bootstrap@^2.10.10:
uncontrollable "^7.2.1" uncontrollable "^7.2.1"
warning "^4.0.3" warning "^4.0.3"
react-dom@^19.2.3: react-dom@^19.2.4:
version "19.2.3" version "19.2.4"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.4.tgz#6fac6bd96f7db477d966c7ec17c1a2b1ad8e6591"
integrity sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg== integrity sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==
dependencies: dependencies:
scheduler "^0.27.0" scheduler "^0.27.0"
@@ -2528,10 +2528,10 @@ react-transition-group@^4.3.0, react-transition-group@^4.4.5:
loose-envify "^1.4.0" loose-envify "^1.4.0"
prop-types "^15.6.2" prop-types "^15.6.2"
react@^19.2.3: react@^19.2.4:
version "19.2.3" version "19.2.4"
resolved "https://registry.npmjs.org/react/-/react-19.2.3.tgz" resolved "https://registry.yarnpkg.com/react/-/react-19.2.4.tgz#438e57baa19b77cb23aab516cf635cd0579ee09a"
integrity sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA== integrity sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==
readdirp@^4.0.1: readdirp@^4.0.1:
version "4.1.2" version "4.1.2"

View File

@@ -1,4 +1,4 @@
FROM cypress/included:14.0.1 FROM cypress/included:15.9.0
# Disable Cypress CLI colors # Disable Cypress CLI colors
ENV FORCE_COLOR=0 ENV FORCE_COLOR=0

View File

@@ -24,10 +24,10 @@ describe('Streams', () => {
// Create a custom cert pair // Create a custom cert pair
cy.exec('mkcert -cert-file=/test/cypress/fixtures/website1.pem -key-file=/test/cypress/fixtures/website1.key.pem website1.example.com').then((result) => { cy.exec('mkcert -cert-file=/test/cypress/fixtures/website1.pem -key-file=/test/cypress/fixtures/website1.key.pem website1.example.com').then((result) => {
expect(result.code).to.eq(0); expect(result.exitCode).to.eq(0);
// Install CA // Install CA
cy.exec('mkcert -install').then((result) => { cy.exec('mkcert -install').then((result) => {
expect(result.code).to.eq(0); expect(result.exitCode).to.eq(0);
}); });
}); });
@@ -56,7 +56,7 @@ describe('Streams', () => {
expect(data).to.have.property('udp_forwarding', false); expect(data).to.have.property('udp_forwarding', false);
cy.exec('curl --noproxy -- http://website1.example.com:1500').then((result) => { cy.exec('curl --noproxy -- http://website1.example.com:1500').then((result) => {
expect(result.code).to.eq(0); expect(result.exitCode).to.eq(0);
expect(result.stdout).to.contain('yay it works'); expect(result.stdout).to.contain('yay it works');
}); });
}); });
@@ -107,7 +107,7 @@ describe('Streams', () => {
expect(data).to.have.property('udp_forwarding', true); expect(data).to.have.property('udp_forwarding', true);
cy.exec('curl --noproxy -- http://website1.example.com:1502').then((result) => { cy.exec('curl --noproxy -- http://website1.example.com:1502').then((result) => {
expect(result.code).to.eq(0); expect(result.exitCode).to.eq(0);
expect(result.stdout).to.contain('yay it works'); expect(result.stdout).to.contain('yay it works');
}); });
}); });
@@ -176,6 +176,7 @@ describe('Streams', () => {
'cert_chain_of_trust', 'cert_chain_of_trust',
'cert_extlifeSpan', 'cert_extlifeSpan',
'cert_revocation', 'cert_revocation',
'engine_problem',
'overall_grade', 'overall_grade',
]; ];

View File

@@ -1,9 +1,9 @@
const logger = require('./logger'); import axios from "axios";
const axios = require('axios').default; import logger from "./logger.mjs";
const BackendApi = function(config, token) { const BackendApi = function (config, token) {
this.config = config; this.config = config;
this.token = token; this.token = token;
this.axios = axios.create({ this.axios = axios.create({
baseURL: config.baseUrl, baseURL: config.baseUrl,
@@ -14,26 +14,24 @@ const BackendApi = function(config, token) {
/** /**
* @param {string} token * @param {string} token
*/ */
BackendApi.prototype.setToken = function(token) { BackendApi.prototype.setToken = function (token) {
this.token = token; this.token = token;
}; };
/** /**
* @param {bool} returnOnError * @param {bool} returnOnError
*/ */
BackendApi.prototype._prepareOptions = function(returnOnError) { BackendApi.prototype._prepareOptions = function (returnOnError) {
let options = { const options = {
headers: { headers: {
Accept: 'application/json' Accept: "application/json",
} },
} };
if (this.token) { if (this.token) {
options.headers.Authorization = 'Bearer ' + this.token; options.headers.Authorization = `Bearer ${this.token}`;
} }
if (returnOnError) { if (returnOnError) {
options.validateStatus = function () { options.validateStatus = () => true;
return true;
}
} }
return options; return options;
}; };
@@ -44,13 +42,30 @@ BackendApi.prototype._prepareOptions = function(returnOnError) {
* @param {function} reject * @param {function} reject
* @param {bool} returnOnError * @param {bool} returnOnError
*/ */
BackendApi.prototype._handleResponse = function(response, resolve, reject, returnOnError) { BackendApi.prototype._handleResponse = (
logger('Response data:', response.data); response,
if (!returnOnError && typeof response.data === 'object' && typeof response.data.error === 'object') { resolve,
if (typeof response.data === 'object' && typeof response.data.error === 'object' && typeof response.data.error.message !== 'undefined') { reject,
reject(new Error(response.data.error.code + ': ' + response.data.error.message)); returnOnError,
) => {
logger("Response data:", response.data);
if (
!returnOnError &&
typeof response.data === "object" &&
typeof response.data.error === "object"
) {
if (
typeof response.data === "object" &&
typeof response.data.error === "object" &&
typeof response.data.error.message !== "undefined"
) {
reject(
new Error(
`${response.data.error.code}: ${response.data.error.message}`,
),
);
} else { } else {
reject(new Error('Error ' + response.status)); reject(new Error(`Error ${response.status}`));
} }
} else { } else {
resolve(response.data); resolve(response.data);
@@ -63,10 +78,10 @@ BackendApi.prototype._handleResponse = function(response, resolve, reject, retur
* @param {function} reject * @param {function} reject
* @param {bool} returnOnError * @param {bool} returnOnError
*/ */
BackendApi.prototype._handleError = function(err, resolve, reject, returnOnError) { BackendApi.prototype._handleError = (err, resolve, reject, returnOnError) => {
logger('Axios Error:', err); logger("Axios Error:", err);
if (returnOnError) { if (returnOnError) {
resolve(typeof err.response.data !== 'undefined' ? err.response.data : err); resolve(typeof err.response.data !== "undefined" ? err.response.data : err);
} else { } else {
reject(err); reject(err);
} }
@@ -84,11 +99,11 @@ BackendApi.prototype.request = function (method, path, returnOnError, data) {
const options = this._prepareOptions(returnOnError); const options = this._prepareOptions(returnOnError);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let opts = { const opts = {
method: method, method: method,
url: path, url: path,
...options ...options,
} };
if (data !== undefined && data !== null) { if (data !== undefined && data !== null) {
opts.data = data; opts.data = data;
} }
@@ -110,16 +125,17 @@ BackendApi.prototype.request = function (method, path, returnOnError, data) {
* @returns {Promise<object>} * @returns {Promise<object>}
*/ */
BackendApi.prototype.postForm = function (path, form, returnOnError) { BackendApi.prototype.postForm = function (path, form, returnOnError) {
logger('POST', this.config.baseUrl + path); logger("POST", this.config.baseUrl + path);
const options = this._prepareOptions(returnOnError); const options = this._prepareOptions(returnOnError);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const opts = { const opts = {
...options, ...options,
...form.getHeaders(), ...form.getHeaders(),
} };
this.axios.post(path, form, opts) this.axios
.post(path, form, opts)
.then((response) => { .then((response) => {
this._handleResponse(response, resolve, reject, returnOnError); this._handleResponse(response, resolve, reject, returnOnError);
}) })
@@ -129,4 +145,4 @@ BackendApi.prototype.postForm = function (path, form, returnOnError) {
}); });
}; };
module.exports = BackendApi; export default BackendApi;

View File

@@ -1,7 +0,0 @@
const _ = require("lodash");
module.exports = function() {
let arr = _.values(arguments);
arr.unshift('[Backend API]');
console.log.apply(null, arr);
};

View File

@@ -0,0 +1,7 @@
const log = (...args) => {
const arr = args;
arr.unshift("[Backend API]");
console.log(...arr);
};
export default log;

View File

@@ -1,13 +1,12 @@
const fs = require('fs'); import fs from "node:fs";
const FormData = require('form-data'); import FormData from "form-data";
const logger = require('./logger'); import Client from "./client.mjs";
const Client = require('./client'); import logger from "./logger.mjs";
module.exports = function (config) { export default (config) => {
logger('Client Ready using', config.baseUrl); logger("Client Ready using", config.baseUrl);
return { return {
/** /**
* @param {object} options * @param {object} options
* @param {string} options.path API path * @param {string} options.path API path
@@ -18,7 +17,7 @@ module.exports = function (config) {
backendApiGet: (options) => { backendApiGet: (options) => {
const api = new Client(config); const api = new Client(config);
api.setToken(options.token); api.setToken(options.token);
return api.request('get', options.path, options.returnOnError || false); return api.request("get", options.path, options.returnOnError || false);
}, },
/** /**
@@ -32,7 +31,12 @@ module.exports = function (config) {
backendApiPost: (options) => { backendApiPost: (options) => {
const api = new Client(config); const api = new Client(config);
api.setToken(options.token); api.setToken(options.token);
return api.request('post', options.path, options.returnOnError || false, options.data); return api.request(
"post",
options.path,
options.returnOnError || false,
options.data,
);
}, },
/** /**
@@ -48,8 +52,11 @@ module.exports = function (config) {
api.setToken(options.token); api.setToken(options.token);
const form = new FormData(); const form = new FormData();
for (let [key, value] of Object.entries(options.files)) { for (const [key, value] of Object.entries(options.files)) {
form.append(key, fs.createReadStream(config.fixturesFolder + '/' + value)); form.append(
key,
fs.createReadStream(`${config.fixturesFolder}/${value}`),
);
} }
return api.postForm(options.path, form, options.returnOnError || false); return api.postForm(options.path, form, options.returnOnError || false);
}, },
@@ -65,7 +72,12 @@ module.exports = function (config) {
backendApiPut: (options) => { backendApiPut: (options) => {
const api = new Client(config); const api = new Client(config);
api.setToken(options.token); api.setToken(options.token);
return api.request('put', options.path, options.returnOnError || false, options.data); return api.request(
"put",
options.path,
options.returnOnError || false,
options.data,
);
}, },
/** /**
@@ -78,7 +90,11 @@ module.exports = function (config) {
backendApiDelete: (options) => { backendApiDelete: (options) => {
const api = new Client(config); const api = new Client(config);
api.setToken(options.token); api.setToken(options.token);
return api.request('delete', options.path, options.returnOnError || false); return api.request(
} "delete",
options.path,
options.returnOnError || false,
);
},
}; };
}; };

View File

@@ -1,20 +1,26 @@
import { SwaggerValidation } from '@jc21/cypress-swagger-validation'; import { SwaggerValidation } from "@jc21/cypress-swagger-validation";
import chalk from 'chalk'; import chalk from "chalk";
import backendTask from "./backendApi/task.mjs";
export default (on, config) => { export default (on, config) => {
// Replace swaggerBase config var wildcard // Replace swaggerBase config var wildcard
if (typeof config.env.swaggerBase !== 'undefined') { if (typeof config.env.swaggerBase !== "undefined") {
config.env.swaggerBase = config.env.swaggerBase.replace('{{baseUrl}}', config.baseUrl); config.env.swaggerBase = config.env.swaggerBase.replace(
"{{baseUrl}}",
config.baseUrl,
);
} }
// Plugin Events // Plugin Events
on('task', SwaggerValidation(config)); on("task", SwaggerValidation(config));
on('task', require('./backendApi/task')(config)); on("task", backendTask(config));
on('task', { on("task", {
log(message) { log(message) {
console.log(`${chalk.cyan.bold('[')}${chalk.blue.bold('LOG')}${chalk.cyan.bold(']')} ${chalk.red.bold(message)}`); console.log(
`${chalk.cyan.bold("[")}${chalk.blue.bold("LOG")}${chalk.cyan.bold("]")} ${chalk.red.bold(message)}`,
);
return null; return null;
} },
}); });
return config; return config;

View File

@@ -35,7 +35,7 @@ Cypress.Commands.add("validateSwaggerFile", (url, savePath) => {
.then((response) => cy.writeFile(savePath, response.body, { log: false })) .then((response) => cy.writeFile(savePath, response.body, { log: false }))
.then(() => cy.exec(`yarn swagger-lint '${savePath}'`, { failOnNonZeroExit: false })) .then(() => cy.exec(`yarn swagger-lint '${savePath}'`, { failOnNonZeroExit: false }))
.then((result) => cy.task('log', `Swagger Vacuum Results:\n${result.stdout || ''}`) .then((result) => cy.task('log', `Swagger Vacuum Results:\n${result.stdout || ''}`)
.then(() => expect(result.code).to.eq(0))); .then(() => expect(result.exitCode).to.eq(0)));
}); });
}); });

View File

@@ -1,4 +1,4 @@
import './commands'; import './commands.mjs';
Cypress.on('uncaught:exception', (/*err, runnable*/) => { Cypress.on('uncaught:exception', (/*err, runnable*/) => {
// returning false here prevents Cypress from // returning false here prevents Cypress from

View File

@@ -4,6 +4,10 @@
"cypress/**/*.js", "cypress/**/*.js",
"cypress/config/dev.mjs", "cypress/config/dev.mjs",
"cypress/config/ci.mjs", "cypress/config/ci.mjs",
"cypress/plugins/index.mjs" "cypress/plugins/index.mjs",
"cypress/plugins/backendApi/task.mjs",
"cypress/plugins/backendApi/logger.mjs",
"cypress/plugins/backendApi/client.mjs",
"cypress/support/commands.mjs"
] ]
} }