require File.join(File.dirname(__FILE__),'..','spec_helper') describe "Ping Android" do it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => false do before do @params = {"device_pin" => @c.device_pin, "sources" => [@s.name], "message" => 'hello world', "vibrate" => '5', "badge" => '5', "sound" => 'hello.mp3'} @response = mock('response') end it "should ping android successfully" do Store.put_value(Android::C2DM_AUTHTOKEN_KEY, 'ValidAuthToken') result = 'id=0:34234234134254%abc123\n' @response.stub!(:code).and_return(200) @response.stub!(:body).and_return(result) @response.stub!(:headers).and_return({}) @response.stub!(:return!).and_return(@response) setup_post_yield(@response) Android.ping(@params).body.should == result end it "should ping android with 503 connection error" do error = 'Connection refused' @response.stub!(:body).and_return(error) RestClient.stub!(:post).and_return { raise RestClient::Exception.new(@response,503) } Android.should_receive(:log).twice lambda { Android.ping(@params) }.should raise_error(RestClient::Exception) end it "should ping android with 200 error message" do Store.put_value(Android::C2DM_AUTHTOKEN_KEY, 'ValidAuthToken') error = 'Error=QuotaExceeded' @response.stub!(:code).and_return(200) @response.stub!(:body).and_return(error) @response.stub!(:headers).and_return(nil) setup_post_yield(@response) Android.should_receive(:log).twice lambda { Android.ping(@params) }.should raise_error(Android::AndroidPingError, "Android ping error: QuotaExceeded") end it "should fail to obtain auth token from C2DM without creds" do error = 'Error=BadAuthentication' @response.stub!(:code).and_return(403) @response.stub!(:body).and_return(error) @response.stub!(:headers).and_return({}) setup_post_yield(@response) Android.should_receive(:log).twice lambda { Android.ping(@params) }.should raise_error(Android::InvalidAuthToken, "Can not obtain auth token from C2DM service. Make sure that your C2DM credentials are valid.: Error=BadAuthentication") end it "should pass to obtain auth token from C2DM" do result = "SID=somesid\nAuth=myauthtoken\n" @response.stub!(:code).and_return(200) @response.stub!(:body).and_return(result) @response.stub!(:headers).and_return({}) setup_post_yield(@response) Android.get_c2dm_token Store.get_value(Android::C2DM_AUTHTOKEN_KEY).should == 'myauthtoken' end it "should fail with invalid C2DM token and call retry" do Store.put_value(Android::C2DM_AUTHTOKEN_KEY, 'BadToken') error = 'Error=BadAuthentication' @response.stub!(:code).and_return(403) @response.stub!(:body).and_return(error) @response.stub!(:[]).and_return(nil) setup_post_yield(@response) Store.should_receive(:flash_data).once Android.should_receive(:get_c2dm_token).twice.and_return('BadToken') Android.should_receive(:log).twice lambda { Android.ping(@params) }.should raise_error(Android::InvalidAuthToken, "Invalid or expired auth token. Obtain new authtoken from C2DM service.") end it "should ping android and receive Update-Client-Auth header" do Store.put_value(Android::C2DM_AUTHTOKEN_KEY, 'ValidAuthToken') @response.stub!(:code).and_return(200) @response.stub!(:body).and_return('') @response.stub!(:headers).and_return(:update_client_auth => 'abc123') @response.stub!(:return!).and_return(@response) setup_post_yield(@response) Android.ping(@params) Store.get_value(Android::C2DM_AUTHTOKEN_KEY).should_not == 'ValidAuthToken' end it "should ping android with 401 error message" do @response.stub!(:code).and_return(401) @response.stub!(:body).and_return('') setup_post_yield(@response) Android.should_receive(:get_c2dm_token).twice.and_return("ValidAuthToken") Android.should_receive(:log).twice lambda { Android.ping(@params) }.should raise_error( Android::InvalidAuthToken, "Invalid or expired auth token. Obtain new authtoken from C2DM service." ) end it "should compute c2d_message" do expected = {'registration_id' => @c.device_pin, 'collapse_key' => "RAND_KEY", 'data.do_sync' => @s.name, 'data.alert' => "hello world", 'data.vibrate' => '5', 'data.sound' => "hello.mp3"} actual = Android.c2d_message(@params) actual['collapse_key'] = "RAND_KEY" unless actual['collapse_key'].nil? actual.should == expected end it "should trim empty or nil params from c2d_message" do expected = {'registration_id' => @c.device_pin, 'collapse_key' => "RAND_KEY", 'data.vibrate' => '5', 'data.do_sync' => '', 'data.sound' => "hello.mp3"} params = {"device_pin" => @c.device_pin, "sources" => [], "message" => '', "vibrate" => '5', "sound" => 'hello.mp3'} actual = Android.c2d_message(params) actual['collapse_key'] = "RAND_KEY" unless actual['collapse_key'].nil? actual.should == expected end end end