From 5e1d824c611546ea8edab830bcd52a1dbb046169 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 9 Feb 2026 22:02:18 -0800 Subject: [PATCH] s3tables: broaden namespace properties round-trip test --- weed/s3api/s3tables/utils_namespace_test.go | 65 ++++++++++++++++----- 1 file changed, 51 insertions(+), 14 deletions(-) diff --git a/weed/s3api/s3tables/utils_namespace_test.go b/weed/s3api/s3tables/utils_namespace_test.go index ac86a7025..d0d4b2a54 100644 --- a/weed/s3api/s3tables/utils_namespace_test.go +++ b/weed/s3api/s3tables/utils_namespace_test.go @@ -2,6 +2,7 @@ package s3tables import ( "encoding/json" + "reflect" "strings" "testing" ) @@ -127,23 +128,59 @@ func TestExpandNamespace(t *testing.T) { } func TestNamespaceMetadataPropertiesRoundTrip(t *testing.T) { - metadata := namespaceMetadata{ - Namespace: []string{"analytics"}, - Properties: map[string]string{"owner": "finance"}, - OwnerAccountID: "123456789012", + testCases := []struct { + name string + metadata namespaceMetadata + }{ + { + name: "with properties", + metadata: namespaceMetadata{ + Namespace: []string{"analytics"}, + Properties: map[string]string{"owner": "finance"}, + OwnerAccountID: "123456789012", + }, + }, + { + name: "nil properties", + metadata: namespaceMetadata{ + Namespace: []string{"analytics"}, + Properties: nil, + OwnerAccountID: "123456789012", + }, + }, + { + name: "empty properties", + metadata: namespaceMetadata{ + Namespace: []string{"analytics"}, + Properties: map[string]string{}, + OwnerAccountID: "123456789012", + }, + }, } - data, err := json.Marshal(metadata) - if err != nil { - t.Fatalf("json.Marshal(metadata) returned error: %v", err) - } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + data, err := json.Marshal(tc.metadata) + if err != nil { + t.Fatalf("json.Marshal(metadata) returned error: %v", err) + } - var decoded namespaceMetadata - if err := json.Unmarshal(data, &decoded); err != nil { - t.Fatalf("json.Unmarshal(data) returned error: %v", err) - } + var decoded namespaceMetadata + if err := json.Unmarshal(data, &decoded); err != nil { + t.Fatalf("json.Unmarshal(data) returned error: %v", err) + } - if decoded.Properties["owner"] != "finance" { - t.Fatalf("decoded.Properties[owner] = %q, want %q", decoded.Properties["owner"], "finance") + // Due to `omitempty`, nil and empty maps are unmarshaled as nil. + if len(tc.metadata.Properties) == 0 { + if decoded.Properties != nil { + t.Fatalf("expected nil properties for empty/nil input, got %v", decoded.Properties) + } + return + } + + if !reflect.DeepEqual(decoded.Properties, tc.metadata.Properties) { + t.Fatalf("decoded.Properties = %v, want %v", decoded.Properties, tc.metadata.Properties) + } + }) } }