Example #1
0
// 1ページに表示される画像にリクエストする
// TODO: 画像には並列リクエストするべきでは?
func loadImages(s *checker.Session, imageUrls []string) {
	for _, url := range imageUrls {
		imgReq := checker.NewAssetAction(url, &checker.Asset{})
		imgReq.Description = "投稿画像を読み込めること"
		imgReq.Play(s)
	}
}
Example #2
0
// 普通のページに表示されるべき静的ファイルに一通りアクセス
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)
}
Example #3
0
// ログインして画像を投稿する
// 簡略化のために画像や静的ファイルへのアクセスはスキップする
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)
}
Example #4
0
// 新規登録→画像投稿→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)
}