🐈

flask_dance の認可テストでは、実際のアクセストークンは要らない

2021/01/24に公開

flask_dance という Flask 向けの OAuth 認証ライブラリを使っている。
このライブラリでは、以下のようなテストの書き方のドキュメントがある。

https://flask-dance.readthedocs.io/en/latest/testing.html

以下が簡単な例である。

from flask_dance.consumer.storage import MemoryStorage
from myapp import app, github_bp

def test_index_unauthorized(monkeypatch):
    storage = MemoryStorage()
    monkeypatch.setattr(github_bp, "storage", storage)

    with app.test_client() as client:
        response = client.get("/", base_url="https://example.com")

    assert response.status_code == 302
    assert response.headers["Location"] == "https://example.com/login/github"

def test_index_authorized(monkeypatch):
    storage = MemoryStorage({"access_token": "fake-token"})
    monkeypatch.setattr(github_bp, "storage", storage)

    with app.test_client() as client:
        response = client.get("/", base_url="https://example.com")

    assert response.status_code == 200
    text = response.get_data(as_text=True)
    assert text == "You are authorized"

これは、認可の有無で画面が変わるエンドポイントをテストしているものだ。
ここでポイントなのが、

    storage = MemoryStorage({"access_token": "fake-token"})

"fake-token" というのはこの文字列のままで良く、実際にアクセストークンに置き換える必要がない。これは、その下の monkeypatch.setattr() の部分で、アクセストークンを取得した状態に差し替えられるからである( monkeypatch によるモックの作成 )。筆者はこれに気づかず1時間くらい無駄に溶かした。

Discussion