Open and retain tender details discovered outside the main pool
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
import {test} from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import {searchTender} from '../src/services/searchTender.js';
|
||||
test('search-only tender becomes a stable detail without fabricated bid or classification fields',()=>{
|
||||
const source={ikn:'2026/1538773',baslik:'Laboratuvar hizmeti',tur:'Hizmet Alımı',ihaleTarihSaat:'22.09.2026 11:30'};
|
||||
const t=searchTender(source);
|
||||
assert.equal(t.id,'ekap-2026/1538773');assert.equal(t.alimTuru,'Hizmet Alımı');
|
||||
assert.equal(t.tarih,'22.09.2026');assert.equal(t.saat,'11:30');assert.deepEqual(t.items,[]);
|
||||
const unknown=searchTender({...source,ihaleTarihSaat:'bilinmiyor'});
|
||||
assert.equal(unknown.tarih,'');assert.equal(unknown.saat,'');assert.equal(unknown.aciklama,'');
|
||||
assert.throws(()=>searchTender({...source,ikn:'unknown'}));
|
||||
});
|
||||
@@ -20,3 +20,17 @@ test('detail loading rejects empty source, supports retry and stops on timeout/c
|
||||
await assert.rejects(()=>pending,{name:'AbortError'});
|
||||
} finally { globalThis.fetch=original; }
|
||||
});
|
||||
|
||||
test('search-only detail uses IKN endpoint and warns when official announcement is absent',async()=>{
|
||||
const original=globalThis.fetch;
|
||||
try {
|
||||
globalThis.fetch=async url=>{
|
||||
assert.equal(url,'/api/documents/ilan?ikn=2026%2F123');
|
||||
return Response.json({success:true,ikn:'2026/123',metin:'Temel ihale bilgisi',ilanSayisi:0});
|
||||
};
|
||||
const detail=await fetchTenderDetail('ekap-2026/123');
|
||||
assert.equal(detail.aciklama,'Temel ihale bilgisi');assert.match(detail.sourceWarning,/yalnız temel/);
|
||||
globalThis.fetch=async()=>Response.json({success:true,ikn:'2026/999',metin:'Farklı kaynak'});
|
||||
await assert.rejects(fetchTenderDetail('ekap-2026/123'),/İKN/);
|
||||
} finally {globalThis.fetch=original;}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user