diff --git a/apps/api/src/domains/autodns-parse.spec.ts b/apps/api/src/domains/autodns-parse.spec.ts index f3ad7f4..6000c35 100644 --- a/apps/api/src/domains/autodns-parse.spec.ts +++ b/apps/api/src/domains/autodns-parse.spec.ts @@ -162,18 +162,28 @@ describe('parseDomainStudio', () => { it('liest den Betrag auch unter `price` und als Zeichenkette', () => { const result = parseDomainStudio( - [studio('beispiel.de', 'FREE', [{ price: { amount: '4,90', currency: 'EUR' } }])], + [ + studio('beispiel.de', 'FREE', [ + { price: { amount: '4,90', currency: 'EUR' }, period: { unit: 'MONTH', period: 12 } }, + ]), + ], 'beispiel.de', ); expect(result.price).toEqual({ amount: 4.9, currency: 'EUR' }); }); - it('nimmt den ersten Preis, wenn kein Ein-Jahres-Eintrag da ist', () => { + it('zeigt keinen Preis, wenn kein Eintrag nachweislich fuer ein Jahr gilt', () => { + // Weder ein Eintrag ohne Zeitraum noch ein mehrjaehriger darf als Jahrespreis erscheinen. const result = parseDomainStudio( - [studio('beispiel.de', 'FREE', [{ amount: 7, currency: 'EUR' }])], + [ + studio('beispiel.de', 'FREE', [ + { amount: 7, currency: 'EUR' }, + { amount: 13, currency: 'EUR', period: { unit: 'YEAR', period: 2 } }, + ]), + ], 'beispiel.de', ); - expect(result.price).toEqual({ amount: 7, currency: 'EUR' }); + expect(result).toEqual({ whoisStatus: 'FREE', price: null }); }); it('ohne Preisdienst ist der Preis null', () => { diff --git a/apps/api/src/domains/autodns-parse.ts b/apps/api/src/domains/autodns-parse.ts index bfa0c30..2f9a1b8 100644 --- a/apps/api/src/domains/autodns-parse.ts +++ b/apps/api/src/domains/autodns-parse.ts @@ -176,7 +176,7 @@ function parsePriceEntry(entry: unknown): ParsedPrice | null { /** * Wertet die Antwort von `POST /domainstudio` aus. Nur der Umschlag, dessen * `domain` der angefragten Domain entspricht, zaehlt (D-K) — alles andere - * ist `NO_RESULT`. Als Preis gilt der Ein-Jahres-Eintrag, sonst der erste. + * ist `NO_RESULT`. Als Preis gilt nur der Ein-Jahres-Eintrag, sonst keiner. */ export function parseDomainStudio(data: unknown, wantedAscii: string): ParsedAvailability { const wanted = wantedAscii.toLowerCase(); @@ -193,7 +193,10 @@ export function parseDomainStudio(data: unknown, wantedAscii: string): ParsedAva let price: ParsedPrice | null = null; if (Array.isArray(prices)) { const oneYear = prices.find((p) => isRecord(p) && isOneYear(p.period)); - price = parsePriceEntry(oneYear) ?? parsePriceEntry(prices[0]); + // Nur ein belegter Ein-Jahres-Preis; ein anderer Zeitraum (mehrjaehrig, + // Uebertragung) wuerde in der verbindlichen Bestaetigung als Jahrespreis + // erscheinen. Ohne Ein-Jahres-Eintrag: kein Preis ("Preis unbekannt"). + price = parsePriceEntry(oneYear); } return { whoisStatus: status ? status.toUpperCase() : 'NO_RESULT', price }; }