From dac771bbedecca010c1d7f28ef0d2b69dfb002e3 Mon Sep 17 00:00:00 2001 From: Steven Straatemans Date: Fri, 17 Jan 2025 09:35:41 +0100 Subject: [PATCH] set createcontract isAllowed option and unit tests --- .../rwa-demo/src/app/(app)/assets/page.tsx | 9 +- .../components/AssetForm/AssetStepperForm.tsx | 8 +- .../__tests__/batchTransferTokens.test.ts | 1 - .../hooks/__tests__/createContract.test.ts | 98 +++++++++++++++++++ .../apps/rwa-demo/src/hooks/createContract.ts | 11 ++- 5 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 packages/apps/rwa-demo/src/hooks/__tests__/createContract.test.ts diff --git a/packages/apps/rwa-demo/src/app/(app)/assets/page.tsx b/packages/apps/rwa-demo/src/app/(app)/assets/page.tsx index 2424b47df0..05e5494fde 100644 --- a/packages/apps/rwa-demo/src/app/(app)/assets/page.tsx +++ b/packages/apps/rwa-demo/src/app/(app)/assets/page.tsx @@ -5,6 +5,7 @@ import { Confirmation } from '@/components/Confirmation/Confirmation'; import { SideBarBreadcrumbs } from '@/components/SideBarBreadcrumbs/SideBarBreadcrumbs'; import { useAccount } from '@/hooks/account'; import { useAsset } from '@/hooks/asset'; +import { useCreateContract } from '@/hooks/createContract'; import { MonoAdd, MonoDelete, MonoFindInPage } from '@kadena/kode-icons'; import { Button } from '@kadena/kode-ui'; import { @@ -26,6 +27,7 @@ import { useState } from 'react'; const Assets = () => { const { account } = useAccount(); const { assets, removeAsset, setAsset, getAsset } = useAsset(); + const { isAllowed } = useCreateContract(); const { addNotification } = useNotifications(); const [openSide, setOpenSide] = useState(false); const { setIsRightAsideExpanded, isRightAsideExpanded } = useLayout(); @@ -72,7 +74,12 @@ const Assets = () => { actions={ }> + } diff --git a/packages/apps/rwa-demo/src/components/AssetForm/AssetStepperForm.tsx b/packages/apps/rwa-demo/src/components/AssetForm/AssetStepperForm.tsx index fd5eda3192..bf08d212bf 100644 --- a/packages/apps/rwa-demo/src/components/AssetForm/AssetStepperForm.tsx +++ b/packages/apps/rwa-demo/src/components/AssetForm/AssetStepperForm.tsx @@ -31,7 +31,7 @@ export const AssetStepperForm: FC = ({ handleDone }) => { const [step, setStep] = useState(STEPS.START); const { addAsset, setAsset } = useAsset(); const { data: namespace } = useGetPrincipalNamespace(); - const { submit: submitContract } = useCreateContract(); + const { submit: submitContract, isAllowed } = useCreateContract(); const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(false); const router = useRouter(); @@ -96,6 +96,7 @@ export const AssetStepperForm: FC = ({ handleDone }) => { or )} diff --git a/packages/apps/rwa-demo/src/hooks/__tests__/batchTransferTokens.test.ts b/packages/apps/rwa-demo/src/hooks/__tests__/batchTransferTokens.test.ts index 9b22a1240c..7818a526f0 100644 --- a/packages/apps/rwa-demo/src/hooks/__tests__/batchTransferTokens.test.ts +++ b/packages/apps/rwa-demo/src/hooks/__tests__/batchTransferTokens.test.ts @@ -1,6 +1,5 @@ import { renderHook } from '@testing-library/react-hooks'; import { useBatchTransferTokens } from '../batchTransferTokens'; -import { useGetInvestors } from '../getInvestors'; describe('batchTransferTokens hook', () => { const mocksHook = vi.hoisted(() => { diff --git a/packages/apps/rwa-demo/src/hooks/__tests__/createContract.test.ts b/packages/apps/rwa-demo/src/hooks/__tests__/createContract.test.ts new file mode 100644 index 0000000000..85177f7c92 --- /dev/null +++ b/packages/apps/rwa-demo/src/hooks/__tests__/createContract.test.ts @@ -0,0 +1,98 @@ +import { renderHook } from '@testing-library/react-hooks'; +import { useCreateContract } from '../createContract'; + +describe('createContract hook', () => { + const mocksHook = vi.hoisted(() => { + return { + useAccount: vi.fn().mockReturnValue({ + account: { + address: 'k:he-man', + }, + sign: vi.fn(), + isMounted: true, + isGasPayable: false, + }), + + useTransactions: vi.fn().mockReturnValue({ + addTransaction: vi.fn(), + }), + useNotifications: vi.fn().mockReturnValue({ + addNotification: vi.fn(), + }), + }; + }); + + beforeEach(async () => { + vi.mock('./../account', async () => { + const actual = await vi.importActual('./../account'); + return { + ...actual, + useAccount: mocksHook.useAccount, + }; + }); + + vi.mock('./../transactions', async () => { + const actual = await vi.importActual('./../transactions'); + return { + ...actual, + useTransactions: mocksHook.useTransactions, + }; + }); + + vi.mock('@kadena/kode-ui/patterns', async () => { + const actual = await vi.importActual('@kadena/kode-ui/patterns'); + return { + ...actual, + useNotifications: mocksHook.useNotifications, + }; + }); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it('should return the correct properties', async () => { + const { result } = renderHook(() => useCreateContract()); + expect(result.current.hasOwnProperty('isAllowed')).toBe(true); + expect(result.current.hasOwnProperty('submit')).toBe(true); + }); + + describe('isAllowed', () => { + it('should return true, when account is Mounted, when gasisPayable', () => { + mocksHook.useAccount.mockImplementation(() => ({ + ...mocksHook.useAccount.getMockImplementation(), + isMounted: true, + isGasPayable: true, + })); + + const { result } = renderHook(() => useCreateContract()); + + expect(result.current.isAllowed).toBe(true); + }); + + it('should return false, when account is NOT Mounted, when gasisPayable', () => { + mocksHook.useAccount.mockImplementation(() => ({ + ...mocksHook.useAccount.getMockImplementation(), + isMounted: false, + isGasPayable: true, + })); + + const { result } = renderHook(() => useCreateContract()); + + expect(result.current.isAllowed).toBe(false); + }); + + it('should return false, when account is Mounted, when NOT gasisPayable', () => { + mocksHook.useAccount.mockImplementation(() => ({ + ...mocksHook.useAccount.getMockImplementation(), + isMounted: true, + isGasPayable: false, + })); + + const { result } = renderHook(() => useCreateContract()); + + expect(result.current.isAllowed).toBe(false); + }); + }); +}); diff --git a/packages/apps/rwa-demo/src/hooks/createContract.ts b/packages/apps/rwa-demo/src/hooks/createContract.ts index db6ff09976..e0ffd00e81 100644 --- a/packages/apps/rwa-demo/src/hooks/createContract.ts +++ b/packages/apps/rwa-demo/src/hooks/createContract.ts @@ -7,11 +7,13 @@ import type { IAddContractProps } from '@/services/createContract'; import { createContract } from '@/services/createContract'; import { getClient } from '@/utils/client'; import { useNotifications } from '@kadena/kode-ui/patterns'; +import { useEffect, useState } from 'react'; import { useAccount } from './account'; import { useTransactions } from './transactions'; export const useCreateContract = () => { - const { account, sign } = useAccount(); + const { account, isMounted, sign, isGasPayable } = useAccount(); + const [isAllowed, setIsAllowed] = useState(false); const { addTransaction } = useTransactions(); const { addNotification } = useNotifications(); @@ -54,5 +56,10 @@ export const useCreateContract = () => { } }; - return { submit }; + useEffect(() => { + if (!isMounted) return; + setIsAllowed(isGasPayable); + }, [isMounted, isGasPayable]); + + return { submit, isAllowed }; };