Life, Education, Death

プログラミング以外でも思ったことをつらつらと書きたい

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についていたテストをみながらどうにか、認証ページのテストがかけた。