Skip to content

Commit

Permalink
Merge branch 'main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
chiscookeke11 authored Jan 31, 2025
2 parents 31a6e70 + 050ab18 commit a704038
Show file tree
Hide file tree
Showing 11 changed files with 904 additions and 1,716 deletions.
4 changes: 0 additions & 4 deletions frontend/babel.config.js

This file was deleted.

14 changes: 0 additions & 14 deletions frontend/jest.config.js

This file was deleted.

8 changes: 6 additions & 2 deletions frontend/jsconfig.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
{
"compilerOptions": {
"baseUrl": "src"
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
},
"allowJs": true
},
"include": ["src/**/*"]
"include": ["src/**/*", "src/**/*.jsx", "test/**/*"]
}
17 changes: 5 additions & 12 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@babel/core": "^7.26.7",
"@babel/preset-env": "^7.26.7",
"@babel/preset-react": "^7.26.3",
"@popperjs/core": "^2.11.8",
"@tailwindcss/vite": "^4.0.1",
"@tanstack/react-query": "^5.64.2",
Expand All @@ -14,8 +11,6 @@
"@testing-library/user-event": "^13.5.0",
"@vitejs/plugin-react": "^4.3.4",
"axios": "^1.7.7",
"babel-jest": "^29.7.0",
"babel-plugin-transform-import-meta": "^2.3.2",
"dotenv": "^16.4.5",
"lucide-react": "^0.454.0",
"react": "^19.0.0",
Expand All @@ -35,7 +30,7 @@
"build": "vite build",
"lint": "eslint .",
"preview": "vite preview",
"test": "jest",
"test": "vitest",
"format": "prettier --check . --write"
},
"options": {
Expand All @@ -58,21 +53,19 @@
]
},
"devDependencies": {
"@tanstack/eslint-plugin-query": "^5.60.1",
"@testing-library/jest-dom": "^6.6.2",
"@types/jest": "^29.5.14",
"clsx": "^2.1.1",
"@vitest/ui": "^3.0.4",
"eslint": "^8.57.1",
"eslint-config-prettier": "^9.1.0",
"eslint-config-react-app": "^7.0.1",
"eslint-plugin-react": "^7.37.2",
"eslint-plugin-react-hooks": "^5.0.0",
"globals": "^15.11.0",
"jest": "^27.5.1",
"jsdom": "^26.0.0",
"prettier": "^3.3.3",
"prettier-plugin-tailwindcss": "^0.6.11",
"starknet": "^6.11.0",
"tailwind-merge": "^2.6.0",
"vite-plugin-svgr": "^4.3.0"
"vite-plugin-svgr": "^4.3.0",
"vitest": "^3.0.4"
}
}
8 changes: 5 additions & 3 deletions frontend/test/__mocks__/get-starknet.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import { vi } from 'vitest';

