1 import { mount } from "@cypress/vue";
2 const dayjs = require("dayjs"); /* Cannot use our calendar JS code, it's in an include file (!)
3 Also note that moment.js is deprecated */
6 today_iso: dayjs().format("YYYY-MM-DD"),
7 today_us: dayjs().format("MM/DD/YYYY"),
8 tomorrow_iso: dayjs().add(1, "day").format("YYYY-MM-DD"),
9 tomorrow_us: dayjs().add(1, "day").format("MM/DD/YYYY"),
11 function get_agreement() {
15 description: "my first agreement",
24 started_on: dates["today_iso"],
25 ended_on: dates["tomorrow_iso"],
26 cancellation_deadline: null,
30 started_on: dates["today_iso"],
32 cancellation_deadline: dates["tomorrow_iso"],
33 notes: "this is a note",
37 agreement_licenses: [],
38 agreement_relationships: [],
39 agreement_packages: [],
44 describe("Agreement CRUD operations", () => {
46 cy.login("koha", "koha");
47 cy.title().should("eq", "Koha staff interface");
50 it("List agreements", () => {
51 // GET agreements returns 500
52 cy.intercept("GET", "/api/v1/erm/agreements", {
54 error: "Something went wrong",
56 cy.visit("/cgi-bin/koha/erm/erm.pl");
57 cy.get("#navmenulist").contains("Agreements").click();
58 cy.get("main div[class='dialog alert']").contains(
59 /Something went wrong/
62 // GET agreements returns empty list
63 cy.intercept("GET", "/api/v1/erm/agreements*", []);
64 cy.visit("/cgi-bin/koha/erm/agreements");
65 cy.get("#agreements_list").contains("There are no agreements defined");
67 // GET agreements returns something
68 let agreement = get_agreement();
69 let agreements = [agreement];
71 cy.intercept("GET", "/api/v1/erm/agreements*", {
75 "X-Base-Total-Count": "1",
79 cy.intercept("GET", "/api/v1/erm/agreements/*", agreement);
80 cy.visit("/cgi-bin/koha/erm/agreements");
81 cy.get("#agreements_list").contains("Showing 1 to 1 of 1 entries");
84 it("Add agreement", () => {
85 // No agreement, no license yet
86 cy.intercept("GET", "/api/v1/erm/agreements", {
90 cy.intercept("GET", "/api/v1/erm/licenses", {
95 // Click the button in the toolbar
96 cy.visit("/cgi-bin/koha/erm/agreements");
97 cy.contains("New agreement").click();
98 cy.get("#agreements_add h2").contains("New agreement");
100 // Fill in the form for normal attributes
101 let agreement = get_agreement();
103 cy.get("#agreements_add").contains("Submit").click();
104 cy.get("input:invalid,textarea:invalid,select:invalid").should(
108 cy.get("#agreement_name").type(agreement.name);
109 cy.get("#agreement_description").type(agreement.description);
110 cy.get("#agreements_add").contains("Submit").click();
111 cy.get("input:invalid,textarea:invalid,select:invalid").should(
114 ); // name, description, status
115 cy.get("#agreement_status .vs__search").type(
116 agreement.status + "{enter}",
120 cy.contains("Add new period").click();
121 cy.get("#agreements_add").contains("Submit").click();
122 cy.get("input:invalid,textarea:invalid,select:invalid").should(
128 cy.contains("Add new period").click();
129 cy.contains("Add new period").click();
130 cy.get("#agreement_periods > fieldset").should("have.length", 3);
132 cy.get("#agreement_period_1").contains("Remove this period").click();
134 cy.get("#agreement_periods > fieldset").should("have.length", 2);
135 cy.get("#agreement_period_0");
136 cy.get("#agreement_period_1");
138 // Selecting the flatpickr values is a bit tedious here...
139 // We have 3 date inputs per period
140 cy.get("#ended_on_0+input").click();
141 // Second flatpickr => ended_on for the first period
142 cy.get(".flatpickr-calendar")
145 .click({ force: true }); // select today. No idea why we should force, but there is a random failure otherwise
147 cy.get("#started_on_0+input").click();
148 cy.get(".flatpickr-calendar")
152 .click(); // select tomorrow
154 cy.get("#ended_on_0").should("have.value", ""); // Has been reset correctly
156 cy.get("#started_on_0+input").click();
157 cy.get(".flatpickr-calendar").eq(0).find("span.today").click(); // select today
158 cy.get("#ended_on_0+input").click({ force: true }); // No idea why we should force, but there is a random failure otherwise
159 cy.get(".flatpickr-calendar")
163 .click(); // select tomorrow
166 cy.get("#started_on_1+input").click({ force: true });
167 cy.get(".flatpickr-calendar").eq(3).find("span.today").click(); // select today
168 cy.get("#cancellation_deadline_1+input").click();
169 cy.get(".flatpickr-calendar")
173 .click(); // select tomorrow
174 cy.get("#notes_1").type("this is a note");
176 // TODO Add a new user
177 // How to test a new window with cypresS?
178 //cy.contains("Add new user").click();
179 //cy.contains("Select user").click();
181 cy.get("#agreement_licenses").contains(
182 "There are no licenses created yet"
184 cy.get("#agreement_relationships").contains(
185 "There are no other agreements created yet"
188 cy.get("#agreement_documents").contains("Add new document");
189 // TODO Test document upload
191 // Submit the form, get 500
192 cy.intercept("POST", "/api/v1/erm/agreements", {
194 error: "Something went wrong",
196 cy.get("#agreements_add").contains("Submit").click();
197 cy.get("main div[class='dialog alert']").contains(
198 "Something went wrong: Internal Server Error"
201 // Submit the form, success!
202 cy.intercept("POST", "/api/v1/erm/agreements", {
206 cy.get("#agreements_add").contains("Submit").click();
207 cy.get("main div[class='dialog message']").contains(
211 cy.intercept("GET", "/api/v1/erm/agreements", {
213 body: [{ agreement_id: 1, description: "an existing agreement" }],
215 cy.intercept("GET", "/api/v1/erm/licenses", {
217 body: [{ license_id: 1, description: "a license" }],
219 cy.visit("/cgi-bin/koha/erm/agreements/add");
220 cy.get("#agreement_licenses").contains(
223 cy.get("#agreement_relationships").contains(
224 "Add new related agreement"
229 it("Edit agreement", () => {
230 let agreement = get_agreement();
231 let agreements = [agreement];
232 // Click the 'Edit' button from the list
233 cy.intercept("GET", "/api/v1/erm/agreements*", {
237 "X-Base-Total-Count": "1",
238 "X-Total-Count": "1",
241 cy.intercept("GET", "/api/v1/erm/agreements/*", agreement).as(
244 cy.visit("/cgi-bin/koha/erm/agreements");
245 cy.get("#agreements_list table tbody tr:first")
248 cy.wait("@get-agreement");
249 cy.wait(500); // Cypress is too fast! Vue hasn't populated the form yet!
250 cy.get("#agreements_add h2").contains("Edit agreement");
252 // Form has been correctly filled in
253 cy.get("#agreement_name").should("have.value", agreements[0].name);
254 cy.get("#agreement_description").should(
256 agreements[0].description
258 cy.get("#agreement_status .vs__selected").contains("Active");
259 cy.get("#agreement_is_perpetual_no").should("be.checked");
260 cy.get("#started_on_0").invoke("val").should("eq", dates["today_iso"]);
261 cy.get("#ended_on_0").invoke("val").should("eq", dates["tomorrow_iso"]);
262 cy.get("#cancellation_deadline_0").invoke("val").should("eq", "");
263 cy.get("#notes_0").should("have.value", "");
264 cy.get("#started_on_1").invoke("val").should("eq", dates["today_iso"]);
265 cy.get("#ended_on_1").invoke("val").should("eq", "");
266 cy.get("#cancellation_deadline_1")
268 .should("eq", dates["tomorrow_iso"]);
269 cy.get("#notes_1").should("have.value", "this is a note");
271 // Submit the form, get 500
272 cy.intercept("PUT", "/api/v1/erm/agreements/*", {
274 error: "Something went wrong",
276 cy.get("#agreements_add").contains("Submit").click();
277 cy.get("main div[class='dialog alert']").contains(
278 "Something went wrong: Internal Server Error"
281 // Submit the form, success!
282 cy.intercept("PUT", "/api/v1/erm/agreements/*", {
286 cy.get("#agreements_add").contains("Submit").click();
287 cy.get("main div[class='dialog message']").contains(
292 it("Show agreement", () => {
293 let agreement = get_agreement();
294 let agreements = [agreement];
295 // Click the "name" link from the list
296 cy.intercept("GET", "/api/v1/erm/agreements*", {
300 "X-Base-Total-Count": "1",
301 "X-Total-Count": "1",
304 cy.intercept("GET", "/api/v1/erm/agreements/*", agreement).as(
307 cy.visit("/cgi-bin/koha/erm/agreements");
308 let name_link = cy.get(
309 "#agreements_list table tbody tr:first td:first a"
313 agreement.name + " (#" + agreement.agreement_id + ")"
316 cy.wait("@get-agreement");
317 cy.wait(500); // Cypress is too fast! Vue hasn't populated the form yet!
318 cy.get("#agreements_show h2").contains(
319 "Agreement #" + agreement.agreement_id
322 // TODO There are more to test here:
323 // Dates correctly formatted
325 // AV's libs displayed
326 // Tables for periods and users
328 it("Delete agreement", () => {
329 let agreement = get_agreement();
330 let agreements = [agreement];
332 // Click the 'Delete' button from the list
333 cy.intercept("GET", "/api/v1/erm/agreements*", {
337 "X-Base-Total-Count": "1",
338 "X-Total-Count": "1",
341 cy.intercept("GET", "/api/v1/erm/agreements/*", agreement);
342 cy.visit("/cgi-bin/koha/erm/agreements");
344 cy.get("#agreements_list table tbody tr:first")
347 cy.get("#agreements_confirm_delete h2").contains("Delete agreement");
348 cy.contains("Agreement name: " + agreement.name);
350 // Submit the form, get 500
351 cy.intercept("DELETE", "/api/v1/erm/agreements/*", {
353 error: "Something went wrong",
355 cy.contains("Yes, delete").click();
356 cy.get("main div[class='dialog alert']").contains(
357 "Something went wrong: Internal Server Error"
360 // Submit the form, success!
361 cy.intercept("DELETE", "/api/v1/erm/agreements/*", {
365 cy.contains("Yes, delete").click();
366 cy.get("main div[class='dialog message']").contains(