package api_test
import (
"encoding/json"
"errors"
"net/http"
"net/http/httptest"
"strings"
"testing"
"flyscrape/api"
"github.com/stretchr/testify/require"
)
func TestScrapeURL(t *testing.T) {
svc := &api.ServiceMock{
ScrapeURLFunc: func(url string, params map[string]any) (any, error) {
return map[string]any{"foo": "bar"}, nil
},
}
h := api.NewHandler(svc)
r := httptest.NewRequest("POST", "/scrape", strings.NewReader(`{"url": "https://example.com", "data": {"foo":".foo"}}`))
w := httptest.NewRecorder()
h.ServeHTTP(w, r)
require.Equal(t, w.Result().StatusCode, http.StatusOK)
require.Equal(t, w.Result().Header.Get("Content-Type"), "application/json")
result := map[string]any{}
require.NoError(t, json.NewDecoder(w.Result().Body).Decode(&result))
require.Equal(t, result["url"].(string), "https://example.com")
require.Equal(t, result["data"].(map[string]any)["foo"], "bar")
}
func TestScrapeURLInternalServerError(t *testing.T) {
svc := &api.ServiceMock{
ScrapeURLFunc: func(url string, params map[string]any) (any, error) {
return nil, errors.New("whoops")
},
}
h := api.NewHandler(svc)
r := httptest.NewRequest("POST", "/scrape", strings.NewReader(`{"url": "https://example.com", "data": {"foo":".foo"}}`))
w := httptest.NewRecorder()
h.ServeHTTP(w, r)
require.Equal(t, w.Result().StatusCode, http.StatusInternalServerError)
require.Equal(t, w.Result().Header.Get("Content-Type"), "application/json")
}
func TestScrapeURLBadRequest(t *testing.T) {
svc := &api.ServiceMock{
ScrapeURLFunc: func(url string, params map[string]any) (any, error) {
return nil, errors.New("whoops")
},
}
h := api.NewHandler(svc)
r := httptest.NewRequest("POST", "/scrape", strings.NewReader(`{"}`))
w := httptest.NewRecorder()
h.ServeHTTP(w, r)
require.Equal(t, w.Result().StatusCode, http.StatusBadRequest)
require.Equal(t, w.Result().Header.Get("Content-Type"), "application/json")
}