caren-api 0.3.5 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -6,10 +6,10 @@ This is the reference implementation for the Caren CareProvider API (http://care
6
6
 
7
7
  To get started you will need a care provider API private/public keypair.
8
8
 
9
- * Generate a private key using: `openssl genrsa -out example 1024`
10
- * Extract the public key from it: `openssl rsa -in example -pubout -out example.pub`
9
+ * Generate a private key using: pk = Caren::Api.generate_private_key
10
+ * Extract the public key from it: pk.public_key
11
11
  * Send the public key to info@caren-cares.com with an access request.
12
- * Set your care provider url `Caren::Api.url` to the provided URL like https://example.caren-cares.com.
12
+ * Create an Api session and fill your private key and your care provider url (like https://example.caren-cares.com)
13
13
 
14
14
  == Getting information from Caren
15
15
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.5
1
+ 0.4.0
data/caren-api.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{caren-api}
8
- s.version = "0.3.5"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Andre Foeken"]
12
- s.date = %q{2011-10-20}
12
+ s.date = %q{2011-10-21}
13
13
  s.description = %q{You can use this gem as inspiration of the base of your connections with Caren.}
14
14
  s.email = %q{andre.foeken@nedap.com}
15
15
  s.extra_rdoc_files = [
data/certs/caren-api.pub CHANGED
@@ -1,6 +1,8 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDll+UxqVoqgd6ZHkw8av/0XYbZ
3
- RP7JIZ8zNst1kK4SnBV0YZBlxl5j+1tRgjvzSUOxJehp0ikFquZk2dm9i7JHIeXL
4
- OnfSjN4Hbw/C/d8RXDcmbtF/7RmYs4mVrhQS5eQNR7bDo6NKA1UfDEB0OFIcvhks
5
- 6ev6vuETYzu7Y+DroQIDAQAB
6
- -----END PUBLIC KEY-----
1
+ -----BEGIN RSA PUBLIC KEY-----
2
+ MIIBCgKCAQEA3sPP1w5IMHMFD2swbNl6LBWBek8QckE9z0MRmIIe4hVTcQcoXRcZ
3
+ bhK3r3l8yFbYjWjxEuWgk1JTdLx5Y+LjP0tbF4C+yTRZr8FmbEBVJ6Gan0AV0rmP
4
+ AGyDY8YrrO3FI9A3L0TP1ZYpIY6Lt33zKXMECgHWpXmiQcvRPR2rXRrVZzC5m1zk
5
+ /fZR+XGQyJ+vcO8MaTRUKs4l28Ih/hGXXGUgT4IYMdF+CIaoympBs8iMcchY4Idn
6
+ DFdtNgG328QZUouHAa/kp46SC1Xo2DtwNNrJxsbQQyeABNCopGmsBJMmwQPfsV4I
7
+ CH1U0hkEzBF2LsWJKRk1scTtVYiB8Kcu4QIDAQAB
8
+ -----END RSA PUBLIC KEY-----
data/init.rb CHANGED
@@ -1,4 +1 @@
1
- require "lib/caren.rb"
2
-
3
- Caren::Api.url = "https://www.carenzorgt.nl"
4
- Caren::Api.caren_public_key = Caren::Api.key_from_path("certs/caren-api.pub")
1
+ require "lib/caren.rb"
data/lib/caren/base.rb CHANGED
@@ -64,7 +64,7 @@ class Caren::Base
64
64
 
65
65
  # The absolute (constructed url) to the resource.
66
66
  def self.resource_url id=nil
67
- "#{Caren::Api.url}#{self.resource_location}#{id}"
67
+ "#{self.resource_location}#{id}"
68
68
  end
69
69
 
70
70
  def self.search_url key, value
@@ -25,20 +25,20 @@ class Caren::CareProvider < Caren::Base
25
25
  ]
26
26
  end
27
27
 
28
- def self.search key, value
29
- from_xml Caren::Api.get( self.search_url(key,value) )
28
+ def self.search key, value, session
29
+ from_xml session.get( self.search_url(key,value) )
30
30
  end
31
31
 
32
- def self.all
33
- from_xml Caren::Api.get(self.resource_url)
32
+ def self.all session
33
+ from_xml session.get(self.resource_url)
34
34
  end
35
35
 
36
- def update
37
- Caren::Api.put(self.resource_url(self.id), self.to_xml)
36
+ def update session
37
+ session.put(self.resource_url(self.id), self.to_xml)
38
38
  end
39
39
 
40
- def update_logo logo_hash_or_path
41
- Caren::Api.put(self.resource_url(self.id), self.to_logo_xml(logo_hash_or_path))
40
+ def update_logo logo_hash_or_path, session
41
+ session.put(self.resource_url(self.id), self.to_logo_xml(logo_hash_or_path))
42
42
  end
43
43
 
44
44
  def as_xml
data/lib/caren/caren.rb CHANGED
@@ -20,74 +20,74 @@ module Caren
20
20
 
21
21
  class Api
22
22
 
23
- def self.url= url
24
- Thread.current[:url] = url
25
- end
26
-
27
- def self.url
28
- Thread.current[:url]
23
+ class << self
24
+ attr_accessor :session
29
25
  end
30
26
 
31
- def self.caren_public_key= key
32
- Thread.current[:caren_public_key] = key
33
- end
34
-
35
- # The public key file used to verify request coming from Caren
36
- def self.caren_public_key
37
- Thread.current[:caren_public_key]
38
- end
39
-
40
- def self.private_key= key
41
- Thread.current[:private_key] = key
42
- end
27
+ attr_accessor :url, :caren_public_key, :private_key
43
28
 
44
- # The private key file used to sign requests coming from you
45
- def self.private_key
46
- Thread.current[:private_key]
29
+ # Initialize new API session. Specify your private key to sign outgoing messages and your care provider url.
30
+ # Optionally you can pass the caren public key used to verify incoming requests.
31
+ def initialize private_key, url, caren_public_key=nil
32
+ self.url = url
33
+ self.private_key = private_key
34
+ self.caren_public_key = caren_public_key || Caren::Api.key_from_path("certs/caren-api.pub")
47
35
  end
48
36
 
37
+ # Create key from string
49
38
  def self.key_from_string string
50
39
  OpenSSL::PKey::RSA.new(string)
51
40
  end
52
41
 
42
+ # Read a file and create key from string
53
43
  def self.key_from_path path
54
44
  self.key_from_string( File.read(path) )
55
45
  end
56
46
 
57
- def self.generate_private_key
58
- OpenSSL::PKey::RSA.generate( 1024 )
47
+ # Generate a new private key
48
+ def self.generate_private_key size=2048
49
+ OpenSSL::PKey::RSA.generate( size )
59
50
  end
60
51
 
61
- def self.put url, xml
52
+ # URL from path using session base url
53
+ def url_for path
54
+ "#{self.url}#{path}"
55
+ end
56
+
57
+ def put path, xml
62
58
  begin
63
- response = RestClient.put url, xml, :content_type => :xml, :accept => :xml, :signature => Caren::Api.sign(xml)
59
+ timestamp = DateTime.now.to_i
60
+ response = RestClient.put url_for(path), xml, :content_type => :xml, :accept => :xml, :timestamp => timestamp, :signature => sign(timestamp,xml)
64
61
  return check_signature(response)
65
62
  rescue RestClient::Exception => e
66
63
  handle_error(e.response)
67
64
  end
68
65
  end
69
66
 
70
- def self.post url, xml
67
+ def post path, xml
71
68
  begin
72
- response = RestClient.post url, xml, :content_type => :xml, :accept => :xml, :signature => Caren::Api.sign(xml)
69
+ timestamp = DateTime.now.to_i
70
+ response = RestClient.post url_for(path), xml, :content_type => :xml, :accept => :xml, :timestamp => timestamp, :signature => sign(timestamp,xml)
73
71
  return check_signature(response)
74
72
  rescue RestClient::Exception => e
75
73
  handle_error(e.response)
76
74
  end
77
75
  end
78
76
 
79
- def self.delete url
77
+ def delete path
80
78
  begin
81
- response = RestClient.delete url, :content_type => :xml, :accept => :xml, :signature => Caren::Api.sign
79
+ timestamp = DateTime.now.to_i
80
+ response = RestClient.delete url_for(path), :content_type => :xml, :accept => :xml, :timestamp => timestamp, :signature => sign(timestamp)
82
81
  return check_signature(response)
83
82
  rescue RestClient::Exception => e
84
83
  handle_error(e.response)
85
84
  end
86
85
  end
87
86
 
88
- def self.get url
87
+ def get path
89
88
  begin
90
- response = RestClient.get url, :content_type => :xml, :accept => :xml, :signature => Caren::Api.sign
89
+ timestamp = DateTime.now.to_i
90
+ response = RestClient.get url_for(path), :content_type => :xml, :accept => :xml, :timestamp => timestamp, :signature => sign(timestamp)
91
91
  return check_signature(response)
92
92
  rescue RestClient::Exception => e
93
93
  handle_error(e.response)
@@ -103,11 +103,11 @@ module Caren
103
103
  end
104
104
 
105
105
  # Pass an XML string to be handled. Only a valid caren_objects xml hash will be parsed.
106
- def self.incoming xml, signature
106
+ def incoming xml, signature
107
107
  if self.verify_signature(signature,xml)
108
108
  objects = []
109
109
  hash = Hash.from_xml(xml)["caren_objects"]
110
- self.supported_incoming_objects.each do |key,klass|
110
+ Caren::Api.supported_incoming_objects.each do |key,klass|
111
111
  objects << (hash[key]||hash[key.to_s]||[]).map{ |h| klass.new(h) }
112
112
  end
113
113
  return objects.flatten
@@ -116,29 +116,30 @@ module Caren
116
116
  end
117
117
  end
118
118
 
119
- # Sign your string using Caren::Api.private_key
120
- def self.sign string=""
121
- encrypted_digest = Caren::Api.private_key.sign( "sha1", string )
119
+ # Sign your string and timestamp using private key
120
+ # Timestamp is UNIX timestamp seconds since 1970
121
+ def sign timestamp, string=nil
122
+ encrypted_digest = self.private_key.sign( "sha1", string.to_s + timestamp.to_s )
122
123
  signature = CGI.escape(Base64.encode64(encrypted_digest))
123
124
  return signature
124
125
  end
125
126
 
126
- private
127
-
128
127
  # Check the signature of the response from rest-client
129
- def self.check_signature response
130
- return response if self.verify_signature( response.headers[:signature], response )
128
+ def check_signature response
129
+ return response if self.verify_signature( response.headers[:signature], response.headers[:timestamp], response )
131
130
  raise Caren::Exceptions::SignatureMismatch.new
132
131
  end
133
132
 
134
- # Verify the signature using the caren public key file
135
- def self.verify_signature signature, string=""
133
+ # Verify the signature using the caren public key
134
+ def verify_signature signature, timestamp, string=nil
136
135
  signature = Base64.decode64(CGI.unescape(signature))
137
- Caren::Api.caren_public_key.verify( "sha1", signature, string )
136
+ self.caren_public_key.verify( "sha1", signature, string.to_s + timestamp.to_s )
138
137
  end
139
-
138
+
139
+ private
140
+
140
141
  # Raise a Caren exception on errors
141
- def self.handle_error response
142
+ def handle_error response
142
143
  errors = []
143
144
  doc = REXML::Document.new(response)
144
145
  doc.elements.each('errors/error') do |error|
@@ -11,13 +11,13 @@ class Caren::ExternalMessage < Caren::Base
11
11
  :subject_id # Integer (Caren person id)
12
12
  ]
13
13
  end
14
-
15
- def create
16
- Caren::Api.post self.class.resource_url(self.subject_id), self.to_xml
14
+
15
+ def create session
16
+ session.post self.class.resource_url(self.subject_id), self.to_xml
17
17
  end
18
18
 
19
- def delete
20
- Caren::Api.delete self.class.resource_url(self.subject_id,self.id)
19
+ def delete session
20
+ session.delete self.class.resource_url(self.subject_id,self.id)
21
21
  end
22
22
 
23
23
  def self.array_root
@@ -47,7 +47,7 @@ class Caren::ExternalMessage < Caren::Base
47
47
  end
48
48
 
49
49
  def self.resource_url subject_id, id=nil
50
- "#{Caren::Api.url}#{self.resource_location % subject_id}#{id}"
50
+ "#{self.resource_location % subject_id}#{id}"
51
51
  end
52
52
 
53
53
  end
data/lib/caren/link.rb CHANGED
@@ -11,18 +11,18 @@ class Caren::Link < Caren::Base
11
11
  ]
