orchestrate 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,3 @@
1
1
  module Orchestrate
2
- VERSION = "0.5.1"
2
+ VERSION = "0.6.0"
3
3
  end
data/lib/orchestrate.rb CHANGED
@@ -1,46 +1,9 @@
1
1
  require "orchestrate/api"
2
2
  require "orchestrate/client"
3
- require "orchestrate/configuration"
4
- require "orchestrate/helpers"
5
3
  require "orchestrate/version"
6
4
 
7
5
  #
8
6
  # A library for supporting connections to the \Orchestrate API.
9
7
  #
10
8
  module Orchestrate
11
-
12
- # Configuration ------------------------------------------------------------
13
-
14
- class << self
15
-
16
- #
17
- # An instance of Configuration containing the current library
18
- # configuration options.
19
- #
20
- attr_accessor :config
21
-
22
- #
23
- # Lazily initialize and return the Configuration instance.
24
- #
25
- def config # :nodoc:
26
- @config ||= Configuration.new
27
- end
28
-
29
- #
30
- # Configure the Orchestrate library. This method should be called during
31
- # application or script initialization. At a bare minimum, the Orchestrate
32
- # library will require that an API key is provided.
33
- #
34
- # ==== Example
35
- #
36
- # Orchestrate.configure do |config|
37
- # config.api_key = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
38
- # end
39
- #
40
- def configure
41
- yield config
42
- end
43
-
44
- end
45
-
46
9
  end
@@ -18,10 +18,13 @@ class CollectionTest < MiniTest::Unit::TestCase
18
18
  response = @client.delete_collection(@collection)
19
19
  assert_equal 204, response.status
20
20
  assert_equal '', response.body
21
+ assert_equal response.headers['X-Orchestrate-Req-Id'], response.request_id
21
22
  end
22
23
 
23
24
  def test_lists_collection_without_params
24
- body = {"count" => 0, "results" => [], "next" => ""}
25
+ body = {"count" => 1, "results" => [
26
+ { "value" => {"value" => "one"}, "path" => {}, "reftime" => "" }
27
+ ], "next" => "/v0/#{@collection}?afterKey=one"}
25
28
 
26
29
  @stubs.get("/v0/#{@collection}") do |env|
27
30
  assert_authorization @basic_auth, env
@@ -32,10 +35,14 @@ class CollectionTest < MiniTest::Unit::TestCase
32
35
  response = @client.list(@collection)
33
36
  assert_equal 200, response.status
34
37
  assert_equal body, response.body
38
+ assert_equal response.headers['X-Orchestrate-Req-Id'], response.request_id
39
+ assert_equal body['count'], response.count
40
+ assert_equal body['results'], response.results
41
+ assert_equal body['next'], response.next_link
35
42
  end
36
43
 
37
44
  def test_lists_collections_with_params_passes_them
38
- body = {"count" => 0, "results" => [], "next" => ""}
45
+ body = {"count" => 0, "results" => []}
39
46
  @stubs.get("/v0/#{@collection}") do |env|
40
47
  assert_authorization @basic_auth, env
41
48
  assert_accepts_json env
@@ -48,11 +55,13 @@ class CollectionTest < MiniTest::Unit::TestCase
48
55
  response = @client.list(@collection, {limit:1, start: 'foo'})
49
56
  assert_equal 200, response.status
50
57
  assert_equal body, response.body
58
+ assert_nil response.next_link
51
59
  end
52
60
 
53
61
  def test_search_with_simple_query
54
62
  query = 'text:"The Right Way" and go'
55
- body = { "results" => [], "count" => 0, "total_count" => 10, "next" => "", "prev" => "" }
63
+ body = { "count" => 1, "total_count" => 1,
64
+ "results" => [{"path" => {}, "score" => 0.5 }] }
56
65
 
57
66
  @stubs.get("/v0/#{@collection}") do |env|
58
67
  assert_authorization @basic_auth, env
@@ -64,24 +73,37 @@ class CollectionTest < MiniTest::Unit::TestCase
64
73
  response = @client.search(@collection, query)
65
74
  assert_equal 200, response.status
66
75
  assert_equal body, response.body
76
+ assert_equal body['count'], response.count
77
+ assert_equal body['total_count'], response.total_count
78
+ assert_equal body['results'], response.results
79
+ assert_nil response.next_link
80
+ assert_nil response.prev_link
67
81
  end
