add: tests
This commit is contained in:
15
jest.config.js
Normal file
15
jest.config.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
module.exports = {
|
||||||
|
testEnvironment: "jsdom",
|
||||||
|
setupFilesAfterEnv: ["@testing-library/jest-dom", "<rootDir>/jest.setup.js"],
|
||||||
|
moduleNameMapper: {
|
||||||
|
"\\.(css|less|scss|sass)$": "identity-obj-proxy",
|
||||||
|
},
|
||||||
|
transform: {
|
||||||
|
"^.+\\.[t|j]sx?$": "babel-jest",
|
||||||
|
},
|
||||||
|
transformIgnorePatterns: [
|
||||||
|
'node_modules/(?!(@thi.ng)/)',
|
||||||
|
"node_modules/(?!node-fetch|katex|react-markdown|remark-math|rehype-katex|rehype-raw)"
|
||||||
|
],
|
||||||
|
|
||||||
|
};
|
||||||
6
jest.setup.js
Normal file
6
jest.setup.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
const { TextEncoder, TextDecoder } = require("util");
|
||||||
|
global.TextEncoder = TextEncoder;
|
||||||
|
global.TextDecoder = TextDecoder;
|
||||||
|
const fetch = (...args) =>
|
||||||
|
import("node-fetch").then(({ default: fetch }) => fetch(...args));
|
||||||
|
global.fetch = fetch;
|
||||||
3791
package-lock.json
generated
3791
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
15
package.json
15
package.json
@@ -12,6 +12,7 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"axios": "^1.7.9",
|
||||||
"bulma": "^1.0.2",
|
"bulma": "^1.0.2",
|
||||||
"katex": "^0.16.11",
|
"katex": "^0.16.11",
|
||||||
"oidc-client-ts": "^3.1.0",
|
"oidc-client-ts": "^3.1.0",
|
||||||
@@ -23,16 +24,26 @@
|
|||||||
"react-syntax-highlighter": "^15.6.1",
|
"react-syntax-highlighter": "^15.6.1",
|
||||||
"rehype-katex": "^7.0.1",
|
"rehype-katex": "^7.0.1",
|
||||||
"rehype-raw": "^7.0.0",
|
"rehype-raw": "^7.0.0",
|
||||||
"remark-math": "^6.0.0"
|
"remark-math": "^6.0.0",
|
||||||
|
"util": "^0.12.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.26.0",
|
"@babel/core": "^7.26.0",
|
||||||
"@babel/preset-env": "^7.26.0",
|
"@babel/preset-env": "^7.26.0",
|
||||||
"@babel/preset-react": "^7.25.9",
|
"@babel/preset-react": "^7.26.3",
|
||||||
|
"@testing-library/jest-dom": "^6.6.3",
|
||||||
|
"@testing-library/react": "^16.1.0",
|
||||||
|
"@testing-library/user-event": "^14.5.2",
|
||||||
|
"axios-mock-adapter": "^2.1.0",
|
||||||
|
"babel-jest": "^29.7.0",
|
||||||
"babel-loader": "^9.2.1",
|
"babel-loader": "^9.2.1",
|
||||||
"css-loader": "^7.1.2",
|
"css-loader": "^7.1.2",
|
||||||
"dotenv-webpack": "^8.1.0",
|
"dotenv-webpack": "^8.1.0",
|
||||||
"html-webpack-plugin": "^5.6.3",
|
"html-webpack-plugin": "^5.6.3",
|
||||||
|
"identity-obj-proxy": "^3.0.0",
|
||||||
|
"jest": "^29.7.0",
|
||||||
|
"jest-environment-jsdom": "^29.7.0",
|
||||||
|
"node-fetch": "^3.3.2",
|
||||||
"sass": "^1.81.0",
|
"sass": "^1.81.0",
|
||||||
"sass-loader": "^16.0.3",
|
"sass-loader": "^16.0.3",
|
||||||
"style-loader": "^4.0.0",
|
"style-loader": "^4.0.0",
|
||||||
|
|||||||
23
tests/AuthProvider.test.js
Normal file
23
tests/AuthProvider.test.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { render, screen } from "@testing-library/react";
|
||||||
|
import AuthProvider, { AuthContext } from "../src/AuthProvider";
|
||||||
|
import "@testing-library/jest-dom";
|
||||||
|
describe("AuthProvider", () => {
|
||||||
|
it("should provide default user and roles as null and empty array", () => {
|
||||||
|
render(
|
||||||
|
<AuthProvider>
|
||||||
|
<AuthContext.Consumer>
|
||||||
|
{({ user, roles }) => (
|
||||||
|
<>
|
||||||
|
<div data-testid="user">{user ? user.name : "null"}</div>
|
||||||
|
<div data-testid="roles">{roles.length}</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</AuthContext.Consumer>
|
||||||
|
</AuthProvider>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(screen.getByTestId("user")).toHaveTextContent("null");
|
||||||
|
expect(screen.getByTestId("roles")).toHaveTextContent("0");
|
||||||
|
});
|
||||||
|
});
|
||||||
38
tests/ConfigProvider.test.js
Normal file
38
tests/ConfigProvider.test.js
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { render, screen, act } from "@testing-library/react";
|
||||||
|
import ConfigProvider from "../src/ConfigProvider";
|
||||||
|
|
||||||
|
global.fetch = jest.fn(() =>
|
||||||
|
Promise.resolve({
|
||||||
|
ok: true,
|
||||||
|
json: () =>
|
||||||
|
Promise.resolve({
|
||||||
|
BACKEND_HOST: "http://localhost:5000",
|
||||||
|
FRONTEND_HOST: "http://localhost:3000",
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
describe("ConfigProvider", () => {
|
||||||
|
it("should display loading initially", () => {
|
||||||
|
render(
|
||||||
|
<ConfigProvider>
|
||||||
|
<div>Loaded</div>
|
||||||
|
</ConfigProvider>
|
||||||
|
);
|
||||||
|
expect(screen.getByText(/Loading configuration/i)).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should display children after loading", async () => {
|
||||||
|
await act(async () => {
|
||||||
|
render(
|
||||||
|
<ConfigProvider>
|
||||||
|
<div>Loaded</div>
|
||||||
|
</ConfigProvider>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const loadedText = await screen.findByText("Loaded");
|
||||||
|
expect(loadedText).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
});
|
||||||
31
tests/PermissionGuard.test.js
Normal file
31
tests/PermissionGuard.test.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import React from "react";
|
||||||
|
import PermissionGuard from "../src/components/PermissionGuard";
|
||||||
|
import { AuthContext } from "../src/AuthProvider";
|
||||||
|
import { render, screen } from "@testing-library/react";
|
||||||
|
describe("PermissionGuard", () => {
|
||||||
|
it("should render children for users with required roles", () => {
|
||||||
|
const roles = ["admin"];
|
||||||
|
render(
|
||||||
|
<AuthContext.Provider value={{ roles }}>
|
||||||
|
<PermissionGuard rolesRequired={["admin"]}>
|
||||||
|
<div data-testid="protected-content">Protected Content</div>
|
||||||
|
</PermissionGuard>
|
||||||
|
</AuthContext.Provider>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(screen.getByTestId("protected-content")).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should not render children for users without required roles", () => {
|
||||||
|
const roles = ["user"];
|
||||||
|
render(
|
||||||
|
<AuthContext.Provider value={{ roles }}>
|
||||||
|
<PermissionGuard rolesRequired={["admin"]}>
|
||||||
|
<div data-testid="protected-content">Protected Content</div>
|
||||||
|
</PermissionGuard>
|
||||||
|
</AuthContext.Provider>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(screen.queryByTestId("protected-content")).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user