<?php

use App\Support\OperatingMode;
use App\Support\StripeWebhookSecret;
use Illuminate\Support\Facades\Schema;

/**
 * Zwei Signaturschlüssel, weil Stripe je Modus einen eigenen vergibt.
 *
 * Der dritte Test ist der eigentliche Grund für diese Datei: die Auswahl liest
 * den Modus aus der Datenbank — aus genau der Quelle, die für diesen Wert
 * bewusst vermieden wurde. Fällt sie aus, muss die Auswahl auf LIVE fallen. Ein
 * echtes Zahlungsereignis wird dann weiter korrekt geprüft; ein Testereignis
 * scheitert laut. Die umgekehrte Vorgabe wäre die gefährliche.
 *
 * Ruft App\Support\StripeWebhookSecret::current() direkt auf statt über
 * Reflection eine private Controller-Methode: die Auswahl sitzt in einer
 * eigenen, öffentlich aufrufbaren Klasse (Begründung in deren Kopfkommentar),
 * gerade damit dieser Test ohne ReflectionMethod auskommt.
 */
beforeEach(function () {
    config()->set('services.stripe.webhook_secret', 'whsec_live');
    config()->set('services.stripe.webhook_secret_test', 'whsec_test');
});

it('uses the live signing secret in live mode', function () {
    OperatingMode::set(OperatingMode::Live);

    expect(StripeWebhookSecret::current())->toBe('whsec_live');
});

it('uses the test signing secret in test mode', function () {
    OperatingMode::set(OperatingMode::Test);

    expect(StripeWebhookSecret::current())->toBe('whsec_test');
});

it('uses the live secret when the settings table cannot be read', function () {
    OperatingMode::set(OperatingMode::Test);

    // Der Ausfall, gegen den der Wert ursprünglich aus der Datenbank
    // herausgehalten wurde.
    Schema::drop('app_settings');

    expect(StripeWebhookSecret::current())->toBe('whsec_live');
});
