#708 apply strictier linting rules (#717)

* #708 apply strictier linting rules and fix simple eslint bugs

* #708 fix eslint errors relate to promise

* #708 fix eslint import/no-extraneous-dependencies

* #708 fix eslint errors of react-hook

* #708 enable eslint check for typescript

---------

Co-authored-by: lethemanh <lethemanh@lethemanhs-MacBook-Pro.local>
This commit is contained in:
lethemanh
2026-04-01 22:15:10 +07:00
committed by GitHub
parent 2bff6aae78
commit cadfa70e60
321 changed files with 27452 additions and 27600 deletions
+88 -88
View File
@@ -1,45 +1,45 @@
import * as appHooks from "@/app/hooks";
import { AppDispatch, setupStore } from "@/app/store";
import HandleLogin from "@/features/User/HandleLogin";
import * as oidcAuth from "@/features/User/oidcAuth";
import { clientConfig } from "@/features/User/oidcAuth";
import { useInitializeApp } from "@/features/User/useInitializeApp";
import * as apiUtils from "@/utils/apiUtils";
import { renderHook, screen, waitFor } from "@testing-library/react";
import { Provider } from "react-redux";
import { push } from "redux-first-history";
import { renderWithProviders } from "../../utils/Renderwithproviders";
import * as appHooks from '@/app/hooks'
import { AppDispatch, setupStore } from '@/app/store'
import HandleLogin from '@/features/User/HandleLogin'
import * as oidcAuth from '@/features/User/oidcAuth'
import { clientConfig } from '@/features/User/oidcAuth'
import { useInitializeApp } from '@/features/User/useInitializeApp'
import * as apiUtils from '@/utils/apiUtils'
import { renderHook, screen, waitFor } from '@testing-library/react'
import { Provider } from 'react-redux'
import { push } from 'redux-first-history'
import { renderWithProviders } from '../../utils/Renderwithproviders'
clientConfig.url = "https://example.com";
clientConfig.url = 'https://example.com'
describe("HandleLogin", () => {
describe('HandleLogin', () => {
beforeEach(() => {
jest.clearAllMocks();
jest.spyOn(apiUtils, "redirectTo").mockImplementation(() => {});
const dispatch = jest.fn() as AppDispatch;
jest.spyOn(appHooks, "useAppDispatch").mockReturnValue(dispatch);
sessionStorage.clear();
Object.defineProperty(window, "matchMedia", {
jest.clearAllMocks()
jest.spyOn(apiUtils, 'redirectTo').mockImplementation(() => {})
const dispatch = jest.fn() as AppDispatch
jest.spyOn(appHooks, 'useAppDispatch').mockReturnValue(dispatch)
sessionStorage.clear()
Object.defineProperty(window, 'matchMedia', {
writable: true,
value: jest.fn().mockImplementation((query) => ({
value: jest.fn().mockImplementation(query => ({
matches: false,
media: query,
onchange: null,
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
dispatchEvent: jest.fn(),
})),
});
});
dispatchEvent: jest.fn()
}))
})
})
test("redirects and sets sessionStorage when no userData", async () => {
test('redirects and sets sessionStorage when no userData', async () => {
const loginUrlMock = {
code_verifier: "verifier123",
state: "state123",
redirectTo: new URL("http://login.url"),
};
code_verifier: 'verifier123',
state: 'state123',
redirectTo: new URL('http://login.url')
}
jest.spyOn(oidcAuth, "Auth").mockResolvedValue(loginUrlMock);
jest.spyOn(oidcAuth, 'Auth').mockResolvedValue(loginUrlMock)
const { result } = renderHook(() => useInitializeApp(), {
wrapper: ({ children }) => (
@@ -50,118 +50,118 @@ describe("HandleLogin", () => {
tokens: null,
loading: false,
error: null,
coreConfig: { language: "en" },
coreConfig: { language: 'en' }
},
calendars: { list: {}, pending: false, error: null },
calendars: { list: {}, pending: false, error: null }
})}
>
{children}
</Provider>
),
});
)
})
await waitFor(
() => {
expect(oidcAuth.Auth).toHaveBeenCalled();
expect(oidcAuth.Auth).toHaveBeenCalled()
},
{ timeout: 3000 }
);
)
await waitFor(
() => {
expect(sessionStorage.getItem("redirectState")).toEqual(
expect(sessionStorage.getItem('redirectState')).toEqual(
JSON.stringify({
code_verifier: "verifier123",
state: "state123",
code_verifier: 'verifier123',
state: 'state123'
})
);
)
},
{ timeout: 3000 }
);
)
await waitFor(
() => {
expect(apiUtils.redirectTo).toHaveBeenCalledWith(
loginUrlMock.redirectTo
);
)
},
{ timeout: 3000 }
);
});
)
})
test("does not render loading element when userData exists and calendars pending is true", () => {
test('does not render loading element when userData exists and calendars pending is true', () => {
const preloadedState = {
user: {
userData: {
sub: "test",
email: "test@test.com",
sid: "aiYbWZSk2g0F+LrQeD7Dg4QcUMR8R/zTZdZBiA7N6Ro",
openpaasId: "667037022b752d0026472254",
sub: 'test',
email: 'test@test.com',
sid: 'aiYbWZSk2g0F+LrQeD7Dg4QcUMR8R/zTZdZBiA7N6Ro',
openpaasId: '667037022b752d0026472254'
},
tokens: { access_token: "test" },
loading: false,
tokens: { access_token: 'test' },
loading: false
},
calendars: { list: {}, pending: true },
loading: { isLoading: true },
};
loading: { isLoading: true }
}
renderWithProviders(<HandleLogin />, preloadedState);
renderWithProviders(<HandleLogin />, preloadedState)
// HandleLogin now returns null, loading is shown at App level via appLoading state
expect(screen.queryByTestId("loading")).not.toBeInTheDocument();
});
test("does not render loading element when userData exists and calendars pending is false", () => {
expect(screen.queryByTestId('loading')).not.toBeInTheDocument()
})
test('does not render loading element when userData exists and calendars pending is false', () => {
const preloadedState = {
user: {
userData: {
sub: "cmoussu",
email: "cmoussu@linagora.com",
sid: "aiYbWZSk2g0F+LrQeD7Dg4QcUMR8R/zTZdZBiA7N6Ro",
openpaasId: "667037022b752d0026472254",
sub: 'cmoussu',
email: 'cmoussu@linagora.com',
sid: 'aiYbWZSk2g0F+LrQeD7Dg4QcUMR8R/zTZdZBiA7N6Ro',
openpaasId: '667037022b752d0026472254'
},
tokens: { access_token: "test" },
loading: false,
tokens: { access_token: 'test' },
loading: false
},
calendars: { list: {}, pending: false },
loading: { isLoading: false },
};
renderWithProviders(<HandleLogin />, preloadedState);
loading: { isLoading: false }
}
renderWithProviders(<HandleLogin />, preloadedState)
// HandleLogin now returns null, loading is shown at App level via appLoading state
expect(screen.queryByTestId("loading")).not.toBeInTheDocument();
});
test("goes to error page when there is error in user data", async () => {
const mockDispatch = jest.fn();
jest.spyOn(appHooks, "useAppDispatch").mockReturnValue(mockDispatch);
jest.spyOn(oidcAuth, "Auth").mockResolvedValue({
code_verifier: "verifier123",
state: "state123",
redirectTo: new URL("http://login.url"),
});
expect(screen.queryByTestId('loading')).not.toBeInTheDocument()
})
test('goes to error page when there is error in user data', async () => {
const mockDispatch = jest.fn()
jest.spyOn(appHooks, 'useAppDispatch').mockReturnValue(mockDispatch)
jest.spyOn(oidcAuth, 'Auth').mockResolvedValue({
code_verifier: 'verifier123',
state: 'state123',
redirectTo: new URL('http://login.url')
})
renderWithProviders(<HandleLogin />, {
user: {
error: true,
loading: false,
userData: {
sub: "test",
email: "test@test.com",
sid: "testSid",
openpaasId: "testId",
sub: 'test',
email: 'test@test.com',
sid: 'testSid',
openpaasId: 'testId'
},
tokens: { access_token: "test" },
tokens: { access_token: 'test' }
},
calendars: {
list: {},
pending: false,
error: null,
},
});
error: null
}
})
await waitFor(
() => {
expect(mockDispatch).toHaveBeenCalledWith(push("/error"));
expect(mockDispatch).toHaveBeenCalledWith(push('/error'))
},
{ timeout: 3000 }
);
});
});
)
})
})