美文网首页
item 接口鉴权测试

item 接口鉴权测试

作者: sweetBoy_9126 | 来源:发表于2022-06-24 20:50 被阅读0次
  • items_spec.rb
it "分页" do
      user1 = User.create email: '1@qq.com'
      user2 = User.create email: '2@qq.com'
      11.times { Item.create amount: 100, user_id: user1.id }
      11.times { Item.create amount: 100, user_id: user2.id }

+      post '/api/v1/session', params: {email: user1.email, code: '123456'}
+      json = JSON.parse response.body
 +     jwt = json['jwt']


+      get '/api/v1/items', headers: {'Authorization': "Bearer #{jwt}"}
      expect(response).to have_http_status 200
      json = JSON.parse(response.body)
      expect(json['resources'].size).to eq 10
      get '/api/v1/items?page=2', headers: {'Authorization': "Bearer #{jwt}"}
      expect(response).to have_http_status 200
      json = JSON.parse(response.body)
      expect(json['resources'].size).to eq 1
    end
  • items_controller.rb
def index
+    current_user_id = request.env['current_user_id']
+    return head :unauthorized if current_user_id.nil?
+    items = Item.where({user_id: current_user_id})
.where({created_at: params[:created_after]..params[:created_before]})
      .page(params[:page])

上面添加的几行代码,我们每次测试的时候都要写,我们可以把请求 session 和设置请求头单独封装一个方法

方法1:

  • spec/spec_helper.rb
+ module RequestTestHelper
+  def sign_in(user)
+    post '/api/v1/session', params: {email: user.email, code: '123456'}
+    json = JSON.parse response.body
+    {Authorization: "Bearer #{json['jwt']}"}
+  end
+ end

RSpec.configure do |config|
+  config.include RequestTestHelper, type: :request

使用

it "分页" do
      user1 = User.create email: '1@qq.com'
      user2 = User.create email: '2@qq.com'
      11.times { Item.create amount: 100, user_id: user1.id }
      11.times { Item.create amount: 100, user_id: user2.id }

- post '/api/v1/session', params: {email: user1.email, code: '123456'}
-  json = JSON.parse response.body
-  jwt = json['jwt']
- get '/api/v1/items', headers: {'Authorization': "Bearer #{jwt}"}

+ headers = sign_in user1
+ get '/api/v1/items', headers: headers

方法2:

  • app/models/user.rb
class User < ApplicationRecord
  validates :email, presence: true

+  def generate_jwt
+    payload = { user_id: self.id }
+    JWT.encode payload, Rails.application.credentials.hmac_secret, 'HS256'
+  end

+  def generate_auth_header
+    {Authorization: "Bearer #{self.generate_jwt}"}
+  end
end
  • app/controllers/api/v1/sessions_controller.rb
else
      # 私钥
- hmac_secret = Rails.application.credentials.hmac_secret
- payload = { user_id: user.id }
- token = JWT.encode payload, hmac_secret, 'HS256'
- render status: 200, json: {
-   jwt: token
- }
+ render status: :ok, json: { jwt: user.generate_jwt }
 end

使用

  • spec/requests/items_spec.rb
- headers = sign_in user1
- get '/api/v1/items', headers: headers

+ get '/api/v1/items', headers: user1.generate_auth_header

相关文章

网友评论

      本文标题:item 接口鉴权测试

      本文链接:https://www.haomeiwen.com/subject/leaivrtx.html