1 import { mount } from "@cypress/vue";
3 function get_attributes() {
6 processing_attribute_id: 1,
9 type: "authorised_value",
10 option_source: "COUNTRY",
13 processing_attribute_id: 2,
17 option_source: "biblio.title",
20 processing_attribute_id: 3,
28 function get_other_attributes() {
31 processing_attribute_id: 4,
34 type: "authorised_value",
35 option_source: "COUNTRY",
38 processing_attribute_id: 5,
47 function get_processings() {
50 name: "new processing",
52 attributes: get_attributes(),
55 name: "an other processing",
57 attributes: get_other_attributes(),
62 function get_items() {
63 // This is not a full item but it contains the info we are using
68 title: "a biblio title",
76 title: "an other biblio title",
84 title: "yet an other biblio title",
92 function get_train_items() {
93 let train_item_1 = get_items()[0];
94 let processing_attributes = get_attributes();
95 train_item_1.attributes = [
97 processing_attribute: processing_attributes[0],
98 processing_attribute_id:
99 processing_attributes[0].processing_attribute_id,
103 processing_attribute: processing_attributes[0],
104 processing_attribute_id:
105 processing_attributes[0].processing_attribute_id,
109 processing_attribute: processing_attributes[1],
110 processing_attribute_id:
111 processing_attributes[1].processing_attribute_id,
112 value: "a biblio title modified",
115 processing_attribute: processing_attributes[2],
116 processing_attribute_id:
117 processing_attributes[2].processing_attribute_id,
121 train_item_1.added_on = "2023-03-31T12:23:34+00:00";
122 train_item_1.processing_id = 1;
123 train_item_1.item_id = 1;
125 let train_item_2 = get_items()[1];
126 let processing_attributes = get_attributes();
127 train_item_2.attributes = [
129 processing_attribute: processing_attributes[0],
130 processing_attribute_id:
131 processing_attributes[0].processing_attribute_id,
135 processing_attribute: processing_attributes[1],
136 processing_attribute_id:
137 processing_attributes[1].processing_attribute_id,
138 value: "an other modified title",
141 processing_attribute: processing_attributes[2],
142 processing_attribute_id:
143 processing_attributes[2].processing_attribute_id,
147 train_item_2.added_on = "2023-04-01T12:34:56+00:00";
148 train_item_2.processing_id = 1;
149 train_item_2.item_id = 2;
151 let train_item_3 = get_items()[0];
152 let processing_attributes = get_other_attributes();
153 train_item_3.attributes = [
155 processing_attribute: processing_attributes[0],
156 processing_attribute_id:
157 processing_attributes[0].processing_attribute_id,
161 processing_attribute: processing_attributes[1],
162 processing_attribute_id:
163 processing_attributes[1].processing_attribute_id,
167 train_item_3.added_on = "2023-04-02T12:34:56+00:00";
168 train_item_3.processing_id = 2;
169 train_item_3.item_id = 3;
171 return [train_item_1, train_item_2, train_item_3];
174 function get_train() {
175 let processings = get_processings();
179 description: "Just a train",
180 default_processing_id: processings[0].processing_id,
182 created_on: "2023-04-05T10:16:27+00:00",
187 default_processing: processings[0],
191 describe("Trains", () => {
194 cy.title().should("eq", "Koha staff interface");
197 "/cgi-bin/koha/svc/config/systempreferences/?pref=PreservationModule",
202 "/cgi-bin/koha/svc/config/systempreferences/?pref=PreservationNotForLoanWaitingListIn",
207 "/cgi-bin/koha/svc/config/systempreferences/?pref=PreservationNotForLoanDefaultTrainIn",
212 "/api/v1/authorised_value_categories/NOT_LOAN/authorised_values",
215 category_name: "NOT_LOAN",
216 description: "Ordered",
220 category_name: "NOT_LOAN",
221 description: "Not for loan",
225 category_name: "NOT_LOAN",
226 description: "Staff collection",
230 category_name: "NOT_LOAN",
231 description: "Added to bundle",
235 category_name: "NOT_LOAN",
236 description: "In preservation",
240 category_name: "NOT_LOAN",
241 description: "In preservation external",
245 category_name: "NOT_LOAN",
246 description: "In preservation other",
253 it("List trains", () => {
254 // GET trains returns 500
255 cy.intercept("GET", "/api/v1/preservation/trains*", {
257 error: "Something went wrong",
259 cy.visit("/cgi-bin/koha/preservation/home.pl");
260 cy.get("#navmenulist").contains("Trains").click();
261 cy.get("main div[class='dialog alert']").contains(
262 /Something went wrong/
265 // GET trains returns empty list
266 cy.intercept("GET", "/api/v1/*", []);
267 cy.visit("/cgi-bin/koha/preservation/trains");
268 cy.get("#trains_list").contains("There are no trains defined");
270 // GET trains returns something
271 let train = get_train();
272 let trains = [train];
274 cy.intercept("GET", "/api/v1/preservation/trains*", {
278 "X-Base-Total-Count": "1",
279 "X-Total-Count": "1",
282 cy.intercept("GET", "/api/v1/preservation/trains/*", train);
283 cy.visit("/cgi-bin/koha/preservation/trains");
284 cy.get("#trains_list").contains("Showing 1 to 1 of 1 entries");
287 it("Add train", () => {
288 cy.intercept("GET", "/api/v1/preservation/trains", []);
291 "/api/v1/preservation/processings",
294 cy.visit("/cgi-bin/koha/preservation/trains");
295 let train = get_train();
296 cy.contains("New train").click();
297 cy.get("#train_name").type(train.name);
298 cy.get("#train_description").type(train.description);
299 // Confirm that the default not_for_loan is selected
300 cy.get("#not_for_loan .vs__selected").contains(
301 "In preservation external"
304 cy.get("#not_for_loan .vs__search").type(
305 "In preservation other{enter}"
307 cy.get("#train_default_processing .vs__search").type(
308 "new processing{enter}"
311 // Submit the form, get 500
312 cy.intercept("POST", "/api/v1/preservation/trains", {
314 error: "Something went wrong",
316 cy.get("#trains_add").contains("Submit").click();
317 cy.get("main div[class='dialog alert']").contains(
318 "Something went wrong: Error: Internal Server Error"
321 // Submit the form, success!
322 cy.intercept("POST", "/api/v1/preservation/trains", {
326 cy.get("#trains_add").contains("Submit").click();
327 cy.get("main div[class='dialog message']").contains("Train created");
330 it("Edit train", () => {
331 let train = get_train();
332 let processings = get_processings();
333 cy.intercept("GET", "/api/v1/preservation/trains/*", train);
334 cy.intercept("GET", "/api/v1/preservation/trains", [train]);
335 cy.intercept("GET", "/api/v1/preservation/processings*", processings);
336 cy.visit("/cgi-bin/koha/preservation/trains");
337 cy.get("#trains_list table tbody tr:first").contains("Edit").click();
338 cy.get("#train_name").should("have.value", train.name);
339 cy.get("#train_description").should("have.value", train.description);
340 cy.get("#not_for_loan .vs__selected").contains(
341 "In preservation external"
343 cy.get("#train_default_processing .vs__selected").contains(
344 train.default_processing.name
347 // Submit the form, get 500
348 cy.intercept("PUT", "/api/v1/preservation/trains/*", {
350 error: "Something went wrong",
352 cy.get("#trains_add").contains("Submit").click();
353 cy.get("main div[class='dialog alert']").contains(
354 "Something went wrong: Error: Internal Server Error"
357 // Submit the form, success!
358 cy.intercept("PUT", "/api/v1/preservation/trains/*", {
362 cy.intercept("GET", "/api/v1/preservation/trains", {
366 cy.get("#trains_add").contains("Submit").click();
367 cy.get("main div[class='dialog message']").contains("Train updated");
370 it("Simple show train", () => {
371 let train = get_train();
372 let trains = [train];
374 cy.intercept("GET", "/api/v1/preservation/trains*", {
378 "X-Base-Total-Count": "1",
379 "X-Total-Count": "1",
382 cy.intercept("GET", "/api/v1/preservation/trains/*", train);
383 cy.visit("/cgi-bin/koha/preservation/trains");
384 let name_link = cy.get("#trains_list table tbody tr:first td:first a");
387 train.name + " (#" + train.train_id + ")"
390 cy.get("#trains_show h2").contains("Train #" + train.train_id);
392 cy.contains("Name:" + train.name);
393 cy.contains("Description:" + train.description);
395 "Status for item added to this train:" + "In preservation external"
397 cy.contains("Default processing:" + train.default_processing.name);
400 it("Show train close, send, receive", () => {
401 let train = get_train();
402 cy.intercept("GET", "/api/v1/preservation/trains/" + train.train_id, {
406 cy.visit("/cgi-bin/koha/preservation/trains/" + train.train_id);
407 cy.wait("@get-train");
408 cy.contains("Closed on:").should("not.exist");
409 cy.contains("Sent on:").should("not.exist");
410 cy.contains("Received on:").should("not.exist");
412 let closed_train = Object.assign({}, train);
413 closed_train.closed_on = "2022-10-27 12:34:56";
414 cy.intercept("PUT", "/api/v1/preservation/trains/" + train.train_id, {
418 cy.intercept("GET", "/api/v1/preservation/trains/" + train.train_id, {
422 cy.get("#toolbar").contains("Close").click();
423 cy.wait("@get-train");
424 cy.contains("Closed on:").should("exist");
425 cy.contains("Sent on:").should("not.exist");
426 cy.contains("Received on:").should("not.exist");
428 let sent_train = Object.assign({}, closed_train);
429 sent_train.sent_on = "2022-10-28 12:34:56";
430 cy.intercept("PUT", "/api/v1/preservation/trains/" + train.train_id, {
434 cy.intercept("GET", "/api/v1/preservation/trains/" + train.train_id, {
438 cy.get("#toolbar").contains("Send").click();
439 cy.wait("@get-train");
440 cy.contains("Closed on:").should("exist");
441 cy.contains("Sent on:").should("exist");
442 cy.contains("Received on:").should("not.exist");
444 let received_train = Object.assign({}, sent_train);
445 received_train.received_on = "2022-10-29 12:34:56";
446 cy.intercept("PUT", "/api/v1/preservation/trains/" + train.train_id, {
448 body: received_train,
450 cy.intercept("GET", "/api/v1/preservation/trains/" + train.train_id, {
452 body: received_train,
454 cy.get("#toolbar").contains("Receive").click();
455 cy.wait("@get-train");
456 cy.contains("Closed on:").should("exist");
457 cy.contains("Sent on:").should("exist");
458 cy.contains("Received on:").should("exist");
461 it("Delete train", () => {
462 let train = get_train();
463 cy.intercept("GET", "/api/v1/preservation/trains*", {
467 "X-Base-Total-Count": "1",
468 "X-Total-Count": "1",
471 cy.visit("/cgi-bin/koha/preservation/trains");
473 // Submit the form, get 500
476 "/api/v1/preservation/trains/" + train.train_id,
479 error: "Something went wrong",
482 cy.get("#trains_list table tbody tr:first").contains("Delete").click();
483 cy.contains("Yes, delete").click();
484 cy.get("main div[class='dialog alert']").contains(
485 "Something went wrong: Error: Internal Server Error"
488 // Submit the form, success!
491 "/api/v1/preservation/trains/" + train.train_id,
497 cy.get("#trains_list table tbody tr:first").contains("Delete").click();
498 cy.contains("Yes, delete").click();
499 cy.get("main div[class='dialog message']").contains(
500 `Train ${train.name} deleted`
504 it("Add new item to a train", () => {
505 let train = get_train();
508 "/api/v1/preservation/trains/" + train.train_id,
511 let processings = get_processings();
512 cy.intercept("GET", "/api/v1/preservation/processings*", processings);
515 "/api/v1/preservation/processings/" + processings[0].processing_id,
518 cy.visit("/cgi-bin/koha/preservation/trains/" + train.train_id);
519 cy.contains("Add items").click();
520 cy.get("#barcode").type("bc_1");
521 cy.intercept("GET", "/api/v1/preservation/waiting-list/items*", []);
522 cy.contains("Submit").click();
523 cy.get("div[class='dialog alert modal']").contains(
524 "Cannot find item with this barcode. It must be in the waiting list."
526 cy.get("#close_modal").click();
528 let item = get_items()[0];
529 cy.intercept("GET", "/api/v1/preservation/waiting-list/items*", [item]);
530 cy.contains("Submit").click();
533 `/api/v1/preservation/trains/${train.train_id}/items`,
536 body: item, // Not correct but not important
539 cy.contains("Itemnumber:" + item.item_id);
540 cy.get("#processing .vs__selected").contains(
541 train.default_processing.name
543 cy.contains("Country:");
544 cy.get("#attribute_0 .vs__search").type("Argentin{enter}");
546 cy.get("#attribute_1").should("have.value", item.biblio.title);
547 cy.get("#attribute_1").type(" modified");
548 cy.contains("Height:");
549 cy.get("#attribute_2").type("42cm");
551 let train_items = get_train_items();
552 let train_with_one_item = Object.assign({}, train);
553 train_with_one_item.items = [train_items[0]];
557 "/api/v1/preservation/trains/" + train.train_id,
560 cy.contains("Submit").click();
561 cy.get("#trains_show").contains("Showing 1 to 1 of 1 entries");
563 let train_with_2_items = Object.assign({}, train);
564 train_with_2_items.items = [train_items[0], train_items[1]];
567 "/api/v1/preservation/trains/" + train.train_id,
570 cy.visit("/cgi-bin/koha/preservation/trains/" + train.train_id);
571 cy.get("#trains_show table").should("exist");
572 cy.get("#trains_show").contains("Showing 1 to 2 of 2 entries");
573 train_with_2_items.items.forEach(train_item => {
574 train_item.attributes.forEach(attribute => {
575 cy.get("td").contains(attribute.value);
579 let train_with_3_items = Object.assign({}, train);
580 train_with_3_items.items = [
587 "/api/v1/preservation/trains/" + train.train_id,
590 cy.visit("/cgi-bin/koha/preservation/trains/" + train.train_id);
591 cy.get("#trains_show table").should("not.exist");
592 train_with_3_items.items.forEach((train_item, i) => {
593 train_item.attributes.forEach(attribute => {
594 let re = new RegExp(attribute.value);
595 cy.get(`#item_${i}`).contains(re);