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(),
56 name: "an other processing",
58 attributes: get_other_attributes(),
64 function get_items() {
65 // This is not a full item but it contains the info we are using
70 title: "a biblio title",
78 title: "an other biblio title",
86 title: "yet an other biblio title",
94 function get_train_items() {
95 let train_item_1 = get_items()[0];
96 let processing_attributes = get_attributes();
97 train_item_1.attributes = [
99 processing_attribute: processing_attributes[0],
100 processing_attribute_id:
101 processing_attributes[0].processing_attribute_id,
103 _strings: { value: { str: "Argentina" } },
106 processing_attribute: processing_attributes[0],
107 processing_attribute_id:
108 processing_attributes[0].processing_attribute_id,
109 value: "Not a country",
110 _strings: { value: { str: "Not a country" } },
113 processing_attribute: processing_attributes[1],
114 processing_attribute_id:
115 processing_attributes[1].processing_attribute_id,
116 value: "a biblio title modified",
117 _strings: { value: { str: "a biblio title modified" } },
120 processing_attribute: processing_attributes[2],
121 processing_attribute_id:
122 processing_attributes[2].processing_attribute_id,
124 _strings: { value: { str: "12cm" } },
127 train_item_1.added_on = "2023-03-31T12:23:34+00:00";
128 train_item_1.processing_id = 1;
129 train_item_1.processing = get_processings()[0];
130 train_item_1.item_id = 1;
132 let train_item_2 = get_items()[1];
133 let processing_attributes = get_attributes();
134 train_item_2.attributes = [
136 processing_attribute: processing_attributes[0],
137 processing_attribute_id:
138 processing_attributes[0].processing_attribute_id,
140 _strings: { value: { str: "Uruguay" } },
143 processing_attribute: processing_attributes[1],
144 processing_attribute_id:
145 processing_attributes[1].processing_attribute_id,
146 value: "an other modified title",
147 _strings: { value: { str: "an other modified title" } },
150 processing_attribute: processing_attributes[2],
151 processing_attribute_id:
152 processing_attributes[2].processing_attribute_id,
154 _strings: { value: { str: "34cm" } },
157 train_item_2.added_on = "2023-04-01T12:34:56+00:00";
158 train_item_2.processing_id = 1;
159 train_item_2.processing = get_processings()[0];
160 train_item_2.item_id = 2;
162 let train_item_3 = get_items()[0];
163 let processing_attributes = get_other_attributes();
164 train_item_3.attributes = [
166 processing_attribute: processing_attributes[0],
167 processing_attribute_id:
168 processing_attributes[0].processing_attribute_id,
170 _strings: { value: { str: "Bolivia" } },
173 processing_attribute: processing_attributes[1],
174 processing_attribute_id:
175 processing_attributes[1].processing_attribute_id,
177 _strings: { value: { str: "W 123cm" } },
180 train_item_3.added_on = "2023-04-02T12:34:56+00:00";
181 train_item_3.processing_id = 2;
182 train_item_3.processing = get_processings()[1];
183 train_item_3.item_id = 3;
185 return [train_item_1, train_item_2, train_item_3];
188 function get_train() {
189 let processings = get_processings();
193 description: "Just a train",
194 default_processing_id: processings[0].processing_id,
196 created_on: "2023-04-05T10:16:27+00:00",
201 default_processing: processings[0],
205 describe("Trains", () => {
208 cy.title().should("eq", "Koha staff interface");
211 "/api/v1/preservation/config",
212 '{"permissions":{"manage_sysprefs":"1"},"settings":{"enabled":"1","not_for_loan_default_train_in":"42","not_for_loan_waiting_list_in": "24"}}'
217 "/api/v1/authorised_value_categories/NOT_LOAN/authorised_values",
220 category_name: "NOT_LOAN",
221 description: "Ordered",
225 category_name: "NOT_LOAN",
226 description: "Not for loan",
230 category_name: "NOT_LOAN",
231 description: "Staff collection",
235 category_name: "NOT_LOAN",
236 description: "Added to bundle",
240 category_name: "NOT_LOAN",
241 description: "In preservation",
245 category_name: "NOT_LOAN",
246 description: "In preservation external",
250 category_name: "NOT_LOAN",
251 description: "In preservation other",
258 it("List trains", () => {
259 // GET trains returns 500
260 cy.intercept("GET", "/api/v1/preservation/trains*", {
262 error: "Something went wrong",
264 cy.visit("/cgi-bin/koha/preservation/home.pl");
265 cy.get("#navmenulist").contains("Trains").click();
266 cy.get("main div[class='dialog alert']").contains(
267 /Something went wrong/
270 // GET trains returns empty list
271 cy.intercept("GET", "/api/v1/preservation/trains*", []);
272 cy.visit("/cgi-bin/koha/preservation/trains");
273 cy.get("#trains_list").contains("There are no trains defined");
275 // GET trains returns something
276 let train = get_train();
277 let trains = [train];
279 cy.intercept("GET", "/api/v1/preservation/trains*", {
283 "X-Base-Total-Count": "1",
284 "X-Total-Count": "1",
287 cy.intercept("GET", "/api/v1/preservation/trains/*", train);
288 cy.visit("/cgi-bin/koha/preservation/trains");
289 cy.get("#trains_list").contains("Showing 1 to 1 of 1 entries");
292 it("Add train", () => {
293 cy.intercept("GET", "/api/v1/preservation/trains*", []);
296 "/api/v1/preservation/processings*",
299 cy.visit("/cgi-bin/koha/preservation/trains");
300 let train = get_train();
301 cy.contains("New train").click();
302 cy.get("#train_name").type(train.name);
303 cy.get("#train_description").type(train.description);
304 // Confirm that the default not_for_loan is selected
305 cy.get("#not_for_loan .vs__selected").contains(
306 "In preservation external"
309 cy.get("#not_for_loan .vs__search").type(
310 "In preservation other{enter}"
312 cy.get("#train_default_processing .vs__search").type(
313 "new processing{enter}"
316 // Submit the form, get 500
317 cy.intercept("POST", "/api/v1/preservation/trains", {
319 error: "Something went wrong",
321 cy.get("#trains_add").contains("Submit").click();
322 cy.get("main div[class='dialog alert']").contains(
323 "Something went wrong: Error: Internal Server Error"
326 // Submit the form, success!
327 cy.intercept("POST", "/api/v1/preservation/trains", {
331 cy.get("#trains_add").contains("Submit").click();
332 cy.get("main div[class='dialog message']").contains("Train created");
335 it("Edit train", () => {
336 let train = get_train();
337 let processings = get_processings();
338 cy.intercept("GET", "/api/v1/preservation/trains/*", train);
339 cy.intercept("GET", "/api/v1/preservation/trains*", {
343 "X-Base-Total-Count": "1",
344 "X-Total-Count": "1",
348 cy.intercept("GET", "/api/v1/preservation/processings*", processings);
349 cy.visit("/cgi-bin/koha/preservation/trains");
350 cy.get("#trains_list table tbody tr:first").contains("Edit").click();
351 cy.get("#train_name").should("have.value", train.name);
352 cy.get("#train_description").should("have.value", train.description);
353 cy.get("#not_for_loan .vs__selected").contains(
354 "In preservation external"
356 cy.get("#train_default_processing .vs__selected").contains(
357 train.default_processing.name
360 // Submit the form, get 500
361 cy.intercept("PUT", "/api/v1/preservation/trains/*", {
364 cy.get("#trains_add").contains("Submit").click();
365 cy.get("main div[class='dialog alert']").contains(
366 "Something went wrong: Error: Internal Server Error"
369 // Submit the form, success!
370 cy.intercept("PUT", "/api/v1/preservation/trains/*", {
374 cy.intercept("GET", "/api/v1/preservation/trains", {
378 cy.get("#trains_add").contains("Submit").click();
379 cy.get("main div[class='dialog message']").contains("Train updated");
382 it("Simple show train", () => {
383 let train = get_train();
384 let trains = [train];
386 cy.intercept("GET", "/api/v1/preservation/trains*", {
390 "X-Base-Total-Count": "1",
391 "X-Total-Count": "1",
394 cy.intercept("GET", "/api/v1/preservation/trains/*", train);
395 cy.visit("/cgi-bin/koha/preservation/trains");
396 let name_link = cy.get("#trains_list table tbody tr:first td:first a");
399 train.name + " (#" + train.train_id + ")"
402 cy.get("#trains_show h2").contains("Train #" + train.train_id);
404 cy.contains("Name:" + train.name);
405 cy.contains("Description:" + train.description);
407 "Status for item added to this train:" + "In preservation external"
409 cy.contains("Default processing:" + train.default_processing.name);
412 it("Show train close, send, receive", () => {
413 let train = get_train();
414 cy.intercept("GET", "/api/v1/preservation/trains/" + train.train_id, {
418 cy.visit("/cgi-bin/koha/preservation/trains/" + train.train_id);
419 cy.wait("@get-train");
420 cy.contains("Closed on:").should("not.exist");
421 cy.contains("Sent on:").should("not.exist");
422 cy.contains("Received on:").should("not.exist");
424 let closed_train = Object.assign({}, train);
425 closed_train.closed_on = "2022-10-27 12:34:56";
426 cy.intercept("PUT", "/api/v1/preservation/trains/" + train.train_id, {
430 cy.intercept("GET", "/api/v1/preservation/trains/" + train.train_id, {
434 cy.get("#toolbar").contains("Close").click();
435 cy.wait("@get-train");
436 cy.contains("Closed on:").should("exist");
437 cy.contains("Sent on:").should("not.exist");
438 cy.contains("Received on:").should("not.exist");
440 let sent_train = Object.assign({}, closed_train);
441 sent_train.sent_on = "2022-10-28 12:34:56";
442 cy.intercept("PUT", "/api/v1/preservation/trains/" + train.train_id, {
446 cy.intercept("GET", "/api/v1/preservation/trains/" + train.train_id, {
450 cy.get("#toolbar").contains("Send").click();
451 cy.wait("@get-train");
452 cy.contains("Closed on:").should("exist");
453 cy.contains("Sent on:").should("exist");
454 cy.contains("Received on:").should("not.exist");
456 let received_train = Object.assign({}, sent_train);
457 received_train.received_on = "2022-10-29 12:34:56";
458 cy.intercept("PUT", "/api/v1/preservation/trains/" + train.train_id, {
460 body: received_train,
462 cy.intercept("GET", "/api/v1/preservation/trains/" + train.train_id, {
464 body: received_train,
466 cy.get("#toolbar").contains("Receive").click();
467 cy.wait("@get-train");
468 cy.contains("Closed on:").should("exist");
469 cy.contains("Sent on:").should("exist");
470 cy.contains("Received on:").should("exist");
473 it("Delete train", () => {
474 let train = get_train();
475 cy.intercept("GET", "/api/v1/preservation/trains*", {
479 "X-Base-Total-Count": "1",
480 "X-Total-Count": "1",
483 cy.visit("/cgi-bin/koha/preservation/trains");
485 // Submit the form, get 500
488 "/api/v1/preservation/trains/" + train.train_id,
491 error: "Something went wrong",
494 cy.get("#trains_list table tbody tr:first").contains("Delete").click();
495 cy.contains("Yes, delete").click();
496 cy.get("main div[class='dialog alert']").contains(
497 "Something went wrong: Error: Internal Server Error"
500 // Submit the form, success!
503 "/api/v1/preservation/trains/" + train.train_id,
509 cy.get("#trains_list table tbody tr:first").contains("Delete").click();
510 cy.contains("Yes, delete").click();
511 cy.get("main div[class='dialog message']").contains(
512 `Train ${train.name} deleted`
516 it("Add new item to a train", () => {
517 let train = get_train();
520 "/api/v1/preservation/trains/" + train.train_id,
523 let processings = get_processings();
524 cy.intercept("GET", "/api/v1/preservation/processings*", processings);
527 "/api/v1/preservation/processings/" + processings[0].processing_id,
530 cy.visit("/cgi-bin/koha/preservation/trains/" + train.train_id);
531 cy.contains("Add items").click();
532 cy.get("#barcode").type("bc_1");
533 cy.intercept("GET", "/api/v1/preservation/waiting-list/items*", []);
534 cy.contains("Submit").click();
535 cy.get("div[class='dialog alert modal']").contains(
536 "Cannot find item with this barcode. It must be in the waiting list."
538 cy.get("#close_modal").click();
540 let item = get_items()[0];
541 cy.intercept("GET", "/api/v1/preservation/waiting-list/items*", [item]);
542 cy.contains("Submit").click();
545 `/api/v1/preservation/trains/${train.train_id}/items`,
548 body: item, // Not correct but not important
551 cy.contains("Itemnumber:" + item.item_id);
552 cy.get("#processing .vs__selected").contains(
553 train.default_processing.name
555 cy.contains("Country:");
556 cy.get("#attribute_0 .vs__search").type("Argentin{enter}");
558 cy.get("#attribute_1").should("have.value", item.biblio.title);
559 cy.get("#attribute_1").type(" modified");
560 cy.contains("Height:");
561 cy.get("#attribute_2").type("42cm");
563 let train_items = get_train_items();
564 let train_with_one_item = Object.assign({}, train);
565 train_with_one_item.items = [train_items[0]];
569 "/api/v1/preservation/trains/" + train.train_id,
572 cy.contains("Submit").click();
573 cy.get("#trains_show").contains("Showing 1 to 1 of 1 entries");
575 let train_with_2_items = Object.assign({}, train);
576 train_with_2_items.items = [train_items[0], train_items[1]];
579 "/api/v1/preservation/trains/" + train.train_id,
582 cy.visit("/cgi-bin/koha/preservation/trains/" + train.train_id);
583 cy.get("#trains_show table").should("exist");
584 cy.get("#trains_show").contains("Showing 1 to 2 of 2 entries");
585 train_with_2_items.items.forEach(train_item => {
586 train_item.attributes.forEach(attribute => {
587 cy.get("td").contains(attribute.value);
591 let train_with_3_items = Object.assign({}, train);
592 train_with_3_items.items = [
599 "/api/v1/preservation/trains/" + train.train_id,
602 cy.visit("/cgi-bin/koha/preservation/trains/" + train.train_id);
603 cy.get("#trains_show table").should("not.exist");
604 train_with_3_items.items.forEach((train_item, i) => {
605 train_item.attributes.forEach(attribute => {
606 let re = new RegExp(attribute.value);
607 cy.get(`#item_${i}`).contains(re);
612 it("Add to waiting list then add to a train", () => {
613 let train = get_train();
614 let processing = get_processings()[0];
615 cy.intercept("GET", "/api/v1/preservation/trains*", [train]);
616 cy.intercept("GET", "/api/v1/preservation/trains/1", train);
617 cy.intercept("GET", "/api/v1/preservation/processings/1", processing);
618 cy.visit("/cgi-bin/koha/preservation/waiting-list");
620 cy.intercept("GET", "/api/v1/preservation/waiting-list/items*", {
624 "X-Base-Total-Count": "2",
625 "X-Total-Count": "2",
628 cy.intercept("POST", "/api/v1/preservation/waiting-list/items", [
632 cy.get("#waiting-list").contains("Add to waiting list").click();
633 cy.get("#barcode_list").type("bc_1\nbc_2\nbc_3");
634 cy.contains("Submit").click();
635 cy.wait("@get-items");
636 cy.get("main div[class='dialog message']").contains(
639 cy.contains("Add last 2 items to a train").click();
640 cy.get("#train_id .vs__search").type(train.name + "{enter}");
641 cy.intercept("GET", "/api/v1/items*", {
643 body: get_items().filter(
644 item => item.item_id == 1 || item.item_id == 2
647 "X-Base-Total-Count": "2",
648 "X-Total-Count": "2",
653 "/api/v1/preservation/trains/" + train.train_id + "/items/batch",
661 cy.contains("Submit").click(); // Select train
662 train.items = get_train_items().filter(
663 train_item => train_item.item_id == 1 || train_item.item_id == 2
665 cy.intercept("GET", "/api/v1/preservation/trains/1", train);
666 cy.contains("Submit").click(); // Submit add items form
667 cy.get("main div[class='dialog message']").contains(
668 `2 items have been added to train ${train.train_id}.`