Sending custom headers through RSpec

rspec, rspec-rails, ruby-on-rails, ruby-on-rails-3

Solution

well, maybe too late for people but just to be lined up:

it 'should get profile when authorized' do
  user = FactoryGirl.create :user
  request.headers[EMAIL_TOKEN] = user.email
  request.headers[AUTH_TOKEN] = user.authentication_token
  get :profile
  response.should be success
end

just call request.headers with appropriate settings.

Problem

Given my API consumers are required to send a customer HTTP header like this: ``` # curl -H 'X-SomeHeader: 123' http://127.0.0.1:3000/api/api_call.json ``` Then I can read this header in a before_filter method like this: ``` # app/controllers/api_controller.rb class ApiController < ApplicationController before_filter :log_request private def log_request logger.debug "Header: #{request.env['HTTP_X_SOMEHEADER']}" ... end end ``` So far great. Now I would like to test this using RSpec as there is a change in behavior: ``` # spec/controllers/api_controller_spec.rb describe ApiController do it "should process the header" do @request.env['HTTP_X_SOMEHEADER'] = '123' get :api_call ... end end ``` However, the `request` received in ApiController will not be able to find the header variable. When trying the `same code` with the HTTP_ACCEPT_LANGUAGE header, it will work. Are custom headers filtered somewhere? PS: Some examples around the web use `request` instead of `@request`. While I'm not certain which one is correct as of the current Rails 3.2/RSpec 2.14 combination - both methods will not trigger the right behavior, BUT both work with `HTTP_ACCEPT_LANGUAGE` as well.

Original source