Пример #1
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)
}
Пример #2
0
// 間違った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)
}
Пример #3
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)
}