From 2b6d14c834647eb566a7118ab54f83ff0d1099e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0=2E=20Emre=20Kutlu?= Date: Tue, 19 May 2026 23:18:42 +0300 Subject: [PATCH] Fix Array support for steps --- lib/transloadit/assembly.rb | 15 +++++- test/unit/transloadit/test_assembly.rb | 73 ++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/lib/transloadit/assembly.rb b/lib/transloadit/assembly.rb index 5d0f1c7..ac303a5 100644 --- a/lib/transloadit/assembly.rb +++ b/lib/transloadit/assembly.rb @@ -143,11 +143,22 @@ def _wrap_steps_in_hash(steps) when nil then steps when Hash then steps when Transloadit::Step then steps.to_hash - else - if steps.uniq(&:name) != steps + when Array + names = steps.inject([]) do |array, step| + case step + when Transloadit::Step then array << step.name + when Hash then array + step.keys.map(&:to_s) + else + raise ArgumentError, "Unsupported array element" + end + end + + if names.uniq != names raise ArgumentError, "There are different Assembly steps using the same name" end steps.inject({}) { |h, s| h.update s } + else + raise ArgumentError, "Unsupported steps class" end end diff --git a/test/unit/transloadit/test_assembly.rb b/test/unit/transloadit/test_assembly.rb index 14fef21..8df81bf 100644 --- a/test/unit/transloadit/test_assembly.rb +++ b/test/unit/transloadit/test_assembly.rb @@ -213,6 +213,79 @@ end end + describe "with multiple hash steps" do + it "must wrap its steps into one hash" do + hash_1 = {encode: {robot: "/video/encode"}, resize: {robot: "/image/resize"}} + hash_2 = {thumbs: {robot: "/video/thumbs"}} + + assembly = Transloadit::Assembly.new @transloadit, + steps: [hash_1, hash_2] + (hash_1.keys + hash_2.keys).each do |key| + _(assembly.to_hash[:steps].keys).must_include key + end + end + + it "must not allow duplicate steps" do + thumbs = {thumbs: {robot: "/video/thumbs"}} + thumbs_duplicate = {thumbs: {robot: "/video/encode"}} + assembly = Transloadit::Assembly.new @transloadit, + steps: [thumbs, thumbs_duplicate] + assert_raises ArgumentError do + assembly.create! open("lib/transloadit/version.rb") + end + end + end + + describe "with mixture of hashes and steps" do + it "must wrap its steps into one hash" do + hash = {encode: {robot: "/video/encode"}, resize: {robot: "/image/resize"}} + step = @transloadit.step "thumbs", "/video/thumbs" + + assembly = Transloadit::Assembly.new @transloadit, + steps: [hash, step] + + hash.keys.each do |key| + _(assembly.to_hash[:steps].keys).must_include key + end + + _(assembly.to_hash[:steps].keys).must_include step.name + end + + it "must not allow duplicate steps" do + hash = {thumbs: {robot: "/video/thumbs"}} + step = @transloadit.step "thumbs", "/video/thumbs" + + assembly = Transloadit::Assembly.new @transloadit, + steps: [hash, step] + + assert_raises ArgumentError do + assembly.create! open("lib/transloadit/version.rb") + end + end + end + + describe "with unsupported step class" do + it "raises error" do + assembly = Transloadit::Assembly.new @transloadit, + steps: Class.new + + assert_raises ArgumentError do + assembly.create! open("lib/transloadit/version.rb") + end + end + end + + describe "with unsupported array element" do + it "raises error" do + assembly = Transloadit::Assembly.new @transloadit, + steps: [Class.new] + + assert_raises ArgumentError do + assembly.create! open("lib/transloadit/version.rb") + end + end + end + describe "using assembly API methods" do include WebMock::API