14873: Fixes nested params behavior on controller tests.
authorLucas Di Pentima <ldipentima@veritasgenetics.com>
Tue, 2 Apr 2019 21:30:11 +0000 (18:30 -0300)
committerLucas Di Pentima <ldipentima@veritasgenetics.com>
Tue, 2 Apr 2019 21:30:11 +0000 (18:30 -0300)
Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <ldipentima@veritasgenetics.com>

services/api/app/controllers/arvados/v1/users_controller.rb
services/api/lib/load_param.rb
services/api/test/test_helper.rb

index f7590b464f6aa04424a47a7bdc9c7c2d4788aeae..18b6b46d2678df8b8094c5f273d8db55a7f9e2a3 100644 (file)
@@ -73,7 +73,7 @@ class Arvados::V1::UsersController < ApplicationController
       if !@object
         return render_404_if_no_object
       end
-    elsif !params[:user]
+    elsif !params[:user] || params[:user].empty?
       raise ArgumentError.new "Required uuid or user"
     elsif !params[:user]['email']
       raise ArgumentError.new "Require user email"
index a08b8b78a532d90fce3bb79deba6b6aabe3d5031..736f270e962700c79c573fed841f5c0bde98b8ff 100644 (file)
@@ -151,7 +151,7 @@ module LoadParam
     when String
       begin
         @select = SafeJSON.load(params[:select])
-        raise unless @select.is_a? Array or @select.nil?
+        raise unless @select.is_a? Array or @select.nil? or !@select
       rescue
         raise ArgumentError.new("Could not parse \"select\" param as an array")
       end
index 710fb2bc41c62493ae02f01332caf6b9fb33c9ad..939242cf8e70eca87be21abac8ac1ef94c2a0a9b 100644 (file)
@@ -152,8 +152,6 @@ end
 class ActionController::TestCase
   setup do
     @test_counter = 0
-    # Trying this:
-    # https://stackoverflow.com/questions/44119273/rails-5-1-minitest-flattens-array-of-arrays-in-params
     self.request.headers['Accept'] = 'application/json'
     self.request.headers['Content-Type'] = 'application/json'
   end
@@ -168,6 +166,18 @@ class ActionController::TestCase
   [:get, :post, :put, :patch, :delete].each do |method|
     define_method method do |action, *args|
       check_counter action
+      # After Rails 5.0 upgrade, some params don't get properly serialized.
+      # One case are filters: [['attr', 'op', 'val']] become [['attr'], ['op'], ['val']]
+      # if not passed upstream as a JSON string.
+      if args[0].is_a?(Hash) && args[0][:params].is_a?(Hash)
+        args[0][:params].each do |key, _|
+          next if key == :exclude_script_versions # Job Reuse tests
+          # Keys could be: :filters, :where, etc
+          if [Array, Hash].include?(args[0][:params][key].class)
+            args[0][:params][key] = SafeJSON.dump(args[0][:params][key])
+          end
+        end
+      end
       super action, *args
     end
   end