share five tender QA fixture data
This commit is contained in:
@@ -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ı.
|
||||||
|
|||||||
@@ -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');
|
||||||
|
|||||||
Vendored
+8
@@ -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' },
|
||||||
|
];
|
||||||
@@ -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}$/);
|
||||||
|
|||||||
Reference in New Issue
Block a user