/*
* Copyright (c) 2020 - present Cloudogu GmbH
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License as published by the Free
* Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see https://www.gnu.org/licenses/.
*/
import React from "react";
import { render, screen } from "@testing-library/react";
import Paginator from "./Paginator";
describe("paginator rendering tests", () => {
const dummyLink = {
href: "https://dummy",
};
it("should render all buttons but disabled, without links", async () => {
const collection = {
page: 10,
pageTotal: 20,
_links: {},
_embedded: {},
};
render();
const buttons: HTMLButtonElement[] = await screen.findAllByRole("button");
assert.lengthOf(buttons, 7);
buttons.forEach((button) => {
assert.strictEqual(button.disabled, true, "all buttons should be disabled");
});
});
it("should render buttons for first page", async () => {
const collection = {
page: 0,
pageTotal: 148,
_links: {
first: dummyLink,
next: dummyLink,
last: dummyLink,
},
_embedded: {},
};
render();
const buttons: HTMLButtonElement[] = await screen.findAllByRole("button");
assert.lengthOf(buttons, 5);
assert.strictEqual(buttons[0].disabled, true, "previous button should be disabled");
assert.strictEqual(buttons[1].disabled, false, "next button should be enabled");
const firstButton = buttons[2];
assert.strictEqual(firstButton.disabled, true, "first button should be disabled");
assert.strictEqual(firstButton.textContent?.trim(), "1", "first button be 1");
const nextButton = buttons[3];
assert.strictEqual(nextButton.disabled, false, "next button should be enabled");
assert.strictEqual(nextButton.textContent?.trim(), "2", "next button be 2");
const lastButton = buttons[4];
assert.strictEqual(lastButton.disabled, false, "last button should be enabled");
assert.strictEqual(lastButton.textContent?.trim(), "148", "last button be 148");
});
it("should render buttons for second page", async () => {
const collection = {
page: 1,
pageTotal: 148,
_links: {
first: dummyLink,
prev: dummyLink,
next: dummyLink,
last: dummyLink,
},
_embedded: {},
};
render();
const buttons: HTMLButtonElement[] = await screen.findAllByRole("button");
assert.lengthOf(buttons, 6);
assert.strictEqual(buttons[0].disabled, false, "previous button should be enabled");
assert.strictEqual(buttons[1].disabled, false, "next button should be enabled");
const firstButton = buttons[2];
assert.strictEqual(firstButton.disabled, false, "first button should be enabled");
assert.strictEqual(firstButton.textContent?.trim(), "1", "first button be 1");
const currentButton = buttons[3];
assert.strictEqual(currentButton.disabled, true, "current button should be disabled");
assert.strictEqual(currentButton.textContent?.trim(), "2", "current button be 2");
const nextButton = buttons[4];
assert.strictEqual(nextButton.disabled, false, "next button should be enabled");
assert.strictEqual(nextButton.textContent?.trim(), "3", "next button be 3");
const lastButton = buttons[5];
assert.strictEqual(lastButton.disabled, false, "last button should be enabled");
assert.strictEqual(lastButton.textContent?.trim(), "148", "last button be 148");
});
it("should render buttons for last page", async () => {
const collection = {
page: 147,
pageTotal: 148,
_links: {
first: dummyLink,
prev: dummyLink,
},
_embedded: {},
};
render();
const buttons: HTMLButtonElement[] = await screen.findAllByRole("button");
assert.lengthOf(buttons, 5);
assert.strictEqual(buttons[0].disabled, false, "previous button should be enabled");
assert.strictEqual(buttons[1].disabled, true, "next button should be disabled");
const firstButton = buttons[2];
assert.strictEqual(firstButton.disabled, false, "first button should be enabled");
assert.strictEqual(firstButton.textContent?.trim(), "1", "first button be 1");
const nextButton = buttons[3];
assert.strictEqual(nextButton.disabled, false, "next button should be enabled");
assert.strictEqual(nextButton.textContent?.trim(), "147", "next button be 147");
const lastButton = buttons[4];
assert.strictEqual(lastButton.disabled, true, "last button should be disabled");
assert.strictEqual(lastButton.textContent?.trim(), "148", "last button be 148");
});
it("should render buttons for penultimate page", async () => {
const collection = {
page: 146,
pageTotal: 148,
_links: {
first: dummyLink,
prev: dummyLink,
next: dummyLink,
last: dummyLink,
},
_embedded: {},
};
render();
const buttons: HTMLButtonElement[] = await screen.findAllByRole("button");
assert.lengthOf(buttons, 6);
assert.strictEqual(buttons[0].disabled, false, "previous button should be enabled");
assert.strictEqual(buttons[1].disabled, false, "next button should be enabled");
const firstButton = buttons[2];
assert.strictEqual(firstButton.disabled, false, "first button should be enabled");
assert.strictEqual(firstButton.textContent?.trim(), "1", "first button be 1");
const previousButton = buttons[3];
assert.strictEqual(previousButton.disabled, false, "previous button should be enabled");
assert.strictEqual(previousButton.textContent?.trim(), "146", "previous button be 146");
const currentButton = buttons[4];
assert.strictEqual(currentButton.disabled, true, "current button should be disabled");
assert.strictEqual(currentButton.textContent?.trim(), "147", "current button be 147");
const lastButton = buttons[5];
assert.strictEqual(lastButton.disabled, false, "last button should be enabled");
assert.strictEqual(lastButton.textContent?.trim(), "148", "last button be 148");
});
it("should render buttons for a page in the middle", async () => {
const collection = {
page: 41,
pageTotal: 148,
_links: {
first: dummyLink,
prev: dummyLink,
next: dummyLink,
last: dummyLink,
},
_embedded: {},
};
render();
const buttons: HTMLButtonElement[] = await screen.findAllByRole("button");
assert.lengthOf(buttons, 7);
assert.strictEqual(buttons[0].disabled, false, "previous button should be enabled");
assert.strictEqual(buttons[1].disabled, false, "next button should be enabled");
const firstButton = buttons[2] as HTMLButtonElement;
assert.strictEqual(firstButton.disabled, false, "first button should be enabled");
assert.strictEqual(firstButton.textContent?.trim(), "1", "first button be 1");
const previousButton = buttons[3];
assert.strictEqual(previousButton.disabled, false, "previous button should be enabled");
assert.strictEqual(previousButton.textContent?.trim(), "41", "previous button be 41");
const currentButton = buttons[4];
assert.strictEqual(currentButton.disabled, true, "current button should be disabled");
assert.strictEqual(currentButton.textContent?.trim(), "42", "current button be 42");
const nextButton = buttons[5];
assert.strictEqual(nextButton.disabled, false, "next button should be enabled");
assert.strictEqual(nextButton.textContent?.trim(), "43", "next button be 43");
const lastButton = buttons[6];
assert.strictEqual(lastButton.disabled, false, "last button should be enabled");
assert.strictEqual(lastButton.textContent?.trim(), "148", "last button be 148");
});
it("should call the function with the last previous url", async () => {
const collection = {
page: 41,
pageTotal: 148,
_links: {
first: dummyLink,
prev: {
href: "https://www.scm-manager.org",
},
next: dummyLink,
last: dummyLink,
},
_embedded: {},
};
let urlToOpen;
const callMe = (url: string) => {
urlToOpen = url;
};
render();
const previousButton = screen.getByRole("button", { name: /paginator.previous/i });
previousButton.click();
assert.strictEqual(urlToOpen, "https://www.scm-manager.org", "the url passed to the function is not correct");
});
});