From 4eaad199ac21e552eee2a049d33a3c076d8bed60 Mon Sep 17 00:00:00 2001 From: Lucas Di Pentima Date: Tue, 2 Apr 2019 18:30:11 -0300 Subject: [PATCH] 14873: Fixes nested params behavior on controller tests. Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima --- .../app/controllers/arvados/v1/users_controller.rb | 2 +- services/api/lib/load_param.rb | 2 +- services/api/test/test_helper.rb | 14 ++++++++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/services/api/app/controllers/arvados/v1/users_controller.rb b/services/api/app/controllers/arvados/v1/users_controller.rb index f7590b464f..18b6b46d26 100644 --- a/services/api/app/controllers/arvados/v1/users_controller.rb +++ b/services/api/app/controllers/arvados/v1/users_controller.rb @@ -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" diff --git a/services/api/lib/load_param.rb b/services/api/lib/load_param.rb index a08b8b78a5..736f270e96 100644 --- a/services/api/lib/load_param.rb +++ b/services/api/lib/load_param.rb @@ -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 diff --git a/services/api/test/test_helper.rb b/services/api/test/test_helper.rb index 710fb2bc41..939242cf8e 100644 --- a/services/api/test/test_helper.rb +++ b/services/api/test/test_helper.rb @@ -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 -- 2.39.5