Rspec Rails 3.1 Prueba de integración. ¿Cómo enviar encabezados de solicitud posterior para dispositivos móviles, autenticación básica http y JSON?
Tengo una prueba de integración RSPEC para una aplicación Rails 3.1 que necesita probar una API para un cliente móvil mediante la emisión de una solicitud POST con parámetros JSON y un encabezado móvil que necesita usar la autenticación http_basic ya que el objeto de solicitud no está disponible en una integración prueba estoy un poco atascado
Este es el código que tengo hasta ahora
it "successfully posts scores" do
# request.env["HTTP_ACCEPT"] = "application/json" #This causes an error as request is nly available in controller tests
post "scores", :score => {:mobile_user_id => @mobile_user.id, :points => 50, :time_taken => 7275}.to_json,
:format => :json, :user_agent => 'Mobile', 'HTTP_AUTHORIZATION' => get_basic_auth
end
La solicitud de publicación no reconoce que estoy usando autenticación básica http pero no estoy seguro si el formato para json es correcto. Cualquier ayuda apreciada
get_basic_auth es un método de ayuda que se parece a este
def get_basic_auth
user = 'user'
pw = 'secret'
ActionController::HttpAuthentication::Basic.encode_credentials user, pw
end
Uso un before_filter en mis controladores que comprueba la autenticación de http_basic_mobile y móvil que se parece a esto
def authorize
logger.debug("@@@@ Authorizing request #{request.inspect}")
if mobile_device?
authenticate_or_request_with_http_basic do |username, password|
username == Mobile::Application.config.mobile_login_name && Mobile::Application.config.mobile_password
end
else
unless current_user
redirect_to login_url, :notice => "Please log in"
end
end
end
Obtengo una redirección para iniciar sesión, por lo que obviamente no se acepta el encabezado móvil, por lo que no tengo idea realmente si alguno de los otros encabezados está funcionando
ACTUALIZA Lo averigu
post("scores", {:score => {:mobile_user_id => @mobile_user.id, :points => 50, :time_taken => 7275}}.to_json,
{"HTTP_USER_AGENT" => "Mobile", 'HTTP_AUTHORIZATION' => get_basic_auth, 'HTTP_CONTENT_TYPE' => "application/json"})
Hace el truco muy bien