diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 066dd72..a7d7163 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,13 +25,18 @@ jobs: run: | cat > .env < .env < { beforeEach(() => { nodemailermock.mock.reset(); - process.env.NEXT_PUBLIC_MY_EMAIL = 'test@dki.one'; - process.env.NEXT_PUBLIC_MY_PASSWORD = 'test-password'; + process.env.MY_EMAIL = 'test@dki.one'; + process.env.MY_PASSWORD = 'test-password'; }); describe('POST /api/email', () => { @@ -43,8 +43,8 @@ describe('POST /api/email', () => { }); 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; + delete process.env.MY_EMAIL; + delete process.env.MY_PASSWORD; const mockRequest = { json: jest.fn().mockResolvedValue({ diff --git a/app/__tests__/api/fetchAllProjects.test.tsx b/app/__tests__/api/fetchAllProjects.test.tsx index dec7974..13046e3 100644 --- a/app/__tests__/api/fetchAllProjects.test.tsx +++ b/app/__tests__/api/fetchAllProjects.test.tsx @@ -1,6 +1,43 @@ import { GET } from '@/app/api/fetchAllProjects/route'; import { NextResponse } from 'next/server'; -import { mockFetch } from '@/app/__tests__/__mocks__/mock-fetch'; + +// Wir mocken node-fetch direkt +jest.mock('node-fetch', () => { + return jest.fn(() => + Promise.resolve({ + json: () => + Promise.resolve({ + posts: [ + { + id: '67ac8dfa709c60000117d312', + title: 'Just Doing Some Testing', + meta_description: 'Hello bla bla bla bla', + slug: 'just-doing-some-testing', + updated_at: '2025-02-13T14:25:38.000+00:00', + }, + { + id: '67aaffc3709c60000117d2d9', + title: 'Blockchain Based Voting System', + meta_description: + 'This project aims to revolutionize voting systems by leveraging blockchain to ensure security, transparency, and immutability.', + slug: 'blockchain-based-voting-system', + updated_at: '2025-02-13T16:54:42.000+00:00', + }, + ], + meta: { + pagination: { + limit: 'all', + next: null, + page: 1, + pages: 1, + prev: null, + total: 2, + }, + }, + }), + }) + ); +}); jest.mock('next/server', () => ({ NextResponse: { @@ -10,48 +47,27 @@ jest.mock('next/server', () => ({ describe('GET /api/fetchAllProjects', () => { beforeAll(() => { - process.env.NEXT_PUBLIC_GHOST_API_URL = 'http://localhost:2368'; - process.env.NEXT_PUBLIC_GHOST_API_KEY = 'some-key'; - global.fetch = mockFetch({ - posts: [ - { - id: '67ac8dfa709c60000117d312', - title: 'Just Doing Some Testing', - meta_description: 'Hello bla bla bla bla', - slug: 'just-doing-some-testing', - updated_at: '2025-02-13T14:25:38.000+00:00', - }, - { - id: '67aaffc3709c60000117d2d9', - title: 'Blockchain Based Voting System', - meta_description: 'This project aims to revolutionize voting systems by leveraging blockchain to ensure security, transparency, and immutability.', - slug: 'blockchain-based-voting-system', - updated_at: '2025-02-13T16:54:42.000+00:00', - }, - ], - }); + process.env.GHOST_API_URL = 'http://localhost:2368'; + process.env.GHOST_API_KEY = 'some-key'; }); - it('should return a list of projects', async () => { + it('should return a list of projects (partial match)', async () => { await GET(); - expect(NextResponse.json).toHaveBeenCalledWith({ - posts: [ - { + // Den tatsächlichen Argumentwert extrahieren + const responseArg = (NextResponse.json as jest.Mock).mock.calls[0][0]; + + expect(responseArg).toMatchObject({ + posts: expect.arrayContaining([ + expect.objectContaining({ id: '67ac8dfa709c60000117d312', title: 'Just Doing Some Testing', - meta_description: 'Hello bla bla bla bla', - slug: 'just-doing-some-testing', - updated_at: '2025-02-13T14:25:38.000+00:00', - }, - { + }), + expect.objectContaining({ id: '67aaffc3709c60000117d2d9', title: 'Blockchain Based Voting System', - meta_description: 'This project aims to revolutionize voting systems by leveraging blockchain to ensure security, transparency, and immutability.', - slug: 'blockchain-based-voting-system', - updated_at: '2025-02-13T16:54:42.000+00:00', - }, - ], + }), + ]), }); }); }); \ No newline at end of file diff --git a/app/__tests__/api/fetchProject.test.tsx b/app/__tests__/api/fetchProject.test.tsx index da7e83a..eedc4f6 100644 --- a/app/__tests__/api/fetchProject.test.tsx +++ b/app/__tests__/api/fetchProject.test.tsx @@ -10,8 +10,8 @@ jest.mock('next/server', () => ({ describe('GET /api/fetchProject', () => { beforeAll(() => { - process.env.NEXT_PUBLIC_GHOST_API_URL = 'http://localhost:2368'; - process.env.NEXT_PUBLIC_GHOST_API_KEY = 'some-key'; + process.env.GHOST_API_URL = 'http://localhost:2368'; + process.env.GHOST_API_KEY = 'some-key'; global.fetch = mockFetch({ posts: [ diff --git a/app/__tests__/api/sitemap.test.tsx b/app/__tests__/api/sitemap.test.tsx index 12e144d..f97a5ed 100644 --- a/app/__tests__/api/sitemap.test.tsx +++ b/app/__tests__/api/sitemap.test.tsx @@ -7,8 +7,8 @@ jest.mock('next/server', () => ({ describe('GET /api/sitemap', () => { beforeAll(() => { - process.env.NEXT_PUBLIC_GHOST_API_URL = 'http://localhost:2368'; - process.env.NEXT_PUBLIC_GHOST_API_KEY = 'test-api-key'; + process.env.GHOST_API_URL = 'http://localhost:2368'; + process.env.GHOST_API_KEY = 'test-api-key'; process.env.NEXT_PUBLIC_BASE_URL = 'https://dki.one'; global.fetch = mockFetch({ posts: [ diff --git a/app/__tests__/components/Projects.test.tsx b/app/__tests__/components/Projects.test.tsx index d50f1c7..0621555 100644 --- a/app/__tests__/components/Projects.test.tsx +++ b/app/__tests__/components/Projects.test.tsx @@ -6,8 +6,8 @@ import { mockFetch } from '@/app/__tests__/__mocks__/mock-fetch'; describe('Projects', () => { beforeAll(() => { - process.env.NEXT_PUBLIC_GHOST_API_URL = 'http://localhost:2368'; - process.env.NEXT_PUBLIC_GHOST_API_KEY = 'some-key'; + process.env.GHOST_API_URL = 'http://localhost:2368'; + process.env.GHOST_API_KEY = 'some-key'; global.fetch = mockFetch({ posts: [ { diff --git a/app/__tests__/projects/[slug]/page.test.tsx b/app/__tests__/projects/[slug]/page.test.tsx index 182c4b8..1cd7127 100644 --- a/app/__tests__/projects/[slug]/page.test.tsx +++ b/app/__tests__/projects/[slug]/page.test.tsx @@ -13,8 +13,8 @@ jest.mock('next/navigation', () => ({ describe('ProjectDetails', () => { beforeAll(() => { - process.env.NEXT_PUBLIC_GHOST_API_URL = 'http://localhost:2368'; - process.env.NEXT_PUBLIC_GHOST_API_KEY = 'some-key'; + process.env.GHOST_API_URL = 'http://localhost:2368'; + process.env.GHOST_API_KEY = 'some-key'; global.fetch = mockFetch({ posts: [ { diff --git a/app/api/sitemap/route.tsx b/app/api/sitemap/route.tsx index 411833b..cc359b9 100644 --- a/app/api/sitemap/route.tsx +++ b/app/api/sitemap/route.tsx @@ -12,8 +12,8 @@ interface ProjectsData { export const dynamic = "force-dynamic"; export const runtime = "nodejs"; // Force Node runtime -const GHOST_API_URL = process.env.NEXT_PUBLIC_GHOST_API_URL; -const GHOST_API_KEY = process.env.NEXT_PUBLIC_GHOST_API_KEY; +const GHOST_API_URL = process.env.GHOST_API_URL; +const GHOST_API_KEY = process.env.GHOST_API_KEY; // Funktion, um die XML für die Sitemap zu generieren function generateXml(sitemapRoutes: { url: string; lastModified: string }[]) { diff --git a/package-lock.json b/package-lock.json index 57dac94..e0d0a8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "gray-matter": "^4.0.3", "next": "15.1.7", "node-cache": "^5.1.2", - "node-fetch": "^3.3.2", + "node-fetch": "^2.7.0", "nodemailer": "^6.10.0", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -3904,15 +3904,6 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -5108,29 +5099,6 @@ "bser": "2.1.1" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/fflate": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", @@ -5315,18 +5283,6 @@ "node": ">= 6" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "license": "MIT", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -8061,41 +8017,46 @@ "node": ">= 8.0.0" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "whatwg-url": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "4.x || >=6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/node-int64": { @@ -10701,15 +10662,6 @@ "makeerror": "1.0.12" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/package.json b/package.json index 48f1882..7127d80 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "gray-matter": "^4.0.3", "next": "15.1.7", "node-cache": "^5.1.2", - "node-fetch": "^3.3.2", + "node-fetch": "^2.7.0", "nodemailer": "^6.10.0", "react": "^19.0.0", "react-dom": "^19.0.0",