package release import ( "context" "errors" "io" "testing" ) type requiredStreamGetOnly struct { Store gets int } func (s *requiredStreamGetOnly) Get(ctx context.Context, key string) ([]byte, string, error) { s.gets++ return s.Store.Get(ctx, key) } func TestOpenObjectStreamingRequiresWholeWrapperChain(t *testing.T) { raw := NewDirStore(t.TempDir()) if _, err := raw.Put(t.Context(), "outer/inner/object", []byte("small"), ""); err != nil { t.Fatal(err) } base := &requiredStreamGetOnly{Store: raw} s := NewPrefixStore(NewPrefixStore(base, "outer"), "inner") if r, _, err := OpenObjectStreaming(t.Context(), s, "object"); r != nil || !errors.Is(err, errors.ErrUnsupported) || base.gets != 0 { t.Fatalf("stream=%v err=%v gets=%d", r, err, base.gets) } r, _, err := OpenObject(t.Context(), s, "object") if err != nil { t.Fatal(err) } body, err := io.ReadAll(r) r.Close() if err != nil || string(body) != "small" || base.gets != 1 { t.Fatalf("fallback %q %v gets=%d", body, err, base.gets) } }