lifen_fhir 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/Gemfile.lock +1 -1
- data/README.md +20 -4
- data/lib/lifen_fhir/app_authenticated_client.rb +4 -10
- data/lib/lifen_fhir/client.rb +11 -20
- data/lib/lifen_fhir/communication_request.rb +28 -5
- data/lib/lifen_fhir/error.rb +44 -15
- data/lib/lifen_fhir/version.rb +1 -1
- data/lib/lifen_fhir.rb +0 -1
- data/spec/cassettes/communication_request/find_by_uuid/valid_uuid_with_status_and_binary_only.yml +70 -0
- data/spec/cassettes/communication_request/find_by_uuid/valid_uuid_with_status_only.yml +63 -0
- data/spec/cassettes/errors/401.yml +62 -0
- data/spec/communication_request_spec.rb +28 -1
- data/spec/error_spec.rb +168 -0
- metadata +10 -3
- data/lib/lifen_fhir/user_authenticated_client.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 883c936ea9075219b23c3cd2a999237d00096ab6
|
4
|
+
data.tar.gz: 62045d010b9ef604b067f17b319bcf57c712f176
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6cc241e7aa995d4eeab7295ddf4ed87f305b91894e797be38f9e7eb1298b1571b33110e6b43d4ce9e988c0c918b3f3154510bce69ab18c6cc6fc401d2732cab0
|
7
|
+
data.tar.gz: b13b9722a50eab03eef4415dce10651f663b88cd9840dc677d4ee035d8129e912cb41fbb86dd67dde84c085e1907626739be02069cbac44751d87f15fb819c38
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -40,9 +40,21 @@ Optionnal configuration:
|
|
40
40
|
- `proxy_url`: route all your requests via a proxy
|
41
41
|
- `logger`: log all requests to a custom logger (on Rails, `Rails.logger` is selected automatically)
|
42
42
|
|
43
|
-
###
|
43
|
+
### Managing errors
|
44
44
|
|
45
|
-
|
45
|
+
`LifenFhir::Error` provides a `context` that can be passed to your issue manager in order to have a better understanding of what is going wrong when an error happens. Here is an example with Sentry:
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
begin
|
49
|
+
# some code using the gem
|
50
|
+
rescue LifenFhir::Error => e
|
51
|
+
Raven.capture_exception(e)
|
52
|
+
Raven.extra_context(lifen: e.context)
|
53
|
+
end
|
54
|
+
```
|
55
|
+
|
56
|
+
|
57
|
+
### Managing a Binary
|
46
58
|
|
47
59
|
```ruby
|
48
60
|
binary = LifenFhir::Binary.new(uuid: "b7c7dae671b93e951ce6a4f530736276")
|
@@ -85,7 +97,7 @@ communication_request_request.send
|
|
85
97
|
|
86
98
|
```
|
87
99
|
|
88
|
-
|
100
|
+
### Custom Channels management
|
89
101
|
|
90
102
|
```ruby
|
91
103
|
recipient = LifenFhir::Practitioner.new(uuid: "valid-user-uuid")
|
@@ -97,7 +109,7 @@ channel = recipient.create_address(type: "address", lines: ["39 rue Aboukir"], c
|
|
97
109
|
channel = recipient.create_telecom(type: "telecom", system: "fax", value: "+33102030405")
|
98
110
|
```
|
99
111
|
|
100
|
-
|
112
|
+
### Managing Patients
|
101
113
|
|
102
114
|
```ruby
|
103
115
|
# To create a new patient
|
@@ -126,6 +138,10 @@ Once the new version is validated, the deployment follows those steps :
|
|
126
138
|
6. publish the gem using `gem publish lifen_fhir-X.X.X.gem`
|
127
139
|
7. run `bundle update lifen` in related projects :)
|
128
140
|
|
141
|
+
## Contributing
|
142
|
+
|
143
|
+
TBD
|
144
|
+
|
129
145
|
## License
|
130
146
|
|
131
147
|
The MIT License (MIT)
|
@@ -9,27 +9,21 @@ module LifenFhir
|
|
9
9
|
|
10
10
|
case response.status
|
11
11
|
when 400
|
12
|
-
|
12
|
+
raise_error("400 Error, Unknown error", response, params)
|
13
13
|
when 401
|
14
|
-
|
15
|
-
when 403
|
16
|
-
raise UserAlreadyExistingError, "Error 403, User already existing, #{response_error(response, params)}"
|
14
|
+
raise_error("401 Error, Invalid app bearer", response, params)
|
17
15
|
when 404
|
18
|
-
|
16
|
+
raise_error("404 Error, Record not found", response, params)
|
19
17
|
when 422
|
20
18
|
json = JSON.parse response.body
|
21
19
|
|
22
20
|
diagnostic = json["issue"][0]["diagnostics"]
|
23
21
|
|
24
|
-
|
22
|
+
raise_error("422 Error, Unprocessable Entity, Diagnostic: '#{diagnostic}'", response, params)
|
25
23
|
end
|
26
24
|
|
27
25
|
end
|
28
26
|
|
29
|
-
def response_error(response, params)
|
30
|
-
"App Client, #{super(response, params)}"
|
31
|
-
end
|
32
|
-
|
33
27
|
def bearer
|
34
28
|
LifenFhir.configuration.application_access_token
|
35
29
|
end
|
data/lib/lifen_fhir/client.rb
CHANGED
@@ -41,12 +41,7 @@ module LifenFhir
|
|
41
41
|
|
42
42
|
def handle_errors(response, params)
|
43
43
|
if response.status == 500
|
44
|
-
|
45
|
-
json = JSON.parse response.body
|
46
|
-
|
47
|
-
trace_id = json.fetch("X-B3-TraceId", "unknown")
|
48
|
-
|
49
|
-
raise Error, "Error 500, Internal server error (trace ID: #{trace_id}), #{response_error(response, params)}"
|
44
|
+
raise_error("500 Error, Internal server error", response, params)
|
50
45
|
end
|
51
46
|
end
|
52
47
|
|
@@ -88,6 +83,12 @@ module LifenFhir
|
|
88
83
|
LifenFhir.configuration.proxy_url
|
89
84
|
end
|
90
85
|
|
86
|
+
def raise_error(message, response, params)
|
87
|
+
message += " -- #{response.env.method.upcase} '#{response.env.url}'"
|
88
|
+
|
89
|
+
raise Error.new(message: message, response: response, params: params, client: "app", token: bearer)
|
90
|
+
end
|
91
|
+
|
91
92
|
def logger
|
92
93
|
LifenFhir.configuration.logger
|
93
94
|
end
|
@@ -95,28 +96,18 @@ module LifenFhir
|
|
95
96
|
def before_request
|
96
97
|
end
|
97
98
|
|
98
|
-
def
|
99
|
-
params
|
99
|
+
def use_and_remove_accept(params)
|
100
|
+
return params.delete :accept if params.is_a?(Hash) and params.has_key? :accept
|
100
101
|
|
101
|
-
"
|
102
|
+
"application/json"
|
102
103
|
end
|
103
104
|
|
104
|
-
def
|
105
|
-
if m = /^(.{24})(.*)$/.match(bearer)
|
106
|
-
"#{m[1]}#{"*" * m[2].length}"
|
107
|
-
else
|
108
|
-
bearer
|
109
|
-
end
|
105
|
+
def before_request
|
110
106
|
end
|
111
107
|
|
112
108
|
def bearer
|
113
109
|
raise "A bearer method must be defined"
|
114
110
|
end
|
115
111
|
|
116
|
-
def use_and_remove_accept(params)
|
117
|
-
return params.delete :accept if params.is_a?(Hash) and params.has_key? :accept
|
118
|
-
|
119
|
-
"application/json"
|
120
|
-
end
|
121
112
|
end
|
122
113
|
end
|
@@ -38,14 +38,22 @@ module LifenFhir
|
|
38
38
|
|
39
39
|
self.status = json.fetch("status") { "unknown" }
|
40
40
|
|
41
|
-
|
41
|
+
if has_payload?(json)
|
42
|
+
self.binary = Binary.new.attributes_from_json(Array(json["payload"]).first)
|
43
|
+
end
|
42
44
|
|
43
|
-
|
45
|
+
if has_category?(json)
|
46
|
+
self.category = Category.new.attributes_from_json(Array(json["category"]).first)
|
47
|
+
end
|
44
48
|
|
45
|
-
|
49
|
+
if has_sender?(json)
|
50
|
+
self.sender = Practitioner.new.attributes_from_json(json["sender"])
|
51
|
+
end
|
46
52
|
|
47
|
-
|
48
|
-
|
53
|
+
if has_recipient?(json)
|
54
|
+
self.recipients = Array(json["recipient"]).map do |recipient_json|
|
55
|
+
Practitioner.new.attributes_from_json(recipient_json)
|
56
|
+
end
|
49
57
|
end
|
50
58
|
end
|
51
59
|
|
@@ -85,5 +93,20 @@ module LifenFhir
|
|
85
93
|
end
|
86
94
|
end
|
87
95
|
|
96
|
+
def has_category?(json)
|
97
|
+
json.key?("category")
|
98
|
+
end
|
99
|
+
|
100
|
+
def has_sender?(json)
|
101
|
+
json.key?("sender")
|
102
|
+
end
|
103
|
+
|
104
|
+
def has_recipient?(json)
|
105
|
+
json.key?("recipient")
|
106
|
+
end
|
107
|
+
|
108
|
+
def has_payload?(json)
|
109
|
+
json.key?("payload")
|
110
|
+
end
|
88
111
|
end
|
89
112
|
end
|
data/lib/lifen_fhir/error.rb
CHANGED
@@ -1,27 +1,56 @@
|
|
1
1
|
module LifenFhir
|
2
2
|
|
3
3
|
class Error < StandardError
|
4
|
-
end
|
5
4
|
|
6
|
-
|
7
|
-
end
|
5
|
+
attr_accessor :response, :params
|
8
6
|
|
9
|
-
|
10
|
-
|
7
|
+
def initialize(message: , response: nil, params: {}, client: "app", token: nil)
|
8
|
+
self.response = response
|
9
|
+
self.params = params
|
11
10
|
|
12
|
-
|
13
|
-
|
11
|
+
@client = client
|
12
|
+
@token = token
|
14
13
|
|
15
|
-
|
16
|
-
|
14
|
+
super(message)
|
15
|
+
end
|
17
16
|
|
18
|
-
|
19
|
-
|
17
|
+
def context
|
18
|
+
return {} if response.nil?
|
20
19
|
|
21
|
-
|
22
|
-
|
20
|
+
{
|
21
|
+
url: response.env.url.to_s,
|
22
|
+
method: response.env.method.to_s,
|
23
|
+
token: trucanted_token,
|
24
|
+
payload_sent: filtered_params,
|
25
|
+
trace_id: extracted_trace_id,
|
26
|
+
payload_received: response.body,
|
27
|
+
client: @client
|
28
|
+
}
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def extracted_trace_id
|
35
|
+
response.headers.fetch("X-B3-Traceid") { "unknown" }
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
def trucanted_token
|
40
|
+
if m = /^(.{24})(.*)$/.match(@token)
|
41
|
+
"#{m[1]}#{"*" * m[2].length}"
|
42
|
+
else
|
43
|
+
@token
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def filtered_params
|
48
|
+
filtered_params = params
|
49
|
+
|
50
|
+
filtered_params[:payload] = "filtered" if filtered_params.is_a?(Hash) and filtered_params.has_key? :payload
|
23
51
|
|
24
|
-
|
52
|
+
filtered_params
|
53
|
+
end
|
25
54
|
end
|
26
55
|
|
27
|
-
end
|
56
|
+
end
|
data/lib/lifen_fhir/version.rb
CHANGED
data/lib/lifen_fhir.rb
CHANGED
@@ -22,7 +22,6 @@ module LifenFhir
|
|
22
22
|
require 'lifen_fhir/logger'
|
23
23
|
require 'lifen_fhir/error'
|
24
24
|
require 'lifen_fhir/client'
|
25
|
-
require 'lifen_fhir/user_authenticated_client'
|
26
25
|
require 'lifen_fhir/app_authenticated_client'
|
27
26
|
require 'lifen_fhir/configuration'
|
28
27
|
require 'lifen_fhir/base'
|
data/spec/cassettes/communication_request/find_by_uuid/valid_uuid_with_status_and_binary_only.yml
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://develop.lifen.fr/fhir/CommunicationRequest/f1924980-6685-40eb-b07d-51f317365ae5
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: "{}"
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.12.1
|
12
|
+
Authorization:
|
13
|
+
- Bearer valid_application_access_token
|
14
|
+
Accept:
|
15
|
+
- application/json
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Server:
|
24
|
+
- Apache-Coyote/1.1
|
25
|
+
X-B3-Traceid:
|
26
|
+
- 6d110814fbb41d26
|
27
|
+
X-B3-Spanid:
|
28
|
+
- 6d110814fbb41d26
|
29
|
+
X-Content-Type-Options:
|
30
|
+
- nosniff
|
31
|
+
X-Xss-Protection:
|
32
|
+
- 1; mode=block
|
33
|
+
Cache-Control:
|
34
|
+
- no-cache, no-store, max-age=0, must-revalidate
|
35
|
+
Pragma:
|
36
|
+
- no-cache
|
37
|
+
Expires:
|
38
|
+
- '0'
|
39
|
+
X-Powered-By:
|
40
|
+
- HAPI FHIR 2.4 REST Server (FHIR Server; FHIR 3.0.1/DSTU3)
|
41
|
+
Location:
|
42
|
+
- http://rc.lifen.fr/fhir/CommunicationRequest/f1924980-6685-40eb-b07d-51f317365ae5
|
43
|
+
Content-Type:
|
44
|
+
- application/json+fhir;charset=UTF-8
|
45
|
+
Transfer-Encoding:
|
46
|
+
- chunked
|
47
|
+
Date:
|
48
|
+
- Wed, 07 Jun 2017 08:34:57 GMT
|
49
|
+
Connection:
|
50
|
+
- close
|
51
|
+
Access-Control-Allow-Credentials:
|
52
|
+
- 'true'
|
53
|
+
body:
|
54
|
+
encoding: UTF-8
|
55
|
+
string: |-
|
56
|
+
{
|
57
|
+
"resourceType": "CommunicationRequest",
|
58
|
+
"id": "f1924980-6685-40eb-b07d-51f317365ae5",
|
59
|
+
"status": "cancelled",
|
60
|
+
"payload": [
|
61
|
+
{
|
62
|
+
"contentReference": {
|
63
|
+
"reference": "Binary/11e746b1-6cd7-1483-96ef-0242ac110004"
|
64
|
+
}
|
65
|
+
}
|
66
|
+
]
|
67
|
+
}
|
68
|
+
http_version:
|
69
|
+
recorded_at: Wed, 07 Jun 2017 08:34:16 GMT
|
70
|
+
recorded_with: VCR 3.0.3
|
@@ -0,0 +1,63 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://develop.lifen.fr/fhir/CommunicationRequest/f1924980-6685-40eb-b07d-51f317365ae5
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: "{}"
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.12.1
|
12
|
+
Authorization:
|
13
|
+
- Bearer valid_application_access_token
|
14
|
+
Accept:
|
15
|
+
- application/json
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Server:
|
24
|
+
- Apache-Coyote/1.1
|
25
|
+
X-B3-Traceid:
|
26
|
+
- 6d110814fbb41d26
|
27
|
+
X-B3-Spanid:
|
28
|
+
- 6d110814fbb41d26
|
29
|
+
X-Content-Type-Options:
|
30
|
+
- nosniff
|
31
|
+
X-Xss-Protection:
|
32
|
+
- 1; mode=block
|
33
|
+
Cache-Control:
|
34
|
+
- no-cache, no-store, max-age=0, must-revalidate
|
35
|
+
Pragma:
|
36
|
+
- no-cache
|
37
|
+
Expires:
|
38
|
+
- '0'
|
39
|
+
X-Powered-By:
|
40
|
+
- HAPI FHIR 2.4 REST Server (FHIR Server; FHIR 3.0.1/DSTU3)
|
41
|
+
Location:
|
42
|
+
- http://rc.lifen.fr/fhir/CommunicationRequest/f1924980-6685-40eb-b07d-51f317365ae5
|
43
|
+
Content-Type:
|
44
|
+
- application/json+fhir;charset=UTF-8
|
45
|
+
Transfer-Encoding:
|
46
|
+
- chunked
|
47
|
+
Date:
|
48
|
+
- Wed, 07 Jun 2017 08:34:57 GMT
|
49
|
+
Connection:
|
50
|
+
- close
|
51
|
+
Access-Control-Allow-Credentials:
|
52
|
+
- 'true'
|
53
|
+
body:
|
54
|
+
encoding: UTF-8
|
55
|
+
string: |-
|
56
|
+
{
|
57
|
+
"resourceType": "CommunicationRequest",
|
58
|
+
"id": "f1924980-6685-40eb-b07d-51f317365ae5",
|
59
|
+
"status": "cancelled"
|
60
|
+
}
|
61
|
+
http_version:
|
62
|
+
recorded_at: Wed, 07 Jun 2017 08:34:16 GMT
|
63
|
+
recorded_with: VCR 3.0.3
|
@@ -0,0 +1,62 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://develop.lifen.fr/fhir/CommunicationRequest/valid_uuid
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: "{}"
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.12.1
|
12
|
+
Authorization:
|
13
|
+
- Bearer invalid_application_access_token
|
14
|
+
Accept:
|
15
|
+
- application/json
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 401
|
21
|
+
message: Unauthorized
|
22
|
+
headers:
|
23
|
+
Server:
|
24
|
+
- Apache-Coyote/1.1
|
25
|
+
X-Content-Type-Options:
|
26
|
+
- nosniff
|
27
|
+
X-Xss-Protection:
|
28
|
+
- 1; mode=block
|
29
|
+
Cache-Control:
|
30
|
+
- no-cache, no-store, max-age=0, must-revalidate
|
31
|
+
Pragma:
|
32
|
+
- no-cache
|
33
|
+
Expires:
|
34
|
+
- '0'
|
35
|
+
X-Powered-By:
|
36
|
+
- HAPI FHIR 2.4 REST Server (FHIR Server; FHIR 3.0.1/DSTU3)
|
37
|
+
Content-Type:
|
38
|
+
- application/json+fhir;charset=UTF-8
|
39
|
+
Transfer-Encoding:
|
40
|
+
- chunked
|
41
|
+
Date:
|
42
|
+
- Mon, 05 Jun 2017 06:46:53 GMT
|
43
|
+
Connection:
|
44
|
+
- close
|
45
|
+
Access-Control-Allow-Credentials:
|
46
|
+
- 'true'
|
47
|
+
body:
|
48
|
+
encoding: UTF-8
|
49
|
+
string: |-
|
50
|
+
{
|
51
|
+
"resourceType": "OperationOutcome",
|
52
|
+
"issue": [
|
53
|
+
{
|
54
|
+
"severity": "error",
|
55
|
+
"code": "login",
|
56
|
+
"diagnostics": "Invalid access token"
|
57
|
+
}
|
58
|
+
]
|
59
|
+
}
|
60
|
+
http_version:
|
61
|
+
recorded_at: Mon, 05 Jun 2017 06:47:02 GMT
|
62
|
+
recorded_with: VCR 3.0.3
|
@@ -151,6 +151,33 @@ describe LifenFhir::CommunicationRequest do
|
|
151
151
|
expect(@communication_request.status).to eq "cancelled"
|
152
152
|
end
|
153
153
|
|
154
|
+
context ':when only status, id and binary' do
|
155
|
+
|
156
|
+
it 'works' do
|
157
|
+
VCR.use_cassette "communication_request/find_by_uuid/valid_uuid_with_status_and_binary_only" do
|
158
|
+
@communication_request = LifenFhir::CommunicationRequest.find_by_uuid("f1924980-6685-40eb-b07d-51f317365ae5")
|
159
|
+
end
|
160
|
+
|
161
|
+
expect(@communication_request.status).to eq "cancelled"
|
162
|
+
expect(@communication_request.uuid).to eq "f1924980-6685-40eb-b07d-51f317365ae5"
|
163
|
+
expect(@communication_request.sender).to be_nil
|
164
|
+
expect(@communication_request.recipients.count).to eq(0)
|
165
|
+
expect(@communication_request.category.code).to eq("MEDICAL_REPORT")
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
context ':when only status and communication_request id' do
|
170
|
+
|
171
|
+
it 'works' do
|
172
|
+
VCR.use_cassette "communication_request/find_by_uuid/valid_uuid_with_status_only" do
|
173
|
+
@communication_request = LifenFhir::CommunicationRequest.find_by_uuid("f1924980-6685-40eb-b07d-51f317365ae5")
|
174
|
+
end
|
175
|
+
|
176
|
+
expect(@communication_request.status).to eq "cancelled"
|
177
|
+
expect(@communication_request.binary).to be_nil
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
154
181
|
context 'with no defined status' do
|
155
182
|
it 'works' do
|
156
183
|
VCR.use_cassette "communication_request/find_by_uuid/valid_uuid_with_no_status" do
|
@@ -180,7 +207,7 @@ describe LifenFhir::CommunicationRequest do
|
|
180
207
|
VCR.use_cassette "communication_request/find_by_uuid/invalid_uuid" do
|
181
208
|
@communication_request = LifenFhir::CommunicationRequest.find_by_uuid("invalid_uuid")
|
182
209
|
end
|
183
|
-
}.to raise_error LifenFhir::Error
|
210
|
+
}.to raise_error LifenFhir::Error
|
184
211
|
end
|
185
212
|
|
186
213
|
end
|
data/spec/error_spec.rb
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LifenFhir::Error do
|
4
|
+
|
5
|
+
describe 'in real conditions' do
|
6
|
+
|
7
|
+
context '404' do
|
8
|
+
|
9
|
+
it 'extracts the correct context' do
|
10
|
+
|
11
|
+
begin
|
12
|
+
VCR.use_cassette "communication_request/find_by_uuid/invalid_uuid" do
|
13
|
+
communication_request = LifenFhir::CommunicationRequest.find_by_uuid("invalid_uuid")
|
14
|
+
end
|
15
|
+
rescue LifenFhir::Error => e
|
16
|
+
|
17
|
+
expect(e.to_s).to eq "404 Error, Record not found -- GET 'https://develop.lifen.fr/fhir/CommunicationRequest/invalid_uuid'"
|
18
|
+
|
19
|
+
current_context = e.context
|
20
|
+
|
21
|
+
expect(current_context[:client]).to eq "app"
|
22
|
+
expect(current_context[:url]).to eq "https://develop.lifen.fr/fhir/CommunicationRequest/invalid_uuid"
|
23
|
+
expect(current_context[:method]).to eq "get"
|
24
|
+
expect(current_context[:token]).to eq "valid_application_access******"
|
25
|
+
expect(current_context[:payload_sent]).to eq({})
|
26
|
+
expect(current_context[:trace_id]).to eq "unknown"
|
27
|
+
expect(current_context[:payload_received]).to include('"diagnostics": "Resource CommunicationRequest/invalid_uuid is not known"')
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
context '400' do
|
35
|
+
|
36
|
+
let(:address) {
|
37
|
+
LifenFhir::Address.new(
|
38
|
+
lines: ["M et Mme Potter", "39 rue d'Aboukir"],
|
39
|
+
city: "paris",
|
40
|
+
postal_code: "75002",
|
41
|
+
country: "France"
|
42
|
+
)
|
43
|
+
}
|
44
|
+
|
45
|
+
let(:patient) {
|
46
|
+
patient = LifenFhir::Patient.new(
|
47
|
+
first_name: ["Pierre", "Henri"],
|
48
|
+
last_name: "Potter",
|
49
|
+
birth_date: Date.new(1974, 12, 25),
|
50
|
+
address: address
|
51
|
+
)
|
52
|
+
}
|
53
|
+
|
54
|
+
it 'extracts the correct context' do
|
55
|
+
patient.last_name = nil
|
56
|
+
|
57
|
+
begin
|
58
|
+
VCR.use_cassette("patient/create/invalid_attributes") do
|
59
|
+
patient.save
|
60
|
+
end
|
61
|
+
rescue LifenFhir::Error => e
|
62
|
+
|
63
|
+
expect(e.to_s).to eq "400 Error, Unknown error -- POST 'https://develop.lifen.fr/fhir/Patient'"
|
64
|
+
|
65
|
+
current_context = e.context
|
66
|
+
|
67
|
+
expect(current_context[:client]).to eq "app"
|
68
|
+
expect(current_context[:url]).to eq "https://develop.lifen.fr/fhir/Patient"
|
69
|
+
expect(current_context[:method]).to eq "post"
|
70
|
+
expect(current_context[:token]).to eq "valid_application_access******"
|
71
|
+
expect(current_context[:payload_sent]["birthDate"]).to eq("1974-12-25")
|
72
|
+
expect(current_context[:trace_id]).to eq "unknown"
|
73
|
+
expect(current_context[:payload_received]).to include('"diagnostics": "Patient\'s family name is mandatory."')
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
context '401' do
|
80
|
+
|
81
|
+
before do
|
82
|
+
LifenFhir.configure do |config|
|
83
|
+
config.application_access_token = "invalid_application_access_token"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'extracts the correct context' do
|
88
|
+
begin
|
89
|
+
VCR.use_cassette "errors/401" do
|
90
|
+
communication_request = LifenFhir::CommunicationRequest.find_by_uuid("valid_uuid")
|
91
|
+
end
|
92
|
+
rescue LifenFhir::Error => e
|
93
|
+
|
94
|
+
expect(e.to_s).to eq "401 Error, Invalid app bearer -- GET 'https://develop.lifen.fr/fhir/CommunicationRequest/valid_uuid'"
|
95
|
+
|
96
|
+
current_context = e.context
|
97
|
+
|
98
|
+
expect(current_context[:client]).to eq "app"
|
99
|
+
expect(current_context[:url]).to eq "https://develop.lifen.fr/fhir/CommunicationRequest/valid_uuid"
|
100
|
+
expect(current_context[:method]).to eq "get"
|
101
|
+
expect(current_context[:token]).to eq "invalid_application_acce********"
|
102
|
+
expect(current_context[:payload_sent]).to eq({})
|
103
|
+
expect(current_context[:trace_id]).to eq "unknown"
|
104
|
+
expect(current_context[:payload_received]).to include('"diagnostics": "Invalid access token"')
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context '422' do
|
111
|
+
let(:practitioner) { LifenFhir::Practitioner.new(uuid: "11e5c85e-9bc0-4c6e-9b29-deb9993a92c0") }
|
112
|
+
|
113
|
+
it 'extracts the correct context' do
|
114
|
+
begin
|
115
|
+
VCR.use_cassette "practitioner/create_channel/address/invalid_attributes" do
|
116
|
+
practitioner.create_address(type: "address", lines: [], city: "Paris", postal_code: "75002", country: "France")
|
117
|
+
end
|
118
|
+
rescue LifenFhir::Error => e
|
119
|
+
|
120
|
+
expect(e.to_s).to eq "422 Error, Unprocessable Entity, Diagnostic: ''line' is mandatory in address data.' -- POST 'https://develop.lifen.fr/fhir/Practitioner/11e5c85e-9bc0-4c6e-9b29-deb9993a92c0/$add-address'"
|
121
|
+
|
122
|
+
current_context = e.context
|
123
|
+
|
124
|
+
expect(current_context[:client]).to eq "app"
|
125
|
+
expect(current_context[:url]).to eq "https://develop.lifen.fr/fhir/Practitioner/11e5c85e-9bc0-4c6e-9b29-deb9993a92c0/$add-address"
|
126
|
+
expect(current_context[:method]).to eq "post"
|
127
|
+
expect(current_context[:token]).to eq "valid_application_access******"
|
128
|
+
expect(current_context[:payload_sent]["resourceType"]).to eq("Practitioner")
|
129
|
+
expect(current_context[:trace_id]).to eq "unknown"
|
130
|
+
expect(current_context[:payload_received]).to include('"diagnostics": "\'line\' is mandatory in address data."')
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
context '500' do
|
136
|
+
let(:medium) { LifenFhir::Medium.new(uuid: "valid-medium-uuid-1") }
|
137
|
+
let(:sender) { LifenFhir::Practitioner.new(uuid: "valid-sender-uuid") }
|
138
|
+
let(:recipient) { LifenFhir::Practitioner.new(uuid: "valid-recipient-uuid-1") }
|
139
|
+
let(:binary) { LifenFhir::Binary.new(uuid: "invalid-binary-uuid") }
|
140
|
+
let(:communication_request) { LifenFhir::CommunicationRequest.new(sender: sender, recipients: [recipient], medium: [medium], binary: binary) }
|
141
|
+
|
142
|
+
it 'extracts the correct context' do
|
143
|
+
begin
|
144
|
+
VCR.use_cassette "communication_request/send/unknown_binary" do
|
145
|
+
communication_request.send
|
146
|
+
end
|
147
|
+
rescue LifenFhir::Error => e
|
148
|
+
|
149
|
+
expect(e.to_s).to eq "500 Error, Internal server error -- POST 'https://develop.lifen.fr/fhir/CommunicationRequest'"
|
150
|
+
|
151
|
+
current_context = e.context
|
152
|
+
|
153
|
+
expect(current_context[:client]).to eq "app"
|
154
|
+
expect(current_context[:url]).to eq "https://develop.lifen.fr/fhir/CommunicationRequest"
|
155
|
+
expect(current_context[:method]).to eq "post"
|
156
|
+
expect(current_context[:token]).to eq "valid_application_access******"
|
157
|
+
expect(current_context[:payload_sent][:resourceType]).to eq("CommunicationRequest")
|
158
|
+
expect(current_context[:trace_id]).to eq "unknown"
|
159
|
+
expect(current_context[:payload_received]).to include('"diagnostics": "Failed to call access method"')
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lifen_fhir
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leonard Sellam
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-06-
|
12
|
+
date: 2017-06-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -217,7 +217,6 @@ files:
|
|
217
217
|
- lib/lifen_fhir/patient.rb
|
218
218
|
- lib/lifen_fhir/practitioner.rb
|
219
219
|
- lib/lifen_fhir/telecom.rb
|
220
|
-
- lib/lifen_fhir/user_authenticated_client.rb
|
221
220
|
- lib/lifen_fhir/version.rb
|
222
221
|
- lifen_fhir.gemspec
|
223
222
|
- spec/binary_spec.rb
|
@@ -226,6 +225,8 @@ files:
|
|
226
225
|
- spec/cassettes/communication_request/find_by_uuid/invalid_uuid.yml
|
227
226
|
- spec/cassettes/communication_request/find_by_uuid/valid_uuid_with_a_status.yml
|
228
227
|
- spec/cassettes/communication_request/find_by_uuid/valid_uuid_with_no_status.yml
|
228
|
+
- spec/cassettes/communication_request/find_by_uuid/valid_uuid_with_status_and_binary_only.yml
|
229
|
+
- spec/cassettes/communication_request/find_by_uuid/valid_uuid_with_status_only.yml
|
229
230
|
- spec/cassettes/communication_request/send/invalid_medium.yml
|
230
231
|
- spec/cassettes/communication_request/send/patient/invalid_attributes_binary.yml
|
231
232
|
- spec/cassettes/communication_request/send/patient/valid_attributes_binary.yml
|
@@ -234,6 +235,7 @@ files:
|
|
234
235
|
- spec/cassettes/communication_request/send/unknown_recipient.yml
|
235
236
|
- spec/cassettes/communication_request/send/valid_attributes.yml
|
236
237
|
- spec/cassettes/communication_request/send/valid_attributes_binary.yml
|
238
|
+
- spec/cassettes/errors/401.yml
|
237
239
|
- spec/cassettes/logger/invalid.yml
|
238
240
|
- spec/cassettes/logger/valid.yml
|
239
241
|
- spec/cassettes/patient/create/invalid_attributes.yml
|
@@ -251,6 +253,7 @@ files:
|
|
251
253
|
- spec/cassettes/practitioner/find_by_rpps/wrong_rpps.yml
|
252
254
|
- spec/category_spec.rb
|
253
255
|
- spec/communication_request_spec.rb
|
256
|
+
- spec/error_spec.rb
|
254
257
|
- spec/logger_spec.rb
|
255
258
|
- spec/patient_spec.rb
|
256
259
|
- spec/practitioner_spec.rb
|
@@ -288,6 +291,8 @@ test_files:
|
|
288
291
|
- spec/cassettes/communication_request/find_by_uuid/invalid_uuid.yml
|
289
292
|
- spec/cassettes/communication_request/find_by_uuid/valid_uuid_with_a_status.yml
|
290
293
|
- spec/cassettes/communication_request/find_by_uuid/valid_uuid_with_no_status.yml
|
294
|
+
- spec/cassettes/communication_request/find_by_uuid/valid_uuid_with_status_and_binary_only.yml
|
295
|
+
- spec/cassettes/communication_request/find_by_uuid/valid_uuid_with_status_only.yml
|
291
296
|
- spec/cassettes/communication_request/send/invalid_medium.yml
|
292
297
|
- spec/cassettes/communication_request/send/patient/invalid_attributes_binary.yml
|
293
298
|
- spec/cassettes/communication_request/send/patient/valid_attributes_binary.yml
|
@@ -296,6 +301,7 @@ test_files:
|
|
296
301
|
- spec/cassettes/communication_request/send/unknown_recipient.yml
|
297
302
|
- spec/cassettes/communication_request/send/valid_attributes.yml
|
298
303
|
- spec/cassettes/communication_request/send/valid_attributes_binary.yml
|
304
|
+
- spec/cassettes/errors/401.yml
|
299
305
|
- spec/cassettes/logger/invalid.yml
|
300
306
|
- spec/cassettes/logger/valid.yml
|
301
307
|
- spec/cassettes/patient/create/invalid_attributes.yml
|
@@ -313,6 +319,7 @@ test_files:
|
|
313
319
|
- spec/cassettes/practitioner/find_by_rpps/wrong_rpps.yml
|
314
320
|
- spec/category_spec.rb
|
315
321
|
- spec/communication_request_spec.rb
|
322
|
+
- spec/error_spec.rb
|
316
323
|
- spec/logger_spec.rb
|
317
324
|
- spec/patient_spec.rb
|
318
325
|
- spec/practitioner_spec.rb
|
@@ -1,39 +0,0 @@
|
|
1
|
-
module LifenFhir
|
2
|
-
class UserAuthenticatedClient < Client
|
3
|
-
|
4
|
-
def initialize(token)
|
5
|
-
@token = token
|
6
|
-
end
|
7
|
-
|
8
|
-
attr_reader :token
|
9
|
-
|
10
|
-
private
|
11
|
-
|
12
|
-
def handle_errors(response, params)
|
13
|
-
super(response, params)
|
14
|
-
|
15
|
-
case response.status
|
16
|
-
when 400
|
17
|
-
raise InvalidParamsError, "Error 400, Invalid params, #{response_error(response, params)}"
|
18
|
-
when 401
|
19
|
-
raise UnauthorizedError, "Error 401, Token is not valid, #{response_error(response, params)}"
|
20
|
-
when 403
|
21
|
-
raise Error, "Error 403, Action is forbidden, #{response_error(response, params)}"
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
def response_error(response, params)
|
27
|
-
"User Client, #{super(response, params)}"
|
28
|
-
end
|
29
|
-
|
30
|
-
def bearer
|
31
|
-
token.value
|
32
|
-
end
|
33
|
-
|
34
|
-
def before_request
|
35
|
-
token.refresh_once_if_needed
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
39
|
-
end
|