fix(domains): Preis nur anzeigen, wenn er nachweislich fuer ein Jahr gilt (WR-05)

Der Rueckgriff auf den ersten Preiseintrag entfaellt; ohne Ein-Jahres-Eintrag
erscheint "Preis unbekannt" statt eines Preises fuer einen anderen Zeitraum.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-08 11:27:41 +02:00
parent d332246bde
commit 9ecf191fb4
2 changed files with 19 additions and 6 deletions
+14 -4
View File
@@ -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', () => {
+5 -2
View File
@@ -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 };
}