package callstest import ( "encoding/json" "net/http" "net/http/httptest" "strings" "testing" ) func TestShareMeetingRequiresMemberAndKeepsInvitation(t *testing.T) { x := newHarness(t, "paul@example.com", "bea@example.com") creator := x.browser(t) creator.signIn("paul@example.com") sqid, token := createMeeting(t, creator, "Share this meeting", "") member := x.browser(t) member.signIn("bea@example.com") route := "/m/" + sqid + "/share" page := member.post(route, nil) if page.Code != 200 || !strings.Contains(page.Body.String(), token) || page.Header().Get("Cache-Control") != "no-store" { t.Fatalf("member share page: %d", page.Code) } req := httptest.NewRequest("POST", route, strings.NewReader(`{}`)) req.Header.Set("Origin", testOrigin) req.Header.Set("Accept", "application/json") response := member.do(req) var result struct { URL string `json:"url"` } if response.Code != 200 || json.Unmarshal(response.Body.Bytes(), &result) != nil || result.URL != testOrigin+"/j/"+token { t.Fatal("native share did not return the current invitation") } if response.Header().Get("Cache-Control") != "no-store" { t.Fatal("native share may be cached") } outsider := x.browser(t) outsider.get("/j/" + token) outsider.signIn("guest@example.com") if rec := outsider.get("/m/" + sqid + "/join"); rec.Code != 200 { t.Fatalf("guest fixture: %d", rec.Code) } if rec := outsider.post(route, nil); rec.Code != http.StatusNotFound { t.Fatalf("guest share: %d", rec.Code) } req = httptest.NewRequest("POST", route, nil) req.Header.Set("Origin", "https://elsewhere.example") if rec := member.do(req); rec.Code != http.StatusForbidden { t.Fatalf("cross-site share: %d", rec.Code) } if rec := member.post("/m/not-a-meeting/share", nil); rec.Code != 404 { t.Fatalf("missing meeting: %d", rec.Code) } creator.post("/meetings/"+sqid+"/end", nil) if rec := member.post(route, nil); rec.Code != 404 { t.Fatalf("ended share: %d", rec.Code) } }