From 053fbd70e28e90fd35a59e941978004c9db55432 Mon Sep 17 00:00:00 2001 From: Ben Vincent Date: Fri, 3 Jul 2026 13:45:19 +1000 Subject: [PATCH] test: provider-not-found and missing-blob download error branches --- internal/server/server_test.go | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/internal/server/server_test.go b/internal/server/server_test.go index f744cfb..cf59063 100644 --- a/internal/server/server_test.go +++ b/internal/server/server_test.go @@ -558,6 +558,52 @@ func TestServerProxyErrors(t *testing.T) { } } +func TestServerLocalMissingBlob(t *testing.T) { + requireStack(t) + req(t, "POST", "/api/v2/remotes", `{"name":"srv-ghost","package_type":"generic","repo_type":"local"}`) + defer req(t, "DELETE", "/api/v2/remotes/srv-ghost", "") + + ctx := context.Background() + // A local file whose blob object is absent from the store. + testSrv.db.UpsertBlob(ctx, "sha256:ghost", "blobs/sha256/ghost-missing", 5, "text/plain") + if err := testSrv.db.CreateLocalFile(ctx, "srv-ghost", "ghost.bin", "sha256:ghost"); err != nil { + t.Fatalf("create local file: %v", err) + } + + if resp, _ := req(t, "GET", "/api/v1/local/srv-ghost/ghost.bin", ""); resp.StatusCode != 500 { + t.Errorf("v1 download missing blob = %d, want 500", resp.StatusCode) + } + if resp, _ := req(t, "GET", "/api/v2/remotes/srv-ghost/files/ghost.bin", ""); resp.StatusCode != 500 { + t.Errorf("v2 download missing blob = %d, want 500", resp.StatusCode) + } +} + +func TestServerBogusProviderType(t *testing.T) { + requireStack(t) + // Insert a remote with an unregistered package type directly, bypassing + // validation, to exercise the provider-not-found branches. + _, err := testSrv.db.Pool.Exec(context.Background(), + `INSERT INTO remotes (name, package_type, repo_type, base_url) VALUES ($1,'bogus','remote','https://x')`, "srv-bogus") + if err != nil { + t.Fatalf("insert bogus remote: %v", err) + } + defer testSrv.db.Pool.Exec(context.Background(), `DELETE FROM remotes WHERE name='srv-bogus'`) + + if resp, _ := req(t, "GET", "/api/v1/remote/srv-bogus/x", ""); resp.StatusCode != 500 { + t.Errorf("bogus provider GET = %d, want 500", resp.StatusCode) + } + rq, _ := http.NewRequest("HEAD", testTS.URL+"/v2/srv-bogus/x", nil) + if resp, err := http.DefaultClient.Do(rq); err == nil { + resp.Body.Close() + if resp.StatusCode != 500 { + t.Errorf("bogus provider HEAD = %d, want 500", resp.StatusCode) + } + } + if resp, b := req(t, "POST", "/api/v2/probe", `{"remote":"srv-bogus","path":"x"}`); resp.StatusCode != 200 || !strings.Contains(string(b), `"status":500`) { + t.Errorf("bogus provider probe: %d %s", resp.StatusCode, b) + } +} + func TestServerNotFound(t *testing.T) { requireStack(t) if resp, _ := req(t, "GET", "/api/v2/remotes/does-not-exist", ""); resp.StatusCode != 404 { @@ -566,4 +612,8 @@ func TestServerNotFound(t *testing.T) { if resp, _ := req(t, "GET", "/api/v1/remote/nope/x", ""); resp.StatusCode != 404 { t.Errorf("expected 404 for unknown remote, got %d", resp.StatusCode) } + // Unknown local repo -> 404 in handleLocal. + if resp, _ := req(t, "GET", "/api/v1/local/nope/x", ""); resp.StatusCode != 404 { + t.Errorf("expected 404 for unknown local repo, got %d", resp.StatusCode) + } }