12
12
  end
13
13
 
14
- def self.search key, value
15
- from_xml Caren::Api.get( self.search_url(key,value) )
14
+ def self.search key, value, session
15
+ from_xml session.get( self.search_url(key,value) )
16
16
  end
17
17
 
18
- def self.all
19
- from_xml Caren::Api.get(self.resource_url)
18
+ def self.all session
19
+ from_xml session.get(self.resource_url)
20
20
  end
21
21
 
22
22
  # Request to create a new link. Example:
23
23
  # Caren::Link.new( :patient_number => 1234 ).create
24
- def create
25
- Caren::Api.post(self.resource_url, self.to_xml)
24
+ def create session
25
+ session.post(self.resource_url, self.to_xml)
26
26
  end
27
27
 
28
28
  def as_xml
@@ -72,33 +72,35 @@ describe "CareProvider", "REST methods" do
72
72
  before do
73
73
  care_providers = File.read("spec/fixtures/caren_care_providers.xml")
74
74
  care_providers_search = File.read("spec/fixtures/caren_care_providers_search.xml")
75
- FakeWeb.register_uri(:put, Caren::CareProvider.resource_url(1), :signature => Caren::Api.sign )
76
75
 
77
- FakeWeb.register_uri(:get, Caren::CareProvider.resource_url, :body => care_providers,
78
- :signature => Caren::Api.sign(care_providers) )
79
-
80
- FakeWeb.register_uri(:get, "#{Caren::CareProvider.resource_url}?key=url-shortcut&value=pantein",
81
- :body => care_providers_search,
82
- :signature => Caren::Api.sign(care_providers_search) )
76
+ care_provider_url = Caren::Api.session.url_for( Caren::CareProvider.resource_url(1) )
77
+ care_providers_url = Caren::Api.session.url_for( Caren::CareProvider.resource_url )
78
+ search_url = Caren::Api.session.url_for( "#{Caren::CareProvider.resource_url}?key=url-shortcut&value=pantein" )
79
+
80
+ timestamp = DateTime.now.to_i
81
+
82
+ FakeWeb.register_uri(:put, care_provider_url, :timestamp => timestamp, :signature => Caren::Api.session.sign(timestamp) )
83
+ FakeWeb.register_uri(:get, care_providers_url, :body => care_providers, :timestamp => timestamp, :signature => Caren::Api.session.sign(timestamp,care_providers) )
84
+ FakeWeb.register_uri(:get, search_url, :body => care_providers_search, :timestamp => timestamp, :signature => Caren::Api.session.sign(timestamp,care_providers_search) )
83
85
  end
