share five tender QA fixture data

This commit is contained in:
2026-09-06 18:23:10 +03:00
parent 45ee3f238b
commit 418763640d
4 changed files with 20 additions and 14 deletions
+6
View File
@@ -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. 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ı. 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ı.
+2 -2
View File
@@ -8,6 +8,7 @@ import {randomBytes} from 'node:crypto';
import {createServer as netServer} from 'node:net'; import {createServer as netServer} from 'node:net';
import {readyBid} from './fixtures/ready-bid.mjs'; import {readyBid} from './fixtures/ready-bid.mjs';
import {printBidFixture} from './fixtures/print-bid.mjs'; import {printBidFixture} from './fixtures/print-bid.mjs';
import {healthAcceptanceCases} from './fixtures/health-acceptance.mjs';
import {preparationSummary} from '../src/services/preparationSummary.js'; import {preparationSummary} from '../src/services/preparationSummary.js';
const dir=mkdtempSync(join(tmpdir(),'ihaleist-browser-')); const dir=mkdtempSync(join(tmpdir(),'ihaleist-browser-'));
process.env.AUTH_SECRET=randomBytes(32).toString('hex'); 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 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 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 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=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)}));
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)}));
// Seed actual persistent history only in this disposable QA volume. // Seed actual persistent history only in this disposable QA volume.
process.env.IHALEIST_SHARED_DATA_DIR=join(dir,'shared'); process.env.IHALEIST_SHARED_DATA_DIR=join(dir,'shared');
const {observeTenders}=await import('../server/tender-history.mjs'); const {observeTenders}=await import('../server/tender-history.mjs');
+8
View File
@@ -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' },
];
+4 -12
View File
@@ -1,19 +1,11 @@
import { test } from 'node:test'; import { test } from 'node:test';
import assert from 'node:assert/strict'; import assert from 'node:assert/strict';
import { healthAcceptanceCases as cases } from './fixtures/health-acceptance.mjs';
// 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'],
];
test('D10 five-tender acceptance fixture stays complete and unique', () => { test('D10 five-tender acceptance fixture stays complete and unique', () => {
assert.equal(new Set(cases.map(([ikn]) => ikn)).size, 5); assert.equal(new Set(cases.map(({ikn}) => ikn)).size, 5);
assert.deepEqual(cases.map(([, , , , scenario]) => scenario), ['mikroskop','sarf','cihaz-servis','kismi-teklif','100-kalem']); assert.deepEqual(cases.map(({scenario}) => scenario), ['mikroskop','sarf','cihaz-servis','kismi-teklif','100-kalem']);
for (const [ikn, city, date, time] of cases) { for (const {ikn,city,date,time} of cases) {
assert.match(ikn, /^\d{7}$/); assert.match(ikn, /^\d{7}$/);
assert.match(city, /^[A-Za-zÇĞİÖŞÜçğıöşü]+$/); assert.match(city, /^[A-Za-zÇĞİÖŞÜçğıöşü]+$/);
assert.match(date, /^\d{2}\.\d{2}\.\d{4}$/); assert.match(date, /^\d{2}\.\d{2}\.\d{4}$/);