(この記事は「fukuoka.ex Elixir/Phoenix Advent Calendar 2018」の7日目です)
昨日の記事は,@kobatakoさんの「ソフトウェアルータでカオスエンジニアリング入門」でした。
はじめに
こんにちは。 @zuminです。
アドベントカレンダーと聞くと,クリスマスが近づいてきて今年ももう終わりかーという気持ちになりますね。
今年1年も一瞬で過ぎ去っていった感じがします。
今回は,PhoenixでRESTful APIを作成した場合などにRequestSpecを書く際,AuthorizationヘッダーにJWTなどを含む必要がある場合について書こうと思います。
動作環境
ExUnitの例はたくさん出てくると思うので,今回はESpecを例に進めていきます。
ただし,ExUnitでも Phoenix.ConnTest
まわりは変わらないと思うので, build_conn()
は同様に利用することができると思います。
- Elixir 1.7.4
- Phoenix 1.3.4
- espec 1.6.3
- espec_phoenix 0.6.10
内容
以下のような,curlでユーザーデータのリストがとれるようなWeb APIのRequestSpecをESpecで書き, JWT認証を行う必要がある場合を想定しています。
curl http://localhost:4000/api/v1/users \
-H "accept: application/json" \
-H "Authorization:Bearer TOKEN"
JWT認証の実装に関しては今回は触れませんが, @yujikawaさんのPhoenix/ElixirでAPIのログイン機能を作成する(guardian・guardianDB)
が参考になると思います。
テストコード例
describe "GET /api/v1/users" do
context "is successful" do
let :token do, "TOKEN"
let :conn do
build_conn()
|> put_req_header("authorization", "Bearer #{token()}")
end
it do
response = get(conn(), "/api/v1/users")
expect(response.status)
|> to(eq 200)
end
end
end
Phoenix.ConnTest の build_conn()
でテスト用の Plug.Conn
のRequest Fieldsを生成することができます。
この時に,build_conn() |> put_req_header("authorization", "Bearer TOKEN")
(TOKENには任意の文字列が入ります) とすることで,Authorizationヘッダーを含んだ Plug.Conn
を作ることができます。
まとめ
Phoenixでテストを書くとき, Plug.Conn
は Phoenix.ConnTest
のヘルパーによって楽にAuthorizationヘッダーなどを含めることができます。
「認証」が絡むテストだ・・・。と身構えてしまうかもしれませんが,意外と簡単にテストを書くことができましたね。
それでは良いBDDライフを!
明日は,「fukuoka.ex Elixir/Phoenix Advent Calendar 2018」の担当は @mocamocalandさんです。 お楽しみに!