Files
LinkPort/internal/alerts/asset_expiry_test.go
T

57 lines
1.8 KiB
Go

package alerts
import (
"context"
"crypto/ed25519"
"crypto/rand"
"linkport/internal/model"
"testing"
"time"
"golang.org/x/crypto/ssh"
)
func TestAssetCertificateAlertsRecoverAfterRenewal(t *testing.T) {
s := fixtureStore(t)
now := time.Now().UTC().Truncate(time.Second)
_, key, err := ed25519.GenerateKey(rand.Reader)
if err != nil {
t.Fatal(err)
}
signer, _ := ssh.NewSignerFromKey(key)
asset := model.Asset{ID: "cert", Name: "secret-name-not-for-webhooks", Type: "ssh_certificate"}
content := func(expiry time.Time) string {
cert := &ssh.Certificate{Key: signer.PublicKey(), CertType: ssh.UserCert, KeyId: "secret-subject-not-for-webhooks", ValidAfter: uint64(now.Add(-time.Hour).Unix()), ValidBefore: uint64(expiry.Unix())}
if err := cert.SignCert(rand.Reader, signer); err != nil {
t.Fatal(err)
}
return string(ssh.MarshalAuthorizedKey(cert))
}
asset.Content = content(now.Add(-time.Minute))
if err = s.SaveAsset(asset); err != nil {
t.Fatal(err)
}
e := New(s, &fixtureSource{})
if err = e.check(context.Background(), now); err != nil {
t.Fatal(err)
}
items, err := s.Alerts()
if err != nil || len(items) != 1 || items[0].Kind != "certificate_expired" || items[0].ResourceID != "cert" || items[0].Status != "active" {
t.Fatalf("asset alert missing: %+v %v", items, err)
}
if items[0].Message != "Asset certificate has expired; upload a renewed certificate" {
t.Fatal("unexpected sensitive alert detail")
}
asset.Content = content(now.Add(90 * 24 * time.Hour))
if err = s.SaveAsset(asset); err != nil {
t.Fatal(err)
}
if err = e.check(context.Background(), now.Add(time.Second)); err != nil {
t.Fatal(err)
}
items, err = s.Alerts()
if err != nil || len(items) != 1 || items[0].Status != "resolved" {
t.Fatalf("renewed alert did not recover %+v %v", items, err)
}
}