import { POST } from '@/app/api/email/route'; import { NextRequest, NextResponse } from 'next/server'; import nodemailermock from '@/app/__tests__/__mocks__/nodemailer'; jest.mock('next/server', () => ({ NextResponse: { json: jest.fn(), }, })); beforeAll(() => { jest.spyOn(console, 'error').mockImplementation(() => {}); }); afterAll(() => { (console.error as jest.Mock).mockRestore(); }); beforeEach(() => { nodemailermock.mock.reset(); process.env.NEXT_PUBLIC_MY_EMAIL = 'test@dki.one'; process.env.NEXT_PUBLIC_MY_PASSWORD = 'test-password'; }); describe('POST /api/email', () => { it('should send an email', async () => { const mockRequest = { json: jest.fn().mockResolvedValue({ email: 'test@example.com', name: 'Test User', message: 'Hello!', }), } as unknown as NextRequest; await POST(mockRequest); expect(NextResponse.json).toHaveBeenCalledWith({ message: 'Email sent' }); const sentEmails = nodemailermock.mock.getSentMail(); expect(sentEmails.length).toBe(1); expect(sentEmails[0].to).toBe('test@dki.one'); expect(sentEmails[0].text).toBe('Hello!\n\n' + 'test@example.com'); }); it('should return an error if EMAIL or PASSWORD is missing', async () => { delete process.env.NEXT_PUBLIC_MY_EMAIL; delete process.env.NEXT_PUBLIC_MY_PASSWORD; const mockRequest = { json: jest.fn().mockResolvedValue({ email: 'test@example.com', name: 'Test User', message: 'Hello!', }), } as unknown as NextRequest; await POST(mockRequest); expect(NextResponse.json).toHaveBeenCalledWith({ error: 'Missing EMAIL or PASSWORD' }, { status: 500 }); }); it('should return an error if request body is invalid', async () => { const mockRequest = { json: jest.fn().mockResolvedValue({ email: '', name: 'Test User', message: 'Test message', }), } as unknown as NextRequest; await POST(mockRequest); expect(NextResponse.json).toHaveBeenCalledWith({ error: 'Invalid request body' }, { status: 400 }); }); it('should return an error if sending email fails', async () => { nodemailermock.mock.setShouldFail(true); const mockRequest = { json: jest.fn().mockResolvedValue({ email: 'test@example.com', name: 'Test User', message: 'Hello!', }), } as unknown as NextRequest; await POST(mockRequest); expect(NextResponse.json).toHaveBeenCalledWith({ error: 'Failed to send email' }, { status: 500 }); }); });