assert links[0][:uuid], 'Expected uuid for the head_link'
end
- test "links for no such object" do
- use_token :active
-
- ac = ApplicationController.new
-
- links = ac.send :links_for_object, "no-such-uuid"
-
- assert links, 'Expected links'
- assert links.is_a?(Array), 'Expected an array'
- assert links.size == 0, 'Expected no links'
- end
-
- test "links for nil object" do
- use_token :active
-
- ac = ApplicationController.new
-
- assert_raise ArgumentError do
- ac.send :links_for_object, nil
- end
- end
-
test "preload links for objects and uuids" do
use_token :active
assert links[link1_head_uuid], 'Expected links for the passed in link head_uuid'
end
- test "preload links for empty array input" do
- use_token :active
+ [ [:preload_links_for_objects, [] ],
+ [:preload_collections_for_objects, [] ],
+ [:preload_log_collections_for_objects, [] ],
+ [:preload_objects_for_dataclass, [] ],
+ ].each do |input|
+ test "preload data for empty array input #{input}" do
+ use_token :active
- ac = ApplicationController.new
+ ac = ApplicationController.new
- links = ac.send :preload_links_for_objects, []
+ if input[0] == :preload_objects_for_dataclass
+ objects = ac.send input[0], @user_dataclass, input[1]
+ else
+ objects = ac.send input[0], input[1]
+ end
- assert links, 'Expected links'
- assert links.is_a?(Hash), 'Expected a hash'
- assert links.size == 0, 'Expected no objects in the preloaded links hash'
+ assert objects, 'Expected objects'
+ assert objects.is_a?(Hash), 'Expected a hash'
+ assert objects.size == 0, 'Expected no objects in the preloaded hash'
+ end
end
[ [:preload_links_for_objects, 'input not an array'],
[:preload_links_for_objects, nil],
+ [:links_for_object, nil],
[:preload_collections_for_objects, 'input not an array'],
[:preload_collections_for_objects, nil],
+ [:collections_for_object, nil],
[:preload_log_collections_for_objects, 'input not an array'],
[:preload_log_collections_for_objects, nil],
+ [:log_collections_for_object, nil],
[:preload_objects_for_dataclass, 'input not an array'],
- [:preload_objects_for_dataclass, nil],
+ [:preload_objects_for_dataclass, nil],
+ [:object_for_dataclass, 'some_dataclass', nil],
+ [:object_for_dataclass, nil, 'some_uuid'],
].each do |input|
- test "preload links for wrong type input #{input}" do
+ test "preload data for wrong type input #{input}" do
use_token :active
ac = ApplicationController.new
- assert_raise ArgumentError do
- ac.send input[0], input[1]
+ if input[0] == :object_for_dataclass
+ assert_raise ArgumentError do
+ ac.send input[0], input[1], input[2]
+ end
+ else
+ assert_raise ArgumentError do
+ ac.send input[0], input[1]
+ end
+ end
+ end
+ end
+
+ [ [:links_for_object, 'no-such-uuid' ],
+ [:collections_for_object, 'no-such-uuid' ],
+ [:log_collections_for_object, 'no-such-uuid' ],
+ [:object_for_dataclass, 'no-such-uuid' ],
+ ].each do |input|
+ test "get data for no such uuid #{input}" do
+ use_token :active
+
+ ac = ApplicationController.new
+
+ if input[0] == :object_for_dataclass
+ object = ac.send input[0], @user_dataclass, input[1]
+ assert_not object, 'Expected no object'
+ else
+ objects = ac.send input[0], input[1]
+ assert objects, 'Expected objects'
+ assert objects.is_a?(Array), 'Expected a array'
end
end
end
assert_equal collections[0][:uuid], uuid, 'Expected uuid not found in collections'
end
- test "collections for no such object" do
+ test "preload collections for given uuids" do
use_token :active
ac = ApplicationController.new
- collections = ac.send :collections_for_object, "no-such-uuid"
+ uuid1 = api_fixture('collections')['foo_file']['uuid']
+ uuid2 = api_fixture('collections')['bar_file']['uuid']
+
+ uuids = [uuid1, uuid2]
+ collections = ac.send :preload_collections_for_objects, uuids
+
+ assert collections, 'Expected collection'
+ assert collections.is_a?(Hash), 'Expected a hash'
+ assert collections.size == 2, 'Expected two objects in the preloaded collection hash'
+ assert collections[uuid1], 'Expected collections for the passed in uuid'
+ assert_equal collections[uuid1].size, 1, 'Expected one collection for the passed in uuid'
+ assert collections[uuid2], 'Expected collections for the passed in uuid'
+ assert_equal collections[uuid2].size, 1, 'Expected one collection for the passed in uuid'
+
+ # invoke again for this same input. this time, the preloaded data will be returned
+ collections = ac.send :preload_collections_for_objects, uuids
+ assert collections, 'Expected collection'
+ assert collections.is_a?(Hash), 'Expected a hash'
+ assert collections.size == 2, 'Expected two objects in the preloaded collection hash'
+ assert collections[uuid1], 'Expected collections for the passed in uuid'
+ end
+
+ test "log collections for object" do
+ use_token :active
+
+ ac = ApplicationController.new
+
+ uuid = api_fixture('logs')['log4']['object_uuid']
+
+ collections = ac.send :log_collections_for_object, uuid
assert collections, 'Expected collections'
assert collections.is_a?(Array), 'Expected an array'
- assert collections.size == 0, 'Expected no collections in response'
+ assert collections.size == 1, 'Expected one collection object'
+ assert_equal collections[0][:uuid], uuid, 'Expected uuid not found in collections'
end
- test "preload collections for given uuids" do
+ test "preload log collections for given uuids" do
use_token :active
ac = ApplicationController.new
- uuid1 = api_fixture('collections')['foo_file']['uuid']
+ uuid1 = api_fixture('logs')['log4']['object_uuid']
uuid2 = api_fixture('collections')['bar_file']['uuid']
uuids = [uuid1, uuid2]
- collections = ac.send :preload_collections_for_objects, uuids
+ collections = ac.send :preload_log_collections_for_objects, uuids
assert collections, 'Expected collection'
assert collections.is_a?(Hash), 'Expected a hash'
assert_equal collections[uuid2].size, 1, 'Expected one collection for the passed in uuid'
# invoke again for this same input. this time, the preloaded data will be returned
- collections = ac.send :preload_collections_for_objects, uuids
+ collections = ac.send :preload_log_collections_for_objects, uuids
assert collections, 'Expected collection'
assert collections.is_a?(Hash), 'Expected a hash'
assert collections.size == 2, 'Expected two objects in the preloaded collection hash'
assert collections[uuid1], 'Expected collections for the passed in uuid'
end
- test "preload collections for empty array input" do
+ test "object for dataclass" do
use_token :active
ac = ApplicationController.new
- collections = ac.send :preload_links_for_objects, []
+ dataclass = ArvadosBase.resource_class_for_uuid(api_fixture('jobs')['running']['uuid'])
+ uuid = api_fixture('jobs')['running']['uuid']
- assert collections, 'Expected collections'
- assert collections.is_a?(Hash), 'Expected a hash'
- assert collections.size == 0, 'Expected no objects in the preloaded collections hash'
+ obj = ac.send :object_for_dataclass, dataclass, uuid
+
+ assert obj, 'Expected object'
+ assert 'Job', obj.class
+ assert_equal uuid, obj['uuid'], 'Expected uuid not found'
+ assert_equal api_fixture('jobs')['running']['script_version'], obj['script_version'],
+ 'Expected script_version not found'
+ end
+
+ test "preload objects for dataclass" do
+ use_token :active
+
+ ac = ApplicationController.new
+
+ dataclass = ArvadosBase.resource_class_for_uuid(api_fixture('jobs')['running']['uuid'])
+
+ uuid1 = api_fixture('jobs')['running']['uuid']
+ uuid2 = api_fixture('jobs')['running_cancelled']['uuid']
+
+ uuids = [uuid1, uuid2]
+ users = ac.send :preload_objects_for_dataclass, dataclass, uuids
+
+ assert users, 'Expected objects'
+ assert users.is_a?(Hash), 'Expected a hash'
+
+ assert users.size == 2, 'Expected two objects in the preloaded hash'
+ assert users[uuid1], 'Expected user object for the passed in uuid'
+ assert users[uuid2], 'Expected user object for the passed in uuid'
+
+ # invoke again for this same input. this time, the preloaded data will be returned
+ users = ac.send :preload_objects_for_dataclass, dataclass, uuids
+ assert users, 'Expected objects'
+ assert users.is_a?(Hash), 'Expected a hash'
+ assert users.size == 2, 'Expected two objects in the preloaded hash'
+
+ # invoke again for this with one more uuid
+ uuids << api_fixture('jobs')['foobar']['uuid']
+ users = ac.send :preload_objects_for_dataclass, dataclass, uuids
+ assert users, 'Expected objects'
+ assert users.is_a?(Hash), 'Expected a hash'
+ assert users.size == 3, 'Expected two objects in the preloaded hash'
+ end
+
+ test "requesting a nonexistent object returns 404" do
+ # We're really testing ApplicationController's find_object_by_uuid.
+ # It's easiest to do that by instantiating a concrete controller.
+ @controller = NodesController.new
+ get(:show, {id: "zzzzz-zzzzz-zzzzzzzzzzzzzzz"}, session_for(:admin))
+ assert_response 404
end
+ test "Workbench returns 4xx when API server is unreachable" do
+ # We're really testing ApplicationController's render_exception.
+ # Our primary concern is that it doesn't raise an error and
+ # return 500.
+ orig_api_server = Rails.configuration.arvados_v1_base
+ begin
+ # The URL should look valid in all respects, and avoid talking over a
+ # network. 100::/64 is the IPv6 discard prefix, so it's perfect.
+ Rails.configuration.arvados_v1_base = "https://[100::f]:1/"
+ @controller = NodesController.new
+ get(:index, {}, session_for(:active))
+ assert_includes(405..422, @response.code.to_i,
+ "bad response code when API server is unreachable")
+ ensure
+ Rails.configuration.arvados_v1_base = orig_api_server
+ end
+ end
end