84
86
 
85
87
  it "should be able to update a care provider" do
86
- lambda{ Caren::CareProvider.new( :id => 1, :name => "Test" ).update }.should_not raise_error
88
+ lambda{ Caren::CareProvider.new( :id => 1, :name => "Test" ).update( Caren::Api.session ) }.should_not raise_error
87
89
  end
88
90
 
89
91
  it "should be able to update the logo for a care provider" do
90
- lambda{ Caren::CareProvider.new( :id => 1 ).update_logo( "spec/fixtures/bacon.jpg" ) }.should_not raise_error
92
+ lambda{ Caren::CareProvider.new( :id => 1 ).update_logo( "spec/fixtures/bacon.jpg", Caren::Api.session ) }.should_not raise_error
91
93
  end
92
94
 
93
95
  it "should be able to search for a specific care provider" do
94
- care_providers = Caren::CareProvider.search :url_shortcut, "pantein"
96
+ care_providers = Caren::CareProvider.search :url_shortcut, "pantein", Caren::Api.session
95
97
  care_providers.should have(1).things
96
98
  care_providers.first.name.should == "Pantein"
97
99
  care_providers.first.url_shortcut.should == "pantein"
98
100
  end
99
101
 
100
102
  it "should be able to find all care providers" do
101
- care_providers = Caren::CareProvider.all
103
+ care_providers = Caren::CareProvider.all Caren::Api.session
102
104
  care_providers.should have(2).things
