package ocrapi import ( "context" "errors" "io" "net/http" "net/http/httptest" "testing" ) func TestClientRecognizePostsMultipartAndParsesSupportedReplies(t *testing.T) { for _, testCase := range []struct { name string contentType string body string want string }{ {"text", "text/plain", "aB12", "aB12"}, {"json", "application/json", `{"text":"K9"}`, "K9"}, {"result", "application/json", `{"result":"Z7"}`, "Z7"}, } { t.Run(testCase.name, func(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost || r.URL.Path != "/ocr" { t.Fatalf("request = %s %s", r.Method, r.URL.Path) } file, header, err := r.FormFile("file") if err != nil || header.Filename != "captcha.png" { t.Fatalf("FormFile() = %v / %#v", err, header) } content, _ := io.ReadAll(file) if string(content) != "image-bytes" { t.Fatalf("image content = %q", content) } w.Header().Set("Content-Type", testCase.contentType) _, _ = w.Write([]byte(testCase.body)) })) defer server.Close() client, err := NewClient(server.URL+"/ocr", 0) if err != nil { t.Fatalf("NewClient() error = %v", err) } actual, err := client.Recognize(context.Background(), []byte("image-bytes"), "image/png") if err != nil || actual != testCase.want { t.Fatalf("Recognize() = %q, %v", actual, err) } }) } } func TestClientRecognizeFailsClosed(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/other", http.StatusFound) })) defer server.Close() client, err := NewClient(server.URL+"/ocr", 0) if err != nil { t.Fatalf("NewClient() error = %v", err) } _, err = client.Recognize(context.Background(), []byte("image"), "image/png") if !errors.Is(err, ErrServiceInvalid) { t.Fatalf("Recognize() error = %v", err) } }