From c90e8a7f675a98f0c52bf10f24c5f9655e769611 Mon Sep 17 00:00:00 2001 From: Ben McClelland Date: Tue, 29 Oct 2024 09:18:34 -0700 Subject: [PATCH] chore: add non standard delimiter to walk unit tests --- backend/walk_test.go | 171 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 145 insertions(+), 26 deletions(-) diff --git a/backend/walk_test.go b/backend/walk_test.go index a5aa5ac9..f2f9a492 100644 --- a/backend/walk_test.go +++ b/backend/walk_test.go @@ -31,9 +31,18 @@ import ( ) type walkTest struct { - fsys fs.FS - expected backend.WalkResults - getobj backend.GetObjFunc + fsys fs.FS + getobj backend.GetObjFunc + cases []testcase +} + +type testcase struct { + name string + prefix string + delimiter string + marker string + maxObjs int32 + expected backend.WalkResults } func getObj(path string, d fs.DirEntry) (s3response.Object, error) { @@ -88,50 +97,154 @@ func TestWalk(t *testing.T) { "photos/2006/February/sample3.jpg": {}, "photos/2006/February/sample4.jpg": {}, }, - expected: backend.WalkResults{ - CommonPrefixes: []types.CommonPrefix{{ - Prefix: backend.GetPtrFromString("photos/"), - }}, - Objects: []s3response.Object{{ - Key: backend.GetPtrFromString("sample.jpg"), - }}, - }, getobj: getObj, + cases: []testcase{ + { + name: "aws example", + delimiter: "/", + maxObjs: 1000, + expected: backend.WalkResults{ + CommonPrefixes: []types.CommonPrefix{{ + Prefix: backend.GetPtrFromString("photos/"), + }}, + Objects: []s3response.Object{{ + Key: backend.GetPtrFromString("sample.jpg"), + }}, + }, + }, + }, }, { // test case single dir/single file fsys: fstest.MapFS{ "test/file": {}, }, - expected: backend.WalkResults{ - CommonPrefixes: []types.CommonPrefix{{ - Prefix: backend.GetPtrFromString("test/"), - }}, - Objects: []s3response.Object{}, + getobj: getObj, + cases: []testcase{ + { + name: "single dir single file", + delimiter: "/", + maxObjs: 1000, + expected: backend.WalkResults{ + CommonPrefixes: []types.CommonPrefix{{ + Prefix: backend.GetPtrFromString("test/"), + }}, + Objects: []s3response.Object{}, + }, + }, + }, + }, + { + // non-standard delimiter + fsys: fstest.MapFS{ + "photo|s/200|6/Januar|y/sampl|e1.jpg": {}, + "photo|s/200|6/Januar|y/sampl|e2.jpg": {}, + "photo|s/200|6/Januar|y/sampl|e3.jpg": {}, }, getobj: getObj, + cases: []testcase{ + { + name: "different delimiter 1", + delimiter: "|", + maxObjs: 1000, + expected: backend.WalkResults{ + CommonPrefixes: []types.CommonPrefix{{ + Prefix: backend.GetPtrFromString("photo|"), + }}, + }, + }, + { + name: "different delimiter 2", + delimiter: "|", + maxObjs: 1000, + prefix: "photo|", + expected: backend.WalkResults{ + CommonPrefixes: []types.CommonPrefix{{ + Prefix: backend.GetPtrFromString("photo|s/200|"), + }}, + }, + }, + { + name: "different delimiter 3", + delimiter: "|", + maxObjs: 1000, + prefix: "photo|s/200|", + expected: backend.WalkResults{ + CommonPrefixes: []types.CommonPrefix{{ + Prefix: backend.GetPtrFromString("photo|s/200|6/Januar|"), + }}, + }, + }, + { + name: "different delimiter 4", + delimiter: "|", + maxObjs: 1000, + prefix: "photo|s/200|", + expected: backend.WalkResults{ + CommonPrefixes: []types.CommonPrefix{{ + Prefix: backend.GetPtrFromString("photo|s/200|6/Januar|"), + }}, + }, + }, + { + name: "different delimiter 5", + delimiter: "|", + maxObjs: 1000, + prefix: "photo|s/200|6/Januar|", + expected: backend.WalkResults{ + CommonPrefixes: []types.CommonPrefix{{ + Prefix: backend.GetPtrFromString("photo|s/200|6/Januar|y/sampl|"), + }}, + }, + }, + { + name: "different delimiter 6", + delimiter: "|", + maxObjs: 1000, + prefix: "photo|s/200|6/Januar|y/sampl|", + expected: backend.WalkResults{ + Objects: []s3response.Object{ + { + Key: backend.GetPtrFromString("photo|s/200|6/Januar|y/sampl|e1.jpg"), + }, + { + Key: backend.GetPtrFromString("photo|s/200|6/Januar|y/sampl|e2.jpg"), + }, + { + Key: backend.GetPtrFromString("photo|s/200|6/Januar|y/sampl|e3.jpg"), + }, + }, + }, + }, + }, }, } for _, tt := range tests { - res, err := backend.Walk(context.Background(), tt.fsys, "", "/", "", 1000, tt.getobj, []string{}) - if err != nil { - t.Fatalf("walk: %v", err) + for _, tc := range tt.cases { + res, err := backend.Walk(context.Background(), + tt.fsys, tc.prefix, tc.delimiter, tc.marker, tc.maxObjs, + tt.getobj, []string{}) + if err != nil { + t.Errorf("tc.name: walk: %v", err) + } + + compareResults(tc.name, res, tc.expected, t) } - - compareResults(res, tt.expected, t) } } -func compareResults(got, wanted backend.WalkResults, t *testing.T) { +func compareResults(name string, got, wanted backend.WalkResults, t *testing.T) { if !compareCommonPrefix(got.CommonPrefixes, wanted.CommonPrefixes) { - t.Errorf("unexpected common prefix, got %v wanted %v", + t.Errorf("%v: unexpected common prefix, got %v wanted %v", + name, printCommonPrefixes(got.CommonPrefixes), printCommonPrefixes(wanted.CommonPrefixes)) } if !compareObjects(got.Objects, wanted.Objects) { - t.Errorf("unexpected object, got %v wanted %v", + t.Errorf("%v: unexpected object, got %v wanted %v", + name, printObjects(got.Objects), printObjects(wanted.Objects)) } @@ -202,10 +315,16 @@ func containsObject(c s3response.Object, list []s3response.Object) bool { func printObjects(list []s3response.Object) string { res := "[" for _, cp := range list { + var key string + if cp.Key == nil { + key = "" + } else { + key = *cp.Key + } if res == "[" { - res = res + *cp.Key + res = res + key } else { - res = res + ", " + *cp.Key + res = res + ", " + key } } return res + "]"