[ARVADOS] updated: 1bd85c64fbf485acceac4711ff06e6b2f548d40a

git at public.curoverse.com git at public.curoverse.com
Mon Jun 9 09:43:21 EDT 2014


Summary of changes:
 .../app/controllers/application_controller.rb      |  62 ++++++++----
 .../test/functional/application_controller_test.rb | 105 +++++++++++++++++++++
 .../arvados/v1/collections_controller_test.rb      |  29 ++++--
 3 files changed, 172 insertions(+), 24 deletions(-)
 create mode 100644 apps/workbench/test/functional/application_controller_test.rb

       via  1bd85c64fbf485acceac4711ff06e6b2f548d40a (commit)
       via  f3da69fb1b882c7fe8feb765ad0558f13706931a (commit)
       via  f0d8ab52b77f74e9294fe634207ce6e1ff9748a1 (commit)
       via  488a811374ff4bdeed9f2f2f57d9ef31d9369b5b (commit)
       via  2f3d49bde80526060d3337f13dfa91cd581ac222 (commit)
       via  cea92754dfacf2b409d1f5b45dd0775fc44c842d (commit)
      from  620a10bed55b85294baad9dba965ea8dad59e884 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit 1bd85c64fbf485acceac4711ff06e6b2f548d40a
Author: radhika <radhika at curoverse.com>
Date:   Mon Jun 9 09:42:04 2014 -0400

    2871: add input checks for helper methods. start adding functional tests for the helper methods.

diff --git a/apps/workbench/app/controllers/application_controller.rb b/apps/workbench/app/controllers/application_controller.rb
index c9a761f..7b726b4 100644
--- a/apps/workbench/app/controllers/application_controller.rb
+++ b/apps/workbench/app/controllers/application_controller.rb
@@ -463,15 +463,20 @@ class ApplicationController < ActionController::Base
   def links_for_object object_or_uuid
     uuid = object_or_uuid.is_a?(String) ? object_or_uuid : object_or_uuid.uuid
     preload_links_for_objects([object_or_uuid])
-    @all_links_for[uuid]
+
+    @all_links_for[uuid] ||= []
   end
 
   # helper method to preload links for given objects and uuids
   helper_method :preload_links_for_objects
   def preload_links_for_objects objects_and_uuids
-    uuids = objects_and_uuids.collect { |x| x.is_a?(String) ? x : x.uuid }
     @all_links_for ||= {}
 
+    raise ArgumentError, 'Argument is not an array' unless objects_and_uuids.is_a? Array
+    return @all_links_for if objects_and_uuids.empty?
+
+    uuids = objects_and_uuids.collect { |x| x.is_a?(String) ? x : x.uuid }
+
     # if already preloaded for all of these uuids, return
     if not uuids.select { |x| @all_links_for[x].nil? }.any?
       return
@@ -480,36 +485,37 @@ class ApplicationController < ActionController::Base
     uuids.each do |x|
       @all_links_for[x] = []
     end
+
     # TODO: make sure we get every page of results from API server
-    Link.filter([['head_uuid','in',uuids]]).each do |link|
+    Link.filter([['head_uuid', 'in', uuids]]).each do |link|
       @all_links_for[link.head_uuid] << link
     end
+    @all_links_for
   end
 
   # helper method to get a certain number of objects of a specific type
   # this can be used to replace any uses of: "dataclass.limit(n)"
   helper_method :get_n_objects_of_class
   def get_n_objects_of_class dataclass, size
-    # if the objects_map_for has a value for this dataclass, and the size used
-    # to retrieve those objects is greater than or equal to size, return it
+    @objects_map_for ||= {}
+
+    # if the objects_map_for has a value for this dataclass, and the
+    # size used to retrieve those objects is equal, return it
     size_key = "#{dataclass}_size"
-    if @objects_map_for && @objects_map_for[dataclass] && @objects_map_for[size_key] &&
-        (@objects_map_for[size_key] >= size)
+    if @objects_map_for[dataclass] && @objects_map_for[size_key] &&
+        (@objects_map_for[size_key] == size)
       return @objects_map_for[dataclass]
     end
 
-    @objects_map_for = {}
-    @objects_map_for[dataclass] = dataclass.limit(size)
     @objects_map_for[size_key] = size
-
-    return @objects_map_for[dataclass]
+    @objects_map_for[dataclass] = dataclass.limit(size)
   end
 
   # helper method to get collections for the given uuid
   helper_method :collections_for_object
   def collections_for_object uuid
     preload_collections_for_objects([uuid])
-    @all_collections_for[uuid]
+    @all_collections_for[uuid] ||= []
   end
 
   # helper method to preload collections for the given uuids
@@ -517,6 +523,9 @@ class ApplicationController < ActionController::Base
   def preload_collections_for_objects uuids
     @all_collections_for ||= {}
 
