From 418763640d7808d0ba07e8fba07c577eacb749ca Mon Sep 17 00:00:00 2001 From: ht Date: Sun, 6 Sep 2026 18:23:10 +0300 Subject: [PATCH] share five tender QA fixture data --- docs/quality/uygulama-durumu.md | 6 ++++++ tests/browser-qa.mjs | 4 ++-- tests/fixtures/health-acceptance.mjs | 8 ++++++++ tests/health-acceptance-fixture.test.mjs | 16 ++++------------ 4 files changed, 20 insertions(+), 14 deletions(-) create mode 100644 tests/fixtures/health-acceptance.mjs diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index b6c01a1..10961f4 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -2052,3 +2052,9 @@ Doğrulama: 289 test geçti, üretim derlemesi başarılı. Allowlistesi etkin HTTP testinde yalnız preflight değil, kimliksiz normal API yanıtı da `Vary: Origin` başlığıyla doğrulanıyor; origin’e göre değişen yanıtların tamamında önbellek ayrımı güvence altında. Doğrulama: HTTP testleri 19/19, toplam 289 test geçti; üretim derlemesi başarılı. + +### 2026-09-06 · Ortak beşli kabul fixture kaynağı + +D10 senaryo kayıtları `tests/fixtures/health-acceptance.mjs` içine taşındı; tarayıcı QA akışı ve fixture birim testi aynı İKN/tarih/saat verisini kullanıyor. Böylece iki test katmanı arasında sessiz veri sapması riski azaltıldı. + +Doğrulama: 289 test geçti, browser QA script sözdizimi kontrolü başarılı, üretim derlemesi başarılı. diff --git a/tests/browser-qa.mjs b/tests/browser-qa.mjs index b8c8a8f..03a5451 100644 --- a/tests/browser-qa.mjs +++ b/tests/browser-qa.mjs @@ -8,6 +8,7 @@ import {randomBytes} from 'node:crypto'; import {createServer as netServer} from 'node:net'; import {readyBid} from './fixtures/ready-bid.mjs'; import {printBidFixture} from './fixtures/print-bid.mjs'; +import {healthAcceptanceCases} from './fixtures/health-acceptance.mjs'; import {preparationSummary} from '../src/services/preparationSummary.js'; const dir=mkdtempSync(join(tmpdir(),'ihaleist-browser-')); process.env.AUTH_SECRET=randomBytes(32).toString('hex'); @@ -34,8 +35,7 @@ const pendingQaJobs=new Map(); const qaHeartbeat=setInterval(()=>{for(const job of pendingQaJobs.values())qaJobs.heartbeatAiJob(job.id,job.runId);},5000);qaHeartbeat.unref(); const probe=netServer();await new Promise(r=>probe.listen(0,'127.0.0.1',r));const port=probe.address().port;await new Promise(r=>probe.close(r)); const api=spawn(process.execPath,['server/index.js'],{cwd:new URL('..',import.meta.url),env:{PATH:process.env.PATH,NODE_ENV:'test',AUTH_SECRET:process.env.AUTH_SECRET,IHALEIST_USER_DATA_DIR:dir,IHALEIST_SHARED_DATA_DIR:join(dir,'shared'),PORT:String(port),UYUM_GOMME:'0'},stdio:'ignore'}); -const entries=[['1582991','Giresun','10.09.2026','10:00'],['1534665','Kayseri','22.09.2026','11:00'],['1499061','Akdeniz','22.09.2026','10:30'],['1573235','Aksaray','09.09.2026','10:00'],['1523851','Tepecik','11.09.2026','10:00']]; -const tenders=entries.map(([id,city,date,time])=>({id:'qa-'+id,ikn:'2026/'+id,baslik:'QA — '+city+' laboratuvar',kurum:city+' TEST KURUMU',sehir:city,tarih:date,saat:time,alimTuru:'Mal Alımı',usul:id==='1534665'?'Açık İhale':'Pazarlık Usulü',kurumTipi:'Eğitim ve Araştırma Hastaneleri',sektor:'Laboratuvar & Ölçüm',sektorler:['Laboratuvar & Ölçüm'],durum:'Açık',takipte:false,kanbanStatus:'incelenecek',items:[{id:'1',ad:'Sentetik test kalemi',miktar:2,birim:'adet'}],aciklama:'Bu yalnızca yerel arayüz test verisidir. Teklif geçerlilik süresi 120 takvim günü. Birim fiyat teklif. '.repeat(3)})); +const tenders=healthAcceptanceCases.map(({ikn: id,city,date,time})=>({id:'qa-'+id,ikn:'2026/'+id,baslik:'QA — '+city+' laboratuvar',kurum:city+' TEST KURUMU',sehir:city,tarih:date,saat:time,alimTuru:'Mal Alımı',usul:id==='1534665'?'Açık İhale':'Pazarlık Usulü',kurumTipi:'Eğitim ve Araştırma Hastaneleri',sektor:'Laboratuvar & Ölçüm',sektorler:['Laboratuvar & Ölçüm'],durum:'Açık',takipte:false,kanbanStatus:'incelenecek',items:[{id:'1',ad:'Sentetik test kalemi',miktar:2,birim:'adet'}],aciklama:'Bu yalnızca yerel arayüz test verisidir. Teklif geçerlilik süresi 120 takvim günü. Birim fiyat teklif. '.repeat(3)})); // Seed actual persistent history only in this disposable QA volume. process.env.IHALEIST_SHARED_DATA_DIR=join(dir,'shared'); const {observeTenders}=await import('../server/tender-history.mjs'); diff --git a/tests/fixtures/health-acceptance.mjs b/tests/fixtures/health-acceptance.mjs new file mode 100644 index 0000000..d33878a --- /dev/null +++ b/tests/fixtures/health-acceptance.mjs @@ -0,0 +1,8 @@ +// Synthetic D10 records. Official tender documents remain a separate release gate. +export const healthAcceptanceCases = [ + { ikn: '1582991', city: 'Giresun', date: '10.09.2026', time: '10:00', scenario: 'mikroskop' }, + { ikn: '1534665', city: 'Kayseri', date: '22.09.2026', time: '11:00', scenario: 'sarf' }, + { ikn: '1499061', city: 'Akdeniz', date: '22.09.2026', time: '10:30', scenario: 'cihaz-servis' }, + { ikn: '1573235', city: 'Aksaray', date: '09.09.2026', time: '10:00', scenario: 'kismi-teklif' }, + { ikn: '1523851', city: 'Tepecik', date: '11.09.2026', time: '10:00', scenario: '100-kalem' }, +]; diff --git a/tests/health-acceptance-fixture.test.mjs b/tests/health-acceptance-fixture.test.mjs index f3187e1..6c8a8eb 100644 --- a/tests/health-acceptance-fixture.test.mjs +++ b/tests/health-acceptance-fixture.test.mjs @@ -1,19 +1,11 @@ import { test } from 'node:test'; import assert from 'node:assert/strict'; - -// D10 smoke fixture: synthetic records only; official documents are still required for release acceptance. -const cases = [ - ['1582991', 'Giresun', '10.09.2026', '10:00', 'mikroskop'], - ['1534665', 'Kayseri', '22.09.2026', '11:00', 'sarf'], - ['1499061', 'Akdeniz', '22.09.2026', '10:30', 'cihaz-servis'], - ['1573235', 'Aksaray', '09.09.2026', '10:00', 'kismi-teklif'], - ['1523851', 'Tepecik', '11.09.2026', '10:00', '100-kalem'], -]; +import { healthAcceptanceCases as cases } from './fixtures/health-acceptance.mjs'; test('D10 five-tender acceptance fixture stays complete and unique', () => { - assert.equal(new Set(cases.map(([ikn]) => ikn)).size, 5); - assert.deepEqual(cases.map(([, , , , scenario]) => scenario), ['mikroskop','sarf','cihaz-servis','kismi-teklif','100-kalem']); - for (const [ikn, city, date, time] of cases) { + assert.equal(new Set(cases.map(({ikn}) => ikn)).size, 5); + assert.deepEqual(cases.map(({scenario}) => scenario), ['mikroskop','sarf','cihaz-servis','kismi-teklif','100-kalem']); + for (const {ikn,city,date,time} of cases) { assert.match(ikn, /^\d{7}$/); assert.match(city, /^[A-Za-zÇĞİÖŞÜçğıöşü]+$/); assert.match(date, /^\d{2}\.\d{2}\.\d{4}$/);