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