Never spend real money while the switch says test

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feature/betriebsmodus
nexxo 2026-07-30 11:01:33 +02:00
parent bc6eee4dc3
commit 59e8689630
2 changed files with 62 additions and 0 deletions

View File

@ -80,6 +80,12 @@ final class SecretVault
'label' => 'secrets.item.stripe_secret',
'check' => StripeCheck::class,
'env_key' => 'STRIPE_SECRET',
// Kein Rückfall, in keine Richtung, und auch nicht auf die Umgebung.
// Ohne das benutzt ein Testkauf bei fehlendem Testschlüssel still den
// Live-Schlüssel und bucht echtes Geld ab, während die Konsole
// „Testbetrieb aktiv" anzeigt. Jeder andere Eintrag hier bezeichnet
// dasselbe Konto in beiden Modi; dieser nicht.
'strict' => true,
],
'dns.token' => [
'config' => 'provisioning.dns.token',

View File

@ -0,0 +1,56 @@
<?php
use App\Models\Operator;
use App\Services\Secrets\SecretVault;
use App\Support\OperatingMode;
/**
* Stripe ist vom Rückfall ausgenommen in BEIDE Richtungen.
*
* Fiele der Testbetrieb bei fehlendem Testschlüssel auf den Live-Schlüssel
* zurück, bucht ein Testkauf echtes Geld ab, während die Konsole „Testbetrieb
* aktiv" anzeigt. Das ist die eine Stelle in diesem Vorhaben, deren Ausfall
* Geld kostet, und deshalb steht sie als eigener Test da statt als Kommentar.
*/
beforeEach(function () {
$this->by = Operator::factory()->create();
$this->vault = app(SecretVault::class);
});
it('does not use the live key while the test mode is active', function () {
$this->vault->put('stripe.secret', 'sk_live_real', $this->by, OperatingMode::Live);
OperatingMode::set(OperatingMode::Test);
expect($this->vault->get('stripe.secret'))->toBeNull();
});
it('does not use the test key while the live mode is active', function () {
$this->vault->put('stripe.secret', 'sk_test_fake', $this->by, OperatingMode::Test);
OperatingMode::set(OperatingMode::Live);
expect($this->vault->get('stripe.secret'))->toBeNull();
});
it('ignores the environment for stripe as well', function () {
// Sonst wäre die .env die Hintertür, durch die der Live-Schlüssel doch in
// den Testbetrieb kommt.
config()->set('services.stripe.secret', 'sk_live_from_env');
OperatingMode::set(OperatingMode::Test);
expect($this->vault->get('stripe.secret'))->toBeNull();
});
it('uses the key of the active mode when it is there', function () {
$this->vault->put('stripe.secret', 'sk_test_fake', $this->by, OperatingMode::Test);
OperatingMode::set(OperatingMode::Test);
expect($this->vault->get('stripe.secret'))->toBe('sk_test_fake');
});
it('lets every other entry keep falling back', function () {
// Die Ausnahme ist eine Ausnahme, keine neue Regel.
$this->vault->put('dns.token', 'live-token', $this->by, OperatingMode::Live);
OperatingMode::set(OperatingMode::Test);
expect($this->vault->get('dns.token'))->toBe('live-token');
});