diff --git a/src/modules/wallets/wallet-activity-invalid-address.integration.test.ts b/src/modules/wallets/wallet-activity-invalid-address.integration.test.ts index db20a1a..80620ee 100644 --- a/src/modules/wallets/wallet-activity-invalid-address.integration.test.ts +++ b/src/modules/wallets/wallet-activity-invalid-address.integration.test.ts @@ -1,71 +1,96 @@ import request from 'supertest'; +import { prisma } from '../../utils/prisma.utils'; + +jest.mock('../../utils/prisma.utils', () => ({ + prisma: { + activity: { + findMany: jest.fn(), + count: jest.fn(), + }, + creatorProfile: { + findMany: jest.fn(), + }, + }, +})); + import app from '../../app'; +const mockPrisma = prisma as unknown as { + activity: { findMany: jest.Mock; count: jest.Mock }; + creatorProfile: { findMany: jest.Mock }; +}; + +const VALID_ADDRESS = 'GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF'; + describe('GET /api/v1/wallets/:address/activity - Malformed Stellar Address', () => { - it('should return 400 for address with wrong prefix', async () => { - const response = await request(app) - .get( - '/api/v1/wallets/XBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB/activity' - ) - .expect(400); - - expect(response.body.error).toBeDefined(); - expect(response.body.details).toBeDefined(); - expect( - response.body.details.some((d: any) => d.field === 'address') - ).toBeTruthy(); - }); - - it('should return 400 for too-short address', async () => { - const response = await request(app) - .get('/api/v1/wallets/GASHORT/activity') - .expect(400); - - expect(response.body.error).toBeDefined(); - expect(response.body.details).toBeDefined(); - expect( - response.body.details.some((d: any) => d.field === 'address') - ).toBeTruthy(); - }); - - it('should return 400 for address with invalid characters', async () => { - const response = await request(app) - .get( - '/api/v1/wallets/GA!!!INVALID!!!CHARACTERS!!!HERE!!!AAAAAAAAAAAAAAAAA/activity' - ) - .expect(400); - - expect(response.body.error).toBeDefined(); - expect(response.body.details).toBeDefined(); - expect( - response.body.details.some((d: any) => d.field === 'address') - ).toBeTruthy(); - }); - - it('should return 400 for completely invalid address format', async () => { - const response = await request(app) - .get('/api/v1/wallets/not-a-stellar-address/activity') - .expect(400); - - expect(response.body.error).toBeDefined(); - expect(response.body.details).toBeDefined(); - expect( - response.body.details.some((d: any) => d.field === 'address') - ).toBeTruthy(); - }); - - it('should not return 400 for valid Stellar address format', async () => { - // Using a properly formatted Stellar address (may return 200 with empty data or 404) - const response = await request(app) - .get( - '/api/v1/wallets/GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF/activity' - ) - .expect(res => { - // Should be 200 (valid request) or potentially 404 (wallet not found) - // But NOT 400 (validation error) - expect([200, 404]).toContain(res.status); - }); - - expect(response.status).not.toBe(400); - }); + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should return 400 for address with wrong prefix', async () => { + const response = await request(app) + .get( + '/api/v1/wallets/XBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB/activity' + ) + .expect(400); + + expect(response.body.error).toBeDefined(); + expect(response.body.error.details).toBeDefined(); + expect( + response.body.error.details.some((d: any) => d.field === 'address') + ).toBeTruthy(); + }); + + it('should return 400 for too-short address', async () => { + const response = await request(app) + .get('/api/v1/wallets/GASHORT/activity') + .expect(400); + + expect(response.body.error).toBeDefined(); + expect(response.body.error.details).toBeDefined(); + expect( + response.body.error.details.some((d: any) => d.field === 'address') + ).toBeTruthy(); + }); + + it('should return 400 for address with invalid characters', async () => { + const response = await request(app) + .get( + '/api/v1/wallets/GA!!!INVALID!!!CHARACTERS!!!HERE!!!AAAAAAAAAAAAAAAAA/activity' + ) + .expect(400); + + expect(response.body.error).toBeDefined(); + expect(response.body.error.details).toBeDefined(); + expect( + response.body.error.details.some((d: any) => d.field === 'address') + ).toBeTruthy(); + }); + + it('should return 400 for completely invalid address format', async () => { + const response = await request(app) + .get('/api/v1/wallets/not-a-stellar-address/activity') + .expect(400); + + expect(response.body.error).toBeDefined(); + expect(response.body.error.details).toBeDefined(); + expect( + response.body.error.details.some((d: any) => d.field === 'address') + ).toBeTruthy(); + }); + + it('should return 200 with empty data array for a valid Stellar address with no trade history', async () => { + mockPrisma.activity.findMany.mockResolvedValue([]); + mockPrisma.activity.count.mockResolvedValue(0); + mockPrisma.creatorProfile.findMany.mockResolvedValue([]); + + const response = await request(app) + .get(`/api/v1/wallets/${VALID_ADDRESS}/activity`) + .expect(200); + + expect(response.body.success).toBe(true); + expect(response.body.data.items).toEqual([]); + expect(response.body.data.meta.total).toBe(0); + expect(response.body.data.meta.hasMore).toBe(false); + }); });