68
82
 
69
83
  def test_search_with_extra_params
70
84
  query = 'text:"The Right Way" and go'
71
- body = { "results" => [], "count" => 0, "total_count" => 10, "next" => "", "prev" => "" }
85
+ body = { "results" => [{"value" => {}, "path" => {}, "score" => 0.5}],
86
+ "count" => 1, "total_count" => 10,
87
+ "next" => "/v0/#{@collection}?limit=1&offset=4&query=__query__",
88
+ "prev" => "/v0/#{@collection}?limit=1&offset=2&query=__query__" }
72
89
 
73
90
  @stubs.get("/v0/#{@collection}") do |env|
74
91
  assert_authorization @basic_auth, env
75
92
  assert_accepts_json env
76
93
  assert_equal query, env.params['query']
77
94
  assert_equal '3', env.params['offset']
78
- assert_equal '10', env.params['limit']
95
+ assert_equal '1', env.params['limit']
79
96
  [ 200, response_headers, body.to_json]
80
97
  end
81
98
 
82
- response = @client.search(@collection, query, {offset: 3, limit: 10})
99
+ response = @client.search(@collection, query, {offset: 3, limit: 1})
83
100
  assert_equal 200, response.status
84
101
  assert_equal body, response.body
102
+ assert_equal body['results'], response.results
103
+ assert_equal body['count'], response.count
104
+ assert_equal body['total_count'], response.total_count
105
+ assert_equal body['next'], response.next_link
106
+ assert_equal body['prev'], response.prev_link
85
107
  end
86
108
 
87
109
  end
@@ -7,70 +7,125 @@ class EventTest < MiniTest::Unit::TestCase
7
7
  @key = 'instance'
8
8
  @client, @stubs, @basic_auth = make_client_and_artifacts
9
9
  @event_type = "commits"
10
- @timestamp = (Time.now.to_f * 1000).to_i
10
+ @time = Time.now
11
+ @timestamp = (@time.to_f * 1000).to_i
11
12
  @ordinal = 5
12
13
  end
13
14
 
14
15
  def test_get_event
15
- body = { "path" => {}, "value" => {"msg" => "hello"}, "timestamp" => @timestamp, "ordinal" => @ordinal }
16
- @stubs.get("/v0/#{@collection}/#{@key}/events/#{@event_type}/#{@timestamp}/#{@ordinal}") do |env|
16
+ ref = "12345"
17
+ value = {"msg" => "hello"}
18
+ path = { "collection" => @collection, "key" => @key, "type" => @event_type,
19
+ "ref" => "\"#{ref}\"", "timestamp" => @timestamp, "ordinal" => @ordinal }
20
+ body = { "path" => path, "value" => value, "timestamp" => @timestamp, "ordinal" => @ordinal }
21
+ location = ["/v0", @collection, @key, "events", @event_type, @timestamp, @ordinal].join('/')
22
+ @stubs.get(location) do |env|
17
23
  assert_authorization @basic_auth, env
18
24
  assert_accepts_json env
19
- [200, response_headers, body.to_json]
25
+ headers = { "Etag" => "\"#{ref}\"" }
26
+ [200, response_headers(headers), body.to_json]
20
27
  end
21
28
 
22
29
  response = @client.get_event(@collection, @key, @event_type, @timestamp, @ordinal)
23
30
  assert_equal 200, response.status
24
31
  assert_equal body, response.body
32
+ assert_equal ref, response.ref
33
+ # assert_equal location, response.location
34
+ assert_equal Time.parse(response.headers['Date']), response.request_time
35
+ assert_equal response.headers['X-Orchestrate-Req-Id'], response.request_id
36
+ end
37
+
38
+ def test_get_event_with_time
39
+ time = Time.now
40
+ ts = (time.getutc.to_f * 1000).to_i
41
+ @stubs.get("/v0/#{@collection}/#{@key}/events/#{@event_type}/#{ts}/#{@ordinal}") do |env|
42
+ assert_authorization @basic_auth, env
43
+ assert_accepts_json env
44
+ [ 200, response_headers, {}.to_json ]
45
+ end
46
+
47
+ response = @client.get_event(@collection, @key, @event_type, time, @ordinal)
48
+ assert_equal 200, response.status
49
+ end
50
+
51
+ def test_get_event_with_datetime
52
+ time = DateTime.now
53
+ ts = (time.to_time.getutc.to_f * 1000).to_i
54
+ @stubs.get("/v0/#{@collection}/#{@key}/events/#{@event_type}/#{ts}/#{@ordinal}") do |env|
55
+ assert_authorization @basic_auth, env
56
+ assert_accepts_json env
57
+ [ 200, response_headers, {}.to_json ]
58
+ end
59
+ response = @client.get_event(@collection, @key, @event_type, time, @ordinal)
60
+ assert_equal 200, response.status
25
61
  end
