// 間違ったCSRF Tokenで画像を投稿できない func cannotPostWrongCSRFTokenScenario(s *checker.Session, me user, image *checker.Asset) { login := checker.NewAction("POST", "/login") login.ExpectedLocation = `^/$` login.Description = "正しくログインできること" login.PostData = map[string]string{ "account_name": me.AccountName, "password": me.Password, } err := login.Play(s) if err != nil { return } postImage := checker.NewUploadAction("POST", "/", "file") postImage.ExpectedStatusCode = 422 postImage.Description = "間違ったCSRFトークンでは画像を投稿できないこと" postImage.Asset = image postImage.PostData = map[string]string{ "body": util.RandomLUNStr(25), "csrf_token": util.RandomLUNStr(64), } postImage.Play(s) }
// 誤ったパスワードでログインできない func cannotLoginWrongPasswordScenario(s *checker.Session, me user) { fakeUser := map[string]string{ "account_name": me.AccountName, "password": util.RandomLUNStr(util.RandomNumber(15) + 10), } login := checker.NewAction("POST", "/login") login.Description = "間違ったパスワードでログインできないこと" login.ExpectedLocation = `^/login$` login.PostData = fakeUser login.CheckFunc = checkHTML(func(doc *goquery.Document) error { message := strings.TrimSpace(doc.Find(`#notice-message`).Text()) if message != "アカウント名かパスワードが間違っています" { return errors.New("ログインエラーメッセージが表示されていません") } return nil }) login.Play(s) }
// 新規登録→画像投稿→banされる func banScenario(s1, s2 *checker.Session, u user, admin user, image *checker.Asset, sentence string) { var csrfToken string var imageUrls []string var userID string var ok bool accountName := util.RandomLUNStr(25) password := util.RandomLUNStr(25) register := checker.NewAction("POST", "/register") register.ExpectedLocation = `^/$` register.Description = "新規登録できること" register.PostData = map[string]string{ "account_name": accountName, "password": password, } register.CheckFunc = checkHTML(func(doc *goquery.Document) error { name := doc.Find(`.isu-account-name`).Text() if name == "" { return errors.New("ユーザー名が表示されていません") } else if name != accountName { return errors.New("表示されているユーザー名が正しくありません") } csrfToken, ok = doc.Find(`input[name="csrf_token"]`).First().Attr("value") if !ok { return errors.New("CSRFトークンが取得できません") } return nil }) err := register.Play(s1) if err != nil { return } postImage := checker.NewUploadAction("POST", "/", "file") postImage.Description = "画像を投稿してリダイレクトされること" postImage.ExpectedLocation = `^/posts/\d+$` postImage.Asset = image postImage.PostData = map[string]string{ "body": util.RandomLUNStr(15), "csrf_token": csrfToken, } postImage.CheckFunc = checkHTML(func(doc *goquery.Document) error { imageUrls = extractImages(doc) if len(imageUrls) < 1 { return errors.New("投稿した画像が表示されていません") } return nil }) if len(imageUrls) < 1 { return // このケースは上のCheckFuncの中で既にエラーにしてある } imageUrl := imageUrls[0] getImage := checker.NewAssetAction(imageUrl, image) getImage.Description = "投稿した画像と一致することを確認" err = getImage.Play(s1) if err != nil { return } login := checker.NewAction("POST", "/login") login.ExpectedLocation = `^/$` login.Description = "管理ユーザーでログインできること" login.PostData = map[string]string{ "account_name": admin.AccountName, "password": admin.Password, } login.CheckFunc = checkHTML(func(doc *goquery.Document) error { imageUrls = extractImages(doc) for _, url := range imageUrls { if url == imageUrl { return nil // 投稿した画像が正しく表示されている } } return errors.New("投稿した画像が表示されていません") }) err = login.Play(s2) if err != nil { return } banPage := checker.NewAction("GET", "/admin/banned") banPage.Description = "管理ユーザーが管理ページにアクセスできること" banPage.ExpectedLocation = `^/admin/banned$` banPage.CheckFunc = checkHTML(func(doc *goquery.Document) error { csrfToken, ok = doc.Find(`input[name="csrf_token"]`).First().Attr("value") if !ok { return errors.New("CSRFトークンが取得できません") } userID, ok = doc.Find(`input[data-account-name="` + accountName + `"]`).First().Attr("value") if !ok { return errors.New("新規登録されたユーザーが管理ページに表示されていません") } return nil }) err = banPage.Play(s2) if err != nil { return } ban := checker.NewAction("POST", "/admin/banned") ban.Description = "ユーザーの禁止ができること" ban.ExpectedLocation = `^/admin/banned$` ban.PostData = map[string]string{ "uid[]": userID, "csrf_token": csrfToken, } err = ban.Play(s2) if err != nil { return } index := checker.NewAction("GET", "/") index.Description = "トップページに禁止ユーザーの画像が表示されていないこと" index.CheckFunc = checkHTML(func(doc *goquery.Document) error { imageUrls = extractImages(doc) for _, url := range imageUrls { if url == imageUrl { return errors.New("禁止ユーザーの画像が表示されています") } } return nil }) index.Play(s2) }