55 lines
3.3 KiB
JavaScript
55 lines
3.3 KiB
JavaScript
import test from 'node:test';
|
||
import assert from 'node:assert/strict';
|
||
import {fetchTenderDetail,fetchOfficialTenderDetail} from '../src/services/tenderApi.js';
|
||
test('detail loading rejects empty source, supports retry and stops on timeout/cancel',async()=>{
|
||
const original=globalThis.fetch;
|
||
try {
|
||
globalThis.fetch=async()=>new Response(JSON.stringify({success:true,aciklama:''}));
|
||
await assert.rejects(()=>fetchTenderDetail('ilan-1'),/Kaynak ilan metni alınamadı/);
|
||
globalThis.fetch=async()=>new Response(JSON.stringify({success:true,aciklama:'Tam ilan metni'}));
|
||
assert.equal((await fetchTenderDetail('ilan-1')).aciklama,'Tam ilan metni');
|
||
globalThis.fetch=async()=>new Response('error',{status:503});
|
||
await assert.rejects(()=>fetchTenderDetail('ilan-1'),/HTTP 503/);
|
||
globalThis.fetch=async()=>Response.json({success:false,code:'SOURCE_UNAVAILABLE',retryable:true,error:'kaynak yok'},{status:502});
|
||
await assert.rejects(()=>fetchTenderDetail('ilan-1'),/geçici olarak erişilemiyor.*yeniden deneyin/);
|
||
globalThis.fetch=async()=>Response.json({success:false,code:'HUMAN_VERIFICATION_REQUIRED',retryable:false,manualAction:true,error:'EKAP güvenlik doğrulaması gerekiyor. EKAP’ı kendi tarayıcınızda açın.'},{status:428});
|
||
await assert.rejects(()=>fetchTenderDetail('ekap-2026/123'),/güvenlik doğrulaması.*kendi tarayıcınızda açın/);
|
||
globalThis.fetch=async(url,{signal})=>new Promise((resolve,reject)=>{
|
||
if(signal.aborted) reject(new DOMException('Cancelled','AbortError'));
|
||
else signal.addEventListener('abort',()=>reject(new DOMException('Cancelled','AbortError')),{once:true});
|
||
});
|
||
await assert.rejects(()=>fetchTenderDetail('ilan-1',{timeoutMs:5}),/zaman aşımı/);
|
||
const controller=new AbortController();
|
||
const pending=fetchTenderDetail('ilan-1',{signal:controller.signal});controller.abort();
|
||
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;}
|
||
});
|
||
|
||
test('official tender detail keeps EKAP date authoritative and validates IKN',async()=>{
|
||
const original=globalThis.fetch;
|
||
try {
|
||
globalThis.fetch=async url=>{
|
||
assert.equal(url,'/api/documents/ilan?ikn=2026%2F1573235');
|
||
return Response.json({success:true,ikn:'2026/1573235',tarih:'16.09.2026',saat:'10:00',sourceDateTime:'16.09.2026 10:00',metin:'EKAP ilanı'});
|
||
};
|
||
const detail=await fetchOfficialTenderDetail(' 2026/1573235 ');
|
||
assert.equal(detail.tarih,'16.09.2026');
|
||
globalThis.fetch=async()=>Response.json({success:true,ikn:'2026/999',tarih:'10.09.2026',saat:'10:00'});
|
||
await assert.rejects(()=>fetchOfficialTenderDetail('2026/1573235'),/İKN/);
|
||
} finally {globalThis.fetch=original;}
|
||
});
|