Bug 32030: Fix Cypress tests - Fix '.'
[srvgit] / cypress / integration / Packages_spec.ts
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 */
4
5 function get_package() {
6     return {
7         package_id: 1,
8         name: "package 1",
9         package_type: "complete",
10         content_type: "Print",
11         package_agreements: [],
12         resources_count: 0,
13     };
14 }
15
16 describe("Package CRUD operations", () => {
17     beforeEach(() => {
18         cy.login("koha", "koha");
19         cy.title().should("eq", "Koha staff interface");
20     });
21
22     it("List package", () => {
23         // GET package returns 500
24         cy.intercept("GET", "/api/v1/erm/eholdings/local/packages", {
25             statusCode: 500,
26             error: "Something went wrong",
27         });
28         cy.visit("/cgi-bin/koha/erm/erm.pl");
29         cy.get("#navmenulist").contains("Packages").click();
30         cy.get("main div[class='dialog alert']").contains(
31             /Something went wrong/
32         );
33
34         // GET packages returns empty list
35         cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", []);
36         cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
37         cy.get("#packages_list").contains("There are no packages defined");
38
39         // GET packages returns something
40         let erm_package = get_package();
41         let packages = [erm_package];
42
43         cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
44             statusCode: 200,
45             body: packages,
46             headers: {
47                 "X-Base-Total-Count": "1",
48                 "X-Total-Count": "1",
49             },
50         });
51         cy.intercept(
52             "GET",
53             "/api/v1/erm/eholdings/local/packages/*",
54             erm_package
55         );
56         cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
57         cy.get("#packages_list").contains("Showing 1 to 1 of 1 entries");
58     });
59
60     it("Add package", () => {
61         // Click the button in the toolbar
62         cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
63         cy.contains("New package").click();
64         cy.get("#packages_add h2").contains("New package");
65
66         // Fill in the form for normal attributes
67         let erm_package = get_package();
68
69         cy.get("#packages_add").contains("Submit").click();
70         cy.get("input:invalid,textarea:invalid,select:invalid").should(
71             "have.length",
72             1
73         );
74         cy.get("#package_name").type(erm_package.name);
75         cy.get("#package_type .vs__search").type(
76             erm_package.package_type + "{enter}",
77             { force: true }
78         );
79         cy.get("#package_content_type .vs__search").type(
80             erm_package.content_type + "{enter}",
81             { force: true }
82         );
83
84         cy.get("#package_agreements").contains(
85             "There are no agreements created yet"
86         );
87
88         // Submit the form, get 500
89         cy.intercept("POST", "/api/v1/erm/eholdings/local/packages", {
90             statusCode: 500,
91             error: "Something went wrong",
92         });
93         cy.get("#packages_add").contains("Submit").click();
94         cy.get("main div[class='dialog alert']").contains(
95             "Something went wrong: Internal Server Error"
96         );
97
98         // Submit the form, success!
99         cy.intercept("POST", "/api/v1/erm/eholdings/local/packages", {
100             statusCode: 201,
101             body: erm_package,
102         });
103         cy.get("#packages_add").contains("Submit").click();
104         cy.get("main div[class='dialog message']").contains("Package created");
105
106         // Link with an agreement
107         cy.intercept("GET", "/api/v1/erm/agreements", {
108             statusCode: 200,
109             body: [{ package_id: 1, description: "an agreement" }],
110         });
111         cy.visit("/cgi-bin/koha/erm/eholdings/local/packages/add");
112         cy.get("#package_agreements").contains("Add new agreement");
113     });
114
115     it("Edit package", () => {
116         let erm_package = get_package();
117         let packages = [erm_package];
118         // Click the 'Edit' button from the list
119         cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
120             statusCode: 200,
121             body: packages,
122             headers: {
123                 "X-Base-Total-Count": "1",
124                 "X-Total-Count": "1",
125             },
126         });
127         cy.intercept(
128             "GET",
129             "/api/v1/erm/eholdings/local/packages/*",
130             erm_package
131         ).as("get-package");
132         cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
133         cy.get("#packages_list table tbody tr:first").contains("Edit").click();
134         cy.wait("@get-package");
135         cy.wait(500); // Cypress is too fast! Vue hasn't populated the form yet!
136         cy.get("#packages_add h2").contains("Edit package");
137
138         // Form has been correctly filled in
139         cy.get("#package_name").should("have.value", erm_package.name);
140         cy.get("#package_type .vs__selected").contains("Complete");
141         cy.get("#package_content_type .vs__selected").contains("Print");
142
143         // Submit the form, get 500
144         cy.intercept("PUT", "/api/v1/erm/eholdings/local/packages/*", {
145             statusCode: 500,
146             error: "Something went wrong",
147         });
148         cy.get("#packages_add").contains("Submit").click();
149         cy.get("main div[class='dialog alert']").contains(
150             "Something went wrong: Internal Server Error"
151         );
152
153         // Submit the form, success!
154         cy.intercept("PUT", "/api/v1/erm/eholdings/local/packages/*", {
155             statusCode: 200,
156             body: erm_package,
157         });
158         cy.get("#packages_add").contains("Submit").click();
159         cy.get("main div[class='dialog message']").contains("Package updated");
160     });
161
162     it("Show package", () => {
163         let erm_package = get_package();
164         let packages = [erm_package];
165         // Click the "name" link from the list
166         cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
167             statusCode: 200,
168             body: packages,
169             headers: {
170                 "X-Base-Total-Count": "1",
171                 "X-Total-Count": "1",
172             },
173         });
174         cy.intercept(
175             "GET",
176             "/api/v1/erm/eholdings/local/packages/*",
177             erm_package
178         ).as("get-package");
179         cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
180         let name_link = cy.get(
181             "#packages_list table tbody tr:first td:first a"
182         );
183         name_link.should(
184             "have.text",
185             erm_package.name + " (#" + erm_package.package_id + ")"
186         );
187         name_link.click();
188         cy.wait("@get-package");
189         cy.wait(500); // Cypress is too fast! Vue hasn't populated the form yet!
190         cy.get("#packages_show h2").contains(
191             "Package #" + erm_package.package_id
192         );
193         // There are no resources, the table should not be displayed
194         cy.contains("Titles (0)");
195         cy.get("#table#title_list").should("not.exist");
196
197         // List resources
198         cy.intercept("GET", "/api/v1/erm/eholdings/local/packages/*", {
199             ...erm_package,
200             resources_count: 1,
201         });
202         cy.intercept(
203             "GET",
204             "/api/v1/erm/eholdings/local/packages/1/resources*",
205             {
206                 statusCode: 200,
207                 body: [
208                     {
209                         package_id: erm_package.package_id,
210                         resource_id: 1,
211                         title_id: 1,
212                         title: {
213                             biblio_id: 42,
214                             publication_title: "A great title",
215                             publication_type: "",
216                         },
217                     },
218                 ],
219                 headers: {
220                     "X-Base-Total-Count": "1",
221                     "X-Total-Count": "1",
222                 },
223             }
224         ).as("get-resource");
225         cy.visit("/cgi-bin/koha/erm/eholdings/local/packages/1");
226         cy.contains("Titles (1)");
227         cy.wait("@get-resource");
228         cy.wait(500);
229         cy.get("table#title_list").contains("A great title");
230     });
231
232     it("Delete package", () => {
233         let erm_package = get_package();
234         let packages = [erm_package];
235
236         // Click the 'Delete' button from the list
237         cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
238             statusCode: 200,
239             body: packages,
240             headers: {
241                 "X-Base-Total-Count": "1",
242                 "X-Total-Count": "1",
243             },
244         });
245         cy.intercept(
246             "GET",
247             "/api/v1/erm/eholdings/local/packages/*",
248             erm_package
249         );
250         cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
251
252         cy.get("#packages_list table tbody tr:first")
253             .contains("Delete")
254             .click();
255         cy.get("#packages_confirm_delete h2").contains("Delete package");
256         cy.contains("Package name: " + erm_package.name);
257
258         // Submit the form, get 500
259         cy.intercept("DELETE", "/api/v1/erm/eholdings/local/packages/*", {
260             statusCode: 500,
261             error: "Something went wrong",
262         });
263         cy.contains("Yes, delete").click();
264         cy.get("main div[class='dialog alert']").contains(
265             "Something went wrong: Internal Server Error"
266         );
267
268         // Submit the form, success!
269         cy.intercept("DELETE", "/api/v1/erm/eholdings/local/packages/*", {
270             statusCode: 204,
271             body: null,
272         });
273         cy.contains("Yes, delete").click();
274         cy.get("main div[class='dialog message']").contains("Package deleted");
275     });
276 });