26
62
 
27
63
  def test_post_event_without_timestamp
28
64
  event = {"msg" => "hello"}
65
+ ref = "12345"
66
+ location = ["/v0",@collection,@key,'events',@event_type,@timestamp,@ordinal].join('/')
29
67
  @stubs.post("/v0/#{@collection}/#{@key}/events/#{@event_type}") do |env|
30
68
  assert_authorization @basic_auth, env
31
69
  assert_equal event.to_json, env.body
32
- [204, response_headers, '']
70
+ headers = { "Etag" => "\"#{ref}\"", "Location" => location }
71
+ [204, response_headers(headers), '']
33
72
  end
34
73
 
35
74
  response = @client.post_event(@collection, @key, @event_type, event)
36
75
  assert_equal 204, response.status
76
+ assert_equal location, response.location
77
+ assert_equal ref, response.ref
37
78
  end
38
79
 
39
80
  def test_post_event_with_timestamp
40
81
  event = {"msg" => "hello"}
82
+ ref = "12345"
83
+ location = ["/v0",@collection,@key,'events',@event_type,@timestamp,@ordinal].join('/')
41
84
  @stubs.post("/v0/#{@collection}/#{@key}/events/#{@event_type}/#{@timestamp}") do |env|
42
85
  assert_authorization @basic_auth, env
43
86
  assert_equal event.to_json, env.body
44
- [204, response_headers, '']
87
+ headers = { "Etag" => "\"#{ref}\"", "Location" => location }
88
+ [204, response_headers(headers), '']
45
89
  end
46
90
 
47
- response = @client.post_event(@collection, @key, @event_type, event, @timestamp)
91
+ response = @client.post_event(@collection, @key, @event_type, event, @time)
48
92
  assert_equal 204, response.status
93
+ assert_equal location, response.location
94
+ assert_equal ref, response.ref
49
95
  end
50
96
 
51
97
  def test_put_event_without_ref
52
98
  event = {"msg" => "hello"}
99
+ ref = "12345"
100
+ location = ["/v0",@collection,@key,'events',@event_type,@timestamp,@ordinal].join('/')
53
101
  @stubs.put("/v0/#{@collection}/#{@key}/events/#{@event_type}/#{@timestamp}/#{@ordinal}") do |env|
54
102
  assert_authorization @basic_auth, env
55
103
  assert_equal event.to_json, env.body
56
- [204, response_headers, '']
104
+ headers = { "Etag" => "\"#{ref}\"", "Location" => location }
105
+ [204, response_headers(headers), '']
57
106
  end
58
- response = @client.put_event(@collection, @key, @event_type, @timestamp, @ordinal, event)
107
+ response = @client.put_event(@collection, @key, @event_type, @time, @ordinal, event)
59
108
  assert_equal 204, response.status
109
+ assert_equal location, response.location
110
+ assert_equal ref, response.ref
60
111
  end
61
112
 
62
113
  def test_put_event_with_ref
63
114
  event = {"msg" => "hello"}
64
115
  ref = "12345"
65
- path = ['v0', @collection, @key, 'events', @event_type, @timestamp, @ordinal]
116
+ new_ref = "abcde"
117
+ path = ['/v0', @collection, @key, 'events', @event_type, @timestamp, @ordinal]
66
118
  @stubs.put(path.join("/")) do |env|
67
119
  assert_authorization @basic_auth, env
68
120
  assert_header 'If-Match', "\"#{ref}\"", env
69
121
  assert_equal event.to_json, env.body
