require 'test/unit' require 'fakeweb' require 'mocha' require '3scale/client' class ThreeScale::ClientTest < Test::Unit::TestCase def setup FakeWeb.clean_registry FakeWeb.allow_net_connect = false @client = ThreeScale::Client.new(:provider_key => '1234abcd') @host = ThreeScale::Client::DEFAULT_HOST end def test_raises_exception_if_provider_key_is_missing assert_raise ArgumentError do ThreeScale::Client.new({}) end end def test_default_host client = ThreeScale::Client.new(:provider_key => '1234abcd') assert_equal 'su1.3scale.net', client.host end def test_successful_authorize body = ' true Ultimate 2010-04-26 00:00:00 +0000 2010-04-27 00:00:00 +0000 10023 50000 2010-04-01 00:00:00 +0000 2010-05-01 00:00:00 +0000 999872 150000 ' FakeWeb.register_uri(:get, "http://#{@host}/transactions/authorize.xml?provider_key=1234abcd&app_id=foo", :status => ['200', 'OK'], :body => body) response = @client.authorize(:app_id => 'foo') assert response.success? assert_equal 'Ultimate', response.plan assert_equal 2, response.usage_reports.size assert_equal :day, response.usage_reports[0].period assert_equal Time.utc(2010, 4, 26), response.usage_reports[0].period_start assert_equal Time.utc(2010, 4, 27), response.usage_reports[0].period_end assert_equal 10023, response.usage_reports[0].current_value assert_equal 50000, response.usage_reports[0].max_value assert_equal :month, response.usage_reports[1].period assert_equal Time.utc(2010, 4, 1), response.usage_reports[1].period_start assert_equal Time.utc(2010, 5, 1), response.usage_reports[1].period_end assert_equal 999872, response.usage_reports[1].current_value assert_equal 150000, response.usage_reports[1].max_value end def test_successful_authorize_with_app_keys body = ' true Ultimate ' FakeWeb.register_uri(:get, "http://#{@host}/transactions/authorize.xml?provider_key=1234abcd&app_id=foo&app_key=toosecret", :status => ['200', 'OK'], :body => body) response = @client.authorize(:app_id => 'foo', :app_key => 'toosecret') assert response.success? end def test_authorize_with_exceeded_usage_limits body = ' false usage limits are exceeded Ultimate 2010-04-26 00:00:00 +0000 2010-04-27 00:00:00 +0000 50002 50000 2010-04-01 00:00:00 +0000 2010-05-01 00:00:00 +0000 999872 150000 ' FakeWeb.register_uri(:get, "http://#{@host}/transactions/authorize.xml?provider_key=1234abcd&app_id=foo", :status => ['200', 'OK'], :body => body) response = @client.authorize(:app_id => 'foo') assert !response.success? assert_equal 'usage limits are exceeded', response.error_message assert response.usage_reports[0].exceeded? end def test_authorize_with_invalid_app_id body = 'application with id="foo" was not found' FakeWeb.register_uri(:get, "http://#{@host}/transactions/authorize.xml?provider_key=1234abcd&app_id=foo", :status => ['403', 'Forbidden'], :body => body) response = @client.authorize(:app_id => 'foo') assert !response.success? assert_equal 'application_not_found', response.error_code assert_equal 'application with id="foo" was not found', response.error_message end def test_authorize_with_server_error FakeWeb.register_uri(:get, "http://#{@host}/transactions/authorize.xml?provider_key=1234abcd&app_id=foo", :status => ['500', 'Internal Server Error'], :body => 'OMG! WTF!') assert_raise ThreeScale::ServerError do @client.authorize(:app_id => 'foo') end end def test_report_raises_an_exception_if_no_transactions_given assert_raise ArgumentError do @client.report end end def test_successful_report FakeWeb.register_uri(:post, "http://#{@host}/transactions.xml", :status => ['200', 'OK']) response = @client.report({:app_id => 'foo', :timestamp => Time.local(2010, 4, 27, 15, 00), :usage => {'hits' => 1}}) assert response.success? end def test_report_encodes_transactions http_response = stub Net::HTTPSuccess.stubs(:===).with(http_response).returns(true) Net::HTTP.expects(:post_form). with(anything, 'provider_key' => '1234abcd', 'transactions[0][app_id]' => 'foo', 'transactions[0][usage][hits]' => '1', 'transactions[0][timestamp]' => CGI.escape('2010-04-27 15:42:17 0200'), 'transactions[1][app_id]' => 'bar', 'transactions[1][usage][hits]' => '1', 'transactions[1][timestamp]' => CGI.escape('2010-04-27 15:55:12 0200')). returns(http_response) @client.report({:app_id => 'foo', :usage => {'hits' => 1}, :timestamp => '2010-04-27 15:42:17 0200'}, {:app_id => 'bar', :usage => {'hits' => 1}, :timestamp => '2010-04-27 15:55:12 0200'}) end def test_failed_report error_body = 'provider key "foo" is invalid' FakeWeb.register_uri(:post, "http://#{@host}/transactions.xml", :status => ['403', 'Forbidden'], :body => error_body) client = ThreeScale::Client.new(:provider_key => 'foo') response = client.report({:app_id => 'abc', :usage => {'hits' => 1}}) assert !response.success? assert_equal 'provider_key_invalid', response.error_code assert_equal 'provider key "foo" is invalid', response.error_message end def test_report_with_server_error FakeWeb.register_uri(:post, "http://#{@host}/transactions.xml", :status => ['500', 'Internal Server Error'], :body => 'OMG! WTF!') assert_raise ThreeScale::ServerError do @client.report({:app_id => 'foo', :usage => {'hits' => 1}}) end end end