cover calendar provider links in browser QA
This commit is contained in:
@@ -26,6 +26,13 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"dailyBulletinHeading": true,
|
"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,
|
"analyticsTargetLabel": true,
|
||||||
"accountScopedAnalyticsTarget": true,
|
"accountScopedAnalyticsTarget": true,
|
||||||
"primaryAnalyticsTargetRestored": true,
|
"primaryAnalyticsTargetRestored": true,
|
||||||
|
|||||||
@@ -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.
|
İ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.
|
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.
|
||||||
|
|||||||
@@ -33,6 +33,29 @@ try {
|
|||||||
await page.getByRole('heading', { name: 'Günlük İhale Bülteni', exact: true }).waitFor({ state: 'attached', timeout: 10_000 });
|
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;
|
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ı.');
|
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: 'Ana İhale Listesi', exact: true }).click();
|
||||||
await page.getByRole('button', { name: 'Pazar', exact: true }).click();
|
await page.getByRole('button', { name: 'Pazar', exact: true }).click();
|
||||||
await page.getByRole('button', { name: 'Analitik Dashboard', exact: true }).click();
|
await page.getByRole('button', { name: 'Analitik Dashboard', exact: true }).click();
|
||||||
|
|||||||
@@ -140,6 +140,20 @@ const ui=await createServer({server:{host:'127.0.0.1',port:0,proxy:{'/api':{targ
|
|||||||
</script></body></html>`;
|
</script></body></html>`;
|
||||||
res.setHeader('Content-Type','text/html; charset=utf-8');res.end(await server.transformIndexHtml('/qa-overview-frame',html));return;
|
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=`<html lang="tr"><head><meta name="viewport" content="width=device-width,initial-scale=1"></head><body><div id="root"></div><script type="module">
|
||||||
|
import React from '/node_modules/.vite/deps/react.js';
|
||||||
|
import ReactDOM from '/node_modules/.vite/deps/react-dom_client.js';
|
||||||
|
import {AppProvider,useApp} from '/src/context/AppContext.jsx';
|
||||||
|
import {TenderDetailModal} from '/src/components/TenderDetailModal.jsx';
|
||||||
|
import '/src/index.css';
|
||||||
|
const selected=${JSON.stringify(calendarTender)};
|
||||||
|
function Probe(){const {setActiveTenderDetail,authUser}=useApp();React.useEffect(()=>{if(!authUser?.email)return;const timer=setTimeout(()=>setActiveTenderDetail(selected),0);return()=>clearTimeout(timer);},[authUser?.email]);return React.createElement(TenderDetailModal);}
|
||||||
|
ReactDOM.createRoot(document.getElementById('root')).render(React.createElement(AppProvider,{},React.createElement(Probe)));
|
||||||
|
</script></body></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') {
|
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;
|
const query=new URL(req.url,'http://localhost').searchParams;
|
||||||
qaFiles=query.has('file')?[{...qaFile}]:null;
|
qaFiles=query.has('file')?[{...qaFile}]:null;
|
||||||
|
|||||||
Reference in New Issue
Block a user