diff --git a/lib/garb.rb b/lib/garb.rb index 50e7c4b..5a78444 100644 --- a/lib/garb.rb +++ b/lib/garb.rb @@ -68,7 +68,7 @@ def from_google_analytics(thing) alias :from_ga :from_google_analytics def parse_properties(entry) - Hash[entry['dxp$property'].map {|p| [Garb.from_ga(p['name']),p['value']]}] + Hash[entry['property'].map {|p| [Garb.from_ga(p['name']),p['value']]}] end def parse_link(entry, rel) diff --git a/lib/garb/management/feed.rb b/lib/garb/management/feed.rb index 6beed52..e52d4ed 100644 --- a/lib/garb/management/feed.rb +++ b/lib/garb/management/feed.rb @@ -1,6 +1,8 @@ module Garb module Management class Feed + require 'xmlsimple' + BASE_URL = "https://www.google.com/analytics/feeds/datasources/ga" attr_reader :request @@ -10,7 +12,8 @@ def initialize(session, path) end def parsed_response - @parsed_response ||= JSON.parse(response.body) + # @parsed_response ||= JSON.parse(response.body) + @parsed_response ||= {'feed' => XmlSimple.xml_in(response.body)} end def entries diff --git a/lib/garb/report_response.rb b/lib/garb/report_response.rb index 63942bf..768144c 100644 --- a/lib/garb/report_response.rb +++ b/lib/garb/report_response.rb @@ -1,6 +1,8 @@ module Garb class ReportResponse - KEYS = ['dxp$metric', 'dxp$dimension'] + require 'xmlsimple' + + KEYS = ['metric', 'dimension'] def initialize(response_body, instance_klass = OpenStruct) @data = response_body @@ -30,7 +32,7 @@ def parse end def entries - feed? ? [parsed_data['feed']['entry']].flatten.compact : [] + feed? ? [parsed_data['feed']['aggregates']].flatten.compact : [] end def parse_total_results @@ -42,7 +44,8 @@ def parse_sampled_flag end def parsed_data - @parsed_data ||= JSON.parse(@data) + # @parsed_data ||= JSON.parse(@data) + @parsed_data ||= {'feed' => XmlSimple.xml_in(@data)} end def feed? diff --git a/lib/garb/request/data.rb b/lib/garb/request/data.rb index 9e83866..22d4eb7 100644 --- a/lib/garb/request/data.rb +++ b/lib/garb/request/data.rb @@ -16,13 +16,13 @@ def parameters end def query_string - parameters.merge!("alt" => format) + # parameters.merge!("alt" => format) parameter_list = @parameters.map {|k,v| "#{k}=#{v}" } parameter_list.empty? ? '' : "?#{parameter_list.join('&')}" end def format - @format ||= "json" # TODO Support other formats? + # @format ||= "json" # TODO Support other formats? end def uri @@ -36,7 +36,7 @@ def send_request oauth_user_request end - raise ClientError, response.body.inspect unless response.kind_of?(Net::HTTPSuccess) + raise ClientError, response.body.inspect unless response.kind_of?(Net::HTTPSuccess) || (response.respond_to?(:status) && response.status == 200) response end diff --git a/test/unit/garb/request/data_test.rb b/test/unit/garb/request/data_test.rb index 0e4815b..146c811 100644 --- a/test/unit/garb/request/data_test.rb +++ b/test/unit/garb/request/data_test.rb @@ -51,7 +51,7 @@ class DataTest < MiniTest::Unit::TestCase assert_received(data_request, :single_user_request) end - should "be able to send a request for an oauth user" do + should "be able to send a request for an oauth user (Net::HTTP)" do @session.stubs(:single_user?).returns(false) @session.stubs(:oauth_user?).returns(true) response = mock('Net::HTTPOK') do |m| @@ -65,7 +65,21 @@ class DataTest < MiniTest::Unit::TestCase assert_received(data_request, :oauth_user_request) end - should "raise if the request is unauthorized" do + should "be able to send a request for an oauth user (OAuth2)" do + @session.stubs(:single_user?).returns(false) + @session.stubs(:oauth_user?).returns(true) + response = mock('OAuth2::Response') do |m| + m.expects(:status).returns(200) + end + + data_request = Request::Data.new(@session, 'https://example.com/data', 'key' => 'value') + data_request.stubs(:oauth_user_request).returns(response) + data_request.send_request + + assert_received(data_request, :oauth_user_request) + end + + should "raise if the request is unauthorized (Net::HTTP)" do @session.stubs(:single_user?).returns(false) @session.stubs(:oauth_user?).returns(true) response = mock('Net::HTTPUnauthorized', :body => 'Error') @@ -78,6 +92,22 @@ class DataTest < MiniTest::Unit::TestCase end end + should "raise if the request is unauthorized (OAuth2)" do + @session.stubs(:single_user?).returns(false) + @session.stubs(:oauth_user?).returns(true) + response = mock('OAuth2::Response') do |m| + m.expects(:status).returns(401) + m.expects(:body).returns('Error') + end + + data_request = Request::Data.new(@session, 'https://example.com/data', 'key' => 'value') + data_request.stubs(:oauth_user_request).returns(response) + + assert_raises(Garb::Request::Data::ClientError) do + data_request.send_request + end + end + should "be able to request via the ouath access token" do access_token = stub(:get => "responseobject") @session.stubs(:access_token).returns(access_token)