package tests import ( "net/http" "net/url" "testing" "github.com/brianvoe/gofakeit/v6" "github.com/gavv/httpexpect/v2" "github.com/stretchr/testify/require" "url-shortener/internal/http-server/handlers/url/save" "url-shortener/internal/lib/api" "url-shortener/internal/lib/random" ) const ( host = "localhost:8082" user = "user" password = "pa$$" ) func TestURLShortener_HappyPath(t *testing.T) { u := url.URL{ Scheme: "http", Host: host, } e := httpexpect.Default(t, u.String()) e.POST("/url"). WithJSON(save.Request{ URL: gofakeit.URL(), Alias: random.NewRandomString(10), }). WithBasicAuth(user, password). Expect(). Status(200). JSON().Object(). ContainsKey("alias") } //nolint:funlen func TestURLShortener_SaveRedirect(t *testing.T) { testCases := []struct { name string url string alias string error string }{ { name: "Valid URL", url: gofakeit.URL(), alias: gofakeit.Word() + gofakeit.Word(), }, { name: "Invalid URL", url: "invalid_url", alias: gofakeit.Word(), error: "field URL is not a valid url", }, { name: "Empty Alias", url: gofakeit.URL(), alias: "", }, // TODO: add more test cases } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { u := url.URL{ Scheme: "http", Host: host, } e := httpexpect.Default(t, u.String()) // Save resp := e.POST("/url"). WithJSON(save.Request{ URL: tc.url, Alias: tc.alias, }). WithBasicAuth(user, password). Expect().Status(http.StatusOK). JSON().Object() if tc.error != "" { resp.NotContainsKey("alias") resp.Value("error").String().IsEqual(tc.error) return } alias := tc.alias if tc.alias != "" { resp.Value("alias").String().IsEqual(tc.alias) } else { resp.Value("alias").String().NotEmpty() alias = resp.Value("alias").String().Raw() } // Redirect testRedirect(t, alias, tc.url) }) } } func testRedirect(t *testing.T, alias string, urlToRedirect string) { u := url.URL{ Scheme: "http", Host: host, Path: alias, } redirectedToURL, err := api.GetRedirect(u.String()) require.NoError(t, err) require.Equal(t, urlToRedirect, redirectedToURL) }