70
- [204, response_headers, '']
122
+ headers = { "Etag" => "\"#{new_ref}\"", "Location" => path.join('/') }
123
+ [204, response_headers(headers), '']
71
124
  end
72
- response = @client.put_event(@collection, @key, @event_type, @timestamp, @ordinal, event, ref)
125
+ response = @client.put_event(@collection, @key, @event_type, @time, @ordinal, event, ref)
73
126
  assert_equal 204, response.status
127
+ assert_equal new_ref, response.ref
128
+ assert_equal path.join('/'), response.location
74
129
  end
75
130
 
76
131
  def test_purge_event_without_ref
@@ -80,8 +135,9 @@ class EventTest < MiniTest::Unit::TestCase
80
135
  assert_equal 'true', env.params['purge']
81
136
  [204, response_headers, '']
82
137
  end
83
- response = @client.purge_event(@collection, @key, @event_type, @timestamp, @ordinal)
138
+ response = @client.purge_event(@collection, @key, @event_type, @time, @ordinal)
84
139
  assert_equal 204, response.status
140
+ assert_equal response.headers['X-Orchestrate-Req-Id'], response.request_id
85
141
  end
86
142
 
87
143
  def test_purge_event_with_ref
@@ -93,12 +149,14 @@ class EventTest < MiniTest::Unit::TestCase
93
149
  assert_equal 'true', env.params['purge']
94
150
  [204, response_headers, '']
95
151
  end
96
- response = @client.purge_event(@collection, @key, @event_type, @timestamp, @ordinal, ref)
152
+ response = @client.purge_event(@collection, @key, @event_type, @time, @ordinal, ref)
97
153
  assert_equal 204, response.status
154
+ assert_equal response.headers['X-Orchestrate-Req-Id'], response.request_id
98
155
  end
99
156
 
100
157
  def test_list_events_without_timestamp
101
- body = { "results" => [], "count" => 0, "next" => "" }
158
+ body = { "results" => [{"path"=>{}, "value"=>{}, "timestamp"=>"", "ordinal"=>0}],
159
+ "count" => 0, "next" => "__NEXT__" }
102
160
  @stubs.get("/v0/#{@collection}/#{@key}/events/#{@event_type}") do |env|
103
161
  assert_authorization @basic_auth, env
104
162
  assert_accepts_json env
@@ -108,26 +166,33 @@ class EventTest < MiniTest::Unit::TestCase
108
166
  response = @client.list_events(@collection, @key, @event_type)
109
167
  assert_equal 200, response.status
110
168
  assert_equal body, response.body
169
+ assert_equal body['count'], response.count
170
+ assert_equal body['results'], response.results
171
+ assert_equal body['next'], response.next_link
111
172
  end
112
173
 
113
174
  def test_list_events_with_timestamp
114
175
  end_time = Time.now
115
176
  start_time = end_time - (24 * 3600)
116
- body = { "results" => [], "count" => 0, "next" => "" }
177
+ body = { "results" => [{"path"=>{}, "value"=>{}, "timestamp"=>"", "ordinal"=>0}],
178
+ "count" => 1, "next" => "__NEXT__" }
117
179
 
118
180
  @stubs.get("/v0/#{@collection}/#{@key}/events/#{@event_type}") do |env|
119
181
  assert_authorization @basic_auth, env
120
182
  assert_accepts_json env
121
- assert_equal start_time.to_i.to_s, env.params['startEvent']
122
- assert_equal end_time.to_i.to_s, env.params['endEvent']
183
+ assert_equal (start_time.to_f * 1000).to_i.to_s, env.params['startEvent']
184
+ assert_equal (end_time.to_f * 1000).to_i.to_s, env.params['endEvent']
123
185
  assert_equal ['startEvent', 'endEvent'].sort, env.params.keys.sort
124
186
  [200, response_headers, body.to_json]
125
187
  end
126
188
  response = @client.list_events(@collection, @key, @event_type,
127
- { start: start_time.to_i, end: end_time.to_i }
128
- )
189
+ { start: start_time, end: end_time })
129
190
  assert_equal 200, response.status
130
191
  assert_equal body, response.body
192
+ assert_equal body['results'], response.results
193
+ assert_equal body['count'], response.count
194
+ assert_equal body['next'], response.next_link
195
+ assert_nil response.prev_link
131
196
  end
132
197
 
133
198
  end
