Compare commits

...

5 Commits

Author SHA1 Message Date
6214678433 chore: add .data/ to .gitignore and untrack existing leads-backup.jsonl file
Some checks failed
CI - Lint, Typecheck & Test / quality-assurance (pull_request) Failing after 6s
Build & Deploy / 🔍 Prepare (push) Successful in 12s
Build & Deploy / 🧪 QA (push) Failing after 1m27s
Build & Deploy / 🏗️ Build (push) Has been skipped
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 4s
2026-06-11 10:12:37 +02:00
6e2a959972 fix: resolve contact form and page slug translation mismatch causing E2E test failures
Some checks failed
CI - Lint, Typecheck & Test / quality-assurance (pull_request) Failing after 6s
Build & Deploy / 🔍 Prepare (push) Successful in 14s
Build & Deploy / 🧪 QA (push) Failing after 1m31s
Build & Deploy / 🏗️ Build (push) Has been skipped
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 4s
2026-06-10 11:47:42 +02:00
a20ba52f7f chore: merge branch fix/mobile-kontakt-button and fix og-image.test.ts 2026-06-10 11:20:18 +02:00
292557eca5 fix(pdf): fix react-pdf svg type compilation error 2026-06-10 11:19:21 +02:00
6c14ceec3e fix(qa): remove hardcoded chromium path to allow auto-detection of chrome browser
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 9s
Build & Deploy / 🧪 QA (push) Failing after 1m9s
Build & Deploy / 🏗️ Build (push) Has been skipped
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 2s
CI - Lint, Typecheck & Test / quality-assurance (pull_request) Failing after 1m35s
2026-06-10 10:42:26 +02:00
8 changed files with 43 additions and 10 deletions

View File

@@ -1 +0,0 @@
{"timestamp":"2026-06-09T17:18:52.824Z","name":"John Doe","email":"john@example.com","productName":null,"message":"Hello, this is a test message."}\n{"timestamp":"2026-06-09T17:18:52.855Z","name":"Tester","email":"testing@mintel.me","productName":null,"message":"Test"}\n{"timestamp":"2026-06-09T17:20:50.586Z","name":"John Doe","email":"john@example.com","productName":null,"message":"Hello, this is a test message."}\n{"timestamp":"2026-06-09T17:20:50.613Z","name":"Tester","email":"testing@mintel.me","productName":null,"message":"Test"}\n

3
.gitignore vendored
View File

@@ -25,3 +25,6 @@ html-errors*.json
reference/
# Database backups
backups/
# Local data / backups
.data/

View File

@@ -316,7 +316,7 @@ const parseSvgPaths = (filePath: string) => {
const VectorLogo = ({ paths, style }: { paths: { d: string; fill: string }[]; style: any }) => (
<Svg viewBox="0 0 295 99" style={style}>
<G>
<G {...({ fillRule: 'evenodd', clipRule: 'evenodd' } as any)}>
{paths.map((p, i) => (
<Path key={i} d={p.d} fill={p.fill} />
))}

View File

@@ -3,11 +3,11 @@
"pages": {
"impressum": "impressum",
"datenschutz": "datenschutz",
"agbs": "terms",
"kontakt": "contact",
"agbs": "agbs",
"kontakt": "kontakt",
"team": "team",
"blog": "blog",
"produkte": "products",
"produkte": "produkte",
"start": "start",
"danke": "thanks",
"niederspannungskabel": "low-voltage-cables",

View File

@@ -3,11 +3,11 @@
"pages": {
"legal-notice": "impressum",
"privacy-policy": "datenschutz",
"terms": "terms",
"contact": "contact",
"terms": "agbs",
"contact": "kontakt",
"team": "team",
"blog": "blog",
"products": "products",
"products": "produkte",
"start": "start",
"thanks": "thanks",
"low-voltage-cables": "low-voltage-cables",

View File

@@ -33,8 +33,14 @@ describe('Contact Form E2E', () => {
it('should submit the contact form and show success message', async ({ skip }) => {
if (!isServerUp) skip();
page.on('console', (msg) => console.log('PAGE LOG:', msg.text()));
page.on('pageerror', (err) => console.error('PAGE ERROR:', err.message));
await page.goto(`${BASE_URL}/de/kontakt`);
// Wait for Next.js hydration to complete
await new Promise((resolve) => setTimeout(resolve, 3000));
// Fill the form
await page.waitForSelector('input[name="name"]');
await page.type('input[name="name"]', 'E2E Tester');
@@ -45,7 +51,7 @@ describe('Contact Form E2E', () => {
await page.click('button[type="submit"]');
// Wait for success message (localized or generic)
await page.waitForSelector('[role="alert"]', { timeout: 10000 });
await page.waitForSelector('[role="alert"]', { timeout: 15000 });
const text = await page.evaluate(() => document.body.innerText);
expect(text).toMatch(/Gesendet|Sent|Erfolgreich|Success/i);

View File

@@ -93,11 +93,12 @@ describe('OG Image Generation', () => {
const url = `${BASE_URL}/de/blog/${slug}/opengraph-image`;
const response = await fetch(url);
const responseClone = response.clone();
await verifyImageResponse(response);
// Verify the image is substantially large (>50KB) to confirm it actually
// contains the featured photo and isn't just a tiny fallback/text-only image
const buffer = await response.clone().arrayBuffer();
const buffer = await responseClone.arrayBuffer();
expect(
buffer.byteLength,
`OG image for "${slug}" is suspiciously small (${buffer.byteLength} bytes) — likely missing featured photo`,

View File

@@ -21,6 +21,30 @@ describe('getPageBySlug translation routing', () => {
expect(page?.frontmatter.title).toBe('Datenschutzerklärung');
});
it('should resolve translated slug "kontakt" for German', async () => {
const page = await getPageBySlug('kontakt', 'de');
expect(page).not.toBeNull();
expect(page?.frontmatter.title).toBe('Kontakt');
});
it('should resolve translated slug "contact" for English', async () => {
const page = await getPageBySlug('contact', 'en');
expect(page).not.toBeNull();
expect(page?.frontmatter.title).toBe('Kontakt');
});
it('should resolve translated slug "produkte" for German', async () => {
const page = await getPageBySlug('produkte', 'de');
expect(page).not.toBeNull();
expect(page?.frontmatter.title).toBe('Produkte');
});
it('should resolve translated slug "products" for English', async () => {
const page = await getPageBySlug('products', 'en');
expect(page).not.toBeNull();
expect(page?.frontmatter.title).toBe('Produkte');
});
it('should return null for non-existent slugs', async () => {
const page = await getPageBySlug('does-not-exist', 'de');
expect(page).toBeNull();