package test import ( "RenewCMS/internal/domain/audit" "RenewCMS/internal/infrastructure/useCases" "context" "io" "log" "net/http" "strconv" "testing" ) func TestMergeMediaReportsEntriesAndTargetsTheKeptImage(t *testing.T) { t.Run("A merge counts repointed entries and targets the kept image", func(t *testing.T) { env := newHardeningEnv(t) env.seedMergeFixture() merge := useCases.NewMergeMediaUseCase(env.images, env.articles, env.storage, env.variants, env.recorder, env.types, env.entries, env.transactor, log.New(io.Discard, "", 0)) result, err := merge.Merge(context.Background(), 7, []uint32{9}) if err != nil || result.EntriesUpdated != 2 { t.Fatalf("expected 2 entries updated, got %+v %v", result, err) } event := env.expectEvents(t, audit.ActionMediaMerge, audit.OutcomeSuccess, 1) if event.Target.ID != strconv.Itoa(7) || event.Target.Name != env.images.images[7].Filename { t.Errorf("unexpected target %+v", event.Target) } }) t.Run("A failed merge still targets the kept image", func(t *testing.T) { env := newHardeningEnv(t) env.seedMergeFixture() env.transactor.failCommit = errRepositoryFailure merge := useCases.NewMergeMediaUseCase(env.images, env.articles, env.storage, env.variants, env.recorder, env.types, env.entries, env.transactor, log.New(io.Discard, "", 0)) _, err := merge.Merge(context.Background(), 7, []uint32{9}) if err == nil { t.Fatalf("expected an error") } event := env.expectEvents(t, audit.ActionMediaMerge, audit.OutcomeFailed, 1) if event.Target.ID != "7" { t.Errorf("expected the kept image as target, got %+v", event.Target) } }) t.Run("A rejected request has no target", func(t *testing.T) { env := newHardeningEnv(t) env.seedMergeFixture() merge := useCases.NewMergeMediaUseCase(env.images, env.articles, env.storage, env.variants, env.recorder, env.types, env.entries, env.transactor, log.New(io.Discard, "", 0)) _, err := merge.Merge(context.Background(), 0, []uint32{9}) if err == nil { t.Fatalf("expected an error") } for _, event := range env.recorder.events { if event.Target != (audit.Target{}) { t.Errorf("expected no target, got %+v", event.Target) } } }) } func TestPurgeAuditReportsFailedGroupsOnlyWhenAny(t *testing.T) { t.Run("A clean run omits failed_groups", func(t *testing.T) { env := newHardeningEnv(t) env.seedPurgeGroups(1) rec := env.send(t, http.MethodPost, "/v1/media/purge", `{}`) if rec.Code != http.StatusOK { t.Fatalf("expected 200, got %d", rec.Code) } event := env.expectEvents(t, audit.ActionMediaPurge, audit.OutcomeSuccess, 1) if _, present := event.Params[audit.ParamFailedGroups]; present { t.Errorf("unexpected failed_groups in %+v", event.Params) } }) t.Run("A run with a failed group reports the count", func(t *testing.T) { env := newHardeningEnv(t) env.seedPurgeGroups(2) env.transactor.failCommit = errRepositoryFailure rec := env.send(t, http.MethodPost, "/v1/media/purge", `{}`) if rec.Code != http.StatusOK { t.Fatalf("expected 200, got %d", rec.Code) } event := env.expectEvents(t, audit.ActionMediaPurge, audit.OutcomeSuccess, 1) if event.Params[audit.ParamFailedGroups] != 2 { t.Errorf("expected failed_groups 2, got %v", event.Params) } }) }