const mockStarknet = {
isConnected: true,
account: {
deployContract: jest.fn().mockResolvedValue({
deployContract: vi.fn().mockResolvedValue({
transaction_hash: '0xabc...',
contract_address: '0xdef...',
}),
waitForTransaction: jest.fn().mockResolvedValue(true),
waitForTransaction: vi.fn().mockResolvedValue(true),
},
};

export const connect = jest.fn().mockResolvedValue(mockStarknet);
export const connect = vi.fn().mockResolvedValue(mockStarknet);
120 changes: 45 additions & 75 deletions frontend/test/services/contract.test.js
Original file line number Diff line number Diff line change
@@ -1,48 +1,54 @@
//contract.test.js
import { connect } from 'starknetkit';
import { getWallet } from '../../src/services/wallet';
import { axiosInstance } from '../../src/utils/axios';
import { deployContract, checkAndDeployContract } from '../../src/services/contract';
import { getDeployContractData } from '../../src/utils/constants';
import { vi, describe, it, expect, beforeEach } from 'vitest';

// Mock dependencies
jest.mock('starknetkit', () => ({
connect: jest.fn(),
vi.mock('starknetkit', () => ({
connect: vi.fn(),
}));
jest.mock('../../src/services/wallet', () => ({
getWallet: jest.fn(),
vi.mock('../../src/services/wallet', () => ({
getWallet: vi.fn(),
}));
jest.mock('../../src/utils/axios');
jest.mock('../../src/utils/constants');
jest.mock('../../src/components/layout/notifier/Notifier', () => ({
notify: jest.fn(),
ToastWithLink: jest.fn(),
vi.mock('../../src/utils/axios');
vi.mock('../../src/utils/constants');
vi.mock('../../src/components/layout/notifier/Notifier', () => ({
notify: vi.fn(),
ToastWithLink: vi.fn(),
}));

describe('Contract Deployment Tests', () => {
const mockWalletId = '0x123...';
const mockTransactionHash = '0xabc...';
const mockContractAddress = '0xdef...';

beforeEach(() => {
jest.clearAllMocks();
// Common mock wallet setup
const createMockWallet = (overrides = {}) => ({
account: {
deployContract: vi.fn().mockResolvedValue({
transaction_hash: mockTransactionHash,
contract_address: mockContractAddress,
}),
waitForTransaction: vi.fn().mockResolvedValue(true),
...overrides,
},
});

beforeEach(() => {
vi.clearAllMocks();
getDeployContractData.mockReturnValue({
contractData: 'mockContractData',
});
vi.mocked(axiosInstance.get).mockReset();
vi.mocked(axiosInstance.post).mockReset();
});

describe('deployContract', () => {
it('should successfully deploy contract', async () => {
const mockWallet = {
account: {
deployContract: jest.fn().mockResolvedValue({
transaction_hash: mockTransactionHash,
contract_address: mockContractAddress,
}),
waitForTransaction: jest.fn().mockResolvedValue(true),
},
};

const mockWallet = createMockWallet();
getWallet.mockResolvedValue(mockWallet);

const result = await deployContract(mockWalletId);
Expand All @@ -52,7 +58,6 @@ describe('Contract Deployment Tests', () => {
contractData: 'mockContractData',
});
expect(mockWallet.account.waitForTransaction).toHaveBeenCalledWith(mockTransactionHash);

expect(result).toEqual({
transactionHash: mockTransactionHash,
contractAddress: mockContractAddress,
Expand All @@ -62,47 +67,27 @@ describe('Contract Deployment Tests', () => {
it('should handle deployment errors correctly', async () => {
const mockError = new Error('Deployment failed');
getWallet.mockRejectedValue(mockError);

await expect(deployContract(mockWalletId)).rejects.toThrow('Deployment failed');
});

it('should handle transaction waiting errors', async () => {
const mockWallet = {
account: {
deployContract: jest.fn().mockResolvedValue({
transaction_hash: mockTransactionHash,
contract_address: mockContractAddress,
}),
waitForTransaction: jest.fn().mockRejectedValue(new Error('Transaction failed')),
},
};

const mockWallet = createMockWallet({
waitForTransaction: vi.fn().mockRejectedValue(new Error('Transaction failed')),
});
getWallet.mockResolvedValue(mockWallet);

await expect(deployContract(mockWalletId)).rejects.toThrow('Transaction failed');
});
});

describe('checkAndDeployContract', () => {
it('should deploy contract if not already deployed', async () => {
// Mock the API check for undeployed contract
axiosInstance.get.mockResolvedValue({
vi.mocked(axiosInstance.get).mockResolvedValue({
data: { is_contract_deployed: false },
});

// Mock successful wallet and deployment
const mockWallet = {
account: {
deployContract: jest.fn().mockResolvedValue({
transaction_hash: mockTransactionHash,
contract_address: mockContractAddress,
}),
waitForTransaction: jest.fn().mockResolvedValue(true),
},
};

const mockWallet = createMockWallet();
getWallet.mockResolvedValue(mockWallet);
axiosInstance.post.mockResolvedValue({ data: 'success' });
vi.mocked(axiosInstance.post).mockResolvedValue({ data: 'success' });

await checkAndDeployContract(mockWalletId);

Expand All @@ -118,55 +103,40 @@ describe('Contract Deployment Tests', () => {
});

it('should skip deployment if contract already exists', async () => {
axiosInstance.get.mockResolvedValue({
vi.mocked(axiosInstance.get).mockResolvedValue({
data: { is_contract_deployed: true },
});

await checkAndDeployContract(mockWalletId);

expect(axiosInstance.get).toHaveBeenCalled();
expect(axiosInstance.get).toHaveBeenCalledWith(`/api/check-user?wallet_id=${mockWalletId}`);
expect(getWallet).not.toHaveBeenCalled();
expect(axiosInstance.post).not.toHaveBeenCalled();
});

it('should handle backend check errors correctly', async () => {
const mockError = new Error('Backend error');
axiosInstance.get.mockRejectedValue(mockError);

console.error = jest.fn();
vi.mocked(axiosInstance.get).mockRejectedValue(mockError);
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});

await checkAndDeployContract(mockWalletId);

expect(console.error).toHaveBeenCalledWith('Error checking contract status:', mockError);
expect(consoleSpy).toHaveBeenCalledWith('Error checking contract status:', mockError);
consoleSpy.mockRestore();
});

it('should handle contract update error correctly after deployment', async () => {
// Mock API check and successful deployment
axiosInstance.get.mockResolvedValue({
vi.mocked(axiosInstance.get).mockResolvedValue({
data: { is_contract_deployed: false },
});

const mockWallet = {
account: {
deployContract: jest.fn().mockResolvedValue({
transaction_hash: mockTransactionHash,
contract_address: mockContractAddress,
}),
waitForTransaction: jest.fn().mockResolvedValue(true),
},
};

const mockWallet = createMockWallet();
getWallet.mockResolvedValue(mockWallet);

// Mock backend update failure
const mockUpdateError = new Error('Update failed');
axiosInstance.post.mockRejectedValue(mockUpdateError);

console.error = jest.fn();
vi.mocked(axiosInstance.post).mockRejectedValue(mockUpdateError);
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});

await checkAndDeployContract(mockWalletId);

expect(console.error).toHaveBeenCalledWith('Error checking contract status:', mockUpdateError);
expect(consoleSpy).toHaveBeenCalledWith('Error checking contract status:', mockUpdateError);
consoleSpy.mockRestore();
});
});
});
Loading

0 comments on commit a704038

Please sign in to comment.