2872: Merge branch 'master' into 2872-folder-nav
[arvados.git] / apps / workbench / test / functional / application_controller_test.rb
index 8b6270da3f7503f607f0e3b5ca663d398a64734a..f3dbcb523be5d2a63d1c197dc938706811aa7dea 100644 (file)
@@ -2,6 +2,10 @@ require 'test_helper'
 
 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
 
@@ -17,37 +21,7 @@ class ApplicationControllerTest < ActionController::TestCase
     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
@@ -68,38 +42,87 @@ class ApplicationControllerTest < ActionController::TestCase
     assert links[link1_head_uuid], 'Expected links for the passed in link head_uuid'
     assert links[link2_object_uuid], 'Expected links for the passed in object uuid'
     assert links[link3_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
+    # invoke again for this same input. this time, the preloaded data will be returned
+    links = ac.send :preload_links_for_objects, uuids
+    assert links, 'Expected links'
+    assert links.is_a?(Hash), 'Expected a hash'
+    assert links.size == 3, 'Expected two objects in the preloaded links hash'
+    assert links[link1_head_uuid], 'Expected links for the passed in link head_uuid'
+  end
 
-    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
@@ -107,10 +130,7 @@ class ApplicationControllerTest < ActionController::TestCase
 
     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'
@@ -120,65 +140,77 @@ class ApplicationControllerTest < ActionController::TestCase
     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']
+
+    uuids = [uuid1, uuid2]
+    collections = ac.send :preload_collections_for_objects, uuids
 
-    dataclass = ArvadosBase.resource_class_for_uuid(uuid)
-    assert_raise ArgumentError do
-      ac.send :get_n_objects_of_class, dataclass, 0
-    end
+    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'
@@ -186,28 +218,16 @@ class ApplicationControllerTest < ActionController::TestCase
     assert_equal collections[0][:uuid], uuid, 'Expected uuid not found in collections'
   end
 
-  test "collections for no such object" do
+  test "preload log collections for given uuids" 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
-    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'
@@ -216,37 +236,64 @@ class ApplicationControllerTest < ActionController::TestCase
     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_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
-  end
-
-  test "preload collections for nil input" do
-    use_token :active
+    dataclass = ArvadosBase.resource_class_for_uuid(api_fixture('jobs')['running']['uuid'])
+    uuid = api_fixture('jobs')['running']['uuid']
 
-    ac = ApplicationController.new
+    obj = ac.send :object_for_dataclass, dataclass, uuid
 
-    assert_raise ArgumentError do
-      ac.send :preload_collections_for_objects, nil
-    end
+    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 empty array input" do
+  test "preload objects 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'])
 
-    assert collections, 'Expected collections'
-    assert collections.is_a?(Hash), 'Expected a hash'
-    assert collections.size == 0, 'Expected no objects in the preloaded collections hash'
+    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
+
 end