package handlers_test import ( "net/http" "net/http/httptest" "net/url" "regexp" "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "sneak.berlin/go/webhooker/internal/database" ) // expiryNever is the archive expiry that keeps archived events // forever. const expiryNever = "never" // matched returns what the one group of pattern matched in page, at // each match. func matched(pattern, page string) []string { matches := regexp.MustCompile(pattern).FindAllStringSubmatch(page, -1) groups := make([]string, 0, len(matches)) for _, m := range matches { groups = append(groups, m[1]) } return groups } // expiryShown returns the archive expiries the webhook page's target // list shows. func expiryShown( t *testing.T, env *sourceTestEnv, webhookID string, ) []string { t.Helper() w := httptest.NewRecorder() env.handlers.HandleSourceDetail().ServeHTTP(w, getRequest( t, "/hook/"+webhookID, env.cookies, map[string]string{sourceIDParam: webhookID}, )) require.Equal(t, http.StatusOK, w.Code) return matched( `Archive expiry:\s*([^<]*)`, w.Body.String(), ) } // expirySelected returns the target edit page and the expiries its // expiry select starts on. func expirySelected( t *testing.T, env *sourceTestEnv, webhookID, targetID string, ) (string, []string) { t.Helper() page := targetEditPage(t, env, webhookID, targetID) return page, selectedIn(page, "expiry") } // targetEditPage returns a target's edit page. func targetEditPage( t *testing.T, env *sourceTestEnv, webhookID, targetID string, ) string { t.Helper() w := serveTarget( env, http.MethodGet, "/hook/"+webhookID+"/targets/"+targetID+"/edit", nil, ) require.Equal(t, http.StatusOK, w.Code) return w.Body.String() } // selectedIn returns the values the select named name on page starts // on. func selectedIn(page, name string) []string { _, rest, _ := strings.Cut(page, `\s*`+ `\s*`+ ``, page, ) assert.Contains(t, page, ``) form := url.Values{} form.Set("name", unlisted.Name) form.Set("expiry", "36h") w := submitTargetEdit(env, webhook.ID, unlisted.ID, form) require.Equal(t, http.StatusSeeOther, w.Code, w.Body.String()) assert.JSONEq( t, `{"expiry":"36h"}`, storedTarget(t, env, unlisted.ID).Config, ) }