package main import ( "bytes" "html" "io" "log" "net/http" "net/http/cookiejar" "net/http/httptest" "net/url" "regexp" "testing" "time" "gitea.local.lab/Lbenedar/snippetbox/internal/models/mocks" "github.com/alexedwards/scs/v2" "github.com/go-playground/form/v4" ) var csrfTokenRX = regexp.MustCompile(``) func extractCSRFToken(t *testing.T, body string) string { t.Logf("Body: %s", body) matches := csrfTokenRX.FindStringSubmatch(body) if len(matches) < 2 { t.Fatal("no csrf token found in body") } return html.UnescapeString(string(matches[1])) } func newTestApplication(t *testing.T) *application { templateCache, err := newTemplateCache() if err != nil { t.Fatal(err) } formDecoder := form.NewDecoder() sessionManager := scs.New() sessionManager.Lifetime = 12 * time.Hour sessionManager.Cookie.Secure = true return &application{ errorLog: log.New(io.Discard, "", 0), infoLog: log.New(io.Discard, "", 0), snippets: &mocks.SnippetModel{}, users: &mocks.UserModel{}, templateCache: templateCache, formDecoder: formDecoder, sessionManager: sessionManager, } } type testServer struct { *httptest.Server } func newTestServer(t *testing.T, h http.Handler) *testServer { ts := httptest.NewTLSServer(h) jar, err := cookiejar.New(nil) if err != nil { t.Fatal(err) } ts.Client().Jar = jar ts.Client().CheckRedirect = func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse } return &testServer{ts} } func (ts *testServer) get(t *testing.T, urlPath string) (int, http.Header, string) { rs, err := ts.Client().Get(ts.URL + urlPath) if err != nil { t.Fatal(err) } defer rs.Body.Close() body, err := io.ReadAll(rs.Body) if err != nil { t.Fatal(err) } bytes.TrimSpace(body) return rs.StatusCode, rs.Header, string(body) } func (ts *testServer) postForm(t *testing.T, urlPath string, form url.Values) (int, http.Header, string) { rs, err := ts.Client().PostForm(ts.URL+urlPath, form) if err != nil { t.Fatal(err) } defer rs.Body.Close() body, err := io.ReadAll(rs.Body) if err != nil { t.Fatal(err) } bytes.TrimSpace(body) return rs.StatusCode, rs.Header, string(body) }