package with_test import ( "context" "io" "net/http" "net/http/httptest" "slices" "strings" "testing" "gitea.bel.blue/bel/with" ) func TestCachedHTTP(t *testing.T) { called := false code := http.StatusAccepted headers := http.Header{ "K": []string{"v"}, "K2": []string{"v2a", "v2b"}, } body := "response body" server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { called = true for k, v := range headers { for _, subv := range v { w.Header().Add(k, subv) } } w.WriteHeader(code) w.Write([]byte(body)) })) defer server.Close() testResp := func(resp *http.Response) { if resp.StatusCode != code { t.Errorf("initial request wrong status code: %d", resp.StatusCode) } else if !slices.Equal(resp.Header["K"], headers["K"]) { t.Errorf("initial request wrong headers[k]: %+v in %+v", resp.Header["K"], resp.Header) } else if !slices.Equal(resp.Header["K2"], headers["K2"]) { t.Errorf("initial request wrong headers[k2]: %+v in %+v", resp.Header["K2"], resp.Header) } else if b, _ := io.ReadAll(resp.Body); string(b) != body { t.Errorf("initial request wrong resp body: %q", b) } } if err := with.CachedHTTP(context.Background(), func(c *http.Client) error { req := func() *http.Request { req, _ := http.NewRequest(http.MethodGet, server.URL+"/my/path", strings.NewReader("my body")) return req } if resp, err := c.Do(req()); err != nil { t.Fatalf("failed initial request: %v", err) } else if !called { t.Errorf("initial request didnt hit server") } else { testResp(resp) } called = false if resp, err := c.Do(req()); err != nil { t.Fatalf("failed second request: %v", err) } else if called { t.Errorf("second request didnt hit cache") } else { testResp(resp) } called = false reqDiffURLPath := req() reqDiffURLPath.URL.Path += "/teehee" if resp, err := c.Do(reqDiffURLPath); err != nil { t.Fatalf("failed diff url path request: %v", err) } else if !called { t.Errorf("new initial hit cache") } else { testResp(resp) } called = false reqDiffURLQuery := req() reqDiffURLQuery.URL.RawQuery += "hello=world" if resp, err := c.Do(reqDiffURLQuery); err != nil { t.Fatalf("failed diff url query request: %v", err) } else if !called { t.Errorf("new initial hit cache") } else { testResp(resp) } called = false reqDiffHeader := req() reqDiffHeader.Header.Set("Misc", "Misc") if resp, err := c.Do(reqDiffHeader); err != nil { t.Fatalf("failed diff header request: %v", err) } else if !called { t.Errorf("new initial hit cache") } else { testResp(resp) } called = false reqDiffBody := req() reqDiffBody.Body = io.NopCloser(strings.NewReader("diff")) reqDiffBody.ContentLength = int64(len("diff")) if resp, err := c.Do(reqDiffBody); err != nil { t.Fatalf("failed diff body request: %v", err) } else if !called { t.Errorf("new initial hit cache") } else { testResp(resp) } return nil }); err != nil { t.Fatal(err) } }