On Friday, 17 August 2018 15:49:36 UTC+2, belgoros wrote:
>
>
>
> On Friday, 17 August 2018 15:32:23 UTC+2, belgoros wrote:
>>
>> What's wrong with the following request spec example (using 
>> FactoryBotRails):
>>
>> RSpec.describe "Users", type: :request do
>>   let(:user)    { create(:user) }
>>   let(:headers) { valid_headers(user.username) }
>>
>>
>>   describe 'PATCH /users/logout' do
>>     before { patch users_logout_path, params: {}, headers: headers }
>>
>>
>>     it 'nullifies user token' do
>>       expect(user.token).to be_nil
>>       expect(response).to have_http_status(204)
>>     end
>>   end
>> end
>>
>> Here is helper method in support/controller_spec_helper.rb
>>
>> def valid_headers(username)
>>     {
>>       'Authorization' => "Bearer #{token_generator(username)}",
>>       'Content-Type' => 'application/json'
>>     }
>>   end
>>
>>
>> def token_generator(username)
>>     JsonWebToken.encode(sub: username)
>> end
>>
>> Here is the controller code:
>>
>> #UsersController
>>
>> def logout
>>     @current_user.update_attribute(:token, nil)
>>     head :no_content
>> end
>>
>> I checked `@current_user` after updating his token, it was `nil`. Why it 
>> is nit the case in the spec example ?
>>
>
> Here is how @current_user is implemented:
>
> #ApplicationController
>
>
> class ApplicationController < ActionController::API
>     before_action :authorize_request
>   attr_reader :current_user
>
>
>   private
>
>
>     def authorize_request
>       @current_user = (AuthorizeApiRequest.new(request.headers).call)[:
> user]
>     end 
> end
>
>
> I figured out, - the difference between the User instance created in spec 
example and the one used in  the controller. The solution I came to is to 
find the user by id in the spec example once logout action executed as 
follows:

RSpec.describe 'Users', type: :request do
  let(:user)    { create(:user) }
  let(:headers) { valid_headers(user.username) }


  describe 'PATCH /users/logout' do
    before do
      patch users_logout_path, params: {}, headers: headers
    end


    it 'nullifies user token' do
      user_without_token = User.find(user.id)
      expect(user_without_token.token).to be_nil
      expect(response).to have_http_status(204)
    end
  end
end


Hope this helps

-- 
You received this message because you are subscribed to the Google Groups 
"rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rspec/9837a21d-fa36-4094-8f1c-10a1b82edc21%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to