103
105
  care_providers.first.name.should == "Demo"
104
106
  care_providers.first.url_shortcut.should == "demo"
data/spec/caren_spec.rb CHANGED
@@ -3,54 +3,54 @@ require 'spec_helper'
3
3
  describe "Caren", "signature checks" do
4
4
 
5
5
  before do
6
- @incorrect_url = "#{Caren::Api.url}/test_with_incorrect_signature"
7
- @correct_url = "#{Caren::Api.url}/test_with_correct_signature"
8
- @error_url = "#{Caren::Api.url}/test_with_errors"
6
+ @incorrect_url = "/test_with_incorrect_signature"
7
+ @correct_url = "/test_with_correct_signature"
8
+ @error_url = "/test_with_errors"
9
9
 
10
- FakeWeb.register_uri(:get, @incorrect_url, :body => "TEST", :signature => "[INCORRECT]" )
11
- FakeWeb.register_uri(:post, @incorrect_url, :body => "TEST", :signature => "[INCORRECT]" )
12
- FakeWeb.register_uri(:put, @incorrect_url, :body => "TEST", :signature => "[INCORRECT]" )
13
- FakeWeb.register_uri(:delete, @incorrect_url, :body => "TEST", :signature => "[INCORRECT]" )
10
+ FakeWeb.register_uri(:get, Caren::Api.session.url_for(@incorrect_url), :body => "TEST", :signature => "[INCORRECT]" )
11
+ FakeWeb.register_uri(:post, Caren::Api.session.url_for(@incorrect_url), :body => "TEST", :signature => "[INCORRECT]" )
12
+ FakeWeb.register_uri(:put, Caren::Api.session.url_for(@incorrect_url), :body => "TEST", :signature => "[INCORRECT]" )
13
+ FakeWeb.register_uri(:delete, Caren::Api.session.url_for(@incorrect_url), :body => "TEST", :signature => "[INCORRECT]" )
14
14
 
