import test from 'node:test'; import assert from 'node:assert/strict'; import {fetchTenderDetail} 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(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;} });