4523: add tests to search for file name
[arvados.git] / services / api / test / integration / collections_api_test.rb
1 require 'test_helper'
2
3 class CollectionsApiTest < ActionDispatch::IntegrationTest
4   fixtures :all
5
6   test "should get index" do
7     get "/arvados/v1/collections", {:format => :json}, auth(:active)
8     assert_response :success
9     assert_equal "arvados#collectionList", json_response['kind']
10   end
11
12   test "get index with filters= (empty string)" do
13     get "/arvados/v1/collections", {:format => :json, :filters => ''}, auth(:active)
14     assert_response :success
15     assert_equal "arvados#collectionList", json_response['kind']
16   end
17
18   test "get index with invalid filters (array of strings) responds 422" do
19     get "/arvados/v1/collections", {
20       :format => :json,
21       :filters => ['uuid', '=', 'ad02e37b6a7f45bbe2ead3c29a109b8a+54'].to_json
22     }, auth(:active)
23     assert_response 422
24     assert_match /nvalid element.*not an array/, json_response['errors'].join(' ')
25   end
26
27   test "get index with invalid filters (unsearchable column) responds 422" do
28     get "/arvados/v1/collections", {
29       :format => :json,
30       :filters => [['this_column_does_not_exist', '=', 'bogus']].to_json
31     }, auth(:active)
32     assert_response 422
33     assert_match /nvalid attribute/, json_response['errors'].join(' ')
34   end
35
36   test "get index with invalid filters (invalid operator) responds 422" do
37     get "/arvados/v1/collections", {
38       :format => :json,
39       :filters => [['uuid', ':-(', 'displeased']].to_json
40     }, auth(:active)
41     assert_response 422
42     assert_match /nvalid operator/, json_response['errors'].join(' ')
43   end
44
45   test "get index with invalid filters (invalid operand type) responds 422" do
46     get "/arvados/v1/collections", {
47       :format => :json,
48       :filters => [['uuid', '=', {foo: 'bar'}]].to_json
49     }, auth(:active)
50     assert_response 422
51     assert_match /nvalid operand type/, json_response['errors'].join(' ')
52   end
53
54   test "get index with where= (empty string)" do
55     get "/arvados/v1/collections", {:format => :json, :where => ''}, auth(:active)
56     assert_response :success
57     assert_equal "arvados#collectionList", json_response['kind']
58   end
59
60   test "controller 404 response is json" do
61     get "/arvados/v1/thingsthatdonotexist", {:format => :xml}, auth(:active)
62     assert_response 404
63     assert_equal 1, json_response['errors'].length
64     assert_equal true, json_response['errors'][0].is_a?(String)
65   end
66
67   test "object 404 response is json" do
68     get "/arvados/v1/groups/zzzzz-j7d0g-o5ba971173cup4f", {}, auth(:active)
69     assert_response 404
70     assert_equal 1, json_response['errors'].length
71     assert_equal true, json_response['errors'][0].is_a?(String)
72   end
73
74   test "store collection as json" do
75     signing_opts = {
76       key: Rails.configuration.blob_signing_key,
77       api_token: api_token(:active),
78     }
79     signed_locator = Blob.sign_locator('bad42fa702ae3ea7d888fef11b46f450+44',
80                                        signing_opts)
81     post "/arvados/v1/collections", {
82       format: :json,
83       collection: "{\"manifest_text\":\". #{signed_locator} 0:44:md5sum.txt\\n\",\"portable_data_hash\":\"ad02e37b6a7f45bbe2ead3c29a109b8a+54\"}"
84     }, auth(:active)
85     assert_response 200
86     assert_equal 'ad02e37b6a7f45bbe2ead3c29a109b8a+54', json_response['portable_data_hash']
87   end
88
89   test "store collection with manifest_text only" do
90     signing_opts = {
91       key: Rails.configuration.blob_signing_key,
92       api_token: api_token(:active),
93     }
94     signed_locator = Blob.sign_locator('bad42fa702ae3ea7d888fef11b46f450+44',
95                                        signing_opts)
96     post "/arvados/v1/collections", {
97       format: :json,
98       collection: "{\"manifest_text\":\". #{signed_locator} 0:44:md5sum.txt\\n\"}"
99     }, auth(:active)
100     assert_response 200
101     assert_equal 'ad02e37b6a7f45bbe2ead3c29a109b8a+54', json_response['portable_data_hash']
102   end
103
104   test "store collection then update name" do
105     signing_opts = {
106       key: Rails.configuration.blob_signing_key,
107       api_token: api_token(:active),
108     }
109     signed_locator = Blob.sign_locator('bad42fa702ae3ea7d888fef11b46f450+44',
110                                        signing_opts)
111     post "/arvados/v1/collections", {
112       format: :json,
113       collection: "{\"manifest_text\":\". #{signed_locator} 0:44:md5sum.txt\\n\",\"portable_data_hash\":\"ad02e37b6a7f45bbe2ead3c29a109b8a+54\"}"
114     }, auth(:active)
115     assert_response 200
116     assert_equal 'ad02e37b6a7f45bbe2ead3c29a109b8a+54', json_response['portable_data_hash']
117
118     put "/arvados/v1/collections/#{json_response['uuid']}", {
119       format: :json,
120       collection: { name: "a name" }
121     }, auth(:active)
122
123     assert_response 200
124     assert_equal 'ad02e37b6a7f45bbe2ead3c29a109b8a+54', json_response['portable_data_hash']
125     assert_equal 'a name', json_response['name']
126
127     get "/arvados/v1/collections/#{json_response['uuid']}", {
128       format: :json,
129     }, auth(:active)
130
131     assert_response 200
132     assert_equal 'ad02e37b6a7f45bbe2ead3c29a109b8a+54', json_response['portable_data_hash']
133     assert_equal 'a name', json_response['name']
134   end
135
136   test "create collection, verify file_names not returned, and search with filename" do
137     signing_opts = {
138       key: Rails.configuration.blob_signing_key,
139       api_token: api_token(:active),
140     }
141     signed_locator = Blob.sign_locator('bad42fa702ae3ea7d999fef11b46f450+44', signing_opts)
142
143     post "/arvados/v1/collections", {
144       format: :json,
145       collection: "{\"manifest_text\":\". #{signed_locator} 0:44:my_test_file.txt\\n\"}"
146     }, auth(:active)
147     assert_response 200
148     assert_equal '0f99f4087beb13dec46d36db9fa6cebf+60', json_response['portable_data_hash']
149     assert_nil json_response['description']
150     assert_nil json_response['file_names']
151
152     put "/arvados/v1/collections/#{json_response['uuid']}", {
153       format: :json,
154       collection: { description: "my test collection description" }
155     }, auth(:active)
156     assert_response :success
157     assert_equal 'my test collection description', json_response['description']
158     assert_equal '0f99f4087beb13dec46d36db9fa6cebf+60', json_response['portable_data_hash']
159     assert_nil json_response['file_names']
160
161     get '/arvados/v1/collections', {
162       where: { any: ['contains', '87beb13dec46d36db9fa'] }
163     }, auth(:active)
164     assert_response :success
165     response_items = json_response['items']
166     assert_not_nil response_items
167     first_item = json_response['items'].first
168     assert_not_nil first_item
169     assert_equal 'my test collection description', first_item['description']
170     assert_equal '0f99f4087beb13dec46d36db9fa6cebf+60', first_item['portable_data_hash']
171     assert_nil first_item['file_names']
172
173     get '/arvados/v1/collections', {
174       where: { any: ['contains', 'my_test_file.txt'] }
175     }, auth(:active)
176     assert_response :success
177     response_items = json_response['items']
178     assert_not_nil response_items
179     assert_equal 1, response_items.size
180     first_item = response_items.first
181     assert_not_nil first_item
182     assert_equal 'my test collection description', first_item['description']
183     assert_equal '0f99f4087beb13dec46d36db9fa6cebf+60', first_item['portable_data_hash']
184     assert_nil first_item['file_names']
185
186     get '/arvados/v1/collections', {
187       where: { any: ['contains', 'there_is_no_such_file.txt'] }
188     }, auth(:active)
189     assert_response :success
190     assert_equal 0, json_response['items_available']
191     response_items = json_response['items']
192     assert_not_nil response_items
193     assert_equal 0, response_items.size
194   end
195 end