orchestrate 0.5.1 → 0.6.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.
@@ -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