diff --git a/lib/airbrake_api/v3/notice_parser.rb b/lib/airbrake_api/v3/notice_parser.rb index 1cdb48c..9517f70 100644 --- a/lib/airbrake_api/v3/notice_parser.rb +++ b/lib/airbrake_api/v3/notice_parser.rb @@ -69,8 +69,10 @@ module AirbrakeApi end def user_attributes - hash = context.slice('userId', 'userUsername', 'userName', 'userEmail') - Hash[hash.map { |key, value| [key.sub(/^user/, ''), value] }] + context['user'] || begin + hash = context.slice('userId', 'userUsername', 'userName', 'userEmail') + Hash[hash.map { |key, value| [key[4..-1].downcase, value] }] + end end def url diff --git a/spec/fixtures/api_v3_request.json b/spec/fixtures/api_v3_request.json index 01a1324..a49c003 100644 --- a/spec/fixtures/api_v3_request.json +++ b/spec/fixtures/api_v3_request.json @@ -22,10 +22,12 @@ "sourceMapEnabled":true, "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36", "url":"http://localhost:3000/kontakt", - "userId":1,"userUsername":"john", - "userName":"John Doe", - "userUsername": "john", - "userEmail":"john.doe@example.org", + "user": { + "id":1,"userUsername":"john", + "name":"John Doe", + "username": "john", + "email":"john.doe@example.org" + }, "version":"1.0", "component":"ContactsController", "action":"show" diff --git a/spec/fixtures/api_v3_request_with_deprecated_user_keys.json b/spec/fixtures/api_v3_request_with_deprecated_user_keys.json new file mode 100644 index 0000000..01a1324 --- /dev/null +++ b/spec/fixtures/api_v3_request_with_deprecated_user_keys.json @@ -0,0 +1,36 @@ +{ + "notifier":{"name":"airbrake-js-v8","version":"0.3.10","url":"https://github.com/airbrake/airbrake-js"}, + "errors":[ + { + "type":"Error", + "message":"Error: TestError", + "backtrace":[ + {"function":"d","file":"http://localhost:3000/assets/application.js","line":11234,"column":24}, + {"function":"c","file":"http://localhost:3000/assets/application.js","line":11233,"column":18}, + {"function":"b","file":"http://localhost:3000/assets/application.js","line":11232,"column":18}, + {"function":"a","file":"http://localhost:3000/assets/application.js","line":11231,"column":18}, + {"function":"HTMLDocument.","file":"http://localhost:3000/assets/application.js","line":11236,"column":3}, + {"function":"fire","file":"http://localhost:3000/assets/application.js","line":1018,"column":34}, + {"function":"Object.self.fireWith [as resolveWith]","file":"http://localhost:3000/assets/application.js","line":1128,"column":13}, + {"function":"Function.jQuery.extend.ready","file":"http://localhost:3000/assets/application.js","line":417,"column":15}, + {"function":"HTMLDocument.DOMContentLoaded","file":"http://localhost:3000/assets/application.js","line":93,"column":14} + ] + } + ], + "context":{ + "language":"JavaScript", + "sourceMapEnabled":true, + "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36", + "url":"http://localhost:3000/kontakt", + "userId":1,"userUsername":"john", + "userName":"John Doe", + "userUsername": "john", + "userEmail":"john.doe@example.org", + "version":"1.0", + "component":"ContactsController", + "action":"show" + }, + "params":{"returnTo":"dashboard"}, + "environment":{"navigator_vendor":"Google Inc."}, + "session":{"isAdmin":true} +} diff --git a/spec/lib/airbrake_api/v3/notice_parser_spec.rb b/spec/lib/airbrake_api/v3/notice_parser_spec.rb index ad656ea..1e59d70 100644 --- a/spec/lib/airbrake_api/v3/notice_parser_spec.rb +++ b/spec/lib/airbrake_api/v3/notice_parser_spec.rb @@ -19,7 +19,7 @@ describe AirbrakeApi::V3::NoticeParser do end it 'parses JSON payload and returns ErrorReport' do - params = build_params(key: app.api_key) + params = build_params_for('api_v3_request.json', key: app.api_key) report = described_class.new(params).report notice = report.generate_notice! @@ -28,10 +28,10 @@ describe AirbrakeApi::V3::NoticeParser do expect(report.message).to eq('Error: TestError') expect(report.backtrace.lines.size).to eq(9) expect(notice.user_attributes).to include( - 'Id' => 1, - 'Name' => 'John Doe', - 'Email' => 'john.doe@example.org', - 'Username' => 'john' + 'id' => 1, + 'name' => 'John Doe', + 'email' => 'john.doe@example.org', + 'username' => 'john' ) expect(notice.session).to include('isAdmin' => true) expect(notice.params).to include('returnTo' => 'dashboard') @@ -42,7 +42,7 @@ describe AirbrakeApi::V3::NoticeParser do end it 'parses JSON payload when api_key is missing but project_id is present' do - params = build_params(key: nil, project_id: app.api_key) + params = build_params_for('api_v3_request.json', key: nil, project_id: app.api_key) report = described_class.new(params).report expect(report).to be_valid @@ -61,6 +61,20 @@ describe AirbrakeApi::V3::NoticeParser do expect(report.backtrace.lines.size).to eq(0) end + it 'parses JSON payload with deprecated user keys' do + params = build_params_for('api_v3_request_with_deprecated_user_keys.json', key: app.api_key) + + report = AirbrakeApi::V3::NoticeParser.new(params).report + notice = report.generate_notice! + + expect(notice.user_attributes).to include( + 'id' => 1, + 'name' => 'John Doe', + 'email' => 'john.doe@example.org', + 'username' => 'john' + ) + end + it 'takes the notifier from root' do parser = described_class.new( 'errors' => ['MyError'], @@ -77,8 +91,8 @@ describe AirbrakeApi::V3::NoticeParser do expect(parser.attributes[:notifier]).to eq(notifier_params) end - def build_params(options = {}) - json = Rails.root.join('spec', 'fixtures', 'api_v3_request.json').read + def build_params_for(fixture, options = {}) + json = Rails.root.join('spec', 'fixtures', fixture).read data = JSON.parse(json) data['key'] = options[:key] if options.key?(:key) -- libgit2 0.21.2