allscripts_unity_client 2.0.5 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +20 -0
  3. data/allscripts_unity_client.gemspec +2 -1
  4. data/lib/allscripts_unity_client.rb +1 -0
  5. data/lib/allscripts_unity_client/client.rb +27 -20
  6. data/lib/allscripts_unity_client/client_driver.rb +9 -0
  7. data/lib/allscripts_unity_client/client_options.rb +6 -1
  8. data/lib/allscripts_unity_client/json_client_driver.rb +13 -10
  9. data/lib/allscripts_unity_client/json_unity_response.rb +0 -2
  10. data/lib/allscripts_unity_client/new_relic_support.rb +19 -0
  11. data/lib/allscripts_unity_client/soap_client_driver.rb +5 -2
  12. data/lib/allscripts_unity_client/version.rb +1 -1
  13. data/spec/allscripts_unity_client_spec.rb +2 -2
  14. data/spec/client_driver_spec.rb +2 -1
  15. data/spec/client_options_spec.rb +17 -1
  16. data/spec/client_spec.rb +1 -1
  17. data/spec/factories/client_driver_factory.rb +4 -0
  18. data/spec/factories/client_options.rb +1 -0
  19. data/spec/factories/unity_request_factory.rb +2 -0
  20. data/spec/factories/unity_response_factory.rb +2 -0
  21. data/spec/json_client_driver_spec.rb +8 -2
  22. data/spec/json_unity_request_spec.rb +1 -1
  23. data/spec/json_unity_response_spec.rb +1 -1
  24. data/spec/new_relic_support_spec.rb +49 -0
  25. data/spec/soap_client_driver_spec.rb +2 -1
  26. data/spec/support/new_relic.rb +16 -0
  27. data/spec/support/shared_examples_for_client_driver.rb +12 -0
  28. data/spec/timezone_spec.rb +1 -1
  29. data/spec/unity_request_spec.rb +1 -1
  30. data/spec/unity_response_spec.rb +1 -1
  31. data/spec/utilities_spec.rb +2 -2
  32. metadata +21 -8
  33. data/spec/factories/json_client_driver_factory.rb +0 -3
  34. data/spec/factories/json_unity_request_factory.rb +0 -3
  35. data/spec/factories/json_unity_response_factory.rb +0 -3
  36. data/spec/factories/soap_client_driver_factory.rb +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 68c98b1b9d819e56c4c9fde2ad52859c706127b3
4
- data.tar.gz: 6ed674a745e5b8a99ee184b15ea7156df79ee2e8
3
+ metadata.gz: 88cc45a2484b53948ae52a7175a9c633b8cf8108
4
+ data.tar.gz: c792e3083d2727be7872e47e932348699ceb416f
5
5
  SHA512:
6
- metadata.gz: 53d768648a047d2460d07f0b9c206248fdbe1cc28397b8a4f73ac72dbd058e23dd406c5a58394d515c741094424e08a5a2d39f59722c1fde5c9dcd50c8127dc3
7
- data.tar.gz: 94b884fb135786a92c0b419a47f35983696e02e928d4aead6600fbfb6888d383f17cc982546c2a45c6cc4c99e15fe00f3a5c3ed7bca81655a06080b963cb2b23
6
+ metadata.gz: 20d968b2549340bd6fc496e95bab512970db94bae8f3637d0609c0859fdf1b33f640164eee30e77da9c9f3e223c0c7de428565285a6f9d5245900e7b8e56be61
7
+ data.tar.gz: 01714c07e5f1568d03b15e27f653d7c4efa8b3571b053bb5f9ebdb2b6473e651ca9116534b6a319e1106e5035ee66635fcc7d3cc6efe3ad41e1c7eec464d2090
data/README.md CHANGED
@@ -244,6 +244,26 @@ unity_client = AllscriptsUnityClient.create({
244
244
  This gem uses the [american_date](http://rubygems.org/gems/american_date) gem to force `Date.parse` to
245
245
  accept USA locale dates by default. There are currently no plans to support other locales. Pull requests welcome.
246
246
 
247
+ ### New Relic support
248
+
249
+ New Relic is supported for tracing Unity HTTP requests and the overall time processing the reqeusts takes. To enable
250
+ New Relic, simply require the gem in your project and enable it on the client:
251
+
252
+ ```ruby
253
+ require 'newrelic_rpm'
254
+ NewRelic::Agent.manual_start
255
+
256
+ unity_client = AllscriptsUnityClient.create({
257
+ base_unity_url: "http://unity.base.url",
258
+ appname: "appname",
259
+ username: "username",
260
+ password: "password",
261
+ new_relic: true
262
+ })
263
+ ```
264
+
265
+ For more information on the New Relic gem, go here: (https://github.com/newrelic/rpm)
266
+
247
267
  ## Examples
248
268
 
249
269
  ### GetServerInfo SOAP
@@ -29,11 +29,12 @@ Gem::Specification.new do |gem|
29
29
  gem.add_runtime_dependency 'nokogiri', '< 1.6', '>= 1.4.0'
30
30
  gem.add_runtime_dependency 'nori', '~> 2.3.0'
31
31
  gem.add_runtime_dependency 'american_date', '~> 1.1.0'
32
+ gem.add_runtime_dependency 'oj', '~> 2.9.8'
32
33
 
33
34
  gem.add_development_dependency 'factory_girl', '~> 4.4.0'
34
35
  gem.add_development_dependency 'rake', '~> 10.3.1'
35
36
  gem.add_development_dependency 'faker', '~> 1.3.0'
36
- gem.add_development_dependency 'rspec', '~> 3.0.0.beta2'
37
+ gem.add_development_dependency 'rspec', '~> 3.0.0'
37
38
  gem.add_development_dependency 'simplecov', '~> 0.8.2'
38
39
  gem.add_development_dependency 'webmock', '~> 1.17.4'
39
40
  gem.add_development_dependency 'coveralls', '~> 0.7.0'
@@ -9,6 +9,7 @@ require 'allscripts_unity_client/client_driver'
9
9
  require 'allscripts_unity_client/client_options'
10
10
  require 'allscripts_unity_client/soap_client_driver'
11
11
  require 'allscripts_unity_client/json_client_driver'
12
+ require 'allscripts_unity_client/new_relic_support'
12
13
 
13
14
  module AllscriptsUnityClient
14
15
  class APIError < RuntimeError
@@ -501,26 +501,33 @@ module AllscriptsUnityClient
501
501
  # Generate XML structure for rxxml
502
502
  builder = Nokogiri::XML::Builder.new do |xml|
503
503
  xml.saverx {
504
- xml.field('name' => 'transid', 'value' => rxxml[:transid]) unless rxxml[:transid].nil?
505
- xml.field('name' => 'PharmID', 'value' => rxxml[:pharmid]) unless rxxml[:pharmid].nil?
506
- xml.field('name' => 'DDI', 'value' => rxxml[:ddi]) unless rxxml[:ddi].nil?
507
- xml.field('name' => 'GPPCCode', 'value' => rxxml[:gppccode]) unless rxxml[:gppccode].nil?
508
- xml.field('name' => 'GPPCText', 'value' => rxxml[:gppctext]) unless rxxml[:gppctext].nil?
509
- xml.field('name' => 'GPPCCustom', 'value' => rxxml[:gppccustom]) unless rxxml[:gppccustom].nil?
510
- xml.field('name' => 'Sig', 'value' => rxxml[:sig]) unless rxxml[:sig].nil?
511
- xml.field('name' => 'QuanPresc', 'value' => rxxml[:quanpresc]) unless rxxml[:quanpresc].nil?
512
- xml.field('name' => 'Refills', 'value' => rxxml[:refills]) unless rxxml[:refills].nil?
513
- xml.field('name' => 'DAW', 'value' => rxxml[:daw]) unless rxxml[:daw].nil?
514
- xml.field('name' => 'DaysSupply', 'value' => rxxml[:dayssupply]) unless rxxml[:dayssupply].nil?
515
- xml.field('name' => 'startdate', 'value' => utc_to_local(Date.parse(rxxml[:startdate].to_s))) unless rxxml[:startdate].nil?
516
- xml.field('name' => 'historicalflag', 'value' => rxxml[:historicalflag]) unless rxxml[:historicalflag].nil?
517
- xml.field('name' => 'rxaction', 'value' => rxxml[:rxaction]) unless rxxml[:rxaction].nil?
518
- xml.field('name' => 'delivery', 'value' => rxxml[:delivery]) unless rxxml[:delivery].nil?
519
- xml.field('name' => 'ignorepharmzero', 'value' => rxxml[:ignorepharmzero]) unless rxxml[:ignorepharmzero].nil?
520
- xml.field('name' => 'orderedbyid', 'value' => rxxml[:orderedbyid]) unless rxxml[:orderedbyid].nil?
521
- xml.field('name' => 'newqty', 'value' => rxxml[:newqty]) unless rxxml[:newqty].nil?
522
- xml.field('name' => 'newrefills', 'value' => rxxml[:newrefills]) unless rxxml[:newrefills].nil?
523
- xml.field('name' => 'comments', 'value' => rxxml[:comments]) unless rxxml[:comments].nil?
504
+ xml.field('name' => 'transid', 'value' => rxxml[:transid]) unless rxxml[:transid]
505
+ xml.field('name' => 'PharmID', 'value' => rxxml[:pharmid]) unless rxxml[:pharmid]
506
+ xml.field('name' => 'DDI', 'value' => rxxml[:ddi]) unless rxxml[:ddi]
507
+ xml.field('name' => 'GPPCCode', 'value' => rxxml[:gppccode]) unless rxxml[:gppccode]
508
+ xml.field('name' => 'GPPCText', 'value' => rxxml[:gppctext]) unless rxxml[:gppctext]
509
+ xml.field('name' => 'GPPCCustom', 'value' => rxxml[:gppccustom]) unless rxxml[:gppccustom]
510
+ xml.field('name' => 'Sig', 'value' => rxxml[:sig]) unless rxxml[:sig]
511
+ xml.field('name' => 'QuanPresc', 'value' => rxxml[:quanpresc]) unless rxxml[:quanpresc]
512
+ xml.field('name' => 'Refills', 'value' => rxxml[:refills]) unless rxxml[:refills]
513
+ xml.field('name' => 'DAW', 'value' => rxxml[:daw]) unless rxxml[:daw]
514
+ xml.field('name' => 'DaysSupply', 'value' => rxxml[:dayssupply]) unless rxxml[:dayssupply]
515
+ xml.field('name' => 'startdate', 'value' => utc_to_local(Date.parse(rxxml[:startdate].to_s))) unless rxxml[:startdate]
516
+ xml.field('name' => 'historicalflag', 'value' => rxxml[:historicalflag]) unless rxxml[:historicalflag]
517
+ xml.field('name' => 'rxaction', 'value' => rxxml[:rxaction]) unless rxxml[:rxaction]
518
+ xml.field('name' => 'delivery', 'value' => rxxml[:delivery]) unless rxxml[:delivery]
519
+ xml.field('name' => 'ignorepharmzero', 'value' => rxxml[:ignorepharmzero]) unless rxxml[:ignorepharmzero]
520
+ xml.field('name' => 'orderedbyid', 'value' => rxxml[:orderedbyid]) unless rxxml[:orderedbyid]
521
+ xml.field('name' => 'newqty', 'value' => rxxml[:newqty]) unless rxxml[:newqty]
522
+ xml.field('name' => 'newrefills', 'value' => rxxml[:newrefills]) unless rxxml[:newrefills]
523
+ xml.field('name' => 'comments', 'value' => rxxml[:comments]) unless rxxml[:comments]
524
+ xml.field('name' => 'orderstatus', 'value' => rxxml[:order_status]) unless rxxml[:order_status]
525
+
526
+ if rxxml[:problems]
527
+ rxxml[:problems].each do |problem|
528
+ xml.field('name' => 'Problem', 'value' => problem)
529
+ end
530
+ end
524
531
  }
525
532
  end
526
533
 
@@ -8,6 +8,15 @@ module AllscriptsUnityClient
8
8
 
9
9
  def initialize(options)
10
10
  @options = ClientOptions.new(options)
11
+
12
+ # If New Relic support is enabled, setup method tracing
13
+ if @options.new_relic
14
+ NewRelicSupport.enable_method_tracer(self)
15
+
16
+ class << self
17
+ add_method_tracer :magic
18
+ end
19
+ end
11
20
  end
12
21
 
13
22
  def security_token?
@@ -1,6 +1,6 @@
1
1
  module AllscriptsUnityClient
2
2
  class ClientOptions
3
- attr_accessor :proxy, :logger, :ca_file, :ca_path, :timeout
3
+ attr_accessor :proxy, :logger, :ca_file, :ca_path, :timeout, :new_relic
4
4
  attr_reader :base_unity_url, :username, :password, :appname, :timezone
5
5
 
6
6
  def initialize(options = {})
@@ -12,6 +12,7 @@ module AllscriptsUnityClient
12
12
  @ca_file = options[:ca_file]
13
13
  @ca_path = options[:ca_path]
14
14
  @timeout = options[:timeout]
15
+ @new_relic = options[:new_relic]
15
16
 
16
17
  self.timezone = options[:timezone]
17
18
  self.base_unity_url = options[:base_unity_url]
@@ -78,5 +79,9 @@ module AllscriptsUnityClient
78
79
  def timeout?
79
80
  !@timeout.to_s.strip.empty?
80
81
  end
82
+
83
+ def new_relic?
84
+ !@new_relic.nil?
85
+ end
81
86
  end
82
87
  end
@@ -1,4 +1,4 @@
1
- require 'json'
1
+ require 'oj'
2
2
  require 'faraday'
3
3
  require 'em-http-request'
4
4
 
@@ -22,17 +22,20 @@ module AllscriptsUnityClient
22
22
  def magic(parameters = {})
23
23
  request_data = JSONUnityRequest.new(parameters, @options.timezone, @options.appname, @security_token)
24
24
 
25
- response = @connection.post do |request|
26
- request.url "#{UNITY_JSON_ENDPOINT}/MagicJson"
27
- request.headers['Content-Type'] = 'application/json'
28
- request.body = JSON.generate(request_data.to_hash)
29
- set_request_timeout(request)
25
+ response = nil
26
+ NewRelicSupport.trace_execution_scoped_if_available(JSONClientDriver, ["Custom/UnityJSON/#{parameters[:action]}"]) do
27
+ response = @connection.post do |request|
28
+ request.url "#{UNITY_JSON_ENDPOINT}/MagicJson"
29
+ request.headers['Content-Type'] = 'application/json'
30
+ request.body = Oj.dump(request_data.to_hash, mode: :compat)
31
+ set_request_timeout(request)
30
32
 
31
- start_timer
33
+ start_timer
34
+ end
32
35
  end
33
36
  end_timer
34
37
 
35
- response = JSON.parse(response.body)
38
+ response = Oj.load(response.body, mode: :strict)
36
39
 
37
40
  raise_if_response_error(response)
38
41
  log_magic(request_data)
@@ -55,7 +58,7 @@ module AllscriptsUnityClient
55
58
  response = @connection.post do |request|
56
59
  request.url "#{UNITY_JSON_ENDPOINT}/GetToken"
57
60
  request.headers['Content-Type'] = 'application/json'
58
- request.body = JSON.generate(request_data)
61
+ request.body = Oj.dump(request_data, mode: :compat)
59
62
  set_request_timeout(request)
60
63
 
61
64
  start_timer
@@ -80,7 +83,7 @@ module AllscriptsUnityClient
80
83
  response = @connection.post do |request|
81
84
  request.url "#{UNITY_JSON_ENDPOINT}/RetireSecurityToken"
82
85
  request.headers['Content-Type'] = 'application/json'
83
- request.body = JSON.generate(request_data)
86
+ request.body = Oj.dump(request_data, mode: :compat)
84
87
  set_request_timeout(request)
85
88
 
86
89
  start_timer
@@ -1,5 +1,3 @@
1
- require 'json'
2
-
3
1
  module AllscriptsUnityClient
4
2
  class JSONUnityResponse < UnityResponse
5
3
  def to_hash
@@ -0,0 +1,19 @@
1
+ module AllscriptsUnityClient
2
+ module NewRelicSupport
3
+ def self.enable_method_tracer(instance)
4
+ class << instance
5
+ if !respond_to?(:trace_execution_scoped) && !respond_to?(:add_method_tracer)
6
+ extend ::NewRelic::Agent::MethodTracer
7
+ end
8
+ end
9
+ end
10
+
11
+ def self.trace_execution_scoped_if_available(klass, scope)
12
+ if klass.respond_to?(:trace_execution_scoped)
13
+ klass.trace_execution_scoped(scope, &Proc.new)
14
+ else
15
+ yield if block_given?
16
+ end
17
+ end
18
+ end
19
+ end
@@ -59,10 +59,13 @@ module AllscriptsUnityClient
59
59
  soap_action: "#{UNITY_ENDPOINT_NAMESPACE}/Magic"
60
60
  }
61
61
 
62
+ response = nil
62
63
  begin
63
64
  start_timer
64
- response = @savon_client.call('Magic', call_data)
65
- end_timer
65
+ NewRelicSupport.trace_execution_scoped_if_available(SOAPClientDriver, ["Custom/UnitySOAP/#{parameters[:action]}"]) do
66
+ response = @savon_client.call('Magic', call_data)
67
+ end_timer
68
+ end
66
69
  rescue Savon::SOAPFault => e
67
70
  raise APIError, e.message
68
71
  end
@@ -1,3 +1,3 @@
1
1
  module AllscriptsUnityClient
2
- VERSION = '2.0.5'
2
+ VERSION = '2.1.0'
3
3
  end
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'AllscriptsUnityClient' do
3
+ describe AllscriptsUnityClient do
4
4
  include Savon::SpecHelper
5
5
 
6
- subject { AllscriptsUnityClient }
6
+ subject { described_class }
7
7
 
8
8
  describe '.create' do
9
9
  context 'when given mode: :soap' do
@@ -1,9 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'ClientDriver' do
3
+ describe AllscriptsUnityClient::ClientDriver do
4
4
  it_behaves_like 'a client driver'
5
5
 
6
6
  subject { build(:client_driver) }
7
+ let(:new_relic_client_driver) { build(:client_driver, new_relic: true) }
7
8
 
8
9
  describe '#client_type' do
9
10
  it { expect(subject.client_type).to be(:none) }
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'ClientOptions' do
3
+ describe AllscriptsUnityClient::ClientOptions do
4
4
  subject { build(:client_options) }
5
5
 
6
6
  let(:url_with_slash) { 'http://www.example.com/' }
@@ -182,4 +182,20 @@ describe 'ClientOptions' do
182
182
  end
183
183
  end
184
184
  end
185
+
186
+ describe '#new_relic?' do
187
+ context 'when new_relic is nil' do
188
+ it 'returns false' do
189
+ subject.new_relic = nil
190
+ expect(subject.new_relic?).to be_falsey
191
+ end
192
+ end
193
+
194
+ context 'when timeout is not nil' do
195
+ it 'returns true' do
196
+ subject.new_relic = true
197
+ expect(subject.new_relic?).to be_truthy
198
+ end
199
+ end
200
+ end
185
201
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Client' do
3
+ describe AllscriptsUnityClient::Client do
4
4
  subject { build(:client) }
5
5
 
6
6
  describe '#initialize' do
@@ -12,5 +12,9 @@ FactoryGirl.define do
12
12
  ca_file nil
13
13
  ca_path nil
14
14
  timeout nil
15
+ new_relic nil
16
+
17
+ factory :json_client_driver, class: AllscriptsUnityClient::JSONClientDriver
18
+ factory :soap_client_driver, class: AllscriptsUnityClient::SOAPClientDriver
15
19
  end
16
20
  end
@@ -12,5 +12,6 @@ FactoryGirl.define do
12
12
  ca_file nil
13
13
  ca_path nil
14
14
  timeout nil
15
+ new_relic nil
15
16
  end
16
17
  end
@@ -6,5 +6,7 @@ FactoryGirl.define do
6
6
  timezone { build(:timezone) }
7
7
  appname Faker::Name.name
8
8
  security_token SecureRandom.uuid
9
+
10
+ factory :json_unity_request, class: AllscriptsUnityClient::JSONUnityRequest
9
11
  end
10
12
  end
@@ -4,5 +4,7 @@ FactoryGirl.define do
4
4
 
5
5
  response Hash.new
6
6
  timezone { build(:timezone) }
7
+
8
+ factory :json_unity_response, class: AllscriptsUnityClient::JSONUnityResponse
7
9
  end
8
10
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'JSONClientDriver' do
3
+ describe AllscriptsUnityClient::JSONClientDriver do
4
4
  it_behaves_like 'a client driver'
5
5
 
6
6
  subject do
@@ -9,6 +9,7 @@ describe 'JSONClientDriver' do
9
9
  client_driver
10
10
  end
11
11
 
12
+ let(:new_relic_client_driver) { build(:json_client_driver, new_relic: true) }
12
13
  let(:get_server_info) { FixtureLoader.load_file('get_server_info.json') }
13
14
  let(:get_security_token) { FixtureLoader.load_file('get_security_token.json') }
14
15
  let(:retire_security_token) { FixtureLoader.load_file('retire_security_token.json') }
@@ -23,7 +24,7 @@ describe 'JSONClientDriver' do
23
24
  end
24
25
 
25
26
  let(:json_hash) do
26
- JSON.generate(hash)
27
+ Oj.dump(hash, mode: :strict)
27
28
  end
28
29
 
29
30
  describe '#initialize' do
@@ -51,6 +52,11 @@ describe 'JSONClientDriver' do
51
52
  expect(WebMock).to have_requested(:post, 'http://www.example.com/Unity/UnityService.svc/json/MagicJson').with(body: /\{"Action":(null|"[^"]*"),"AppUserID":(null|"[^"]*"),"Appname":(null|"[^"]*"),"PatientID":(null|"[^"]*"),"Token":(null|"[^"]*"),"Parameter1":(null|"[^"]*"),"Parameter2":(null|"[^"]*"),"Parameter3":(null|"[^"]*"),"Parameter4":(null|"[^"]*"),"Parameter5":(null|"[^"]*"),"Parameter6":(null|"[^"]*"),"Data":(null|"[^"]*")\}/, headers: { 'Content-Type' => 'application/json' })
52
53
  end
53
54
 
55
+ it 'should serialize DateTime to iso8601 when given' do
56
+ subject.magic(parameter1: DateTime.now)
57
+ expect(WebMock).to have_requested(:post, 'http://www.example.com/Unity/UnityService.svc/json/MagicJson').with(body: /\{"Action":(null|"[^"]*"),"AppUserID":(null|"[^"]*"),"Appname":(null|"[^"]*"),"PatientID":(null|"[^"]*"),"Token":(null|"[^"]*"),"Parameter1":"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(-|\+)\d{2}:\d{2}","Parameter2":(null|"[^"]*"),"Parameter3":(null|"[^"]*"),"Parameter4":(null|"[^"]*"),"Parameter5":(null|"[^"]*"),"Parameter6":(null|"[^"]*"),"Data":(null|"[^"]*")\}/, headers: { 'Content-Type' => 'application/json' })
58
+ end
59
+
54
60
  it 'should call start_timer' do
55
61
  subject.magic
56
62
  expect(subject).to have_received(:start_timer)
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'JSONUnityRequest' do
3
+ describe AllscriptsUnityClient::JSONUnityRequest do
4
4
  it_behaves_like 'a unity request'
5
5
 
6
6
  subject { build(:json_unity_request) }
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'JSONUnityResponse' do
3
+ describe AllscriptsUnityClient::JSONUnityResponse do
4
4
  it_behaves_like 'a unity response'
5
5
 
6
6
  subject { build(:json_unity_response, response: get_server_info) }
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe AllscriptsUnityClient::NewRelicSupport do
4
+ subject { described_class }
5
+ let(:scope) { ['scope'] }
6
+ let(:block) { lambda {} }
7
+
8
+ before :all do
9
+ # Mock a test class for NewRelic mixin tests.
10
+ class NewRelicSupportTest
11
+ end
12
+ end
13
+
14
+ describe '.enable_method_tracer' do
15
+ context 'when given an object that does not have the NewRelic::Agent::MethodTracer module mixed in' do
16
+ it 'mixes in the NewRelic::Agent::MethodTracer module' do
17
+ allow(NewRelicSupportTest).to receive(:extend)
18
+ subject.enable_method_tracer(NewRelicSupportTest.new)
19
+ expect(NewRelicSupportTest).to have_received(:extend).with(::NewRelic::Agent::MethodTracer)
20
+ end
21
+ end
22
+
23
+ context 'when given an object that does have the NewRelic::Agent::MethodTracer module mixed in' do
24
+ it 'does not mix in the NewRelic::Agent::MethodTracer module' do
25
+ allow(NewRelicSupportTest).to receive(:extend)
26
+ allow(NewRelicSupportTest).to receive(:trace_execution_scoped)
27
+ allow(NewRelicSupportTest).to receive(:add_method_tracer)
28
+ subject.enable_method_tracer(NewRelicSupportTest.new)
29
+ expect(NewRelicSupportTest).not_to have_received(:extend).with(::NewRelic::Agent::MethodTracer)
30
+ end
31
+ end
32
+ end
33
+
34
+ describe '.trace_execution_scoped_if_available' do
35
+ context 'when a class does not have trace_execution_scoped and is given block' do
36
+ it 'will yield to the block' do
37
+ expect { |b| subject.trace_execution_scoped_if_available(NewRelicSupportTest, scope, &b) }.to yield_control
38
+ end
39
+ end
40
+
41
+ context 'when a class has trace_execution_scoped and is given a block' do
42
+ it 'will pass the block to trace_execution_scoped' do
43
+ allow(NewRelicSupportTest).to receive(:trace_execution_scoped)
44
+ subject.trace_execution_scoped_if_available(NewRelicSupportTest, scope, &block)
45
+ expect(NewRelicSupportTest).to have_received(:trace_execution_scoped).with(scope)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'SOAPClientDriver' do
3
+ describe AllscriptsUnityClient::SOAPClientDriver do
4
4
  include Savon::SpecHelper
5
5
  it_behaves_like 'a client driver'
6
6
 
@@ -10,6 +10,7 @@ describe 'SOAPClientDriver' do
10
10
  client_driver
11
11
  end
12
12
 
13
+ let(:new_relic_client_driver) { build(:soap_client_driver, new_relic: true) }
13
14
  let(:get_server_info) { FixtureLoader.load_file('get_server_info.xml') }
14
15
  let(:get_security_token) { FixtureLoader.load_file('get_security_token.xml') }
15
16
  let(:retire_security_token) { FixtureLoader.load_file('retire_security_token.xml') }
@@ -0,0 +1,16 @@
1
+ RSpec.configure do |config|
2
+ config.before(:suite) do
3
+ # Mock the NewRelic::Agent::MethodTracer module
4
+ module NewRelic
5
+ module Agent
6
+ module MethodTracer
7
+ def trace_execution_scoped
8
+ end
9
+
10
+ def add_method_tracer
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,4 +1,16 @@
1
1
  shared_examples 'a client driver' do
2
+ describe '#initialize' do
3
+ context 'when options.new_relic is true' do
4
+ it 'enables NewRelic tracing' do
5
+ allow(AllscriptsUnityClient::NewRelicSupport).to receive(:enable_method_tracer)
6
+ allow(described_class).to receive(:add_method_tracer)
7
+ new_relic_client_driver
8
+ expect(AllscriptsUnityClient::NewRelicSupport).to have_received(:enable_method_tracer).with(new_relic_client_driver)
9
+ expect(described_class).to have_received(:add_method_tracer).with(:magic)
10
+ end
11
+ end
12
+ end
13
+
2
14
  describe '#security_token?' do
3
15
  context 'when @security_token is nil' do
4
16
  it do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Timezone' do
3
+ describe AllscriptsUnityClient::Timezone do
4
4
  subject { build(:timezone) }
5
5
 
6
6
  let(:positive_timezone) { build(:timezone, zone_identifier: 'Asia/Jakarta') }
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'UnityRequest' do
3
+ describe AllscriptsUnityClient::UnityRequest do
4
4
  it_behaves_like 'a unity request'
5
5
 
6
6
  subject { build(:unity_request) }
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'UnityResponse' do
3
+ describe AllscriptsUnityClient::UnityResponse do
4
4
  it_behaves_like 'a unity response'
5
5
 
6
6
  subject { build(:unity_response, response: get_server_info) }
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Utilities' do
4
- subject { AllscriptsUnityClient::Utilities }
3
+ describe AllscriptsUnityClient::Utilities do
4
+ subject { described_class }
5
5
 
6
6
  let(:date_string) { '2013-02-15' }
7
7
  let(:date) { Date.parse(date_string) }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: allscripts_unity_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.5
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ash Gupta
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-06-06 00:00:00.000000000 Z
12
+ date: 2014-07-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: savon
@@ -115,6 +115,20 @@ dependencies:
115
115
  - - ~>
116
116
  - !ruby/object:Gem::Version
117
117
  version: 1.1.0
118
+ - !ruby/object:Gem::Dependency
119
+ name: oj
120
+ requirement: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: 2.9.8
125
+ type: :runtime
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: 2.9.8
118
132
  - !ruby/object:Gem::Dependency
119
133
  name: factory_girl
120
134
  requirement: !ruby/object:Gem::Requirement
@@ -163,14 +177,14 @@ dependencies:
163
177
  requirements:
164
178
  - - ~>
165
179
  - !ruby/object:Gem::Version
166
- version: 3.0.0.beta2
180
+ version: 3.0.0
167
181
  type: :development
168
182
  prerelease: false
169
183
  version_requirements: !ruby/object:Gem::Requirement
170
184
  requirements:
171
185
  - - ~>
172
186
  - !ruby/object:Gem::Version
173
- version: 3.0.0.beta2
187
+ version: 3.0.0
174
188
  - !ruby/object:Gem::Dependency
175
189
  name: simplecov
176
190
  requirement: !ruby/object:Gem::Requirement
@@ -236,6 +250,7 @@ files:
236
250
  - lib/allscripts_unity_client/json_client_driver.rb
237
251
  - lib/allscripts_unity_client/json_unity_request.rb
238
252
  - lib/allscripts_unity_client/json_unity_response.rb
253
+ - lib/allscripts_unity_client/new_relic_support.rb
239
254
  - lib/allscripts_unity_client/soap_client_driver.rb
240
255
  - lib/allscripts_unity_client/timezone.rb
241
256
  - lib/allscripts_unity_client/unity_request.rb
@@ -250,11 +265,7 @@ files:
250
265
  - spec/factories/client_driver_factory.rb
251
266
  - spec/factories/client_factory.rb
252
267
  - spec/factories/client_options.rb
253
- - spec/factories/json_client_driver_factory.rb
254
- - spec/factories/json_unity_request_factory.rb
255
- - spec/factories/json_unity_response_factory.rb
256
268
  - spec/factories/magic_request_factory.rb
257
- - spec/factories/soap_client_driver_factory.rb
258
269
  - spec/factories/timezone_factory.rb
259
270
  - spec/factories/unity_request_factory.rb
260
271
  - spec/factories/unity_response_factory.rb
@@ -281,10 +292,12 @@ files:
281
292
  - spec/json_client_driver_spec.rb
282
293
  - spec/json_unity_request_spec.rb
283
294
  - spec/json_unity_response_spec.rb
295
+ - spec/new_relic_support_spec.rb
284
296
  - spec/soap_client_driver_spec.rb
285
297
  - spec/spec_helper.rb
286
298
  - spec/support/factory_girl.rb
287
299
  - spec/support/fixture_loader.rb
300
+ - spec/support/new_relic.rb
288
301
  - spec/support/shared_examples_for_client_driver.rb
289
302
  - spec/support/shared_examples_for_unity_request.rb
290
303
  - spec/support/shared_examples_for_unity_response.rb
@@ -1,3 +0,0 @@
1
- FactoryGirl.define do
2
- factory :json_client_driver, parent: :client_driver, class: AllscriptsUnityClient::JSONClientDriver
3
- end
@@ -1,3 +0,0 @@
1
- FactoryGirl.define do
2
- factory :json_unity_request, parent: :unity_request, class: AllscriptsUnityClient::JSONUnityRequest
3
- end
@@ -1,3 +0,0 @@
1
- FactoryGirl.define do
2
- factory :json_unity_response, parent: :unity_response, class: AllscriptsUnityClient::JSONUnityResponse
3
- end
@@ -1,3 +0,0 @@
1
- FactoryGirl.define do
2
- factory :soap_client_driver, parent: :client_driver, class: AllscriptsUnityClient::SOAPClientDriver
3
- end