@@ -0,0 +1,172 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class ExceptionsTest < MiniTest::Unit::TestCase
4
+ def setup
5
+ @client, @stubs, @basic_auth = make_client_and_artifacts
6
+ end
7
+
8
+ def test_raises_on_unauthroized
9
+ @stubs.get("/v0/foo") do |env|
10
+ assert_authorization @basic_auth, env
11
+ [ 401, response_headers, {
12
+ "message" => "Valid credentials are required.",
13
+ "code" => "security_unauthorized"
14
+ }.to_json ]
15
+ end
16
+ assert_raises Orchestrate::API::Unauthorized do
17
+ @client.list(:foo)
18
+ end
19
+ end
20
+
21
+ def test_raises_on_bad_request
22
+ message = "Invalid value for header 'If-Match'."
23
+ @stubs.put("/v0/foo/bar") do |env|
24
+ [400, response_headers, {
25
+ message: message,
26
+ code: "api_bad_request"
27
+ }.to_json ]
28
+ end
29
+ err = assert_raises Orchestrate::API::BadRequest do
30
+ @client.put(:foo, "bar", {}, "'foo'")
31
+ end
32
+ assert_equal message, err.message
33
+ end
34
+
35
+ def test_raises_on_malformed_search_query
36
+ @stubs.get("/v0/foo") do |env|
37
+ [ 400, response_headers, {
38
+ message: "The search query provided is invalid.",
39
+ code: "search_query_malformed"
40
+ }.to_json ]
41
+ end
42
+ assert_raises Orchestrate::API::MalformedSearch do
43
+ @client.search(:foo, "foo=\"no")
44
+ end
45
+ end
46
+
47
+ def test_raises_on_invalid_search_param
48
+ @stubs.get("/v0/foo") do |env|
49
+ [ 400, response_headers, {
50
+ message: "A provided search query param is invalid.",
51
+ details: { query: "Query is empty." },
52
+ code: "search_param_invalid"
53
+ }.to_json ]
54
+ end
55
+ assert_raises Orchestrate::API::InvalidSearchParam do
56
+ @client.search(:foo, '')
57
+ end
58
+ end
59
+
60
+ def test_raises_on_malformed_ref
61
+ @stubs.put("/v0/foo/bar") do |env|
62
+ [ 400, response_headers, {
63
+ message: "The provided Item Ref is malformed.",
64
+ details: { ref: "blerg" },
65
+ code: "item_ref_malformed"
66
+ }.to_json ]
67
+ end
68
+ assert_raises Orchestrate::API::MalformedRef do
69
+ @client.put(:foo, "bar", {:blerg => 'blerg'}, "blerg")
70
+ end
71
+ end
72
+
73
+ def test_raises_on_indexing_conflict
74
+ @stubs.put("/v0/foo/bar") do |env|
75
+ [ 409, response_headers, {
76
+ message: "The item has been stored but conflicts were detected when indexing. Conflicting fields have not been indexed.",
77
+ details: {
78
+ conflicts: { name: { type: "string", expected: "long" } },
79
+ conflicts_uri: "/v0/test/one/refs/f8a86a25029a907b/conflicts"
80
+ },
81
+ code: "indexing_conflict"
82
+ }.to_json ]
83
+ end
84
+ assert_raises Orchestrate::API::IndexingConflict do
85
+ @client.put(:foo, 'bar', {count: "foo"})
86
+ end
87
+ end
88
+
89
+ def test_raises_on_version_mismatch
90
+ @stubs.put("/v0/foo/bar") do |env|
91
+ [ 412, response_headers, {
92
+ message: "The version of the item does not match.",
93
+ code: "item_version_mismatch"
94
+ }.to_json ]
95
+ end
96
+ assert_raises Orchestrate::API::VersionMismatch do
97
+ @client.put(:foo, 'bar', {foo:'bar'}, "7ae8635207acbb2f")
98
+ end
99
+ end
100
+
101
+ def test_raises_on_item_already_present
102
+ @stubs.put("/v0/foo/bar") do |env|
103
+ [ 412, response_headers, {
104
+ message: "The item is already present.",
105
+ code: "item_already_present"
106
+ }.to_json ]
107
+ end
108
+ assert_raises Orchestrate::API::AlreadyPresent do
109
+ @client.put_if_absent(:foo, 'bar', {foo:'bar'})
110
+ end
111
+ end
112
+
113
+ def test_raises_on_unexpected_response_error
114
+ @stubs.get("/v0/teapot/spout") do |env|
115
+ [ 418, response_headers, {
116
+ message: "I'm a little teapot",
117
+ code: "teapot"
118
+ }.to_json ]
119
+ end
120
+ assert_raises Orchestrate::API::RequestError do
121
+ @client.get(:teapot, "spout")
122
+ end
123
+ end
124
+
125
+ def test_raises_on_security_authentication
126
+ @stubs.get("/v0/test/123") do |env|
127
+ [ 500, response_headers, {
128
+ message: "An error occurred while trying to authenticate.",
129
+ code: "security_authentication"
130
+ }.to_json ]
131
+ end
132
+ assert_raises Orchestrate::API::SecurityAuthentication do
133
+ @client.get(:test, '123')
134
+ end
135
+ end
136
+
137
+ def test_raises_on_search_index_not_found
138
+ @stubs.get("/v0/test") do |env|
139
+ [ 500, response_headers, {
140
+ message: "Index could not be queried for this application.",
141
+ code: "search_index_not_found"
142
+ }.to_json ]
143
+ end
144
+ assert_raises Orchestrate::API::SearchIndexNotFound do
145
+ @client.search(:test, '123')
146
+ end
147
+ end
148
+
149
+ def test_raises_on_internal_error
150
+ @stubs.get("/v0/test/123") do |env|
151
+ [ 500, response_headers, {
152
+ message: "Internal Error.",
153
+ code: "internal_error"
154
+ }.to_json ]
155
+ end
156
+ assert_raises Orchestrate::API::InternalError do
157
+ @client.get(:test, '123')
158
+ end
159
+ end
160
+
161
+ def test_raises_on_generic_500_error
162
+ body = "The bees, they're in my eyes"
163
+ @stubs.get("/v0/test/123") do |env|
164
+ [ 500, {}, body ]
165
+ end
166
+ err = assert_raises Orchestrate::API::ServiceError do
167
+ @client.get(:test, '123')
168
+ end
169
+ assert_equal body, err.message
170
+ end
171
+ end
172
+
@@ -21,6 +21,8 @@ class GraphTest < MiniTest::Unit::TestCase
21
21
  response = @client.get_relations(@collection, @key, @kind, @kind)
