refac: atomic merge, lost-update race, RunPurge cost, duplicated walks
This commit is contained in:
1 parent
0fc3511e2b
commit
074944c99a
45 files changed
+2204
-267
No files matched your search
@@ -0,0 +1,97 @@
|
||||
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)
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in new issue
Block a user