15
- FakeWeb.register_uri(:get, @correct_url, :body => "TEST", :signature => Caren::Api.sign("TEST") )
16
- FakeWeb.register_uri(:post, @correct_url, :body => "TEST", :signature => Caren::Api.sign("TEST") )
17
- FakeWeb.register_uri(:put, @correct_url, :body => "TEST", :signature => Caren::Api.sign("TEST") )
18
- FakeWeb.register_uri(:delete, @correct_url, :body => "TEST", :signature => Caren::Api.sign("TEST") )
15
+ FakeWeb.register_uri(:get, Caren::Api.session.url_for(@correct_url), :body => "TEST", :signature => Caren::Api.session.sign("TEST") )
16
+ FakeWeb.register_uri(:post, Caren::Api.session.url_for(@correct_url), :body => "TEST", :signature => Caren::Api.session.sign("TEST") )
17
+ FakeWeb.register_uri(:put, Caren::Api.session.url_for(@correct_url), :body => "TEST", :signature => Caren::Api.session.sign("TEST") )
18
+ FakeWeb.register_uri(:delete, Caren::Api.session.url_for(@correct_url), :body => "TEST", :signature => Caren::Api.session.sign("TEST") )
19
19
 
20
20
  errors = File.read "spec/fixtures/caren_care_provider_validation.xml"