22
22
  assert_equal 200, response.status
23
23
  assert_equal body, response.body
24
+ assert_equal body['count'], response.count
25
+ assert_equal body['results'], response.results
24
26
  end
25
27
 
26
28
  def test_put_graph
@@ -30,6 +32,7 @@ class GraphTest < MiniTest::Unit::TestCase
30
32
  end
31
33
  response = @client.put_relation(@collection, @key, @kind, @target_collection, @target_key)
32
34
  assert_equal 204, response.status
35
+ assert_equal response.headers['X-Orchestrate-Req-Id'], response.request_id
33
36
  end
34
37
 
35
38
  def test_delete_graph
@@ -40,5 +43,6 @@ class GraphTest < MiniTest::Unit::TestCase
40
43
  end
41
44
  response = @client.delete_relation(@collection, @key, @kind, @target_collection, @target_key)
42
45
  assert_equal 204, response.status
46
+ assert_equal response.headers['X-Orchestrate-Req-Id'], response.request_id
43
47
  end
44
48
  end
@@ -27,6 +27,11 @@ class KeyValueTest < MiniTest::Unit::TestCase
27
27
 
28
28
  assert_equal "\"#{ref}\"", response.headers['Etag']
29
29
  assert_equal ref_url, response.headers['Content-Location']
30
+
31
+ assert_equal ref_url, response.location
32
+ assert_equal ref, response.ref
33
+ assert_equal Time.parse(response.headers['Date']), response.request_time
34
+ assert_equal response.headers['X-Orchestrate-Req-Id'], response.request_id
30
35
  end
31
36
 
32
37
  def test_gets_key_value_is_404_when_does_not_exist
@@ -36,22 +41,28 @@ class KeyValueTest < MiniTest::Unit::TestCase
36
41
  [ 404, response_headers(), response_not_found({collection:@collection, key:@key}) ]
37
42
  end
