class ApplicationControllerTest < ActionController::TestCase
+ setup do
+ @user_dataclass = ArvadosBase.resource_class_for_uuid(api_fixture('users')['active']['uuid'])
+ end
+
test "links for object" do
use_token :active
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 "preload links for given uuids" do
- use_token :active
-
- ac = ApplicationController.new
-
- link_head_uuid1 = api_fixture('links')['foo_file_readable_by_active']['head_uuid']
- link_head_uuid2 = api_fixture('links')['bar_file_readable_by_active']['head_uuid']
-
- uuids = [link_head_uuid1, link_head_uuid2]
- links = ac.send :preload_links_for_objects, uuids
-
- assert links, 'Expected links'
- assert links.is_a?(Hash), 'Expected a hash'
- assert links.size == 2, 'Expected two objects in the preloaded links hash'
- assert links[link_head_uuid1], 'Expected links for the passed in head_uuid'
- assert links[link_head_uuid2], 'Expected links for the passed in head_uuid'
- end
-
- test "preload links for object and uuids" do
+ test "preload links for objects and uuids" do
use_token :active
ac = ApplicationController.new
assert links[link1_head_uuid], 'Expected links for the passed in link head_uuid'
end
- test "preload links for wrong typed input" do
- use_token :active
-
- ac = ApplicationController.new
-
- assert_raise ArgumentError do
- ac.send :preload_links_for_objects, 'input not an array'
+ [ [: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
+
+ 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 objects, 'Expected objects'
+ assert objects.is_a?(Hash), 'Expected a hash'
+ assert objects.size == 0, 'Expected no objects in the preloaded hash'
end
end
- test "preload links for nil input" do
- use_token :active
-
- ac = ApplicationController.new
-
- assert_raise ArgumentError do
- ac.send :preload_links_for_objects, nil
+ [ [: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],
+ [:object_for_dataclass, 'some_dataclass', nil],
+ [:object_for_dataclass, nil, 'some_uuid'],
+ ].each do |input|
+ test "preload data for wrong type input #{input}" do
+ use_token :active
+
+ ac = ApplicationController.new
+
+ 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
- test "preload links for empty array input" do
- use_token :active
-
- ac = ApplicationController.new
-
- links = ac.send :preload_links_for_objects, []
-
- assert links, 'Expected links'
- assert links.is_a?(Hash), 'Expected a hash'
- assert links.size == 0, 'Expected no objects in the preloaded links hash'
+ [ [: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
test "get 10 objects of data class user" do
ac = ApplicationController.new
- uuid = api_fixture('users')['active']['uuid']
-
- dataclass = ArvadosBase.resource_class_for_uuid(uuid)
- objects = ac.send :get_n_objects_of_class, dataclass, 10
+ objects = ac.send :get_n_objects_of_class, @user_dataclass, 10
assert objects, 'Expected objects'
assert objects.is_a?(ArvadosResourceList), 'Expected an ArvadosResourceList'
assert_equal 'User', first_object.class.name, 'Expected user object'
# invoke it again. this time, the preloaded info will be returned
- objects = ac.send :get_n_objects_of_class, dataclass, 10
+ objects = ac.send :get_n_objects_of_class, @user_dataclass, 10
assert objects, 'Expected objects'
assert_equal 'User', objects.first.class.name, 'Expected user object'
end
- test "get objects for incorrect input" do
- use_token :active
+ [ ['User', 10],
+ [nil, 10],
+ [@user_dataclass, 0],
+ [@user_dataclass, -1],
+ [@user_dataclass, nil] ].each do |input|
+ test "get_n_objects for incorrect input #{input}" do
+ use_token :active
- ac = ApplicationController.new
+ ac = ApplicationController.new
- assert_raise ArgumentError do
- ac.send :get_n_objects_of_class, 'User', 10
+ assert_raise ArgumentError do
+ ac.send :get_n_objects_of_class, input[0], input[1]
+ end
end
end
- test "get objects for nil data class" do
+ test "collections for object" do
use_token :active
ac = ApplicationController.new
- assert_raise ArgumentError do
- ac.send :get_n_objects_of_class, nil, 10
- end
- end
-
- test "get objects of data class user with no limit specified" do
- use_token :active
-
- ac = ApplicationController.new
+ uuid = api_fixture('collections')['foo_file']['uuid']
- uuid = api_fixture('users')['active']['uuid']
+ collections = ac.send :collections_for_object, uuid
- dataclass = ArvadosBase.resource_class_for_uuid(uuid)
- assert_raise ArgumentError do
- ac.send :get_n_objects_of_class, dataclass
- end
+ assert collections, 'Expected collections'
+ assert collections.is_a?(Array), 'Expected an array'
+ assert collections.size == 1, 'Expected one collection object'
+ assert_equal collections[0][:uuid], uuid, 'Expected uuid not found in collections'
end
- test "get objects of data class user with incorrect limit size" do
+ test "preload collections for given uuids" do
use_token :active
ac = ApplicationController.new
- uuid = api_fixture('users')['active']['uuid']
+ uuid1 = api_fixture('collections')['foo_file']['uuid']
+ uuid2 = api_fixture('collections')['bar_file']['uuid']
- dataclass = ArvadosBase.resource_class_for_uuid(uuid)
- assert_raise ArgumentError do
- ac.send :get_n_objects_of_class, dataclass, 0
- end
+ 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 "collections for object" do
+ test "log collections for object" do
use_token :active
ac = ApplicationController.new
- uuid = api_fixture('collections')['foo_file']['uuid']
+ uuid = api_fixture('logs')['log4']['object_uuid']
- collections = ac.send :collections_for_object, uuid
+ collections = ac.send :log_collections_for_object, uuid
assert collections, 'Expected collections'
assert collections.is_a?(Array), 'Expected an array'
assert_equal collections[0][:uuid], uuid, 'Expected uuid not found in collections'
end
- test "collections for no such object" do
- use_token :active
-
- ac = ApplicationController.new
-
- collections = ac.send :collections_for_object, "no-such-uuid"
-
- assert collections, 'Expected collections'
- assert collections.is_a?(Array), 'Expected an array'
- assert collections.size == 0, 'Expected no collection'
- 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 wrong typed input" do
+ test "object for dataclass" do
use_token :active
ac = ApplicationController.new
- assert_raise ArgumentError do
- ac.send :preload_collections_for_objects, 'input not an array'
- end
+ dataclass = ArvadosBase.resource_class_for_uuid(api_fixture('jobs')['running']['uuid'])
+ uuid = api_fixture('jobs')['running']['uuid']
+
+ 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 collections for nil input" do
+ test "preload objects for dataclass" do
use_token :active
ac = ApplicationController.new
- assert_raise ArgumentError do
- ac.send :preload_collections_for_objects, nil
- end
- end
+ dataclass = ArvadosBase.resource_class_for_uuid(api_fixture('jobs')['running']['uuid'])
- test "preload collections for empty array input" do
- use_token :active
+ uuid1 = api_fixture('jobs')['running']['uuid']
+ uuid2 = api_fixture('jobs')['running_cancelled']['uuid']
- ac = ApplicationController.new
+ uuids = [uuid1, uuid2]
+ users = ac.send :preload_objects_for_dataclass, dataclass, uuids
- collections = ac.send :preload_links_for_objects, []
+ assert users, 'Expected objects'
+ assert users.is_a?(Hash), 'Expected a hash'
- assert collections, 'Expected collections'
- assert collections.is_a?(Hash), 'Expected a hash'
- assert collections.size == 0, 'Expected no objects in the preloaded collections 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