From 8d630bb8ef8f3636cba37b6bd7b461fd77949e9b Mon Sep 17 00:00:00 2001 From: Ruben Date: Fri, 10 Mar 2023 09:36:55 -0400 Subject: [PATCH 1/4] fix m1 tests Signed-off-by: Ruben --- package-lock.json | 4 +-- .../balance/components/ChainSelector.test.tsx | 4 +-- src/pages/signIn/SignIn.test.tsx | 5 ++-- src/pages/signIn/SignIn.tsx | 2 ++ .../authProvider/AuthProvider.test.tsx | 6 ++--- .../networkProvider/NetworkProvider.test.tsx | 26 ++++++++++++++++--- .../networkProvider/NetworkProvider.tsx | 7 +++++ 7 files changed, 41 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 36b4fb5b..068f9e54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "kuma-wallet", - "version": "0.0.1-alpha.1", + "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "kuma-wallet", - "version": "0.0.1-alpha.1", + "version": "0.0.1", "license": "MIT", "dependencies": { "@floating-ui/react": "^0.20.1", diff --git a/src/pages/balance/components/ChainSelector.test.tsx b/src/pages/balance/components/ChainSelector.test.tsx index 43949f9a..4d938f4f 100644 --- a/src/pages/balance/components/ChainSelector.test.tsx +++ b/src/pages/balance/components/ChainSelector.test.tsx @@ -69,8 +69,8 @@ describe("ChainSelector", () => { await act(() => { fireEvent.click(button); }); - waitFor(() => { - const account = screen.getByText(CHAINS[0].name); + await waitFor(() => { + const account = screen.getByText(CHAINS[0].chains[0].name); expect(account).toBeDefined(); }); }); diff --git a/src/pages/signIn/SignIn.test.tsx b/src/pages/signIn/SignIn.test.tsx index ea39c2e4..b6d0dd3e 100644 --- a/src/pages/signIn/SignIn.test.tsx +++ b/src/pages/signIn/SignIn.test.tsx @@ -29,7 +29,7 @@ describe("SignIn", () => { })); vi.mock("@src/Extension", () => ({ - signIn: () => signIn(), + default: { signIn: () => signIn() }, })); }); @@ -47,7 +47,8 @@ describe("SignIn", () => { fireEvent.change(passwordInput, { target: { value: "Test.123" } }); fireEvent.click(button); }); - waitFor(() => expect(signIn).toHaveBeenCalled()); + + expect(signIn).toHaveBeenCalledOnce(); }); it("should go to forgot password", async () => { diff --git a/src/pages/signIn/SignIn.tsx b/src/pages/signIn/SignIn.tsx index 10d7da99..75102e48 100644 --- a/src/pages/signIn/SignIn.tsx +++ b/src/pages/signIn/SignIn.tsx @@ -22,7 +22,9 @@ export const SignIn = () => { const signIn = async () => { try { + console.log("signIn"); await Extension?.signIn(password); + console.log("adios"); navigate(BALANCE); } catch (error) { showErrorToast(tCommon(error as string)); diff --git a/src/providers/authProvider/AuthProvider.test.tsx b/src/providers/authProvider/AuthProvider.test.tsx index 1ed927a6..ff8b3f00 100644 --- a/src/providers/authProvider/AuthProvider.test.tsx +++ b/src/providers/authProvider/AuthProvider.test.tsx @@ -98,7 +98,7 @@ const renderComponent = (accountForm: AccountFormType) => { describe("AuthProvider", () => { beforeAll(() => { vi.mock("@src/Extension", () => ({ - defualt: { + default: { createAccounts: vi.fn().mockResolvedValue(true), isUnlocked: vi.fn().mockResolvedValue(true), importAccount: vi.fn().mockResolvedValue(true), @@ -124,10 +124,10 @@ describe("AuthProvider", () => { it("should return true", async () => { renderComponent(mockAccountForm); - act(() => { + await act(() => { fireEvent.click(screen.getByTestId(testIds.createBtn)); }); - waitFor(() => + await waitFor(() => expect(screen.getByTestId(testIds.createResponse).innerHTML).toEqual( "true" ) diff --git a/src/providers/networkProvider/NetworkProvider.test.tsx b/src/providers/networkProvider/NetworkProvider.test.tsx index 89541770..d7946392 100644 --- a/src/providers/networkProvider/NetworkProvider.test.tsx +++ b/src/providers/networkProvider/NetworkProvider.test.tsx @@ -170,8 +170,17 @@ describe("NetworkProvider", () => { }); describe("useEffect", () => { it("should init", async () => { + const Extension: any = await import("@src/Extension"); + Extension.default.getNetwork = vi + .fn() + .mockResolvedValue({ chain: selectedWASMChainMock }); + + Extension.default.getSelectedAccount = vi + .fn() + .mockResolvedValue(selectedWASMAccountMock); + renderComponent({}); - waitFor(() => { + await waitFor(() => { const state = JSON.parse(screen.getByTestId(testIds.state).innerHTML); expect(state).toHaveProperty("type", "WASM"); expect(state).toHaveProperty("rpc", selectedWASMChainMock.rpc.wasm); @@ -255,14 +264,23 @@ describe("NetworkProvider", () => { }); describe("setNewRpc", () => { it("should keep the current rpc", async () => { + const Extension: any = await import("@src/Extension"); + Extension.default.getNetwork = vi + .fn() + .mockResolvedValue({ chain: selectedWASMChainMock }); + + Extension.default.getSelectedAccount = vi + .fn() + .mockResolvedValue(selectedWASMAccountMock); + renderComponent(); - act(() => { + await act(() => { fireEvent.click(screen.getByTestId(testIds.selectedBtn)); }); - act(() => { + await act(() => { fireEvent.click(screen.getByTestId(testIds.newRpcBtn)); }); - waitFor(() => + await waitFor(() => expect( JSON.parse(screen.getByTestId(testIds.state).innerHTML) ).toHaveProperty("rpc", selectedWASMChainMock.rpc.wasm) diff --git a/src/providers/networkProvider/NetworkProvider.tsx b/src/providers/networkProvider/NetworkProvider.tsx index d9cb759c..d3057b65 100644 --- a/src/providers/networkProvider/NetworkProvider.tsx +++ b/src/providers/networkProvider/NetworkProvider.tsx @@ -87,13 +87,20 @@ export const NetworkProvider: FC = ({ children }) => { let rpc = ""; let type = ""; + // console.log("selectedNetwork", selectedNetwork); + if (selectedNetwork?.chain?.name) { const account = await Extension.getSelectedAccount(); + // console.log("selectedAccount", account); selectedChain = selectedNetwork?.chain; type = getAccountType(account?.type); rpc = selectedChain.rpc[type.toLowerCase() as "evm" | "wasm"] || ""; } + // console.log({ + // rpc, + // }); + dispatch({ type: "init", payload: { From 93a5cf7021bc2a8b23bb5067d140968219376b8a Mon Sep 17 00:00:00 2001 From: Ruben Date: Fri, 10 Mar 2023 10:13:06 -0400 Subject: [PATCH 2/4] fix more tests Signed-off-by: Ruben --- src/hooks/common/useLoading.test.tsx | 18 +++---- src/hooks/common/useLoading.tsx | 6 +-- .../advanced_settings/ManageNetworks.tsx | 1 - src/pages/signIn/SignIn.tsx | 2 - .../authProvider/AuthProvider.test.tsx | 47 +++++++++++-------- 5 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/hooks/common/useLoading.test.tsx b/src/hooks/common/useLoading.test.tsx index d7068627..a9de4ebf 100644 --- a/src/hooks/common/useLoading.test.tsx +++ b/src/hooks/common/useLoading.test.tsx @@ -1,26 +1,22 @@ -import { act, fireEvent, renderHook, waitFor } from "@testing-library/react"; +import { act, renderHook } from "@testing-library/react"; import { useLoading } from "./useLoading"; describe("useLoading", () => { it("should set isLoading to true", () => { - const { - result: { current }, - } = renderHook(() => useLoading()); + const { result } = renderHook(() => useLoading()); act(() => { - current.starLoading(); + result.current.starLoading(); }); - waitFor(() => expect(current.isLoading).toBe(true)); + expect(result.current.isLoading).toBe(true); }); it("should set isLoading to false", () => { - const { - result: { current }, - } = renderHook(() => useLoading(true)); + const { result } = renderHook(() => useLoading(true)); act(() => { - current.endLoading(); + result.current.endLoading(); }); - waitFor(() => expect(current.isLoading).toBe(false)); + expect(result.current.isLoading).toBe(false); }); }); diff --git a/src/hooks/common/useLoading.tsx b/src/hooks/common/useLoading.tsx index 6e7d9f51..b5e17685 100644 --- a/src/hooks/common/useLoading.tsx +++ b/src/hooks/common/useLoading.tsx @@ -1,11 +1,11 @@ -import { useState } from "react"; +import { useState, useCallback } from "react"; export const useLoading = (defaultState = false) => { const [isLoading, setIsLoading] = useState(defaultState); - const starLoading = () => setIsLoading(true); + const starLoading = useCallback(() => setIsLoading(true), []); - const endLoading = () => setIsLoading(false); + const endLoading = useCallback(() => setIsLoading(false), []); return { isLoading, diff --git a/src/pages/settings/advanced_settings/ManageNetworks.tsx b/src/pages/settings/advanced_settings/ManageNetworks.tsx index 2ad57d71..ac9847c0 100644 --- a/src/pages/settings/advanced_settings/ManageNetworks.tsx +++ b/src/pages/settings/advanced_settings/ManageNetworks.tsx @@ -25,7 +25,6 @@ export const ManageNetworks = () => { const getNetworks = async () => { try { const networks = await Extension.getAllChains(); - console.log(networks); setNetworks(networks); } catch (error) { setNetworks([]); diff --git a/src/pages/signIn/SignIn.tsx b/src/pages/signIn/SignIn.tsx index 75102e48..10d7da99 100644 --- a/src/pages/signIn/SignIn.tsx +++ b/src/pages/signIn/SignIn.tsx @@ -22,9 +22,7 @@ export const SignIn = () => { const signIn = async () => { try { - console.log("signIn"); await Extension?.signIn(password); - console.log("adios"); navigate(BALANCE); } catch (error) { showErrorToast(tCommon(error as string)); diff --git a/src/providers/authProvider/AuthProvider.test.tsx b/src/providers/authProvider/AuthProvider.test.tsx index ff8b3f00..bc4caa5a 100644 --- a/src/providers/authProvider/AuthProvider.test.tsx +++ b/src/providers/authProvider/AuthProvider.test.tsx @@ -103,6 +103,7 @@ describe("AuthProvider", () => { isUnlocked: vi.fn().mockResolvedValue(true), importAccount: vi.fn().mockResolvedValue(true), restorePassword: vi.fn().mockResolvedValue(true), + deriveAccount: vi.fn().mockResolvedValue(true), }, })); }); @@ -150,27 +151,33 @@ describe("AuthProvider", () => { describe("importAccount", () => { it("should return true", async () => { + const Extension = await import("@src/Extension"); + Extension.default.isUnlocked = vi.fn().mockReturnValue(true); + renderComponent(mockAccountForm); act(() => { fireEvent.click(screen.getByTestId(testIds.importBtn)); }); - waitFor(() => + await waitFor(() => { expect(screen.getByTestId(testIds.importResonse).innerHTML).toEqual( "true" - ) - ); + ); + }); }); it("should return password_required error", async () => { + const Extension = await import("@src/Extension"); + Extension.default.isUnlocked = vi.fn().mockReturnValue(false); + renderComponent({ ...mockAccountForm, password: "" }); - act(() => { + await act(() => { fireEvent.click(screen.getByTestId(testIds.importBtn)); }); - waitFor(() => + await waitFor(() => expect(screen.getByTestId(testIds.importResonse).innerHTML).toEqual( "false" ) @@ -180,11 +187,11 @@ describe("AuthProvider", () => { it("should return private_key_or_seed_required error", async () => { renderComponent({ ...mockAccountForm, privateKeyOrSeed: "" }); - act(() => { + await act(() => { fireEvent.click(screen.getByTestId(testIds.importBtn)); }); - waitFor(() => + await waitFor(() => expect(screen.getByTestId(testIds.importResonse).innerHTML).toEqual( "false" ) @@ -194,11 +201,11 @@ describe("AuthProvider", () => { it("should return account_type_required error", async () => { renderComponent({ ...mockAccountForm, accountType: undefined }); - act(() => { + await act(() => { fireEvent.click(screen.getByTestId(testIds.importBtn)); }); - waitFor(() => + await waitFor(() => expect(screen.getByTestId(testIds.importResonse).innerHTML).toEqual( "false" ) @@ -208,13 +215,15 @@ describe("AuthProvider", () => { describe("deriveAccount", () => { it("should return true", async () => { + const Extension = await import("@src/Extension"); + Extension.default.isUnlocked = vi.fn().mockReturnValue(true); renderComponent(mockAccountForm); - act(() => { + await act(() => { fireEvent.click(screen.getByTestId(testIds.deriveBtn)); }); - waitFor(() => + await waitFor(() => expect(screen.getByTestId(testIds.deriveResponse).innerHTML).toEqual( "true" ) @@ -224,11 +233,11 @@ describe("AuthProvider", () => { it("should return account_type_required error", async () => { renderComponent({ ...mockAccountForm, accountType: undefined }); - act(() => { + await act(() => { fireEvent.click(screen.getByTestId(testIds.deriveBtn)); }); - waitFor(() => + await waitFor(() => expect(screen.getByTestId(testIds.deriveResponse).innerHTML).toEqual( "false" ) @@ -240,11 +249,11 @@ describe("AuthProvider", () => { it("should return true", async () => { renderComponent(mockAccountForm); - act(() => { + await act(() => { fireEvent.click(screen.getByTestId(testIds.restoreBtn)); }); - waitFor(() => + await waitFor(() => expect(screen.getByTestId(testIds.restoreResponse).innerHTML).toEqual( "true" ) @@ -254,11 +263,11 @@ describe("AuthProvider", () => { it("should return recovery_phrase_required error", async () => { renderComponent({ ...mockAccountForm, privateKeyOrSeed: undefined }); - act(() => { + await act(() => { fireEvent.click(screen.getByTestId(testIds.restoreBtn)); }); - waitFor(() => + await waitFor(() => expect(screen.getByTestId(testIds.restoreResponse).innerHTML).toEqual( "false" ) @@ -268,11 +277,11 @@ describe("AuthProvider", () => { it("should return password_required error", async () => { renderComponent({ ...mockAccountForm, password: undefined }); - act(() => { + await act(() => { fireEvent.click(screen.getByTestId(testIds.restoreBtn)); }); - waitFor(() => + await waitFor(() => expect(screen.getByTestId(testIds.restoreResponse).innerHTML).toEqual( "false" ) From b2b957def074b7e0e0afa58d5d8b81e4bdb6696d Mon Sep 17 00:00:00 2001 From: Ruben Date: Fri, 10 Mar 2023 10:39:56 -0400 Subject: [PATCH 3/4] fix tests warnings Signed-off-by: Ruben --- src/providers/accountProvider/AccountProvider.test.tsx | 10 +++++++--- src/providers/authProvider/AuthProvider.test.tsx | 10 +++++++--- src/providers/networkProvider/NetworkProvider.test.tsx | 10 +++++++--- src/tests/setup.ts | 4 ++++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/providers/accountProvider/AccountProvider.test.tsx b/src/providers/accountProvider/AccountProvider.test.tsx index ad1dd064..39378faa 100644 --- a/src/providers/accountProvider/AccountProvider.test.tsx +++ b/src/providers/accountProvider/AccountProvider.test.tsx @@ -9,6 +9,8 @@ import { import { AccountProvider, useAccountContext } from "./AccountProvider"; import { selectedEVMAccountMock } from "../../tests/mocks/account-mocks"; import Account from "@src/storage/entities/Account"; +import { I18nextProvider } from "react-i18next"; +import i18n from "@src/utils/i18n"; const testIds = { createAccount: "create-account", @@ -61,9 +63,11 @@ const TestComponent = () => { const renderComponent = () => { return render( - - - + + + + + ); }; diff --git a/src/providers/authProvider/AuthProvider.test.tsx b/src/providers/authProvider/AuthProvider.test.tsx index bc4caa5a..7145e18f 100644 --- a/src/providers/authProvider/AuthProvider.test.tsx +++ b/src/providers/authProvider/AuthProvider.test.tsx @@ -10,6 +10,8 @@ import { vi } from "vitest"; import { FC, useState } from "react"; import { AccountFormType } from "@src/pages"; import { AccountType } from "@src/accounts/types"; +import { I18nextProvider } from "react-i18next"; +import i18n from "@src/utils/i18n"; interface ResponseState { create: null | boolean; @@ -89,9 +91,11 @@ const mockAccountForm: AccountFormType = { const renderComponent = (accountForm: AccountFormType) => { return render( - - - + + + + + ); }; diff --git a/src/providers/networkProvider/NetworkProvider.test.tsx b/src/providers/networkProvider/NetworkProvider.test.tsx index d7946392..109d9220 100644 --- a/src/providers/networkProvider/NetworkProvider.test.tsx +++ b/src/providers/networkProvider/NetworkProvider.test.tsx @@ -18,6 +18,8 @@ import { selectedMultiSupportChain, } from "../../tests/mocks/chain-mocks"; import { selectedWASMAccountMock } from "../../tests/mocks/account-mocks"; +import { I18nextProvider } from "react-i18next"; +import i18n from "@src/utils/i18n"; const initialState: InitialState = { chains: CHAINS, @@ -65,9 +67,11 @@ const TestComponent: FC = ({ newChain, type }) => { const renderComponent = (props?: TestComponentProps) => { return render( - - - + + + + + ); }; diff --git a/src/tests/setup.ts b/src/tests/setup.ts index e444f388..a2aa3e92 100644 --- a/src/tests/setup.ts +++ b/src/tests/setup.ts @@ -6,6 +6,10 @@ import { vi } from "vitest"; // extends Vitest's expect method with methods from react-testing-library expect.extend(matchers); +beforeEach(() => { + (globalThis as any).IS_REACT_ACT_ENVIRONMENT = true; +}); + // runs a cleanup after each test case (e.g. clearing jsdom) afterEach(() => { cleanup(); From b63c5ac892553698536d7b527b922285c4115e87 Mon Sep 17 00:00:00 2001 From: Ruben Date: Fri, 10 Mar 2023 10:54:37 -0400 Subject: [PATCH 4/4] add setup to tests Signed-off-by: Ruben --- src/pages/balance/components/ChainSelector.test.tsx | 2 ++ src/providers/authProvider/AuthProvider.test.tsx | 4 ++-- vite.config.ts | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/pages/balance/components/ChainSelector.test.tsx b/src/pages/balance/components/ChainSelector.test.tsx index 4d938f4f..4d3933a8 100644 --- a/src/pages/balance/components/ChainSelector.test.tsx +++ b/src/pages/balance/components/ChainSelector.test.tsx @@ -88,6 +88,8 @@ describe("ChainSelector", () => { expect(account).toBeDefined(); }); const account = screen.getByText(CHAINS[0].chains[1].name); + + (globalThis as any).IS_REACT_ACT_ENVIRONMENT = true; await act(() => { fireEvent.click(account.parentElement as HTMLElement); }); diff --git a/src/providers/authProvider/AuthProvider.test.tsx b/src/providers/authProvider/AuthProvider.test.tsx index 7145e18f..15cc51fb 100644 --- a/src/providers/authProvider/AuthProvider.test.tsx +++ b/src/providers/authProvider/AuthProvider.test.tsx @@ -267,7 +267,7 @@ describe("AuthProvider", () => { it("should return recovery_phrase_required error", async () => { renderComponent({ ...mockAccountForm, privateKeyOrSeed: undefined }); - await act(() => { + act(() => { fireEvent.click(screen.getByTestId(testIds.restoreBtn)); }); @@ -281,7 +281,7 @@ describe("AuthProvider", () => { it("should return password_required error", async () => { renderComponent({ ...mockAccountForm, password: undefined }); - await act(() => { + act(() => { fireEvent.click(screen.getByTestId(testIds.restoreBtn)); }); diff --git a/vite.config.ts b/vite.config.ts index 3d85bb65..911a8061 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -36,6 +36,7 @@ export default defineConfig({ test: { globals: true, environment: "jsdom", + setupFiles: "src/tests/setup.ts", coverage: { exclude: [ ...(configDefaults.coverage.exclude as string[]),