package console import ( "context" "os" "path/filepath" "testing" "time" "github.com/carlosframework/platform/internal/objstore" "github.com/carlosframework/platform/internal/release" ) type resultCollectionRunner struct { *release.DirStore before func() beforeDelete func() } func (s *resultCollectionRunner) RunAppMutation(ctx context.Context, account, app, action string, fn func(context.Context) error) error { if s.before != nil { before := s.before s.before = nil before() } return fn(ctx) } func (s *resultCollectionRunner) DeleteIfMatch(ctx context.Context, key, etag string) error { if s.beforeDelete != nil { before := s.beforeDelete s.beforeDelete = nil before() } return s.DirStore.DeleteIfMatch(ctx, key, etag) } func TestRevivalResultCollectionPreservesReplacementBeforePermit(t *testing.T) { testResultCollectionReplacement(t, false) } func TestRevivalResultCollectionConditionallyDeletesObservedRevision(t *testing.T) { testResultCollectionReplacement(t, true) } func testResultCollectionReplacement(t *testing.T, beforeDelete bool) { t.Helper() ctx := context.Background() dir := t.TempDir() raw := release.NewDirStore(dir) old := time.Now().Add(-48 * time.Hour) result := &objstore.ScanResult{ Key: "report.pdf", Version: "old-version", Verdict: "clean", At: old, } if err := objstore.WriteScanResult(ctx, raw, "bab", "app", result); err != nil { t.Fatal(err) } path := filepath.Join(dir, objstore.ScanResultKey("bab", "app", result.Key)) if err := os.Chtimes(path, old, old); err != nil { t.Fatal(err) } runner := &resultCollectionRunner{DirStore: raw} replace := func() { fresh := &objstore.ScanResult{ Key: result.Key, Version: "new-version", Verdict: "infected", At: time.Now(), } if err := objstore.WriteScanResult(ctx, raw, "bab", "app", fresh); err != nil { t.Fatal(err) } } if beforeDelete { runner.beforeDelete = replace } else { runner.before = replace } n, err := objstore.CollectScanResults(ctx, runner, "bab", "app", time.Now().Add(-24*time.Hour)) if err != nil || n != 0 { t.Fatalf("collection removed %d results, err %v; the replacement must survive", n, err) } fresh, err := objstore.ReadScanResult(ctx, raw, "bab", "app", result.Key, "new-version") if err != nil || fresh == nil || fresh.Verdict != "infected" { t.Fatalf("replacement result = %+v, err %v", fresh, err) } }