diff --git a/docs/quality/evidence/qa-browser-acceptance-runtime.json b/docs/quality/evidence/qa-browser-acceptance-runtime.json index 162c387..17d0d25 100644 --- a/docs/quality/evidence/qa-browser-acceptance-runtime.json +++ b/docs/quality/evidence/qa-browser-acceptance-runtime.json @@ -26,6 +26,13 @@ } ], "dailyBulletinHeading": true, + "calendarProviderLinks": { + "googleHost": "calendar.google.com", + "googleDates": "20260910T070000Z/20260910T070000Z", + "outlookHost": "outlook.live.com", + "outlookStart": "2026-09-10T07:00:00Z", + "outlookEnd": "2026-09-10T07:00:00Z" + }, "analyticsTargetLabel": true, "accountScopedAnalyticsTarget": true, "primaryAnalyticsTargetRestored": true, diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index e3bd1a6..f92169c 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -2326,3 +2326,9 @@ Doğrulama: `nginx -t`, Docker üretim build'i ve yerel container probe `pass:tr İhale detayındaki takvim bölümüne, doğrulanmış İstanbul son teklif tarihini kullanan Google Calendar ve Outlook web taslak bağlantıları eklendi. Bağlantılar başlık, İKN, kurum, yer ve resmî kaynağı yeniden kontrol etme notunu önceden dolduruyor; kaynakta saat yoksa bağlantı üretilmiyor ve hata yalnız kullanıcı tıkladığında gösteriliyor. Otomatik OAuth senkronizasyonu, kayıt güncellemesi veya dış sağlayıcıya veri gönderimi yapılmıyor; kullanıcı taslağı kendi hesabında kaydediyor. Doğrulama: `npm test` 301/301, `npm run build` başarılı ve `npm run qa:browser` farklı cihaz saat dilimi (`America/New_York`) ile başarılı. Gerçek Google/Outlook hesaplarında OAuth, kayıt ve değişiklik sonrası yeniden senkron kabulü hâlâ açık. + +### 2026-09-06 · Takvim provider bağlantılarının modal browser kabulü + +Takvim bağlantıları artık yalnız servis birim testlerinde değil, ihale detay modalının gerçek DOM akışında da kontrol ediliyor. Yerel QA fikstürü kaynak tarihi 10.09.2026 10:00 İstanbul olan bir ihale açıyor; Google bağlantısında `20260910T070000Z`, Outlook bağlantısında `2026-09-10T07:00:00Z` başlangıç/bitiş değerleri ve doğru provider hostları doğrulanıyor. + +Doğrulama: `npm run qa:browser` başarılı; kanıt [`qa-browser-acceptance-runtime.json`](evidence/qa-browser-acceptance-runtime.json) içindeki `calendarProviderLinks` alanında. Bu kabul sentetik ve salt okunur; OAuth hesabına kaydetme ve zeyilname sonrası gerçek senkronizasyon açık iş olarak kalıyor. diff --git a/tests/browser-acceptance.mjs b/tests/browser-acceptance.mjs index f988b4e..7687662 100644 --- a/tests/browser-acceptance.mjs +++ b/tests/browser-acceptance.mjs @@ -33,6 +33,29 @@ try { await page.getByRole('heading', { name: 'Günlük İhale Bülteni', exact: true }).waitFor({ state: 'attached', timeout: 10_000 }); evidence.checks.dailyBulletinHeading = await page.getByRole('heading', { name: 'Günlük İhale Bülteni', exact: true }).count() === 1; if (!evidence.checks.dailyBulletinHeading) throw new Error('Günlük bülten başlığı açılmadı.'); + const calendarPage = await context.newPage(); + try { + await calendarPage.goto(`${url.replace(/\/qa-signin$/, '')}/qa-calendar-links`, { waitUntil: 'networkidle' }); + const googleLink = calendarPage.getByRole('link', { name: 'Google Takvim taslağı', exact: true }); + const outlookLink = calendarPage.getByRole('link', { name: 'Outlook taslağı', exact: true }); + await googleLink.waitFor({ state: 'attached', timeout: 10_000 }); + await outlookLink.waitFor({ state: 'attached', timeout: 10_000 }); + const [googleHref, outlookHref] = await Promise.all([googleLink.getAttribute('href'), outlookLink.getAttribute('href')]); + const googleUrl = new URL(googleHref); + const outlookUrl = new URL(outlookHref); + evidence.checks.calendarProviderLinks = { + googleHost: googleUrl.hostname, + googleDates: googleUrl.searchParams.get('dates'), + outlookHost: outlookUrl.hostname, + outlookStart: outlookUrl.searchParams.get('startdt'), + outlookEnd: outlookUrl.searchParams.get('enddt'), + }; + if (googleUrl.hostname !== 'calendar.google.com' || googleUrl.searchParams.get('dates') !== '20260910T070000Z/20260910T070000Z' || + outlookUrl.hostname !== 'outlook.live.com' || outlookUrl.searchParams.get('startdt') !== '2026-09-10T07:00:00Z' || + outlookUrl.searchParams.get('enddt') !== '2026-09-10T07:00:00Z') { + throw new Error(`Takvim provider bağlantısı kaynak son tarihi korumuyor: ${JSON.stringify(evidence.checks.calendarProviderLinks)}`); + } + } finally { await calendarPage.close(); } await page.getByRole('button', { name: 'Ana İhale Listesi', exact: true }).click(); await page.getByRole('button', { name: 'Pazar', exact: true }).click(); await page.getByRole('button', { name: 'Analitik Dashboard', exact: true }).click(); diff --git a/tests/browser-qa.mjs b/tests/browser-qa.mjs index c46c653..7a4844c 100644 --- a/tests/browser-qa.mjs +++ b/tests/browser-qa.mjs @@ -140,6 +140,20 @@ const ui=await createServer({server:{host:'127.0.0.1',port:0,proxy:{'/api':{targ `; res.setHeader('Content-Type','text/html; charset=utf-8');res.end(await server.transformIndexHtml('/qa-overview-frame',html));return; } + if(req.url==='/qa-calendar-links'){ + const calendarTender={...tenders[0],ikn:'2026/1582991',tarih:'10.09.2026',saat:'10:00',baslik:'QA Giresun mikroskop',kurum:'Giresun TEST KURUMU',ihaleYeri:'QA toplantı salonu'}; + const html=`
`; + res.setHeader('Content-Type','text/html; charset=utf-8');res.end(await server.transformIndexHtml('/qa-calendar-links',html));return; + } if(req.url==='/qa-source-update'||req.url==='/qa-source-update?ready=1'||req.url==='/qa-source-update?ready=1&file=1') { const query=new URL(req.url,'http://localhost').searchParams; qaFiles=query.has('file')?[{...qaFile}]:null;