diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx
index bf0257a..b1ba814 100644
--- a/app/[locale]/layout.tsx
+++ b/app/[locale]/layout.tsx
@@ -71,9 +71,9 @@ export default async function RootLayout({
params,
}: {
children: React.ReactNode;
- params: { locale: string };
+ params: Promise<{ locale: string }>;
}) {
- const { locale } = params;
+ const { locale } = await params;
// Validate that the incoming `locale` is supported
if (locale !== "de") {
diff --git a/components/Layout.tsx b/components/Layout.tsx
index 7743d4f..cd2081a 100644
--- a/components/Layout.tsx
+++ b/components/Layout.tsx
@@ -1,6 +1,6 @@
"use client";
-import { AnimatePresence, m, LazyMotion, domAnimation } from "framer-motion";
+import { AnimatePresence, m } from "framer-motion";
import { ArrowUp, Home, Info, Menu, X } from "lucide-react";
import Image from "next/image";
import Link from "next/link";
diff --git a/tests/.gitkeep b/tests/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/contact.test.tsx b/tests/contact.test.tsx
deleted file mode 100644
index cf3b522..0000000
--- a/tests/contact.test.tsx
+++ /dev/null
@@ -1,97 +0,0 @@
-import { render, screen, fireEvent, waitFor } from '@testing-library/react'
-import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
-import Contact from '../app/kontakt/page'
-
-// Mock fetch
-const fetchMock = vi.fn()
-global.fetch = fetchMock
-
-// Mock alert
-const alertMock = vi.fn()
-global.alert = alertMock
-
-describe('Contact Page', () => {
- beforeEach(() => {
- fetchMock.mockClear()
- alertMock.mockClear()
- })
-
- it('renders the contact form correctly', () => {
- render()
-
- expect(screen.getByLabelText(/Name \*/i)).toBeInTheDocument()
- expect(screen.getByLabelText(/Firma/i)).toBeInTheDocument()
- expect(screen.getByLabelText(/E-Mail \*/i)).toBeInTheDocument()
- expect(screen.getByLabelText(/Nachricht \*/i)).toBeInTheDocument()
- expect(screen.getByRole('button', { name: /Nachricht senden/i })).toBeInTheDocument()
- })
-
- it('submits the form successfully', async () => {
- fetchMock.mockResolvedValueOnce({
- ok: true,
- json: async () => ({ success: true }),
- })
-
- render()
-
- fireEvent.change(screen.getByLabelText(/Name \*/i), { target: { value: 'John Doe' } })
- fireEvent.change(screen.getByLabelText(/Firma/i), { target: { value: 'Acme Corp' } })
- fireEvent.change(screen.getByLabelText(/E-Mail \*/i), { target: { value: 'john@example.com' } })
- fireEvent.change(screen.getByLabelText(/Nachricht \*/i), { target: { value: 'This is a test message that is long enough.' } })
-
- fireEvent.click(screen.getByRole('button', { name: /Nachricht senden/i }))
-
- await waitFor(() => {
- expect(fetchMock).toHaveBeenCalledTimes(1)
- expect(fetchMock).toHaveBeenCalledWith('/api/contact', expect.objectContaining({
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({
- name: 'John Doe',
- company: 'Acme Corp',
- email: 'john@example.com',
- message: 'This is a test message that is long enough.',
- website: ''
- }),
- }))
- })
-
- expect(screen.getByText(/Nachricht gesendet/i)).toBeInTheDocument()
- expect(screen.getByText(/Vielen Dank für Ihre Anfrage/i)).toBeInTheDocument()
- })
-
- it('handles submission errors', async () => {
- fetchMock.mockResolvedValueOnce({
- ok: false,
- json: async () => ({ error: 'Server error' }),
- })
-
- render()
-
- fireEvent.change(screen.getByLabelText(/Name \*/i), { target: { value: 'John Doe' } })
- fireEvent.change(screen.getByLabelText(/E-Mail \*/i), { target: { value: 'john@example.com' } })
- fireEvent.change(screen.getByLabelText(/Nachricht \*/i), { target: { value: 'This is a test message that is long enough.' } })
-
- fireEvent.click(screen.getByRole('button', { name: /Nachricht senden/i }))
-
- await waitFor(() => {
- expect(alertMock).toHaveBeenCalledWith('Fehler: Server error')
- })
- })
-
- it('handles network errors', async () => {
- fetchMock.mockRejectedValueOnce(new Error('Network error'))
-
- render()
-
- fireEvent.change(screen.getByLabelText(/Name \*/i), { target: { value: 'John Doe' } })
- fireEvent.change(screen.getByLabelText(/E-Mail \*/i), { target: { value: 'john@example.com' } })
- fireEvent.change(screen.getByLabelText(/Nachricht \*/i), { target: { value: 'This is a test message that is long enough.' } })
-
- fireEvent.click(screen.getByRole('button', { name: /Nachricht senden/i }))
-
- await waitFor(() => {
- expect(alertMock).toHaveBeenCalledWith('Es gab einen Fehler beim Senden Ihrer Nachricht.')
- })
- })
-})
diff --git a/tests/home.test.tsx b/tests/home.test.tsx
deleted file mode 100644
index 30b670f..0000000
--- a/tests/home.test.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { render, screen } from '@testing-library/react'
-import { describe, it, expect } from 'vitest'
-import Home from '../app/page'
-
-describe('Home Page', () => {
- it('renders the hero section with correct title', () => {
- render()
- expect(screen.getByText(/Spezialisierter Partner für Energiekabelprojekte/i)).toBeInTheDocument()
- })
-
- it('contains the CTA button', () => {
- render()
- const ctaButton = screen.getByRole('link', { name: /Projekt anfragen/i })
- expect(ctaButton).toBeInTheDocument()
- expect(ctaButton).toHaveAttribute('href', '/kontakt')
- })
-
- it('renders the portfolio section', () => {
- render()
- expect(screen.getByText(/Unsere Leistungen/i)).toBeInTheDocument()
- // Use getAllByText because it appears in both hero description and card title
- const elements = screen.getAllByText(/Technische Beratung/i)
- expect(elements.length).toBeGreaterThan(0)
- })
-})
diff --git a/tests/setup.ts b/tests/setup.ts
deleted file mode 100644
index 66ef24b..0000000
--- a/tests/setup.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import '@testing-library/jest-dom'
-import { vi } from 'vitest'
-
-// Mock next/navigation
-vi.mock('next/navigation', () => ({
- usePathname: () => '/',
- useRouter: () => ({
- push: vi.fn(),
- replace: vi.fn(),
- prefetch: vi.fn(),
- }),
-}))
diff --git a/tests_bak/contact.test.tsx b/tests_bak/contact.test.tsx
new file mode 100644
index 0000000..7b5ea77
--- /dev/null
+++ b/tests_bak/contact.test.tsx
@@ -0,0 +1,126 @@
+import { render, screen, fireEvent, waitFor } from "@testing-library/react";
+import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
+import Contact from "../app/kontakt/page";
+
+// Mock fetch
+const fetchMock = vi.fn();
+global.fetch = fetchMock;
+
+// Mock alert
+const alertMock = vi.fn();
+global.alert = alertMock;
+
+describe("Contact Page", () => {
+ beforeEach(() => {
+ fetchMock.mockClear();
+ alertMock.mockClear();
+ });
+
+ it("renders the contact form correctly", () => {
+ render();
+
+ expect(screen.getByLabelText(/Name \*/i)).toBeInTheDocument();
+ expect(screen.getByLabelText(/Firma/i)).toBeInTheDocument();
+ expect(screen.getByLabelText(/E-Mail \*/i)).toBeInTheDocument();
+ expect(screen.getByLabelText(/Nachricht \*/i)).toBeInTheDocument();
+ expect(
+ screen.getByRole("button", { name: /Nachricht senden/i }),
+ ).toBeInTheDocument();
+ });
+
+ it("submits the form successfully", async () => {
+ fetchMock.mockResolvedValueOnce({
+ ok: true,
+ json: async () => ({ success: true }),
+ });
+
+ render();
+
+ fireEvent.change(screen.getByLabelText(/Name \*/i), {
+ target: { value: "John Doe" },
+ });
+ fireEvent.change(screen.getByLabelText(/Firma/i), {
+ target: { value: "Acme Corp" },
+ });
+ fireEvent.change(screen.getByLabelText(/E-Mail \*/i), {
+ target: { value: "john@example.com" },
+ });
+ fireEvent.change(screen.getByLabelText(/Nachricht \*/i), {
+ target: { value: "This is a test message that is long enough." },
+ });
+
+ fireEvent.click(screen.getByRole("button", { name: /Nachricht senden/i }));
+
+ await waitFor(() => {
+ expect(fetchMock).toHaveBeenCalledTimes(1);
+ expect(fetchMock).toHaveBeenCalledWith(
+ "/api/contact",
+ expect.objectContaining({
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ name: "John Doe",
+ company: "Acme Corp",
+ email: "john@example.com",
+ message: "This is a test message that is long enough.",
+ website: "",
+ }),
+ }),
+ );
+ });
+
+ expect(screen.getByText(/Nachricht gesendet/i)).toBeInTheDocument();
+ expect(
+ screen.getByText(/Vielen Dank für Ihre Anfrage/i),
+ ).toBeInTheDocument();
+ });
+
+ it("handles submission errors", async () => {
+ fetchMock.mockResolvedValueOnce({
+ ok: false,
+ json: async () => ({ error: "Server error" }),
+ });
+
+ render();
+
+ fireEvent.change(screen.getByLabelText(/Name \*/i), {
+ target: { value: "John Doe" },
+ });
+ fireEvent.change(screen.getByLabelText(/E-Mail \*/i), {
+ target: { value: "john@example.com" },
+ });
+ fireEvent.change(screen.getByLabelText(/Nachricht \*/i), {
+ target: { value: "This is a test message that is long enough." },
+ });
+
+ fireEvent.click(screen.getByRole("button", { name: /Nachricht senden/i }));
+
+ await waitFor(() => {
+ expect(alertMock).toHaveBeenCalledWith("Fehler: Server error");
+ });
+ });
+
+ it("handles network errors", async () => {
+ fetchMock.mockRejectedValueOnce(new Error("Network error"));
+
+ render();
+
+ fireEvent.change(screen.getByLabelText(/Name \*/i), {
+ target: { value: "John Doe" },
+ });
+ fireEvent.change(screen.getByLabelText(/E-Mail \*/i), {
+ target: { value: "john@example.com" },
+ });
+ fireEvent.change(screen.getByLabelText(/Nachricht \*/i), {
+ target: { value: "This is a test message that is long enough." },
+ });
+
+ fireEvent.click(screen.getByRole("button", { name: /Nachricht senden/i }));
+
+ await waitFor(() => {
+ expect(alertMock).toHaveBeenCalledWith(
+ "Es gab einen Fehler beim Senden Ihrer Nachricht.",
+ );
+ });
+ });
+});
diff --git a/tests_bak/home.test.tsx b/tests_bak/home.test.tsx
new file mode 100644
index 0000000..eeea4ef
--- /dev/null
+++ b/tests_bak/home.test.tsx
@@ -0,0 +1,27 @@
+import { render, screen } from "@testing-library/react";
+import { describe, it, expect } from "vitest";
+import Home from "../app/page";
+
+describe("Home Page", () => {
+ it("renders the hero section with correct title", () => {
+ render();
+ expect(
+ screen.getByText(/Spezialisierter Partner für Energiekabelprojekte/i),
+ ).toBeInTheDocument();
+ });
+
+ it("contains the CTA button", () => {
+ render();
+ const ctaButton = screen.getByRole("link", { name: /Projekt anfragen/i });
+ expect(ctaButton).toBeInTheDocument();
+ expect(ctaButton).toHaveAttribute("href", "/kontakt");
+ });
+
+ it("renders the portfolio section", () => {
+ render();
+ expect(screen.getByText(/Unsere Leistungen/i)).toBeInTheDocument();
+ // Use getAllByText because it appears in both hero description and card title
+ const elements = screen.getAllByText(/Technische Beratung/i);
+ expect(elements.length).toBeGreaterThan(0);
+ });
+});
diff --git a/tests_bak/setup.ts b/tests_bak/setup.ts
new file mode 100644
index 0000000..4a6d2e3
--- /dev/null
+++ b/tests_bak/setup.ts
@@ -0,0 +1,12 @@
+import "@testing-library/jest-dom";
+import { vi } from "vitest";
+
+// Mock next/navigation
+vi.mock("next/navigation", () => ({
+ usePathname: () => "/",
+ useRouter: () => ({
+ push: vi.fn(),
+ replace: vi.fn(),
+ prefetch: vi.fn(),
+ }),
+}));
diff --git a/tsconfig.json b/tsconfig.json
index b8dd0e0..b922940 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -13,5 +13,5 @@
".next/types/**/*.ts",
".next/dev/types/**/*.ts"
],
- "exclude": ["node_modules"]
+ "exclude": ["node_modules", "tests", "tests_bak"]
}