Merge pull request #320 from etkecc/broken-upgrade

Broken upgrade (now fixed)
This commit is contained in:
Aine
2025-01-30 09:12:07 +00:00
committed by GitHub
8 changed files with 1632 additions and 1571 deletions

View File

@@ -2,7 +2,7 @@ import type { JestConfigWithTsJest } from "ts-jest";
const config: JestConfigWithTsJest = { const config: JestConfigWithTsJest = {
preset: "ts-jest", preset: "ts-jest",
testEnvironment: "jsdom", testEnvironment: "jest-fixed-jsdom",
collectCoverage: true, collectCoverage: true,
coveragePathIgnorePatterns: ["node_modules", "dist"], coveragePathIgnorePatterns: ["node_modules", "dist"],
coverageDirectory: "<rootDir>/coverage/", coverageDirectory: "<rootDir>/coverage/",

View File

@@ -11,20 +11,20 @@
"url": "https://github.com/etkecc/synapse-admin" "url": "https://github.com/etkecc/synapse-admin"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.17.0", "@eslint/js": "^9.19.0",
"@testing-library/dom": "^10.0.0", "@testing-library/dom": "^10.0.0",
"@testing-library/jest-dom": "^6.6.3", "@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.2.0", "@testing-library/react": "^16.2.0",
"@testing-library/user-event": "^14.6.0", "@testing-library/user-event": "^14.6.1",
"@types/jest": "^29.5.14", "@types/jest": "^29.5.14",
"@types/lodash": "^4.17.14", "@types/lodash": "^4.17.14",
"@types/node": "^22.10.7", "@types/node": "^22.10.10",
"@types/papaparse": "^5.3.15", "@types/papaparse": "^5.3.15",
"@types/react": "^18.3.12", "@types/react": "^18.3.12",
"@typescript-eslint/eslint-plugin": "^8.18.2", "@typescript-eslint/eslint-plugin": "^8.18.2",
"@typescript-eslint/parser": "^8.19.0", "@typescript-eslint/parser": "^8.19.0",
"@vitejs/plugin-react": "^4.3.4", "@vitejs/plugin-react": "^4.3.4",
"eslint": "^9.18.0", "eslint": "^9.19.0",
"eslint-config-prettier": "^10.0.1", "eslint-config-prettier": "^10.0.1",
"eslint-plugin-import": "^2.31.0", "eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-jsx-a11y": "^6.10.2",
@@ -39,8 +39,8 @@
"ts-jest": "^29.2.5", "ts-jest": "^29.2.5",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "^5.7.3", "typescript": "^5.7.3",
"typescript-eslint": "^8.20.0", "typescript-eslint": "^8.21.0",
"vite": "^6.0.9", "vite": "^6.0.11",
"vite-plugin-version-mark": "^0.1.4" "vite-plugin-version-mark": "^0.1.4"
}, },
"dependencies": { "dependencies": {
@@ -53,22 +53,21 @@
"@mui/utils": "^5.16.14", "@mui/utils": "^5.16.14",
"@tanstack/react-query": "^5.64.2", "@tanstack/react-query": "^5.64.2",
"history": "^5.3.0", "history": "^5.3.0",
"jest-fixed-jsdom": "^0.0.9",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"papaparse": "^5.5.1", "papaparse": "^5.5.1",
"ra-core": "^5.4.4", "ra-core": "^5.4.4",
"ra-i18n-polyglot": "^5.4.4", "ra-i18n-polyglot": "^5.4.4",
"ra-language-english": "^5.4.4", "ra-language-english": "^5.4.4",
"ra-language-farsi": "^5.1.0", "ra-language-farsi": "^5.1.0",
"ra-language-french": "^5.4.4", "ra-language-french": "^5.5.2",
"ra-language-italian": "^3.13.1", "ra-language-italian": "^3.13.1",
"ra-language-russian": "^4.14.2", "ra-language-russian": "^4.14.2",
"react": "^18.3.1", "react": "^18.3.1",
"react-admin": "^5.4.4", "react-admin": "^5.5.2",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-hook-form": "^7.54.2", "react-hook-form": "^7.54.2",
"react-is": "^18.3.1", "react-is": "^18.3.1",
"react-router": "^6.28.2",
"react-router-dom": "^6.28.2",
"ts-jest-mock-import-meta": "^1.2.1" "ts-jest-mock-import-meta": "^1.2.1"
}, },
"scripts": { "scripts": {

View File

@@ -1,12 +1,32 @@
import { render, screen } from "@testing-library/react"; import { render, screen } from "@testing-library/react";
import { BrowserRouter } from "react-router-dom";
import fetchMock from "jest-fetch-mock"; import fetchMock from "jest-fetch-mock";
fetchMock.enableMocks(); fetchMock.enableMocks();
jest.mock("./synapse/authProvider", () => ({
__esModule: true,
default: {
logout: jest.fn().mockResolvedValue(undefined),
},
}));
import App from "./App"; import App from "./App";
describe("App", () => { describe("App", () => {
beforeEach(() => {
// Reset all mocks before each test
fetchMock.resetMocks();
// Mock any fetch call to return empty JSON immediately
fetchMock.mockResponseOnce(JSON.stringify({}));
});
it("renders", async () => { it("renders", async () => {
render(<App />); render(
<BrowserRouter>
<App />
</BrowserRouter>
);
await screen.findAllByText("Welcome to Synapse Admin"); await screen.findAllByText("Welcome to Synapse Admin");
}); });
}); });

View File

@@ -15,6 +15,7 @@ const fixedGermanMessages = {
action: { action: {
...formalGermanMessages.ra.action, ...formalGermanMessages.ra.action,
update_application: "Anwendung aktualisieren", update_application: "Anwendung aktualisieren",
select_all_button: "Alle auswählen",
}, },
page: { page: {
...formalGermanMessages.ra.page, ...formalGermanMessages.ra.page,
@@ -28,6 +29,7 @@ const fixedGermanMessages = {
"Sie haben nicht die erforderlichen Berechtigungen um auf diese Seite zuzugreifen.", "Sie haben nicht die erforderlichen Berechtigungen um auf diese Seite zuzugreifen.",
authentication_error: authentication_error:
"Der Authentifizierungsserver hat einen Fehler zurückgegeben und Ihre Anmeldedaten konnten nicht überprüft werden.", "Der Authentifizierungsserver hat einen Fehler zurückgegeben und Ihre Anmeldedaten konnten nicht überprüft werden.",
select_all_limit_reached: "Es gibt zu viele Elemente, um sie alle auszuwählen. Es wurden nur die ersten %{max} Elemente ausgewählt.",
}, },
}, },
} }

