From 35904c0a3508478fd5ebe1f89ae721006d055de8 Mon Sep 17 00:00:00 2001 From: patrick Date: Mon, 19 Oct 2026 14:48:02 +0200 Subject: [PATCH] test: fakeKEKProvider/fakeKEK-Dopplung in testutil-Pakete konsolidiert Fable-Review auf Code-Dopplung (P1). Byteidentische Test-Doubles, die unabhaengig in vielen *_test.go-Dateien dupliziert waren, je Modul in ein neues internal/testutil-Paket gezogen (Go-Modulgrenzen verhindern ein gemeinsames Paket ueber dms/archive/connect hinweg): - dms/internal/testutil.FakeKEKProvider: 14 Dateien (thumbnail, versioningapi, documentapi, pdfsign, docmerge, pdfconvert, export, watchfolder, downloadapi, malwarescan, uploadapi, versioning, migrationdocument, upload) + 2 weitere Nutzstellen ohne eigene Typdefinition (versioning/diff_test.go, uploadapi/int19_...). dms/internal/crypto/service_test.go NICHT angefasst -- eigene Call-Counting-Variante, keine echte Dopplung. - archive/internal/testutil.FakeKEKProvider: backup + objectbackup (tenant-keyed Map-Variante, von der dms-Variante verschieden). - connect/internal/testutil.FakeKEK: 7 Dateien (backupconnector, credential, contracttest, connectorsetupapi, webhooksub x2, m365connector). connect/internal/crypto/envelope_test.go NICHT angefasst -- einziges Vorkommen, keine Dopplung. fakeUsageReporter/fakeVerifier bewusst NICHT konsolidiert: bei Pruefung stellten sich die meisten Vorkommen als inhaltlich verschiedene Varianten heraus (unterschiedliche Felder/Fehlerpfade), keine echte Kopie. Die eine echte Dopplung (archive/workflow moduleadapter) liegt ueber einer Modulgrenze, nicht ohne neue Shared-Library loesbar. go build/vet/test (-p 1) sauber in allen betroffenen Paketen von dms, archive, connect auf Testhost 131. Co-Authored-By: Claude Sonnet 5 --- archive/internal/backup/encryption_test.go | 24 +++----------- .../objectbackup/kek_password_test.go | 30 +++-------------- archive/internal/testutil/kekfake.go | 32 +++++++++++++++++++ .../backupconnector/backupconnector_test.go | 11 +++---- .../connectorsetupapi_test.go | 9 ++---- .../contracttest/contracttest_test.go | 6 ++-- .../internal/credential/credential_test.go | 11 ++----- .../m365connector/m365connector_test.go | 9 ++---- connect/internal/testutil/kekfake.go | 13 ++++++++ connect/internal/webhooksub/common_test.go | 9 ++---- .../internal/webhooksub/webhooksub_test.go | 5 +-- dms/internal/docmerge/docmerge_test.go | 9 ++---- dms/internal/documentapi/handler_test.go | 9 ++---- dms/internal/downloadapi/handler_test.go | 9 ++---- dms/internal/export/export_test.go | 9 ++---- dms/internal/malwarescan/scan_test.go | 9 ++---- .../migrationdocument/migrate_test.go | 13 ++------ dms/internal/pdfconvert/pdfconvert_test.go | 9 ++---- dms/internal/pdfsign/pdfsign_test.go | 9 ++---- dms/internal/testutil/kekfake.go | 14 ++++++++ dms/internal/thumbnail/thumbnail_test.go | 9 ++---- dms/internal/upload/service_test.go | 12 ++----- dms/internal/uploadapi/handler_test.go | 9 ++---- .../uploadapi/int19_mobilecapture_test.go | 3 +- dms/internal/versioning/diff_test.go | 3 +- dms/internal/versioning/versioning_test.go | 9 ++---- dms/internal/versioningapi/handler_test.go | 9 ++---- dms/internal/watchfolder/watcher_test.go | 11 ++----- 28 files changed, 119 insertions(+), 195 deletions(-) create mode 100644 archive/internal/testutil/kekfake.go create mode 100644 connect/internal/testutil/kekfake.go create mode 100644 dms/internal/testutil/kekfake.go diff --git a/archive/internal/backup/encryption_test.go b/archive/internal/backup/encryption_test.go index 0542add3..28bbc443 100644 --- a/archive/internal/backup/encryption_test.go +++ b/archive/internal/backup/encryption_test.go @@ -3,32 +3,16 @@ package backup import ( "bytes" "context" - "errors" "os" "path/filepath" "testing" "time" + + "gitea.perlbach24.de/scripte/nexarch/archive/internal/testutil" ) -// fakeKEKProvider liefert deterministische, tenant-spezifische KEKs für -// Tests, ohne einen echten Core-API-10-Aufruf zu brauchen. -type fakeKEKProvider struct { - keks map[string][]byte -} - -func newFakeKEKProvider() *fakeKEKProvider { - return &fakeKEKProvider{keks: map[string][]byte{ - "mandant-a": bytes.Repeat([]byte{0xAA}, 32), - "mandant-b": bytes.Repeat([]byte{0xBB}, 32), - }} -} - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - kek, ok := f.keks[tenantSlug] - if !ok { - return nil, errors.New("fakeKEKProvider: unbekannter mandant") - } - return kek, nil +func newFakeKEKProvider() *testutil.FakeKEKProvider { + return testutil.NewFakeKEKProvider() } // TestEncryptGeneration_RemovesPlaintextReadability ist Prüfung 1 (BAK-09): diff --git a/archive/internal/objectbackup/kek_password_test.go b/archive/internal/objectbackup/kek_password_test.go index f0364bfa..e5907a7c 100644 --- a/archive/internal/objectbackup/kek_password_test.go +++ b/archive/internal/objectbackup/kek_password_test.go @@ -2,37 +2,15 @@ package objectbackup import ( "context" - "errors" "os" "path/filepath" "testing" + + "gitea.perlbach24.de/scripte/nexarch/archive/internal/testutil" ) -type fakeKEKProvider struct { - keks map[string][]byte -} - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - kek, ok := f.keks[tenantSlug] - if !ok { - return nil, errors.New("fakeKEKProvider: unbekannter mandant") - } - return kek, nil -} - -func newFakeKEKProvider() *fakeKEKProvider { - return &fakeKEKProvider{keks: map[string][]byte{ - "mandant-a": bytesOf(0xAA), - "mandant-b": bytesOf(0xBB), - }} -} - -func bytesOf(b byte) []byte { - out := make([]byte, 32) - for i := range out { - out[i] = b - } - return out +func newFakeKEKProvider() *testutil.FakeKEKProvider { + return testutil.NewFakeKEKProvider() } // TestTenantEncryptedConfig_BackupAndRestore ist Pruefung 2 (BAK-09): diff --git a/archive/internal/testutil/kekfake.go b/archive/internal/testutil/kekfake.go new file mode 100644 index 00000000..03b0a47b --- /dev/null +++ b/archive/internal/testutil/kekfake.go @@ -0,0 +1,32 @@ +// Package testutil buendelt Test-Doubles, die identisch in mehreren +// archive/internal-Paketen dupliziert waren (Fable-Review auf Code-Dopplung). +package testutil + +import ( + "bytes" + "context" + "errors" +) + +// FakeKEKProvider liefert deterministische, tenant-spezifische KEKs fuer +// Tests, ohne einen echten Core-API-10-Aufruf zu brauchen. +type FakeKEKProvider struct { + Keks map[string][]byte +} + +// NewFakeKEKProvider liefert einen FakeKEKProvider mit den beiden in +// Tests ueblichen Mandanten "mandant-a"/"mandant-b" vorbefuellt. +func NewFakeKEKProvider() *FakeKEKProvider { + return &FakeKEKProvider{Keks: map[string][]byte{ + "mandant-a": bytes.Repeat([]byte{0xAA}, 32), + "mandant-b": bytes.Repeat([]byte{0xBB}, 32), + }} +} + +func (f *FakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { + kek, ok := f.Keks[tenantSlug] + if !ok { + return nil, errors.New("fakeKEKProvider: unbekannter mandant") + } + return kek, nil +} diff --git a/connect/internal/backupconnector/backupconnector_test.go b/connect/internal/backupconnector/backupconnector_test.go index 363c05de..d36dafd7 100644 --- a/connect/internal/backupconnector/backupconnector_test.go +++ b/connect/internal/backupconnector/backupconnector_test.go @@ -20,18 +20,15 @@ import ( "gitea.perlbach24.de/scripte/nexarch/connect/internal/registry" "gitea.perlbach24.de/scripte/nexarch/connect/internal/syncjob" "gitea.perlbach24.de/scripte/nexarch/connect/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/connect/internal/testutil" ) -type fakeKEK struct{ key []byte } - -func (f *fakeKEK) TenantKEK(_ context.Context, _ string) ([]byte, error) { return f.key, nil } - -func newTestKEK() *fakeKEK { +func newTestKEK() *testutil.FakeKEK { key := make([]byte, crypto.KEKSize) for i := range key { key[i] = byte(i + 7) } - return &fakeKEK{key: key} + return &testutil.FakeKEK{KEK: key} } // mockS3 is a minimal S3-compatible test double: it requires a well-formed @@ -170,7 +167,7 @@ func TestClient_ExportIsEncryptedInTransit(t *testing.T) { t.Fatalf("decrypted = %q, want %q", opened, plaintext) } - wrongKEK := &fakeKEK{key: make([]byte, crypto.KEKSize)} + wrongKEK := &testutil.FakeKEK{KEK: make([]byte, crypto.KEKSize)} wrongSvc := crypto.NewService(wrongKEK) if _, err := wrongSvc.Open(context.Background(), "acme", &crypto.Sealed{ Ciphertext: env.Ciphertext, WrappedDEK: env.WrappedDEK, diff --git a/connect/internal/connectorsetupapi/connectorsetupapi_test.go b/connect/internal/connectorsetupapi/connectorsetupapi_test.go index b546a163..a6f7e091 100644 --- a/connect/internal/connectorsetupapi/connectorsetupapi_test.go +++ b/connect/internal/connectorsetupapi/connectorsetupapi_test.go @@ -18,14 +18,9 @@ import ( "gitea.perlbach24.de/scripte/nexarch/connect/internal/fieldmapping" "gitea.perlbach24.de/scripte/nexarch/connect/internal/migrate" "gitea.perlbach24.de/scripte/nexarch/connect/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/connect/internal/testutil" ) -type fakeKEK struct{ kek []byte } - -func (f *fakeKEK) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - func newTestServer(t *testing.T) *http.ServeMux { t.Helper() dsn := os.Getenv("TEST_TENANT_DSN") @@ -44,7 +39,7 @@ func newTestServer(t *testing.T) *http.ServeMux { if _, err := migrate.Up(context.Background(), pool, migrations); err != nil { t.Fatalf("migrationen anwenden: %v", err) } - cryptoSvc := connectcrypto.NewService(&fakeKEK{kek: bytes.Repeat([]byte{0x11}, connectcrypto.KEKSize)}) + cryptoSvc := connectcrypto.NewService(&testutil.FakeKEK{KEK: bytes.Repeat([]byte{0x11}, connectcrypto.KEKSize)}) s := NewServer(credential.NewStore(pool, cryptoSvc), fieldmapping.NewStore(pool)) mux := http.NewServeMux() s.RegisterRoutes(mux) diff --git a/connect/internal/contracttest/contracttest_test.go b/connect/internal/contracttest/contracttest_test.go index 0d83c331..3ff824bd 100644 --- a/connect/internal/contracttest/contracttest_test.go +++ b/connect/internal/contracttest/contracttest_test.go @@ -16,6 +16,7 @@ import ( connectcrypto "gitea.perlbach24.de/scripte/nexarch/connect/internal/crypto" "gitea.perlbach24.de/scripte/nexarch/connect/internal/migrate" "gitea.perlbach24.de/scripte/nexarch/connect/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/connect/internal/testutil" "gitea.perlbach24.de/scripte/nexarch/connect/internal/webhookclient" "gitea.perlbach24.de/scripte/nexarch/connect/internal/webhooksub" ) @@ -165,9 +166,6 @@ func TestContract_DeliverySignatureHeader_MatchesDocumentedName(t *testing.T) { } } -type fakeKEK struct{ kek []byte } - -func (f *fakeKEK) TenantKEK(context.Context, string) ([]byte, error) { return f.kek, nil } // fakeCoreWebhookAPI reicht fuer Vertrag 4 aus, um ein echtes, von Connect // generiertes Geheimnis an Core "weiterzugeben" -- dasselbe, ausdruecklich @@ -221,7 +219,7 @@ func setupDeliveryContractTest(t *testing.T) deliveryContractEnv { fakeCore, coreSecret := newFakeCoreForDeliveryContract() t.Cleanup(fakeCore.Close) - cryptoSvc := connectcrypto.NewService(&fakeKEK{kek: make([]byte, connectcrypto.KEKSize)}) + cryptoSvc := connectcrypto.NewService(&testutil.FakeKEK{KEK: make([]byte, connectcrypto.KEKSize)}) mgr := webhooksub.NewManager(pool, cryptoSvc, webhookclient.New(fakeCore.URL, "svc-token-test"), "https://connect.example.test/connector-webhooks/deliveries") return deliveryContractEnv{Manager: mgr, FakeCore: fakeCore, coreSecret: coreSecret} } diff --git a/connect/internal/credential/credential_test.go b/connect/internal/credential/credential_test.go index 584523eb..2d9d02d2 100644 --- a/connect/internal/credential/credential_test.go +++ b/connect/internal/credential/credential_test.go @@ -19,14 +19,9 @@ import ( connectcrypto "gitea.perlbach24.de/scripte/nexarch/connect/internal/crypto" "gitea.perlbach24.de/scripte/nexarch/connect/internal/migrate" "gitea.perlbach24.de/scripte/nexarch/connect/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/connect/internal/testutil" ) -type fakeKEK struct{ kek []byte } - -func (f *fakeKEK) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - func setup(t *testing.T) (*credential.Store, *pgxpool.Pool) { t.Helper() dsn := os.Getenv("TEST_TENANT_DSN") @@ -44,7 +39,7 @@ func setup(t *testing.T) (*credential.Store, *pgxpool.Pool) { t.Fatalf("migrationen anwenden: %v", err) } - cryptoSvc := connectcrypto.NewService(&fakeKEK{kek: bytes.Repeat([]byte{0x11}, connectcrypto.KEKSize)}) + cryptoSvc := connectcrypto.NewService(&testutil.FakeKEK{KEK: bytes.Repeat([]byte{0x11}, connectcrypto.KEKSize)}) store := credential.NewStore(pool, cryptoSvc) return store, pool } @@ -119,7 +114,7 @@ func TestStore_WrongKeyFailsClosed(t *testing.T) { t.Fatalf("put: %v", err) } - wrongKEK := connectcrypto.NewService(&fakeKEK{kek: bytes.Repeat([]byte{0x22}, connectcrypto.KEKSize)}) + wrongKEK := connectcrypto.NewService(&testutil.FakeKEK{KEK: bytes.Repeat([]byte{0x22}, connectcrypto.KEKSize)}) wrongStore := credential.NewStore(pool, wrongKEK) if _, _, _, err := wrongStore.Get(ctx, ref); !errors.Is(err, connectcrypto.ErrDecryptFailed) { t.Fatalf("erwartet ErrDecryptFailed, habe %v", err) diff --git a/connect/internal/m365connector/m365connector_test.go b/connect/internal/m365connector/m365connector_test.go index c3a85439..43d3708c 100644 --- a/connect/internal/m365connector/m365connector_test.go +++ b/connect/internal/m365connector/m365connector_test.go @@ -16,14 +16,9 @@ import ( "gitea.perlbach24.de/scripte/nexarch/connect/internal/migrate" "gitea.perlbach24.de/scripte/nexarch/connect/internal/testcorpus" "gitea.perlbach24.de/scripte/nexarch/connect/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/connect/internal/testutil" ) -type fakeKEK struct{ kek []byte } - -func (f *fakeKEK) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - func setupCredentialStore(t *testing.T) *credential.Store { t.Helper() dsn := os.Getenv("TEST_TENANT_DSN") @@ -41,7 +36,7 @@ func setupCredentialStore(t *testing.T) *credential.Store { t.Fatalf("migrationen anwenden: %v", err) } - cryptoSvc := connectcrypto.NewService(&fakeKEK{kek: make([]byte, connectcrypto.KEKSize)}) + cryptoSvc := connectcrypto.NewService(&testutil.FakeKEK{KEK: make([]byte, connectcrypto.KEKSize)}) return credential.NewStore(pool, cryptoSvc) } diff --git a/connect/internal/testutil/kekfake.go b/connect/internal/testutil/kekfake.go new file mode 100644 index 00000000..a4b0bcb5 --- /dev/null +++ b/connect/internal/testutil/kekfake.go @@ -0,0 +1,13 @@ +// Package testutil buendelt Test-Doubles, die identisch in mehreren +// connect/internal-Paketen dupliziert waren (Fable-Review auf Code-Dopplung). +package testutil + +import "context" + +// FakeKEK ist ein Test-Double fuer das KEKProvider-Interface -- liefert +// immer denselben festen Schluessel, unabhaengig vom Tenant. +type FakeKEK struct{ KEK []byte } + +func (f *FakeKEK) TenantKEK(_ context.Context, _ string) ([]byte, error) { + return f.KEK, nil +} diff --git a/connect/internal/webhooksub/common_test.go b/connect/internal/webhooksub/common_test.go index ebac0bcd..68f6f3f8 100644 --- a/connect/internal/webhooksub/common_test.go +++ b/connect/internal/webhooksub/common_test.go @@ -19,14 +19,9 @@ import ( "gitea.perlbach24.de/scripte/nexarch/connect/internal/testdb" "gitea.perlbach24.de/scripte/nexarch/connect/internal/webhookclient" "gitea.perlbach24.de/scripte/nexarch/connect/internal/webhooksub" + "gitea.perlbach24.de/scripte/nexarch/connect/internal/testutil" ) -type fakeKEK struct{ kek []byte } - -func (f *fakeKEK) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - // fakeCoreWebhookAPI reproduziert Core API-07s Subscribe/Unsubscribe-Vertrag // -- der von dieser Kachel ausdruecklich erlaubte "minimal gestubte // Core-Webhook-Registry-Endpunkt" fuer den echten End-zu-Ende-Test (echte @@ -131,7 +126,7 @@ func setup(t *testing.T) testEnv { coreSrv := httptest.NewServer(http.HandlerFunc(core.handle)) t.Cleanup(coreSrv.Close) - cryptoSvc := connectcrypto.NewService(&fakeKEK{kek: make([]byte, connectcrypto.KEKSize)}) + cryptoSvc := connectcrypto.NewService(&testutil.FakeKEK{KEK: make([]byte, connectcrypto.KEKSize)}) client := webhookclient.New(coreSrv.URL, "svc-token-test") mgr := webhooksub.NewManager(pool, cryptoSvc, client, "https://connect.example.test/connector-webhooks/deliveries") diff --git a/connect/internal/webhooksub/webhooksub_test.go b/connect/internal/webhooksub/webhooksub_test.go index 91d90c7c..26fbc43b 100644 --- a/connect/internal/webhooksub/webhooksub_test.go +++ b/connect/internal/webhooksub/webhooksub_test.go @@ -8,6 +8,7 @@ import ( "testing" connectcrypto "gitea.perlbach24.de/scripte/nexarch/connect/internal/crypto" + "gitea.perlbach24.de/scripte/nexarch/connect/internal/testutil" "gitea.perlbach24.de/scripte/nexarch/connect/internal/webhookclient" "gitea.perlbach24.de/scripte/nexarch/connect/internal/webhooksub" ) @@ -61,7 +62,7 @@ func TestSubscribe_CoreFailure_PersistsNothingLocally(t *testing.T) { })) defer failingCore.Close() - cryptoSvc := connectcrypto.NewService(&fakeKEK{kek: make([]byte, connectcrypto.KEKSize)}) + cryptoSvc := connectcrypto.NewService(&testutil.FakeKEK{KEK: make([]byte, connectcrypto.KEKSize)}) mgr := webhooksub.NewManager(env.Pool, cryptoSvc, webhookclient.New(failingCore.URL, "svc-token-test"), "https://connect.example.test/connector-webhooks/deliveries") mgr.RegisterAction("testcrm", "dms.document.archived", func(context.Context, []byte) error { return nil }) @@ -138,7 +139,7 @@ func TestUnsubscribe_CoreFailure_KeepsLocalRowForRetry(t *testing.T) { w.WriteHeader(http.StatusInternalServerError) })) defer brokenCore.Close() - cryptoSvc := connectcrypto.NewService(&fakeKEK{kek: make([]byte, connectcrypto.KEKSize)}) + cryptoSvc := connectcrypto.NewService(&testutil.FakeKEK{KEK: make([]byte, connectcrypto.KEKSize)}) mgrWithBrokenCore := webhooksub.NewManager(env.Pool, cryptoSvc, webhookclient.New(brokenCore.URL, "svc-token-test"), "https://connect.example.test/connector-webhooks/deliveries") if err := mgrWithBrokenCore.Unsubscribe(context.Background(), "acme", "testcrm", "dms.document.archived"); err == nil { diff --git a/dms/internal/docmerge/docmerge_test.go b/dms/internal/docmerge/docmerge_test.go index 73d3152e..f1958eb4 100644 --- a/dms/internal/docmerge/docmerge_test.go +++ b/dms/internal/docmerge/docmerge_test.go @@ -14,14 +14,9 @@ import ( dmscrypto "gitea.perlbach24.de/scripte/nexarch/dms/internal/crypto" "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - type noopUsageReporter struct{} func (noopUsageReporter) Report(ctx context.Context, tenantSlug, metric string, delta int64) error { @@ -93,7 +88,7 @@ func setupTest(t *testing.T) *testEnv { } storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x44}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x44}, dmscrypto.KEKSize)}) return &testEnv{pool: pool, storage: storageSvc, crypto: cryptoSvc, userID: userID} } diff --git a/dms/internal/documentapi/handler_test.go b/dms/internal/documentapi/handler_test.go index e13de9cf..44b4f4d3 100644 --- a/dms/internal/documentapi/handler_test.go +++ b/dms/internal/documentapi/handler_test.go @@ -15,14 +15,9 @@ import ( dmscrypto "gitea.perlbach24.de/scripte/nexarch/dms/internal/crypto" "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - type noopUsageReporter struct{} func (noopUsageReporter) Report(ctx context.Context, tenantSlug, metric string, delta int64) error { @@ -77,7 +72,7 @@ func setupTest(t *testing.T) (*httptest.Server, *pgxpool.Pool, *storage.Service, }) storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x33}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x33}, dmscrypto.KEKSize)}) server := NewServer(pool, storageSvc, cryptoSvc, "acme") mux := http.NewServeMux() diff --git a/dms/internal/downloadapi/handler_test.go b/dms/internal/downloadapi/handler_test.go index 8a7fbcff..9561a58e 100644 --- a/dms/internal/downloadapi/handler_test.go +++ b/dms/internal/downloadapi/handler_test.go @@ -22,14 +22,9 @@ import ( "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testaudit" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - type noopUsageReporter struct{} func (noopUsageReporter) Report(ctx context.Context, tenantSlug, metric string, delta int64) error { @@ -84,7 +79,7 @@ func setupTest(t *testing.T, ttl time.Duration) (*testEnv, string) { t.Cleanup(func() { _, _ = pool.Exec(context.Background(), `TRUNCATE file_revisions, documents, users CASCADE`) }) storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("storage-secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x11}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x11}, dmscrypto.KEKSize)}) server := NewServer(pool, storageSvc, cryptoSvc, "acme", &DocumentOwnerChecker{Pool: pool}, []byte("download-secret"), ttl) mux := http.NewServeMux() diff --git a/dms/internal/export/export_test.go b/dms/internal/export/export_test.go index d3e5f3c7..b648e667 100644 --- a/dms/internal/export/export_test.go +++ b/dms/internal/export/export_test.go @@ -20,14 +20,9 @@ import ( "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testaudit" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - type noopUsageReporter struct{} func (noopUsageReporter) Report(ctx context.Context, tenantSlug, metric string, delta int64) error { @@ -107,7 +102,7 @@ func setupTest(t *testing.T) (*testEnv, string) { storageDir := t.TempDir() storageSvc := storage.NewService(storage.NewLocalDriver(storageDir, []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) queue := jobqueue.NewQueue(pool, 5*time.Minute) proc := &Processor{Pool: pool, Storage: storageSvc, Crypto: cryptoSvc, TenantSlug: "acme", Permissions: &ownerChecker{pool: pool}} worker := jobqueue.NewWorker(queue, "test-export-worker", []string{JobType}, time.Millisecond, proc.Handler) diff --git a/dms/internal/malwarescan/scan_test.go b/dms/internal/malwarescan/scan_test.go index 5e455766..0fea7263 100644 --- a/dms/internal/malwarescan/scan_test.go +++ b/dms/internal/malwarescan/scan_test.go @@ -17,14 +17,9 @@ import ( dmscrypto "gitea.perlbach24.de/scripte/nexarch/dms/internal/crypto" "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - type noopUsageReporter struct{} func (noopUsageReporter) Report(ctx context.Context, tenantSlug, metric string, delta int64) error { @@ -104,7 +99,7 @@ func setupTest(t *testing.T) (*pgxpool.Pool, *storage.Service, *dmscrypto.Servic }) storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x66}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x66}, dmscrypto.KEKSize)}) var userID string if err := pool.QueryRow(ctx, `INSERT INTO users (email, name) VALUES ($1, 'A') RETURNING id`, fmt.Sprintf("malwarescan-%d@example.test", time.Now().UnixNano())).Scan(&userID); err != nil { diff --git a/dms/internal/migrationdocument/migrate_test.go b/dms/internal/migrationdocument/migrate_test.go index b3a84706..6ad96dce 100644 --- a/dms/internal/migrationdocument/migrate_test.go +++ b/dms/internal/migrationdocument/migrate_test.go @@ -16,16 +16,9 @@ import ( dmscrypto "gitea.perlbach24.de/scripte/nexarch/dms/internal/crypto" "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) -// fakeKEKProvider liefert einen fest hinterlegten Tenant-KEK, analog zum -// Fake in dms/internal/upload (dort nicht exportiert). -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - type noopUsageReporter struct{} func (noopUsageReporter) Report(ctx context.Context, tenantSlug, metric string, delta int64) error { @@ -149,7 +142,7 @@ func setupMigratorTest(t *testing.T) (*Migrator, *pgxpool.Pool, *storage.LocalDr driver := storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0) storageSvc := storage.NewService(driver, noopUsageReporter{}, "acme-test") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) migrator := NewMigrator(pool, newSyntheticSource(), staticUserResolver{userID: userID}, storageSvc, cryptoSvc, "acme-test") return migrator, pool, driver, userID @@ -232,7 +225,7 @@ func TestMigrateAll_AkzeptanzkriteriumKonsistenteVerknuepfung(t *testing.T) { if err := pool.QueryRow(ctx, `SELECT wrapped_dek FROM file_revisions WHERE id = $1`, currentRevisionID).Scan(&wrappedDEK); err != nil { t.Fatalf("wrapped_dek lesen: %v", err) } - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) plainReader, err := cryptoSvc.Open(ctx, "acme-test", wrappedDEK, bytes.NewReader(ciphertext)) if err != nil { t.Fatalf("entschluesseln: %v", err) diff --git a/dms/internal/pdfconvert/pdfconvert_test.go b/dms/internal/pdfconvert/pdfconvert_test.go index 0861bc81..0f71befb 100644 --- a/dms/internal/pdfconvert/pdfconvert_test.go +++ b/dms/internal/pdfconvert/pdfconvert_test.go @@ -18,14 +18,9 @@ import ( "gitea.perlbach24.de/scripte/nexarch/dms/internal/jobqueue" "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - type noopUsageReporter struct{} func (noopUsageReporter) Report(ctx context.Context, tenantSlug, metric string, delta int64) error { @@ -98,7 +93,7 @@ func setupTest(t *testing.T) *testEnv { } storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) queue := jobqueue.NewQueue(pool, time.Minute) return &testEnv{ diff --git a/dms/internal/pdfsign/pdfsign_test.go b/dms/internal/pdfsign/pdfsign_test.go index 63ce6196..82950ed7 100644 --- a/dms/internal/pdfsign/pdfsign_test.go +++ b/dms/internal/pdfsign/pdfsign_test.go @@ -22,14 +22,9 @@ import ( "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testaudit" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - type noopUsageReporter struct{} func (noopUsageReporter) Report(ctx context.Context, tenantSlug, metric string, delta int64) error { @@ -104,7 +99,7 @@ func setupTest(t *testing.T, identity *SigningIdentity, tsaURL string) *testEnv } storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) return &testEnv{ pool: pool, storage: storageSvc, crypto: cryptoSvc, userID: userID, diff --git a/dms/internal/testutil/kekfake.go b/dms/internal/testutil/kekfake.go new file mode 100644 index 00000000..19add994 --- /dev/null +++ b/dms/internal/testutil/kekfake.go @@ -0,0 +1,14 @@ +// Package testutil buendelt Test-Doubles, die identisch in mehreren +// dms/internal-Paketen dupliziert waren (Fable-Review auf Code-Dopplung). +package testutil + +import "context" + +// FakeKEKProvider ist ein Test-Double fuer das KEKProvider-Interface +// (crypto.NewService braucht einen) -- liefert immer denselben festen +// Schluessel, unabhaengig vom Tenant. +type FakeKEKProvider struct{ KEK []byte } + +func (f *FakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { + return f.KEK, nil +} diff --git a/dms/internal/thumbnail/thumbnail_test.go b/dms/internal/thumbnail/thumbnail_test.go index 7185c2f4..1c0681b4 100644 --- a/dms/internal/thumbnail/thumbnail_test.go +++ b/dms/internal/thumbnail/thumbnail_test.go @@ -21,14 +21,9 @@ import ( "gitea.perlbach24.de/scripte/nexarch/dms/internal/jobqueue" "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - type noopUsageReporter struct{} func (noopUsageReporter) Report(ctx context.Context, tenantSlug, metric string, delta int64) error { @@ -104,7 +99,7 @@ func setupTest(t *testing.T) *testEnv { } storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) queue := jobqueue.NewQueue(pool, time.Minute) return &testEnv{ diff --git a/dms/internal/upload/service_test.go b/dms/internal/upload/service_test.go index 956fff5a..f7ecb8b3 100644 --- a/dms/internal/upload/service_test.go +++ b/dms/internal/upload/service_test.go @@ -19,17 +19,9 @@ import ( "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testaudit" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) -// fakeKEKProvider liefert einen fest hinterlegten Tenant-KEK — dieselbe -// Fixture wie in internal/crypto, hier lokal dupliziert, da Testhilfen -// nicht paketuebergreifend exportiert sind. -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - func setupServiceTest(t *testing.T) (*Service, *pgxpool.Pool, string) { t.Helper() dsn := os.Getenv("TEST_TENANT_DSN") @@ -99,7 +91,7 @@ func setupServiceTest(t *testing.T) (*Service, *pgxpool.Pool, string) { sessions := NewSessionStore(pool) staging := NewStaging(t.TempDir()) storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x11}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x11}, dmscrypto.KEKSize)}) validator := NewValidator(10*1024*1024, []string{"application/pdf", "text/plain"}) svc := NewService(pool, sessions, staging, storageSvc, cryptoSvc, validator, "acme") diff --git a/dms/internal/uploadapi/handler_test.go b/dms/internal/uploadapi/handler_test.go index bec37013..942548b1 100644 --- a/dms/internal/uploadapi/handler_test.go +++ b/dms/internal/uploadapi/handler_test.go @@ -18,14 +18,9 @@ import ( "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" "gitea.perlbach24.de/scripte/nexarch/dms/internal/upload" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - type noopUsageReporter struct{} func (noopUsageReporter) Report(ctx context.Context, tenantSlug, metric string, delta int64) error { @@ -73,7 +68,7 @@ func setupTest(t *testing.T) (*httptest.Server, string) { sessions := upload.NewSessionStore(pool) staging := upload.NewStaging(t.TempDir()) storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) validator := upload.NewValidator(10*1024*1024, []string{"application/pdf", "text/plain"}) svc := upload.NewService(pool, sessions, staging, storageSvc, cryptoSvc, validator, "acme") diff --git a/dms/internal/uploadapi/int19_mobilecapture_test.go b/dms/internal/uploadapi/int19_mobilecapture_test.go index d1f024f7..9ae965f3 100644 --- a/dms/internal/uploadapi/int19_mobilecapture_test.go +++ b/dms/internal/uploadapi/int19_mobilecapture_test.go @@ -21,6 +21,7 @@ import ( "gitea.perlbach24.de/scripte/nexarch/dms/internal/migrate" "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" "gitea.perlbach24.de/scripte/nexarch/dms/internal/upload" ) @@ -72,7 +73,7 @@ func setupInt19Test(t *testing.T, maxSizeBytes int64) (*httptest.Server, string, sessions := upload.NewSessionStore(pool) staging := upload.NewStaging(t.TempDir()) storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x22}, dmscrypto.KEKSize)}) // Gleiche Positivliste wie ein echter mobiler Erfassungskanal: nur der // vom Kamera-Capture-Code tatsaechlich erzeugte MIME-Typ ist erlaubt. validator := upload.NewValidator(maxSizeBytes, []string{"image/jpeg"}) diff --git a/dms/internal/versioning/diff_test.go b/dms/internal/versioning/diff_test.go index a7e00807..a5de6720 100644 --- a/dms/internal/versioning/diff_test.go +++ b/dms/internal/versioning/diff_test.go @@ -15,6 +15,7 @@ import ( "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testaudit" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) // Akzeptanzkriterium 1: Textunterschiede werden zeilenweise geliefert. @@ -189,7 +190,7 @@ func setupDiffTest(t *testing.T) (*pgxpool.Pool, *storage.Service, *dmscrypto.Se }) storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x77}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x77}, dmscrypto.KEKSize)}) var userID string if err := pool.QueryRow(ctx, `INSERT INTO users (email, name) VALUES ($1, 'A') RETURNING id`, fmt.Sprintf("diff-%d@example.test", time.Now().UnixNano())).Scan(&userID); err != nil { diff --git a/dms/internal/versioning/versioning_test.go b/dms/internal/versioning/versioning_test.go index 48eda40f..dd1095f2 100644 --- a/dms/internal/versioning/versioning_test.go +++ b/dms/internal/versioning/versioning_test.go @@ -15,14 +15,9 @@ import ( "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testaudit" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - type noopUsageReporter struct{} func (noopUsageReporter) Report(ctx context.Context, tenantSlug, metric string, delta int64) error { @@ -85,7 +80,7 @@ func setupTest(t *testing.T) (*testEnv, string, string) { } storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x44}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x44}, dmscrypto.KEKSize)}) return &testEnv{pool: pool, storage: storageSvc, crypto: cryptoSvc}, userA, userB } diff --git a/dms/internal/versioningapi/handler_test.go b/dms/internal/versioningapi/handler_test.go index ee4d052f..379bb2d0 100644 --- a/dms/internal/versioningapi/handler_test.go +++ b/dms/internal/versioningapi/handler_test.go @@ -19,14 +19,9 @@ import ( "gitea.perlbach24.de/scripte/nexarch/dms/internal/testaudit" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" "gitea.perlbach24.de/scripte/nexarch/dms/internal/versioning" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - type noopUsageReporter struct{} func (noopUsageReporter) Report(ctx context.Context, tenantSlug, metric string, delta int64) error { @@ -90,7 +85,7 @@ func setupTest(t *testing.T) (*testEnv, string, string) { } storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x55}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x55}, dmscrypto.KEKSize)}) server := NewServer(pool, storageSvc, cryptoSvc, "acme", &OwnerChecker{Pool: pool}) mux := http.NewServeMux() diff --git a/dms/internal/watchfolder/watcher_test.go b/dms/internal/watchfolder/watcher_test.go index 9cd07d51..07276ddb 100644 --- a/dms/internal/watchfolder/watcher_test.go +++ b/dms/internal/watchfolder/watcher_test.go @@ -17,6 +17,7 @@ import ( "gitea.perlbach24.de/scripte/nexarch/dms/internal/storage" "gitea.perlbach24.de/scripte/nexarch/dms/internal/testdb" "gitea.perlbach24.de/scripte/nexarch/dms/internal/upload" + "gitea.perlbach24.de/scripte/nexarch/dms/internal/testutil" ) // allowAll ersetzt den Tenant-Guard in den Tests der Import-Pipeline (INT-08); die Zuordnung prueft guard_test.go. @@ -24,12 +25,6 @@ type allowAll struct{} func (allowAll) Check(context.Context, string) error { return nil } -type fakeKEKProvider struct{ kek []byte } - -func (f *fakeKEKProvider) TenantKEK(ctx context.Context, tenantSlug string) ([]byte, error) { - return f.kek, nil -} - type noopUsageReporter struct{} func (noopUsageReporter) Report(ctx context.Context, tenantSlug, metric string, delta int64) error { @@ -106,7 +101,7 @@ func setupTest(t *testing.T) (svc *upload.Service, pool *pgxpool.Pool, userID st sessions := upload.NewSessionStore(pool) staging := upload.NewStaging(t.TempDir()) storageSvc := storage.NewService(storage.NewLocalDriver(t.TempDir(), []byte("secret"), "https://files.example.test", 0), noopUsageReporter{}, "acme") - cryptoSvc := dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x11}, dmscrypto.KEKSize)}) + cryptoSvc := dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x11}, dmscrypto.KEKSize)}) validator := upload.NewValidator(10*1024*1024, nil) svc = upload.NewService(pool, sessions, staging, storageSvc, cryptoSvc, validator, "acme") @@ -241,5 +236,5 @@ func newStorageSvc(t *testing.T) *storage.Service { } func newCryptoSvc() *dmscrypto.Service { - return dmscrypto.NewService(&fakeKEKProvider{kek: bytes.Repeat([]byte{0x11}, dmscrypto.KEKSize)}) + return dmscrypto.NewService(&testutil.FakeKEKProvider{KEK: bytes.Repeat([]byte{0x11}, dmscrypto.KEKSize)}) } -- 2.47.3