38
43
 
39
- response = @client.get(@collection, @key)
40
- assert_equal 404, response.status
41
- assert_equal 'items_not_found', response.body['code']
44
+ assert_raises Orchestrate::API::NotFound do
45
+ @client.get(@collection, @key)
46
+ end
42
47
  end
43
48
 
44
49
  def test_puts_key_value_without_ref
45
50
  body={"foo" => "bar"}
46
- @stubs.put("/v0/#{@collection}/#{@key}") do |env|
51
+ ref = "12345"
52
+ base_location = "/v0/#{@collection}/#{@key}"
53
+ @stubs.put(base_location) do |env|
47
54
  assert_authorization @basic_auth, env
48
55
  assert_header 'Content-Type', 'application/json', env
49
56
  assert_equal body.to_json, env.body
50
- [ 201, response_headers, '' ]
57
+ headers = { "Location" => "#{base_location}/refs/#{ref}",
58
+ "Etag" => "\"#{ref}\"" }
59
+ [ 201, response_headers(headers), '' ]
51
60
  end
52
61
 
53
62
  response = @client.put(@collection, @key, body)
54
63
  assert_equal 201, response.status
64
+ assert_equal ref, response.ref
65
+ assert_equal "#{base_location}/refs/#{ref}", response.location
55
66
  end
56
67
 
57
68
  def test_puts_key_value_with_specific_ref
@@ -122,6 +133,7 @@ class KeyValueTest < MiniTest::Unit::TestCase
122
133
  end
123
134
  response = @client.delete(@collection, @key)
124
135
  assert_equal 204, response.status
136
+ assert_equal response.headers['X-Orchestrate-Req-Id'], response.request_id
125
137
  end
126
138
 
127
139
  def test_delete_key_value_with_condition
@@ -154,20 +166,53 @@ class KeyValueTest < MiniTest::Unit::TestCase
154
166
  end
155
167
  response = @client.purge(@collection, @key)
156
168
  assert_equal 204, response.status
169
+ assert_equal response.headers['X-Orchestrate-Req-Id'], response.request_id
157
170
  end
158
171
 
159
172
  def test_gets_ref
160
173
  body = {"key" => "value"}
161
174
  ref = '123456'
162
- @stubs.get("/v0/#{@collection}/#{@key}/refs/#{ref}") do |env|
175
+ ref_url = "/v0/#{@collection}/#{@key}/refs/#{ref}"
176
+ @stubs.get(ref_url) do |env|
163
177
  assert_authorization @basic_auth, env
164
178
  assert_accepts_json env
165
- [ 200, response_headers, body.to_json ]
179
+ headers = {
180
+ 'Content-Location' => ref_url,
181
+ 'Etag' => "\"#{ref}\""
182
+ }
183
+ [ 200, response_headers(headers), body.to_json ]
166
184
  end
167
185
 
168
186
  response = @client.get(@collection, @key, ref)
169
187
  assert_equal 200, response.status
170
188
  assert_equal body, response.body
189
+
190
+ assert_equal ref_url, response.location
191
+ assert_equal ref, response.ref
192
+ assert_equal Time.parse(response.headers['Date']), response.request_time
193
+ assert_equal response.headers['X-Orchestrate-Req-Id'], response.request_id
194
+ end
195
+
196
+ def test_list_refs
197
+ reflist = (1..3).map do |i|
198
+ { "path" => {}, "reftime" => Time.now.to_i - (-2 * i * 3600 * 1000) }
199
+ end
200
+ body = { "results" => reflist, "count" => 3, "prev" => "__PREV__" }
201
+
202
+ @stubs.get("/v0/#{@collection}/#{@key}/refs") do |env|
203
+ assert_authorization @basic_auth, env
204
+ assert_accepts_json env
205
+ assert_equal "10", env.params['offset']
206
+ [ 200, response_headers, body.to_json ]
207
+ end
208
+
209
+ response = @client.list_refs(@collection, @key, {offset: 10})
210
+ assert_equal 200, response.status
211
+ assert_equal body, response.body
212
+ assert_equal body['count'], response.count
213
+ assert_equal body['results'], response.results
214
+ assert_equal body['prev'], response.prev_link
215
+ assert_nil response.next_link
171
216
  end
172
217
 
173
218
  end