LoginSignup
9
5

More than 5 years have passed since last update.

Authorizationヘッダーで認証が必要なPhoenixのRequestSpecについて

Posted at

(この記事は「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.ConnTestbuild_conn() でテスト用の Plug.Conn のRequest Fieldsを生成することができます。
この時に,build_conn() |> put_req_header("authorization", "Bearer TOKEN") (TOKENには任意の文字列が入ります) とすることで,Authorizationヘッダーを含んだ Plug.Conn を作ることができます。

まとめ

Phoenixでテストを書くとき, Plug.ConnPhoenix.ConnTest のヘルパーによって楽にAuthorizationヘッダーなどを含めることができます。

「認証」が絡むテストだ・・・。と身構えてしまうかもしれませんが,意外と簡単にテストを書くことができましたね。
それでは良いBDDライフを!

明日は,「fukuoka.ex Elixir/Phoenix Advent Calendar 2018」の担当は @mocamocalandさんです。 お楽しみに!

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5