+    raise ArgumentError, 'Argument is not an array' unless uuids.is_a? Array
+    return @all_collections_for if uuids.empty?
+
     # if already preloaded for all of these uuids, return
     if not uuids.select { |x| @all_collections_for[x].nil? }.any?
       return
@@ -530,28 +539,42 @@ class ApplicationController < ActionController::Base
     Collection.where(uuid: uuids).each do |collection|
       @all_collections_for[collection.uuid] << collection
     end
+    @all_collections_for
   end
 
   # helper method to get log collections for the given log
   helper_method :log_collections_for_object
   def log_collections_for_object log
+    preload_log_collections_for_objects([log])
+
+    uuid = log
     fixup = /([a-f0-9]{32}\+\d+)(\+?.*)/.match(log)
-    uuid = fixup[1]
-    preload_log_collections_for_objects([uuid])
-    @all_log_collections_for[uuid]
+    if fixup && fixup.size>1
+      uuid = fixup[1]
+    end
+
+    @all_log_collections_for[uuid] ||= []
   end
 
   # helper method to preload collections for the given uuids
   helper_method :preload_log_collections_for_objects
   def preload_log_collections_for_objects logs
+    @all_log_collections_for ||= {}
+
+    raise ArgumentError, 'Argument is not an array' unless logs.is_a? Array
+    return @all_log_collections_for if logs.empty?
+
     uuids = []
     logs.each do |log|
       fixup = /([a-f0-9]{32}\+\d+)(\+?.*)/.match(log)
-      uuids << fixup[1]
+      if fixup && fixup.size>1
+        uuids << fixup[1]
+      else
+        uuids << log
+      end
     end
 
     # if already preloaded for all of these uuids, return
-    @all_log_collections_for ||= {}
     if not uuids.select { |x| @all_log_collections_for[x].nil? }.any?
       return
     end
@@ -564,6 +587,7 @@ class ApplicationController < ActionController::Base
     Collection.where(uuid: uuids).each do |collection|
       @all_log_collections_for[collection.uuid] << collection
     end
+    @all_log_collections_for
   end
 
   # helper method to get object of a given dataclass and uuid
@@ -578,6 +602,9 @@ class ApplicationController < ActionController::Base
   def preload_objects_for_dataclass dataclass, uuids
     @objects_for ||= {}
 
+    raise ArgumentError, 'Argument is not an array' unless uuids.is_a? Array
+    return @all_collections_for if uuids.empty?
+
     # if already preloaded for all of these uuids, return
     if not uuids.select { |x| @objects_for[x].nil? }.any?
       return
@@ -586,6 +613,7 @@ class ApplicationController < ActionController::Base
     dataclass.where(uuid: uuids).each do |obj|
       @objects_for[obj.uuid] = obj
     end
+    @objects_for
   end
 
 end
diff --git a/apps/workbench/test/functional/application_controller_test.rb b/apps/workbench/test/functional/application_controller_test.rb
new file mode 100644
index 0000000..5960abf
--- /dev/null
+++ b/apps/workbench/test/functional/application_controller_test.rb
@@ -0,0 +1,105 @@
+require 'test_helper'
+
+class ApplicationControllerTest < ActionController::TestCase
+
+  test "links for object" do
+    use_token :active
+
+    ac = ApplicationController.new
+
+    link_head_uuid = api_fixture('links')['foo_file_readable_by_active']['head_uuid']
+
+    links = ac.send :links_for_object, link_head_uuid
+
+    assert links, 'Expected links'
+    assert links.is_a?(Array), 'Expected an array'
+    assert links.size > 0, 'Expected at least one link'
+    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
+    use_token :active
+
+    ac = ApplicationController.new
+
+    link1_head_uuid = api_fixture('links')['foo_file_readable_by_active']['head_uuid']
+    link2_uuid = api_fixture('links')['bar_file_readable_by_active']['uuid']
+    link3_head_uuid = api_fixture('links')['bar_file_readable_by_active']['head_uuid']
+
+    link2_object = User.find(api_fixture('users')['active']['uuid'])
+    link2_object_uuid = link2_object['uuid']
+
+    uuids = [link1_head_uuid, link2_object, link3_head_uuid]
+    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'
+    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
+
+    assert_raise ArgumentError do
+      links = ac.send :preload_links_for_objects, 'input not an array'
+    end
+  end
+
+  test "preload links for nil input" do
+    use_token :active
+
+    ac = ApplicationController.new
+
+    assert_raise ArgumentError do
+      links = ac.send :preload_links_for_objects, nil
+    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'
+  end
+
+end

commit f3da69fb1b882c7fe8feb765ad0558f13706931a
Merge: 620a10b f0d8ab5
Author: radhika <radhika at curoverse.com>
Date:   Sat Jun 7 09:03:19 2014 -0400

    Merge branch 'master' into 2871-preload-objects


-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list