gaemaのミドルウェアを使ったときにテストが書きたい
GAEMAを使うと簡単に認証必須のページが作れた
認証していないといけないページは
Kay Framework で認証に Twitter の OAuth を使う方法 - present
のように
@login_requiredデコレータを使うことですんなりと、動いたので
Twitter認証が必須のページを簡単に作ることができた。
GAEMAはそもそも、GAE上で簡単に使える認証ツールらしく
Twitter以外でも、facebookとかも簡単に対応できるらしい。
http://www.moongift.jp/2010/03/gaema/
認証必須ページのテストを書くのに苦労した。
テストを書きながら作業をしていたので、認証ページの設定をしたことで
テストが通らなくなってしまった。
http://d.hatena.ne.jp/griefworker/20100901/test_login_required_view
をみると、Kay-framework本体のテストに色々書いてあるっぽかったので
そちらを参考に、Twitter認証したときのテストコードを書いた
下は投稿するたびにArticleデータを作成するのをテストするコード。
ポイントは
- self.client.test_login
- self.client.test_logout
の二つの関数。
(gaemaを使っているときは
auth.backend.gaema.pyのtest_loginとtest_logoutが最終的に呼ばれるようだ。)
今回は必要なときだけ、ログインをして
tearDown時に必ずログアウトするようなテストになっている。
test_loginの引数はサービス名とtwitterのIDとログイン名を渡すとうまく動いた。
他のサービス(facebookなどでは別のパラメータが必要かもしれないが、ちゃんと調べていない)
# -*- coding: utf-8 -*- import types from google.appengine.ext import db from werkzeug import BaseResponse, Request from kay.app import get_application from kay.utils.test import ( init_recording, get_last_context, get_last_template, disable_recording ) from kay.ext.testutils.gae_test_base import GAETestBase from kay.utils.test import Client from donedot.models import Item, Article class donedotTestCase(GAETestBase): CLEANUP_USED_KIND = True USE_PRODUCTION_STUBS = True def setUp(self): init_recording() app = get_application() self.client = Client(app, BaseResponse) def tearDown(self): self.client.test_logout(service='twitter') disable_recording() # 同じアイテムについてコメントをしても、二つ投稿される def test_RegisterItem_TwoPostArticle(self): self._login() self._postArticle('4515445800017') articles = Article.all().fetch(100) self.assertEquals( len(articles), 1 ) self._postArticle('4515445800017') articles = Article.all().fetch(100) self.assertEquals( len(articles), 2 ) def _login(self): self.client.test_login(service='twitter', user_data={'id': 'ユーザーID', 'name':アカウント名'}) def _postArticle(self, janCode ): response = self.client.get('/') used_context = get_last_context() response = self.client.post('/', data={'janCode': janCode, '_csrf_token': used_context['form'].csrf_token}, follow_redirects=True)
kay-frameworkについていたテストをみながらどうにか、認証ページのテストがかけた。