Skip to content

Commit 73645e3

Browse files
🐛 fix(day-view): enable nested child routes navigation (#1268)
* 🐛 fix(navigation): enable nested-routes navigation-day-view * fix(web): update App import path in index.tsx * fix(tests): rename jest env to avoid ignore * Update packages/web/src/index.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(jest): fix path resolution for test environment --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 17bf866 commit 73645e3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1096
-980
lines changed

jest.config.js

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,11 @@ const config = {
150150
"^@web/auth(/(.*)$)?": "<rootDir>/packages/web/src/auth/$1",
151151
"^@web/common(/(.*)$)?": "<rootDir>/packages/web/src/common/$1",
152152
"^@web/components(/(.*)$)?": "<rootDir>/packages/web/src/components/$1",
153-
"^@web/containers(/(.*)$)?": "<rootDir>/packages/web/src/containers/$1",
154153
"^@web/ducks(/(.*)$)?": "<rootDir>/packages/web/src/ducks/$1",
155154
"^@web/public(/(.*)$)?": "<rootDir>/packages/web/src/public/$1",
156-
"^@web/routers(/(.*)$)?": "<rootDir>/packages/web/src/routers/",
157-
"^@web/store((/(.*)$)?)?": "<rootDir>/packages/web/src/store/$1",
155+
"^@web/routers(/(.*)$)?": "<rootDir>/packages/web/src/routers/$1",
158156
"^@web/socket(/(.*)$)?": "<rootDir>/packages/web/src/socket/$1",
157+
"^@web/store((/(.*)$)?)?": "<rootDir>/packages/web/src/store/$1",
159158
"^@web/views(/(.*)$)?": "<rootDir>/packages/web/src/views/$1",
160159
"^.+\\.(css|less)$":
161160
"<rootDir>/packages/web/src/__tests__/__mocks__/css.stub.js",
@@ -165,12 +164,13 @@ const config = {
165164
},
166165
setupFiles: [
167166
"<rootDir>/packages/core/src/__tests__/core.test.init.ts",
168-
"<rootDir>/packages/web/src/__tests__/web.test.init.js",
167+
"<rootDir>/packages/core/src/__tests__/core.test.start.ts",
168+
"<rootDir>/packages/web/src/__tests__/web.test.init.ts",
169169
],
170170
setupFilesAfterEnv: [
171-
"<rootDir>/packages/web/src/__tests__/web.test.start.js",
171+
"<rootDir>/packages/web/src/__tests__/web.test.start.ts",
172172
],
173-
testEnvironment: "jsdom",
173+
testEnvironment: "<rootDir>/packages/web/src/__tests__/jsdom.ts",
174174
testMatch: ["<rootDir>/packages/web/**/*.(test|spec).[jt]s?(x)"],
175175
transformIgnorePatterns: [
176176
//https://github.com/react-dnd/react-dnd/issues/3443
@@ -295,5 +295,4 @@ const config = {
295295
// watchman: true,
296296
};
297297

298-
// eslint-disable-next-line no-undef
299-
module.exports = config;
298+
export default config;

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"@eslint/js": "^9.20.0",
5555
"@playwright/test": "^1.56.0",
5656
"@trivago/prettier-plugin-sort-imports": "^5.2.2",
57+
"@types/node-fetch": "^2.6.13",
5758
"@types/uuid": "^9.0.0",
5859
"@typescript-eslint/eslint-plugin": "^8.0.0",
5960
"@typescript-eslint/parser": "^8.0.0",

packages/backend/src/__tests__/helpers/mock.setup.ts

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Handler, NextFunction, Response } from "express";
22
import { GoogleApis } from "googleapis";
3-
import mergeWith, { default as mockMergeWith } from "lodash.mergewith";
3+
import mergeWith from "lodash.mergewith";
44
import { randomUUID } from "node:crypto";
55
import { SessionRequest } from "supertokens-node/framework/express";
66
import {
@@ -14,6 +14,7 @@ import {
1414
} from "supertokens-node/lib/build/recipe/session/types";
1515
import { UserContext } from "supertokens-node/lib/build/types";
1616
import { createMockCalendarListEntry as mockCalendarListCreate } from "@core/__tests__/helpers/gcal.factory";
17+
import { mockModule } from "@core/__tests__/mock.setup";
1718
import { gSchema$CalendarListEntry } from "@core/types/gcal";
1819
import { StringV4Schema, zObjectId } from "@core/types/type.utils";
1920
import { UserMetadata } from "@core/types/user.types";
@@ -55,7 +56,7 @@ function mockGoogleapis() {
5556
});
5657
}
5758

58-
function mockSuperToken() {
59+
function mockSuperTokens() {
5960
const userMetadata = new Map<string, UserMetadata>();
6061

6162
function verifySession(input: {
@@ -330,28 +331,12 @@ export function mockEnv(env: Partial<typeof ENV>) {
330331
);
331332
}
332333

333-
export function mockModule<T>(
334-
mockPath: string,
335-
mockFactory: (mockedModule: T) => object = () => ({}),
336-
mockAsEsModule = true,
337-
) {
338-
const mockedModule = jest.requireActual(mockPath);
339-
340-
jest.mock(mockPath, () =>
341-
mockMergeWith(
342-
{ __esModule: mockAsEsModule },
343-
mockedModule,
344-
mockFactory(mockedModule),
345-
),
346-
);
347-
}
348-
349334
export function mockNodeModules() {
350335
beforeEach(mockCompassTestState);
351336
afterEach(() => jest.unmock("compass-test-state"));
352337
mockConstants();
353338
mockWinstonLogger();
354339
mockHttpLoggingMiddleware();
355340
mockGoogleapis();
356-
mockSuperToken();
341+
mockSuperTokens();
357342
}

packages/core/src/__tests__/mock.setup.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { default as mockMergeWith } from "lodash.mergewith";
12
import { faker as mockFaker } from "@faker-js/faker";
23

34
export const mockBSON = () => {
@@ -23,3 +24,19 @@ export const mockBSON = () => {
2324
},
2425
}));
2526
};
27+
28+
export function mockModule<T>(
29+
mockPath: string,
30+
mockFactory: (mockedModule: T) => object = () => ({}),
31+
mockAsEsModule = true,
32+
) {
33+
const mockedModule = jest.requireActual(mockPath);
34+
35+
jest.mock<T>(mockPath, () =>
36+
mockMergeWith(
37+
{ __esModule: mockAsEsModule },
38+
mockedModule,
39+
mockFactory(mockedModule),
40+
),
41+
);
42+
}

packages/core/src/types/type.utils.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,20 @@ export const zObjectId = zod4.pipe(
2424

2525
export const zBase64String = zod4Mini.base64();
2626

27+
export const zYearMonthDayString = zod4.string().refine(
28+
(dateString) => {
29+
return dayjs(
30+
dateString,
31+
dayjs.DateFormat.YEAR_MONTH_DAY_FORMAT,
32+
true,
33+
).isValid();
34+
},
35+
{
36+
error: () =>
37+
`Invalid date string. Must be in ${dayjs.DateFormat.YEAR_MONTH_DAY_FORMAT} format.`,
38+
},
39+
);
40+
2741
export const TimezoneSchema = zod4.string().refine(
2842
(timeZone) => {
2943
try {

packages/web/src/App.tsx

Lines changed: 0 additions & 114 deletions
This file was deleted.

packages/web/src/__tests__/__mocks__/mock.render.tsx

Lines changed: 52 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,75 @@
1-
import { PropsWithChildren, ReactElement } from "react";
2-
import { DndProvider } from "react-dnd";
3-
import { HTML5Backend } from "react-dnd-html5-backend";
4-
import { Provider } from "react-redux";
5-
import { BrowserRouter } from "react-router-dom";
6-
import { ThemeProvider } from "styled-components";
7-
import { GoogleOAuthProvider } from "@react-oauth/google";
1+
import { ComponentType, PropsWithChildren, ReactElement } from "react";
2+
import { RouterProvider, RouterProviderProps } from "react-router-dom";
83
import { configureStore } from "@reduxjs/toolkit";
94
import { RenderOptions, render, renderHook } from "@testing-library/react";
105
import { sagaMiddleware } from "@web/common/store/middlewares";
11-
import { theme } from "@web/common/styles/theme";
12-
import { GlobalStyle } from "@web/components/GlobalStyle";
6+
import { AbsoluteOverflowLoader } from "@web/components/AbsoluteOverflowLoader";
7+
import { CompassRequiredProviders } from "@web/components/CompassProvider/CompassProvider";
138
import type { store as compassStore } from "@web/store";
149
import { reducers } from "@web/store/reducers";
1510
import { sagas } from "@web/store/sagas";
16-
import { SessionProvider } from "../../auth/SessionProvider";
1711

18-
type CustomRenderOptions = Omit<RenderOptions, "wrapper"> & {
12+
interface CustomRenderOptions extends RenderOptions {
1913
state?: any;
2014
store?: typeof compassStore;
21-
};
15+
router?: RouterProviderProps["router"];
16+
wrapper?: ComponentType<PropsWithChildren>;
17+
}
18+
19+
const TestProviders = (props?: {
20+
router?: RouterProviderProps["router"];
21+
store?: typeof compassStore;
22+
}) => {
23+
return ({ children }: PropsWithChildren) => {
24+
if (!props?.router) {
25+
return <CompassRequiredProviders {...props} children={children} />;
26+
}
2227

23-
const AllTheProviders =
24-
(store: typeof compassStore) =>
25-
({ children }: PropsWithChildren<{}>) => {
2628
return (
27-
<SessionProvider>
28-
<DndProvider backend={HTML5Backend}>
29-
<GoogleOAuthProvider clientId="anyClientId">
30-
<GlobalStyle />
31-
<ThemeProvider theme={theme}>
32-
<BrowserRouter
33-
future={{
34-
v7_startTransition: true,
35-
v7_relativeSplatPath: true,
36-
}}
37-
>
38-
<Provider store={store}>{children}</Provider>
39-
</BrowserRouter>
40-
</ThemeProvider>
41-
</GoogleOAuthProvider>
42-
</DndProvider>
43-
</SessionProvider>
29+
<CompassRequiredProviders store={props?.store}>
30+
<RouterProvider
31+
router={props.router}
32+
fallbackElement={<AbsoluteOverflowLoader />}
33+
future={{
34+
v7_startTransition: true,
35+
}}
36+
/>
37+
</CompassRequiredProviders>
4438
);
4539
};
40+
};
4641

4742
const customRender = (
4843
ui: ReactElement,
4944
{
5045
state,
46+
router,
5147
store = configureStore({
5248
middleware: (getDefaultMiddleware) =>
5349
getDefaultMiddleware().concat(sagaMiddleware),
5450
reducer: reducers,
5551
preloadedState: state,
5652
}),
5753
...renderOptions
58-
}: CustomRenderOptions = {},
54+
}: Omit<CustomRenderOptions, "wrapper"> = {},
5955
) => {
6056
sagaMiddleware.run(sagas);
6157

6258
const options: RenderOptions = { ...renderOptions };
59+
6360
// wraps test component with providers
64-
return render(ui, { wrapper: AllTheProviders(store), ...options });
61+
return render(ui, {
62+
wrapper: TestProviders({ store, router }),
63+
...options,
64+
});
6565
};
6666

6767
const customRenderHook = <ReturnType, Props>(
6868
hook: (props: Props) => ReturnType,
6969
{
70+
wrapper: WrapperComponent,
7071
state,
72+
router,
7173
store = configureStore({
7274
middleware: (getDefaultMiddleware) =>
7375
getDefaultMiddleware().concat(sagaMiddleware),
@@ -80,8 +82,23 @@ const customRenderHook = <ReturnType, Props>(
8082
sagaMiddleware.run(sagas);
8183

8284
const options: RenderOptions = { ...renderOptions };
85+
const BaseProviders = TestProviders({ store, router });
86+
87+
const Wrapper = (props: PropsWithChildren) => {
88+
if (!WrapperComponent) return <BaseProviders {...props} />;
89+
90+
return (
91+
<BaseProviders>
92+
<WrapperComponent {...props} />
93+
</BaseProviders>
94+
);
95+
};
96+
8397
// wraps test component with providers
84-
return renderHook(hook, { wrapper: AllTheProviders(store), ...options });
98+
return renderHook(hook, {
99+
wrapper: Wrapper,
100+
...options,
101+
});
85102
};
86103

87104
export * from "@testing-library/react";

0 commit comments

Comments
 (0)