// 1ページに表示される画像にリクエストする // TODO: 画像には並列リクエストするべきでは? func loadImages(s *checker.Session, imageUrls []string) { for _, url := range imageUrls { imgReq := checker.NewAssetAction(url, &checker.Asset{}) imgReq.Description = "投稿画像を読み込めること" imgReq.Play(s) } }
// 普通のページに表示されるべき静的ファイルに一通りアクセス func loadAssets(s *checker.Session) { a := checker.NewAssetAction("/favicon.ico", &checker.Asset{MD5: "ad4b0f606e0f8465bc4c4c170b37e1a3"}) a.Description = "faviconが読み込めること" a.Play(s) a = checker.NewAssetAction("js/jquery-2.2.0.js", &checker.Asset{MD5: "56f1d01ee4bb68d1572cfd60755cf67a"}) a.Description = "jqueryが読み込めること" a.Play(s) a = checker.NewAssetAction("js/jquery.timeago.js", &checker.Asset{MD5: "fb592cf6f07c6ba8c65fb7922de011d4"}) a.Description = "jquery.timeago.jsが読み込めること" a.Play(s) a = checker.NewAssetAction("js/jquery.timeago.ja.js", &checker.Asset{MD5: "8deed411d62b6ab593b82e2448ec8d7b"}) a.Description = "jquery.timeago.ja.jsが読み込めること" a.Play(s) a = checker.NewAssetAction("/js/main.js", &checker.Asset{MD5: "be25132ce51abdd99b4b0127da278624"}) a.Description = "main.jsが読み込めること" a.Play(s) a = checker.NewAssetAction("/css/style.css", &checker.Asset{MD5: "e4c3606a18d11863189405eb5c6ca551"}) a.Description = "style.cssが読み込めること" a.Play(s) }
// ログインして画像を投稿する // 簡略化のために画像や静的ファイルへのアクセスはスキップする func postImageScenario(s *checker.Session, me user, image *checker.Asset, sentence string) { var csrfToken string var imageUrls []string var ok bool login := checker.NewAction("POST", "/login") login.ExpectedLocation = `^/$` login.Description = "ログインできること" login.PostData = map[string]string{ "account_name": me.AccountName, "password": me.Password, } login.CheckFunc = checkHTML(func(doc *goquery.Document) error { csrfToken, ok = doc.Find(`input[name="csrf_token"]`).First().Attr("value") if !ok { return errors.New("CSRFトークンが取得できません") } return nil }) err := login.Play(s) if err != nil { return } postImage := checker.NewUploadAction("POST", "/", "file") postImage.Description = "画像を投稿してリダイレクトされること" postImage.ExpectedLocation = `^/posts/\d+$` postImage.Asset = image postImage.PostData = map[string]string{ "body": sentence, "csrf_token": csrfToken, } postImage.CheckFunc = checkHTML(func(doc *goquery.Document) error { imageUrls = extractImages(doc) if len(imageUrls) < 1 { return errors.New("投稿した画像が表示されていません") } return nil }) postImage.Play(s) getImage := checker.NewAssetAction(imageUrls[0], image) getImage.Description = "投稿した画像と一致すること" getImage.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) }