21
21
  unauth = File.read "spec/fixtures/caren_unauthorized.xml"
22
- FakeWeb.register_uri(:get, @error_url, :status => 406, :body => errors, :signature => Caren::Api.sign(errors) )
23
- FakeWeb.register_uri(:post, @error_url, :status => 406, :body => errors, :signature => Caren::Api.sign(errors) )
24
- FakeWeb.register_uri(:put, @error_url, :status => 406, :body => errors, :signature => Caren::Api.sign(errors) )
25
- FakeWeb.register_uri(:delete, @error_url, :status => 403, :body => unauth, :signature => Caren::Api.sign(unauth) )
22
+ FakeWeb.register_uri(:get, Caren::Api.session.url_for(@error_url), :status => 406, :body => errors, :signature => Caren::Api.session.sign(errors) )
23
+ FakeWeb.register_uri(:post, Caren::Api.session.url_for(@error_url), :status => 406, :body => errors, :signature => Caren::Api.session.sign(errors) )
24
+ FakeWeb.register_uri(:put, Caren::Api.session.url_for(@error_url), :status => 406, :body => errors, :signature => Caren::Api.session.sign(errors) )
25
+ FakeWeb.register_uri(:delete, Caren::Api.session.url_for(@error_url), :status => 403, :body => unauth, :signature => Caren::Api.session.sign(unauth) )
26
26
  end
27
27
 
28
28
  it "should not accept result swith an incorrect signature" do
29
- lambda{ Caren::Api.get @incorrect_url }.should raise_error
30
- lambda{ Caren::Api.post @incorrect_url, "" }.should raise_error
31
- lambda{ Caren::Api.put @incorrect_url, "" }.should raise_error
32
- lambda{ Caren::Api.delete @incorrect_url }.should raise_error
29
+ lambda{ Caren::Api.session.get @incorrect_url }.should raise_error
30
+ lambda{ Caren::Api.session.post @incorrect_url, "" }.should raise_error
31
+ lambda{ Caren::Api.session.put @incorrect_url, "" }.should raise_error
32
+ lambda{ Caren::Api.session.delete @incorrect_url }.should raise_error
33
33
  end
34
34
 
35
35
  it "should accept results with a correct signature" do
36
- lambda{ Caren::Api.get @correct_url }.should_not raise_error
37
- lambda{ Caren::Api.post @correct_url, "" }.should_not raise_error
38
- lambda{ Caren::Api.put @correct_url, "" }.should_not raise_error
39
- lambda{ Caren::Api.delete @correct_url }.should_not raise_error
36
+ lambda{ Caren::Api.session.get @correct_url }.should_not raise_error
37
+ lambda{ Caren::Api.session.post @correct_url, "" }.should_not raise_error
38
+ lambda{ Caren::Api.session.put @correct_url, "" }.should_not raise_error
39
+ lambda{ Caren::Api.session.delete @correct_url }.should_not raise_error
40
40
  end
41
41
 
42
42
  it "should be able to handle server side errors" do
43
43
 
