From 8bd38ea62bac502eb33900df6be38459fd978d86 Mon Sep 17 00:00:00 2001
From: denshooter <44590296+denshooter@users.noreply.github.com>
Date: Sat, 22 Feb 2025 23:59:54 +0100
Subject: [PATCH] Dev (#46)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* 🚀 refactor: simplify deployment process in workflow file
* 🚀 chore: add IMAGE_NAME to GITHUB_ENV for deployment workflow
* ✨ chore: simplify deployment logging in workflow file
* 🚀 fix: correct container name in deployment script logic
* 🚀 refactor: rename job and streamline deployment steps
* Update README.md
* ✨ fix: prevent multiple form submissions in Contact component
* ✨ feat: honeypot and timestamp checks to form submission
* ✨ refactor: simplify contact form and improve UI elements
* ✨ feat: add responsive masonry layout for projects display
* ✨ style: Update project title size and improve layout visibility
* ✨ fix: remove unnecessary test assertions and improve act usage
---
app/__tests__/api/email.test.tsx | 8 ++++++
app/__tests__/components/Contact.test.tsx | 33 +++++++++++++++-------
app/__tests__/components/Projects.test.tsx | 1 -
app/api/email/route.tsx | 1 -
jest.setup.ts | 17 ++++++++++-
5 files changed, 47 insertions(+), 13 deletions(-)
diff --git a/app/__tests__/api/email.test.tsx b/app/__tests__/api/email.test.tsx
index b09c9fe..6d59b0c 100644
--- a/app/__tests__/api/email.test.tsx
+++ b/app/__tests__/api/email.test.tsx
@@ -8,6 +8,14 @@ jest.mock('next/server', () => ({
},
}));
+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';
diff --git a/app/__tests__/components/Contact.test.tsx b/app/__tests__/components/Contact.test.tsx
index 5c13912..d60d008 100644
--- a/app/__tests__/components/Contact.test.tsx
+++ b/app/__tests__/components/Contact.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen, fireEvent, waitFor } from '@testing-library/react';
+import { render, screen, fireEvent, waitFor, act } from '@testing-library/react';
import Contact from '@/app/components/Contact';
import '@testing-library/jest-dom';
@@ -28,16 +28,29 @@ describe('Contact', () => {
it('submits the form', async () => {
render();
+ // Wrap timer advancement in act
+ await act(async () => {
+ jest.advanceTimersByTime(3000);
+ });
- // Fast forward time to ensure the timestamp check passes
- jest.advanceTimersByTime(3000);
+ // Fire events inside act if needed
+ act(() => {
+ fireEvent.change(screen.getByPlaceholderText('Your Name'), {
+ target: { value: 'John Doe' },
+ });
+ fireEvent.change(screen.getByPlaceholderText('you@example.com'), {
+ target: { value: 'john@example.com' },
+ });
+ fireEvent.change(screen.getByPlaceholderText('Your Message...'), {
+ target: { value: 'Hello!' },
+ });
+ fireEvent.click(screen.getByLabelText('I accept the privacy policy.'));
+ fireEvent.click(screen.getByText('Send Message'));
+ });
- fireEvent.change(screen.getByPlaceholderText('Your Name'), { target: { value: 'John Doe' } });
- fireEvent.change(screen.getByPlaceholderText('you@example.com'), { target: { value: 'john@example.com' } });
- fireEvent.change(screen.getByPlaceholderText('Your Message...'), { target: { value: 'Hello!' } });
- fireEvent.click(screen.getByLabelText('I accept the privacy policy.'));
- fireEvent.click(screen.getByText('Send Message'));
-
- await waitFor(() => expect(screen.getByText('Email sent')).toBeInTheDocument());
+ // Wait for the result
+ await waitFor(() =>
+ expect(screen.getByText('Email sent')).toBeInTheDocument()
+ );
});
});
\ No newline at end of file
diff --git a/app/__tests__/components/Projects.test.tsx b/app/__tests__/components/Projects.test.tsx
index a4836d8..d50f1c7 100644
--- a/app/__tests__/components/Projects.test.tsx
+++ b/app/__tests__/components/Projects.test.tsx
@@ -38,7 +38,6 @@ describe('Projects', () => {
expect(screen.getByText('Hello bla bla bla bla')).toBeInTheDocument();
expect(screen.getByText('Blockchain Based Voting System')).toBeInTheDocument();
expect(screen.getByText('This project aims to revolutionize voting systems by leveraging blockchain to ensure security, transparency, and immutability.')).toBeInTheDocument();
- expect(screen.getByText('More to come')).toBeInTheDocument();
});
});
});
\ No newline at end of file
diff --git a/app/api/email/route.tsx b/app/api/email/route.tsx
index 76a1168..3d286ae 100644
--- a/app/api/email/route.tsx
+++ b/app/api/email/route.tsx
@@ -55,7 +55,6 @@ export async function POST(request: NextRequest) {
new Promise((resolve, reject) => {
transport.sendMail(mailOptions, function (err, info) {
if (!err) {
- console.log("Email sent");
resolve(info.response);
} else {
console.error("Error sending email:", err);
diff --git a/jest.setup.ts b/jest.setup.ts
index bf9f2b6..9f5a3ea 100644
--- a/jest.setup.ts
+++ b/jest.setup.ts
@@ -1 +1,16 @@
-import 'whatwg-fetch';
\ No newline at end of file
+import 'whatwg-fetch';
+import React from "react";
+
+jest.mock("react-responsive-masonry", () => ({
+ __esModule: true,
+ default: ({ children }: { children: React.ReactNode }) =>
+ React.createElement("div", null, children),
+ get ResponsiveMasonry() {
+ return ({ children }: { children: React.ReactNode }) =>
+ React.createElement("div", null, children);
+ },
+}));
+
+jest.mock('next/link', () => {
+ return ({ children }: { children: React.ReactNode }) => children;
+});
\ No newline at end of file