restful_authenticationの生成したフィクスチャ、users.ymlを動的なものにする。

いやはや。
友達機能だとか、メッセージ機能だとかのテストをするとなると、やっぱり、沢山のユーザ・データが必要になる訳ですわ。


でも、restful_authenticationのジェネレータでは、たった3件、role_requiremetで作られるadminユーザを入れても、たったの4件しか、エントリーが無い訳ですわ。


そんなもん、どう足掻いたって、回りきらねぇよっwww


なんだけど、saltやらtokenやらcrypted_passwordなんてのは、どこかで生成しないと、解んないよね?


なんで、モノは試し、と、vendor/restful_authentication/generators/authenticated/spec/fixtures/users.ymlのコードをペロンと貼ってみたんだけど、なんか、エラーが返ってくる。
必要そうなものをrequireしてincludeして、と色々試したんだけど...


さて。どうしましょうか?


で、しばらく、放っておいたんだけど、今さっき、restful_authenticationのコードを見直したら、どうも、crypted_passwordの生成には、たった二つのメソッドしか、使ってないんだね...

  • vendor/restful_authentication/lib/authentication.rbのModelClassMethods moduleの、secure_digest
  • vendor/restful_authentication/lib/authentication/by_password.rbのModelClassMethods moduleの、password_digest

なんで、コレ、二つとも、持ってきちゃえば、動きそうだよね?


で、vendor/restful_authentication/generators/authenticated/spec/fixtures/users.ymlの冒頭のerbをペロンと貼って、その中に、上の二つのメソッドを追加してみた。


んで、動かしたら、動いたよwww
んじゃあ、とりあえず、人数増やす前のusers.ymlを。
test/fixtures/users.yml

<%
  ## this code must match that in templates/model.rb
  require 'digest/sha1'

  def secure_digest(*args)
    Digest::SHA1.hexdigest(args.flatten.join('--'))
  end

  def password_digest(password, salt)
    digest = REST_AUTH_SITE_KEY
    REST_AUTH_DIGEST_STRETCHES.times do
      digest = secure_digest(digest, salt, password, REST_AUTH_SITE_KEY)
    end
    digest
  end      

  def make_fake_token
    @fake_token_counter ||= 0
    @fake_token_counter +=  1
    Digest::SHA1.hexdigest(@fake_token_counter.to_s)
  end

  salts   = (1..10).map{ make_fake_token }
  passwds = salts.map{ |salt| password_digest('monkey', salt) }
%>
quentin:
  id:                        1
  nickname:                  quentin
  family_name:               Family
  middle_name:               Middle
  given_name:                Given
  email:                     quentin@example.com
  salt:                      <%= salts[0]   %> # SHA1('0')
  crypted_password:          <%= passwds[0] %> # 'monkey'
  created_at:                <%= 5.days.ago.to_s :db  %>
  remember_token_expires_at: <%= 1.days.from_now.to_s %>
  remember_token:            <%= make_fake_token %>
  activation_code:           
  activated_at:              <%= 5.days.ago.to_s :db %>
  state:                     active
      
aaron:
  id:                        2
  nickname:                  aaron
  family_name:               Hogehoge
  middle_name:               ""
  given_name:                Fugafuga
  email:                     aaron@example.com
  salt:                      <%= salts[1]   %> # SHA1('1')
  crypted_password:          <%= passwds[1] %> # 'monkey'
  created_at:                <%= 1.days.ago.to_s :db %>
  remember_token_expires_at: 
  remember_token:            
  activation_code:           <%= make_fake_token %>
  activated_at:              
  state:                     pending


old_password_holder:
  id:                        3
  nickname:                  old_password_holder
  family_name:               名字
  middle_name:               ミドル・ネーム
  given_name:                名前
  email:                     salty_dog@example.com
  salt:                      7e3041ebc2fc05a40c60028e2c4901a81035d3cd
  crypted_password:          00742970dc9e6319f8019fd54864d3ea740f04b1 # test
  created_at:                <%= 1.days.ago.to_s :db %>
  remember_token_expires_at: 
  remember_token:            
  activation_code:           
  activated_at:              <%= 5.days.ago.to_s :db %>
  state:                     passive

admin:
  id: 4
  nickname:                  admin
  family_name:               アドミン
  middle_name:               ザ
  given_name:                管理者
  email:                     admin@example.com
  salt:                      <%= salts[2]   %> # SHA1('2')
  crypted_password:          <%= passwds[2] %> # 'monkey'
  # activation_code: adminscode # only if you're activating new signups
  created_at:                <%= 1.days.ago.to_s :db %>
  remember_token_expires_at: 
  remember_token:            
  activation_code:           
  activated_at:              <%= 5.days.ago.to_s :db %>
  state:                     active


スゴイね。
ちゃんとテスト通ってるよwww
ああ、old_password_holderのsaltとcrypted_passwordは、falseを返す為のものだから、これでいいのだ:-) ...と思われ。


じゃあ、コレを更にアレンジしながら、人数増やしましょうかね。
ああ、あと、adminをid: 1に移動しようかな。
その方が、管理が楽そうだし。


じゃあ、そんな感じで、やっちゃいましょうか。