Jonathan Druart
df3acf3d68
From bug bug 34448. 386 // Submit the form, get 500 387 cy.intercept("POST", "/api/v1/erm/agreements", { 388 statusCode: 500, 389 error: "Something went wrong", 390 }); 391 cy.get("#agreements_add").contains("Submit").click(); 392 cy.get("main div[class='dialog alert']").contains( 393 "Something went wrong: SyntaxError: Unexpected end of JSON input" 394 ); This is wrong: we are now showing a JS error (SyntaxError) instead of the expected 500: internal server error! The problem was that a regular 500 does not have anything in the body, and _fetchJSON didn't handle that ( JSON.parse(text) ). If the body of the response does not contain anything we need to get the text from statusText (which contains "Internal Server Error" in case of 500). Test plan: 1. Make sure all cypress tests pass 2. Confirm the above: Raise an exception from a given route (/agreements for instance) and confirm that the error displayed on the interface is correct (ie. not SyntaxError, but "Error: Internal Server Error") For QA: * This change is covered properly in Dialog_spec.ts, no need to redo it in every other test files. * Without the following change in count, we see: "Something went wrong: Error: Error: Internal Server Error" because setError is called twice. We don't need to set the error from count, it has been set from _fetchJSON already. - error => { - setError(error.toString()); - } + error => {} Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
361 lines
13 KiB
TypeScript
361 lines
13 KiB
TypeScript
import { mount } from "@cypress/vue";
|
|
const dayjs = require("dayjs"); /* Cannot use our calendar JS code, it's in an include file (!)
|
|
Also note that moment.js is deprecated */
|
|
|
|
function get_package() {
|
|
return {
|
|
package_id: 1,
|
|
name: "package 1",
|
|
package_type: "complete",
|
|
content_type: "Print",
|
|
package_agreements: [
|
|
{
|
|
agreement: {
|
|
agreement_id: 2,
|
|
description: "agreement description",
|
|
name: "agreement name",
|
|
},
|
|
agreement_id: 2,
|
|
package_id: 1,
|
|
},
|
|
],
|
|
resources_count: 0,
|
|
};
|
|
}
|
|
|
|
describe("Package CRUD operations", () => {
|
|
beforeEach(() => {
|
|
cy.login();
|
|
cy.title().should("eq", "Koha staff interface");
|
|
cy.intercept(
|
|
"GET",
|
|
"/api/v1/erm/config",
|
|
'{"settings":{"ERMModule":"1","ERMProviders":["local"]}}'
|
|
);
|
|
});
|
|
|
|
it("List package", () => {
|
|
// GET package returns 500
|
|
cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
|
|
statusCode: 500,
|
|
});
|
|
cy.visit("/cgi-bin/koha/erm/erm.pl");
|
|
cy.get("#navmenulist").contains("Packages").click();
|
|
cy.get("main div[class='dialog alert']").contains(
|
|
"Something went wrong: Error: Internal Server Error"
|
|
);
|
|
|
|
// GET packages returns empty list
|
|
cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
|
|
statusCode: 200,
|
|
body: [],
|
|
headers: {
|
|
"X-Base-Total-Count": "0",
|
|
"X-Total-Count": "0",
|
|
},
|
|
});
|
|
cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
|
|
cy.get("#packages_list").contains("There are no packages defined");
|
|
|
|
// GET packages returns something
|
|
let erm_package = get_package();
|
|
let packages = [erm_package];
|
|
|
|
cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
|
|
statusCode: 200,
|
|
body: packages,
|
|
headers: {
|
|
"X-Base-Total-Count": "1",
|
|
"X-Total-Count": "1",
|
|
},
|
|
});
|
|
cy.intercept(
|
|
"GET",
|
|
"/api/v1/erm/eholdings/local/packages/*",
|
|
erm_package
|
|
);
|
|
cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
|
|
cy.get("#packages_list").contains("Showing 1 to 1 of 1 entries");
|
|
});
|
|
|
|
it("Add package", () => {
|
|
cy.intercept("GET", "/api/v1/erm/agreements*", []);
|
|
|
|
// Click the button in the toolbar
|
|
cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
|
|
cy.contains("New package").click();
|
|
cy.get("#packages_add h2").contains("New package");
|
|
cy.left_menu_active_item_is("Packages");
|
|
|
|
// Fill in the form for normal attributes
|
|
let erm_package = get_package();
|
|
|
|
cy.get("#packages_add").contains("Submit").click();
|
|
cy.get("input:invalid,textarea:invalid,select:invalid").should(
|
|
"have.length",
|
|
1
|
|
);
|
|
cy.get("#package_name").type(erm_package.name);
|
|
cy.get("#package_type .vs__search").type(
|
|
erm_package.package_type + "{enter}",
|
|
{ force: true }
|
|
);
|
|
cy.get("#package_content_type .vs__search").type(
|
|
erm_package.content_type + "{enter}",
|
|
{ force: true }
|
|
);
|
|
|
|
cy.get("#package_agreements").contains(
|
|
"There are no agreements created yet"
|
|
);
|
|
|
|
// Submit the form, get 500
|
|
cy.intercept("POST", "/api/v1/erm/eholdings/local/packages", {
|
|
statusCode: 500,
|
|
});
|
|
cy.get("#packages_add").contains("Submit").click();
|
|
cy.get("main div[class='dialog alert']").contains(
|
|
"Something went wrong: Error: Internal Server Error"
|
|
);
|
|
|
|
// Submit the form, success!
|
|
cy.intercept("POST", "/api/v1/erm/eholdings/local/packages", {
|
|
statusCode: 201,
|
|
body: erm_package,
|
|
});
|
|
cy.get("#packages_add").contains("Submit").click();
|
|
cy.get("main div[class='dialog message']").contains("Package created");
|
|
|
|
// Add new related agreement
|
|
let related_agreement = erm_package.package_agreements[0];
|
|
cy.intercept("GET", "/api/v1/erm/agreements*", {
|
|
statusCode: 200,
|
|
body: cy.get_agreements_to_relate(),
|
|
});
|
|
cy.visit("/cgi-bin/koha/erm/eholdings/local/packages/add");
|
|
cy.get("#package_agreements").contains("Add new agreement").click();
|
|
cy.get("#package_agreement_0").contains("Agreement 1");
|
|
cy.get("#agreement_id_0 .vs__search").type(
|
|
related_agreement.agreement.name
|
|
);
|
|
cy.get("#agreement_id_0 .vs__dropdown-menu li")
|
|
.eq(0)
|
|
.click({ force: true }); //click first agreement suggestion
|
|
});
|
|
|
|
it("Edit package", () => {
|
|
let erm_package = get_package();
|
|
let packages = [erm_package];
|
|
// Click the 'Edit' button from the list
|
|
cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
|
|
statusCode: 200,
|
|
body: packages,
|
|
headers: {
|
|
"X-Base-Total-Count": "1",
|
|
"X-Total-Count": "1",
|
|
},
|
|
});
|
|
cy.intercept(
|
|
"GET",
|
|
"/api/v1/erm/eholdings/local/packages/*",
|
|
erm_package
|
|
).as("get-package");
|
|
cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
|
|
// Intercept related agreements request after entering agreement edit
|
|
cy.intercept("GET", "/api/v1/erm/agreements*", {
|
|
statusCode: 200,
|
|
body: cy.get_agreements_to_relate(),
|
|
}).as("get-related-agreements");
|
|
cy.get("#packages_list table tbody tr:first").contains("Edit").click();
|
|
cy.wait("@get-package");
|
|
cy.wait(500); // Cypress is too fast! Vue hasn't populated the form yet!
|
|
cy.get("#packages_add h2").contains("Edit package");
|
|
cy.left_menu_active_item_is("Packages");
|
|
|
|
// Form has been correctly filled in
|
|
cy.get("#package_name").should("have.value", erm_package.name);
|
|
cy.get("#package_type .vs__selected").contains("Complete");
|
|
cy.get("#package_content_type .vs__selected").contains("Print");
|
|
|
|
//Test related content
|
|
cy.get("#package_agreement_0 #agreement_id_0 .vs__selected").contains(
|
|
"second agreement name"
|
|
);
|
|
|
|
// Submit the form, get 500
|
|
cy.intercept("PUT", "/api/v1/erm/eholdings/local/packages/*", {
|
|
statusCode: 500,
|
|
});
|
|
cy.get("#packages_add").contains("Submit").click();
|
|
cy.get("main div[class='dialog alert']").contains(
|
|
"Something went wrong: Error: Internal Server Error"
|
|
);
|
|
|
|
// Submit the form, success!
|
|
cy.intercept("PUT", "/api/v1/erm/eholdings/local/packages/*", {
|
|
statusCode: 200,
|
|
body: erm_package,
|
|
});
|
|
cy.get("#packages_add").contains("Submit").click();
|
|
cy.get("main div[class='dialog message']").contains("Package updated");
|
|
});
|
|
|
|
it("Show package", () => {
|
|
let erm_package = get_package();
|
|
let packages = [erm_package];
|
|
// Click the "name" link from the list
|
|
cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
|
|
statusCode: 200,
|
|
body: packages,
|
|
headers: {
|
|
"X-Base-Total-Count": "1",
|
|
"X-Total-Count": "1",
|
|
},
|
|
});
|
|
cy.intercept(
|
|
"GET",
|
|
"/api/v1/erm/eholdings/local/packages/*",
|
|
erm_package
|
|
).as("get-package");
|
|
cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
|
|
let name_link = cy.get(
|
|
"#packages_list table tbody tr:first td:first a"
|
|
);
|
|
name_link.should(
|
|
"have.text",
|
|
erm_package.name + " (#" + erm_package.package_id + ")"
|
|
);
|
|
name_link.click();
|
|
cy.wait("@get-package");
|
|
cy.wait(500); // Cypress is too fast! Vue hasn't populated the form yet!
|
|
cy.get("#packages_show h2").contains(
|
|
"Package #" + erm_package.package_id
|
|
);
|
|
cy.left_menu_active_item_is("Packages");
|
|
|
|
// There are no resources, the table should not be displayed
|
|
cy.contains("Titles (0)");
|
|
cy.get("#title_list_result table").should("not.exist");
|
|
|
|
// List resources
|
|
cy.intercept("GET", "/api/v1/erm/eholdings/local/packages/*", {
|
|
...erm_package,
|
|
resources_count: 1,
|
|
});
|
|
cy.intercept(
|
|
"GET",
|
|
"/api/v1/erm/eholdings/local/packages/1/resources*",
|
|
{
|
|
statusCode: 200,
|
|
body: [
|
|
{
|
|
package_id: erm_package.package_id,
|
|
resource_id: 1,
|
|
title_id: 1,
|
|
title: {
|
|
biblio_id: 42,
|
|
publication_title: "A great title",
|
|
publication_type: "",
|
|
},
|
|
},
|
|
],
|
|
headers: {
|
|
"X-Base-Total-Count": "1",
|
|
"X-Total-Count": "1",
|
|
},
|
|
}
|
|
).as("get-resource");
|
|
cy.visit("/cgi-bin/koha/erm/eholdings/local/packages/1");
|
|
cy.contains("Titles (1)");
|
|
cy.wait("@get-resource");
|
|
cy.wait(500);
|
|
cy.get("#title_list_result table").contains("A great title");
|
|
});
|
|
|
|
it("Delete package", () => {
|
|
let erm_package = get_package();
|
|
let packages = [erm_package];
|
|
|
|
// Click the 'Delete' button from the list
|
|
cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
|
|
statusCode: 200,
|
|
body: packages,
|
|
headers: {
|
|
"X-Base-Total-Count": "1",
|
|
"X-Total-Count": "1",
|
|
},
|
|
});
|
|
cy.intercept(
|
|
"GET",
|
|
"/api/v1/erm/eholdings/local/packages/*",
|
|
erm_package
|
|
);
|
|
cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
|
|
|
|
cy.get("#packages_list table tbody tr:first")
|
|
.contains("Delete")
|
|
.click();
|
|
cy.get(".dialog.alert.confirmation h1").contains("remove this package");
|
|
cy.contains(erm_package.name);
|
|
|
|
// Accept the confirmation dialog, get 500
|
|
cy.intercept("DELETE", "/api/v1/erm/eholdings/local/packages/*", {
|
|
statusCode: 500,
|
|
});
|
|
cy.contains("Yes, delete").click();
|
|
cy.get("main div[class='dialog alert']").contains(
|
|
"Something went wrong: Error: Internal Server Error"
|
|
);
|
|
|
|
// Accept the confirmation dialog, success!
|
|
cy.intercept("DELETE", "/api/v1/erm/eholdings/local/packages/*", {
|
|
statusCode: 204,
|
|
body: null,
|
|
});
|
|
cy.get("#packages_list table tbody tr:first")
|
|
.contains("Delete")
|
|
.click();
|
|
cy.get(".dialog.alert.confirmation h1").contains("remove this package");
|
|
cy.contains("Yes, delete").click();
|
|
cy.get("main div[class='dialog message']")
|
|
.contains("Local package")
|
|
.contains("deleted");
|
|
|
|
// Delete from show
|
|
// Click the "name" link from the list
|
|
cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
|
|
statusCode: 200,
|
|
body: packages,
|
|
headers: {
|
|
"X-Base-Total-Count": "1",
|
|
"X-Total-Count": "1",
|
|
},
|
|
});
|
|
cy.intercept(
|
|
"GET",
|
|
"/api/v1/erm/eholdings/local/packages/*",
|
|
erm_package
|
|
).as("get-package");
|
|
cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
|
|
let name_link = cy.get(
|
|
"#packages_list table tbody tr:first td:first a"
|
|
);
|
|
name_link.should(
|
|
"have.text",
|
|
erm_package.name + " (#" + erm_package.package_id + ")"
|
|
);
|
|
name_link.click();
|
|
cy.wait("@get-package");
|
|
cy.wait(500); // Cypress is too fast! Vue hasn't populated the form yet!
|
|
cy.get("#packages_show h2").contains(
|
|
"Package #" + erm_package.package_id
|
|
);
|
|
|
|
cy.get("#packages_show .action_links .fa-trash").click();
|
|
cy.get(".dialog.alert.confirmation h1").contains("remove this package");
|
|
cy.contains("Yes, delete").click();
|
|
|
|
//Make sure we return to list after deleting from show
|
|
cy.get("#packages_list table tbody tr:first");
|
|
});
|
|
});
|