2017年3月18日土曜日

punditのtest

pundit使うので、role-abilityのtable構成はhttp://magazine.rubyist.net/?0047-IntroductionToPunditを参考にしたというかそのまま。

とりあえずusersのindexを、adminのみ見れて、normalなuserは見れないのを試す。

userのindexにauthorize @usersを入れておいてusers_policyに飛ばす。users_policyではcan?(__method__)して、action名教えてあげる。can?は別のところでも使いたいのでapplication_policyで。

def can?(action)
    action = action.to_s.chop
    user.abilities.exists?(domain: record.class.to_s.split("::").first.underscore, ability: action)
end

recordは@usersが入っているので、そこからnamespaceだけ取り出す。abilityはusers_policyから貰ったaction名を?は要らないので外して探す。

テスト側ではabilities.ymlに権限入れておく、これをadminのみにつける

one:
  domain: user
  ability: index

role_flows_test.rbで、まずsnsで認証通してuser作成する。

class ActorFlowsTest < ActionDispatch::IntegrationTest
    setup do
        get "/auth/twitter/callback"
        @user = SocialProfile.find_by(uid: "123545").user
    end

    def set_user
        @user.role = roles(:two)
        @user.save
    end

    def set_admin
        @user.role = roles(:one)
        @user.role.abilities << abilities(:one)
        @user.save
    end

    test "index by admin user" do
        set_admin
        get users_path 
        assert_response :success
    end

    test "index by user" do
        set_user
        assert_raise(Pundit::NotAuthorizedError) do
            get users_path 
        end
    end
end

adminなuserはindex見た時にsuccessはok。

問題はnormalなuserで、indexが見れちゃいけない。indexにget飛ばした時に、500-599とか返さないで例外出してしまう...。assert_responseは諦めて Pundit::NotAuthorizedErrorをcatchするように変更して通った。

これ全部につけるのか...。やっぱ辛ぇわ...。

2017年3月17日金曜日

omniauthのtest

policyのtestしようと思ってguard動かすとボロボロボロボロ...。

まずログイン状態になってないのがアウツ。まぁsession入る要素無いし。

omniauth通さず、controller testで直にsession入れてしまえば良い気がするが、方法が見つからん。仕方ないので以下の手順にせざるを得ない

  1. omniauthでsession入れる
  2. ApplicationControllerでcurrent_user入れる
  3. やりたいtest実行

でもこれってomniauthにrequest送らなければならんが、どうやってrequest送るんだよとか探してた。

Integration Testing見に行って読んでパッと分かればすぐ終わる話。

つまりtest_modeにして /auth/provider にgetリクエスト投げればいいらしい。どこでどう書くんだよって感じでよくわからなかった。

全部のcontrollerで、ログインするかどうかは分からんが、とりあえずその準備をしておきたいのでtest_helper.rbに

if Rails.env.development? or Rails.env.test?
    OmniAuth.config.test_mode = true
    OmniAuth.config.mock_auth[:twitter] = OmniAuth::AuthHash.new({
        provider: 'twitter',
        uid: '123545',
        credentials: "credentials",
        info: {
            email: "iaia@example.com",
            name: "iaia",
            nickname: "iaia",
            description: "setumei",
            urls: {public_profile: "example@exampl.com", Website: "exampl.com"},
            location: "tokyo"
        },
        extra: {raw_info: "info"}
    })
end

って追加。各controller testでget /auth/provider する。

rails routes

すると /auth/provider 無い...。多分何か設定しなければいけないんだろう。面倒なので

get "/auth/twitter/callback"

してしまう。 常にログインしている状態でtestしたいので

setup do
    get "/auth/twitter/callback"
end

でわざわざrequestにomniauth.authとか送らんで良いらしい。test_helperで追加したmockが自動で request.env に入っている。そのためのtest_modeか。

2017年3月12日日曜日

午後ロー視聴管理2

とりあえず認証とwatched管理は問題無さそうなのでherokuにあげる https://afr-load.herokuapp.com/
認証でdevise使うのが多かったので何も考えずに使ってしまったが、導入でうだうだやってしまったし、メールで登録だとかって機能は要らないし、というか別に認証でいちいちgem使う必要ないなということで排除。omniauthは使うが...。
後は重いタスクでユーザ権限とwatchedリストと実況リプレイかな。
ユーザ権限は、tv, movieの編集だとか手入力での追加辺りの編集権限。他にも必要なら追加で。 パッと考えつくのはroleテーブル作ってadmin, movie_edit, movie_addとかで管理、user.can_movie_edit?とか都度やる。特に難しく無さそうだが、ググると結構自前で作る権限系がどうこう、gemが色々あって〜ってのをよく見る。無駄gemいれたくないのでこの辺は応相談だな。
watchedリストはまぁ簡単。見た目の問題だし。
実況リプレイはそもそも必要か考えないと。

2017年3月6日月曜日

眠れないので


とかいう題でブログ書きながら寝落ちしたので
ニーアが面白い。移動にストレスが少ないのが強い。FF15と比べると圧倒的に強い。
とりあえず午後ローの視聴管理作った。
既に午後ローで見た映画だけど、再度放送されると見たっけ?となるので そういう意味ではまぁ必要かな。watched movieでunwatched tvな時の表示がまだだが
現状、視聴管理しか出来ないので視聴管理とは言ったけど、 視聴管理がしたいのではなくて、録画管理がしたい。
torneもうちにあるbraviaも、アプリから録画情報を取ってそこから削除だとかが出来る。
なのでhttpなapiあるだろうと公式ドキュメント探すが無いのでググる。
【nasne】APIを調べてみた。ディスク容量が知りたい、他
まぁnasneは皆やるだろうな感ある。もちろん推奨されてはいないんだろうが。 braviaの方はググっても見つからんので、やられてないんだろうな。ただ同じようなAPIが定義されてるのでは?的な想像。
まぁあんまり現実的じゃない。
todoがよく分かんなくなってきてしまったので、task管理でtrello使ってみる。https://trello.com/b/aEXsQhra/afr-load-rails とりあえず画面を良くするとモチベーション上がるので、そっちをだらだらっと平日やって、土日でその辺調査か。
その前にcolumn追加系は早めにやっておかないと、後でぐだってしまうので最優先。
thumbnail関連は自動で取得できるようにしたいが難しそうだな。