Testovanie
Certificates::fake() nahradí fasádu aj väzbu v kontajneri triedou Testing\CertificatesFake v pamäti, takže sa zaznamenajú aj managery injektované cez konštruktor, rukoväť for() a HasCertificates::requestCertificate(). Vráti inštanciu fake a každú aserciu zavoláte na nej alebo na fasáde:
use RoundlyConsulting\Certificates\Facades\Certificates;
$fake = Certificates::fake();
$this->post('/sites', ['domain' => 'app.example.com']);
Certificates::assertIssued('app.example.com');
Certificates::assertNothingRevoked();- Nikdy sa nedotkne poskytovateľa, registra, fronty ani udalostí — certifikáty žijú v pamäti a každý driver() je ArrayProvider v pamäti.
- Neplatné domény (InvalidDomainException), neznáme domény a nepovolené prechody stavu — vrátane renewLater() — naďalej vyhadzujú výnimky, presne ako skutočný manager.
- renewDue() pracuje s úložiskom v pamäti a vracia skutočný RenewalReport; sync() a prune() vracajú 0.
Asercie
| Zaznamená ho | Asercie |
|---|---|
| issue, issueIfMissing, generate, for()->issue(), requestCertificate() | assertIssued($domain), assertNotIssued($domain), assertIssuedCount($n), assertNothingIssued(), assertRequested($domain) |
| recordFailure($domain) | assertFailed($domain) |
| renew, for()->renew() (aj priamy renewDue) | assertRenewed($domain), assertNotRenewed($domain), assertNothingRenewed() |
| renewLater, for()->renewLater() (aj renewDue(queue: true)) | assertRenewedLater($domain), assertNothingRenewedLater() |
| renewDue | assertRenewedDue(?$thresholdDays), assertNothingRenewedDue() |
| obnova zlyhaná cez failRenewalOf() | assertRenewalFailed($domain), assertNoRenewalFailures() |
| revoke, for()->revoke() | assertRevoked($domain, ?$reason), assertNotRevoked($domain), assertNothingRevoked() |
| expire, for()->expire() | assertExpired($domain), assertNothingExpired() |
| sync | assertSynced(?$driver), assertNothingSynced() |
| prune | assertPruned(?$days), assertNothingPruned() |
Všetky asercie v praxi:
use RoundlyConsulting\Certificates\Facades\Certificates;
$fake = Certificates::fake();
// Issuance — issue, issueIfMissing, generate, for()->issue(), requestCertificate()
Certificates::issueIfMissing('a.example.com');
Certificates::for('b.example.com')->issue();
$fake->recordFailure('c.example.com');
Certificates::assertIssued('a.example.com');
Certificates::assertNotIssued('c.example.com');
Certificates::assertIssuedCount(2);
Certificates::assertRequested('c.example.com'); // issued, or recorded as failed
Certificates::assertFailed('c.example.com');
// Renewals — renew, renewLater, renewDue
Certificates::renew('a.example.com');
Certificates::for('b.example.com')->renewLater();
Certificates::renewDue(7);
Certificates::assertRenewed('a.example.com');
Certificates::assertNotRenewed('b.example.com');
Certificates::assertRenewedLater('b.example.com');
Certificates::assertRenewedDue(7); // a run with exactly this threshold
Certificates::assertNoRenewalFailures();
// Revoke and expire
Certificates::revoke('a.example.com', 'key compromise');
Certificates::for('b.example.com')->expire();
Certificates::assertRevoked('a.example.com', 'key compromise');
Certificates::assertNotRevoked('b.example.com');
Certificates::assertExpired('b.example.com');
// Registry maintenance
Certificates::sync('kubernetes');
Certificates::prune(30);
Certificates::assertSynced('kubernetes');
Certificates::assertPruned(30);A ich náprotivky pre prípad, keď sa nemalo stať nič:
Certificates::fake();
// ...code that must leave certificates alone...
Certificates::assertNothingIssued();
Certificates::assertNothingRenewed();
Certificates::assertNothingRenewedLater();
Certificates::assertNothingRenewedDue();
Certificates::assertNothingRevoked();
Certificates::assertNothingExpired();
Certificates::assertNothingSynced();
Certificates::assertNothingPruned();Vloženie certifikátov a zlyhané obnovy
| Metóda | Účel |
|---|---|
seed(Certificate ...$certificates) | Uloží certifikáty do pamäte bez zaznamenania vystavenia, aby ste mohli obnoviť, odvolať či expirovať certifikát, ktorý test nevystavil. Vráti fake. |
failRenewalOf(string ...$domains) | Obnovy týchto domén zlyhajú: záznam prejde do Failed, renew() vyhodí výnimku a renewDue() ho uvedie medzi failed a pokračuje. Vráti fake. |
recordFailure(string $domain) | Zaznamená neúspešné vystavenie — podklad pre assertFailed() a assertRequested(). |
Cez seed() a failRenewalOf() otestujete, ako váš kód spracuje RenewalReport so zlyhaniami:
use RoundlyConsulting\Certificates\Facades\Certificates;
use RoundlyConsulting\Certificates\Models\Certificate;
$fake = Certificates::fake()
->seed(Certificate::factory()->forDomain('a.example.com')->expiring(5)->make())
->failRenewalOf('a.example.com');
$report = Certificates::renewDue();
expect($report->hasFailures())->toBeTrue()
->and($report->failedDomains())->toBe(['a.example.com']);
Certificates::assertRenewalFailed('a.example.com');Monitory expirácie
monitorExpiry() vytvára plán v alerts, preto ho testujte cez Health::fake() z alerts a assertMonitored():
use RoundlyConsulting\Alerts\Facades\Health;
use RoundlyConsulting\Certificates\Alerts\CertificateExpiryCheck;
use RoundlyConsulting\Certificates\Facades\Certificates;
$health = Health::fake();
Certificates::monitorExpiry($certificate, $opsTeam)->daily()->save();
$health->assertMonitored(CertificateExpiryCheck::class, $opsTeam);Proti driveru array
Ak chcete otestovať skutočnú cestu vystavenia — záznamy v registri, udalosti, vlastníkov — fake vynechajte a prepnite predvolený driver na in-memory driver array. Testy spúšťajte s načítanými migráciami (RefreshDatabase):
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Certificates\Events\CertificateIssued;
use RoundlyConsulting\Certificates\Facades\Certificates;
it('records an issued certificate', function () {
config(['certificates.default' => 'array']);
Event::fake([CertificateIssued::class]);
$certificate = Certificates::issueIfMissing('app.example.com');
expect($certificate->status->isActive())->toBeTrue()
->and($certificate->expires_at)->not->toBeNull();
Event::assertDispatched(CertificateIssued::class);
});Factory modelu
Model registra má factory so stavmi pre bežné scenáre:
use RoundlyConsulting\Certificates\Models\Certificate;
Certificate::factory()->create(); // pending, random domain, kubernetes driver
Certificate::factory()->issued()->create(); // issued, expires in 90 days
Certificate::factory()->expiring(5)->create(); // issued, expires in 5 days
Certificate::factory()->expired()->create(); // expired 5 days ago
Certificate::factory()->failed()->create(); // failed, with last_error
Certificate::factory()->forDomain('shop.example.com')->issued()->create();Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.