44
- lambda{ Caren::Api.get @error_url }.should raise_error(Caren::Exceptions::ServerSideError)
45
- lambda{ Caren::Api.put @error_url, "" }.should raise_error(Caren::Exceptions::ServerSideError)
46
- lambda{ Caren::Api.post @error_url, "" }.should raise_error(Caren::Exceptions::ServerSideError)
47
- lambda{ Caren::Api.delete @error_url }.should raise_error(Caren::Exceptions::ServerSideError)
44
+ lambda{ Caren::Api.session.get @error_url }.should raise_error(Caren::Exceptions::ServerSideError)
45
+ lambda{ Caren::Api.session.put @error_url, "" }.should raise_error(Caren::Exceptions::ServerSideError)
46
+ lambda{ Caren::Api.session.post @error_url, "" }.should raise_error(Caren::Exceptions::ServerSideError)
47
+ lambda{ Caren::Api.session.delete @error_url }.should raise_error(Caren::Exceptions::ServerSideError)
48
48
 
49
49
  end
50
50
 
51
51
  it "should be able to handle authorization errors" do
52
52
  begin
53
- Caren::Api.delete @error_url
53
+ Caren::Api.session.delete @error_url
54
54
  rescue Caren::Exceptions::ServerSideError => e
55
55
  e.errors.should have(1).things
56
56
  e.errors.first.class.should == Caren::Error
@@ -61,7 +61,7 @@ describe "Caren", "signature checks" do
61
61
 
62
62
  it "should be able to handle validation errors" do
63
63
  begin
64
- Caren::Api.get @error_url
64
+ Caren::Api.session.get @error_url
65
65
  rescue Caren::Exceptions::ServerSideError => e
66
66
  e.errors.should have(1).things
67
67
  e.errors.first.class.should == Caren::ValidationError
@@ -73,7 +73,7 @@ describe "Caren", "signature checks" do
73
73
 
74
74
  it "should be able to handle incoming xml from caren" do
75
75
  incoming = File.read "spec/fixtures/incoming.xml"
76
- results = Caren::Api.incoming(incoming, Caren::Api.sign(incoming))
76
+ results = Caren::Api.session.incoming(incoming, Caren::Api.session.sign(incoming))
77
77
  results.should have(4).things
78
78
  external_messages = results.select{ |x| x.is_a?(Caren::ExternalMessage) }
79
79
  external_messages.first.id.should == 1
@@ -29,8 +29,12 @@ end
29
29
  describe "ExternalMessage", "REST methods" do
30
30
 
31
31
  before do
32
- FakeWeb.register_uri(:post, Caren::ExternalMessage.resource_url(1), :status => 201, :signature => Caren::Api.sign )
33
- FakeWeb.register_uri(:delete, Caren::ExternalMessage.resource_url(1,1), :signature => Caren::Api.sign )
32
+ post_url = Caren::Api.session.url_for( Caren::ExternalMessage.resource_url(1) )
33
+ delete_url = Caren::Api.session.url_for( Caren::ExternalMessage.resource_url(1,1) )
34
+ timestamp = DateTime.now.to_i
35
+
36
+ FakeWeb.register_uri(:post, post_url, :status => 201, :signature => Caren::Api.session.sign(timestamp), :timestamp => timestamp )
37
+ FakeWeb.register_uri(:delete, delete_url, :signature => Caren::Api.session.sign(timestamp), :timestamp => timestamp )
34
38
  end
35
39
 
36
40
  it "should be able to create an external message" do
@@ -38,11 +42,11 @@ describe "ExternalMessage", "REST methods" do
38
42
  :external_person_id => 1,
39
43
  :body => "Test message",
40
44
  :external_id => 1,
41
- :subject_id => 1 ).create }.should_not raise_error
45
+ :subject_id => 1 ).create(Caren::Api.session) }.should_not raise_error
42
46
  end
43
47
 
44
48
  it "should be able to delete an external message" do
