diff --git a/lagoon/attach/file_test.go b/lagoon/attach/file_test.go index 79943c8..c24cc2b 100644 --- a/lagoon/attach/file_test.go +++ b/lagoon/attach/file_test.go @@ -1,6 +1,10 @@ package attach -import "testing" +import ( + "testing" + + "gocloud.dev/blob/memblob" +) func TestFileTableName(t *testing.T) { if got := (File{}).TableName(); got != "system_files" { @@ -17,3 +21,44 @@ func TestFileSelfRegisters(t *testing.T) { } t.Fatal("File must self-register via attach.Register") } + +// WR-05 pin: the force-delete prefix is thumb__ with its trailing +// underscore, so ID 4 cannot match thumbs of ID 40/41/42 that share a +// partition. "thumb_4_" is not a string prefix of "thumb_42_". +func TestDeleteKeysThumbPrefixIsIDDelimited(t *testing.T) { + ctx := t.Context() + bucket := memblob.OpenBucket(nil) + defer bucket.Close() + const disk = "abc123xyz000.jpg" + part := PartitionDirectory(disk) + doomed := []string{ + part + disk, + part + ThumbFilename(4, 200, 200, 0, 0, "auto", "jpg"), + part + ThumbFilename(4, 50, 50, 0, 0, "crop", "jpg"), + } + survivors := []string{ + part + "abc123xyz111.jpg", + part + ThumbFilename(40, 200, 200, 0, 0, "auto", "jpg"), + part + ThumbFilename(41, 200, 200, 0, 0, "auto", "jpg"), + part + ThumbFilename(42, 4, 4, 0, 0, "auto", "jpg"), + part + ThumbFilename(14, 200, 200, 0, 0, "auto", "jpg"), + } + for _, key := range append(append([]string{}, doomed...), survivors...) { + if err := bucket.WriteAll(ctx, key, []byte("x"), nil); err != nil { + t.Fatal(err) + } + } + if err := DeleteKeys(ctx, bucket, blobKeysFor(File{ID: 4, DiskName: disk})); err != nil { + t.Fatal(err) + } + for _, key := range doomed { + if ok, err := bucket.Exists(ctx, key); err != nil || ok { + t.Fatalf("%s must be deleted (exists=%v err=%v)", key, ok, err) + } + } + for _, key := range survivors { + if ok, err := bucket.Exists(ctx, key); err != nil || !ok { + t.Fatalf("%s must survive deleting file 4 (exists=%v err=%v)", key, ok, err) + } + } +}