View File

@@ -11,6 +11,10 @@ const fixedRussianMessages = {
no_filtered_results: "Нет результатов", no_filtered_results: "Нет результатов",
clear_filters: "Все фильтры сбросить", clear_filters: "Все фильтры сбросить",
}, },
action: {
...russianMessages.ra.action,
select_all_button: "Выбрать все",
},
page: { page: {
...russianMessages.ra.page, ...russianMessages.ra.page,
empty: "Пусто", empty: "Пусто",
@@ -23,6 +27,7 @@ const fixedRussianMessages = {
"У вас нет прав доступа к этой странице.", "У вас нет прав доступа к этой странице.",
authentication_error: authentication_error:
"Сервер аутентификации вернул ошибку и не смог проверить ваши учетные данные.", "Сервер аутентификации вернул ошибку и не смог проверить ваши учетные данные.",
select_all_limit_reached: "Слишком много элементов для выбора. Были выбраны только первые %{max} элементов.",
}, },
}, },
} }

View File

@@ -13,7 +13,8 @@ const fixedChineseMessages = {
}, },
action: { action: {
...chineseMessages.ra.action, ...chineseMessages.ra.action,
update_application: "Anwendung aktualisieren", update_application: "更新应用",
select_all_button: "全部选择",
}, },
page: { page: {
...chineseMessages.ra.page, ...chineseMessages.ra.page,
@@ -26,6 +27,7 @@ const fixedChineseMessages = {
"您没有访问此页面的权限。", "您没有访问此页面的权限。",
authentication_error: authentication_error:
"身份验证服务器返回错误,无法验证您的凭据。", "身份验证服务器返回错误,无法验证您的凭据。",
select_all_limit_reached: "选择的元素太多。只选择了前 %{max} 个元素。",
}, },
}, },
} }

View File

@@ -2,6 +2,7 @@ import polyglotI18nProvider from "ra-i18n-polyglot";
import { render, screen } from "@testing-library/react"; import { render, screen } from "@testing-library/react";
import { AdminContext } from "react-admin"; import { AdminContext } from "react-admin";
import { BrowserRouter } from "react-router-dom";
import LoginPage from "./LoginPage"; import LoginPage from "./LoginPage";
import { AppContext } from "../Context"; import { AppContext } from "../Context";
@@ -14,9 +15,11 @@ describe("LoginForm", () => {
it("renders with no restriction to homeserver", async () => { it("renders with no restriction to homeserver", async () => {
await act(async () => { await act(async () => {
render( render(
<AdminContext i18nProvider={i18nProvider}> <BrowserRouter>
<LoginPage /> <AdminContext i18nProvider={i18nProvider}>
</AdminContext> <LoginPage />
</AdminContext>
</BrowserRouter>
); );
}); });
@@ -33,13 +36,15 @@ describe("LoginForm", () => {
it("renders with single restricted homeserver", () => { it("renders with single restricted homeserver", () => {
render( render(
<AppContext.Provider <BrowserRouter>
value={{ restrictBaseUrl: "https://matrix.example.com", asManagedUsers: [], menu: [] }} <AppContext.Provider
> value={{ restrictBaseUrl: "https://matrix.example.com", asManagedUsers: [], menu: [] }}
>
<AdminContext i18nProvider={i18nProvider}> <AdminContext i18nProvider={i18nProvider}>
<LoginPage /> <LoginPage />
</AdminContext> </AdminContext>
</AppContext.Provider> </AppContext.Provider>
</BrowserRouter>
); );
screen.getByText(englishMessages.synapseadmin.auth.welcome); screen.getByText(englishMessages.synapseadmin.auth.welcome);
@@ -56,14 +61,16 @@ describe("LoginForm", () => {
it("renders with multiple restricted homeservers", async () => { it("renders with multiple restricted homeservers", async () => {
render( render(
<AppContext.Provider <AppContext.Provider
value={{ value={{
restrictBaseUrl: ["https://matrix.example.com", "https://matrix.example.org"], restrictBaseUrl: ["https://matrix.example.com", "https://matrix.example.org"],
asManagedUsers: [], asManagedUsers: [],
menu: [], menu: [],
}} }}
> >
<AdminContext i18nProvider={i18nProvider}> <AdminContext i18nProvider={i18nProvider}>
<LoginPage /> <BrowserRouter>
<LoginPage />
</BrowserRouter>
</AdminContext> </AdminContext>
</AppContext.Provider> </AppContext.Provider>
); );

3118
yarn.lock

File diff suppressed because it is too large Load Diff