45
- lambda{ Caren::ExternalMessage.new( :subject_id => 1, :id => 1 ).delete }.should_not raise_error
49
+ lambda{ Caren::ExternalMessage.new( :subject_id => 1, :id => 1 ).delete(Caren::Api.session) }.should_not raise_error
46
50
  end
47
51
 
48
52
  end
data/spec/link_spec.rb CHANGED
@@ -22,17 +22,23 @@ describe "Link", "REST methods" do
22
22
  before do
23
23
  links = File.read("spec/fixtures/caren_links.xml")
24
24
  search = File.read("spec/fixtures/caren_links_search.xml")
25
- FakeWeb.register_uri(:get, Caren::Link.resource_url, :body => links, :signature => Caren::Api.sign(links) )
26
- FakeWeb.register_uri(:get, "#{Caren::Link.resource_url}?key=external-id&value=1", :body => search, :signature => Caren::Api.sign(search) )
27
- FakeWeb.register_uri(:post, Caren::Link.resource_url, :status => 201, :signature => Caren::Api.sign )
25
+
26
+ links_url = Caren::Api.session.url_for(Caren::Link.resource_url)
27
+ search_url = Caren::Api.session.url_for("#{Caren::Link.resource_url}?key=external-id&value=1")
28
+
29
+ timestamp = DateTime.now.to_i
30
+
31
+ FakeWeb.register_uri(:get, links_url, :body => links, :timestamp => timestamp, :signature => Caren::Api.session.sign(timestamp,links) )
32
+ FakeWeb.register_uri(:get, search_url, :body => search, :timestamp => timestamp, :signature => Caren::Api.session.sign(timestamp,search) )
33
+ FakeWeb.register_uri(:post, links_url, :status => 201, :timestamp => timestamp, :signature => Caren::Api.session.sign(timestamp) )
28
34
  end
29
35
 
30
36
  it "should be able to create a new link using the API" do
31
- lambda{ Caren::Link.new( :patient_number => "12345" ).create }.should_not raise_error
37
+ lambda{ Caren::Link.new( :patient_number => "12345" ).create(Caren::Api.session) }.should_not raise_error
32
38
  end
33
39
 
34
40
  it "should be find all links using the API" do
35
- links = Caren::Link.all
41
+ links = Caren::Link.all(Caren::Api.session)
36
42
  links.should have(3).things
37
43
  links.first.id.should == 1
38
44
  links.first.status.should == "confirmed"
@@ -42,7 +48,7 @@ describe "Link", "REST methods" do
42
48
  end
43
49
 
44
50
  it "should be find a specific link using the API" do
45
- links = Caren::Link.search(:external_id, 1)
51
+ links = Caren::Link.search(:external_id, 1, Caren::Api.session)
46
52
  links.should have(1).thing
47
53
  end
48
54
 
data/spec/spec_helper.rb CHANGED
@@ -5,11 +5,9 @@ require 'fakeweb'
5
5
  require 'capybara'
6
6
 
7
7
  # For the tests we need to know both the public and private key, so we share them here.
8
- new_private_key = Caren::Api.generate_private_key
9
-
10
- Caren::Api.caren_public_key = new_private_key.public_key
11
- Caren::Api.private_key = new_private_key
12
- Caren::Api.url = "http://example.com"
8
+ # We also use a smaller key here, to make the tests faster.
9
+ new_private_key = Caren::Api.generate_private_key( 512 )
10
+ Caren::Api.session = Caren::Api.new( new_private_key, "http://example.com", new_private_key.public_key )
13
11
 
14
12
  FakeWeb.allow_net_connect = false
15
13
 
metadata CHANGED
@@ -4,10 +4,10 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 3
8
- - 5
7
+ - 4
8
+ - 0
9
9
  segments_generated: true
10
- version: 0.3.5
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Andre Foeken
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-20 00:00:00 +02:00
18
+ date: 2011-10-21 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency