Quantcast
Channel: fukuoka.ex Elixir/Phoenix Advent Calendarの記事 - Qiita
Viewing all articles
Browse latest Browse all 25

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

$
0
0

(この記事は「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さんです。 お楽しみに!


Viewing all articles
Browse latest Browse all 25

Trending Articles