Skip to content

Commit

Permalink
Better error messages for parsing bad input path, reference path, and…
Browse files Browse the repository at this point in the history
… payload templates
  • Loading branch information
kbrock committed Jul 11, 2024
1 parent 56bf60c commit 50bc558
Show file tree
Hide file tree
Showing 10 changed files with 43 additions and 24 deletions.
2 changes: 1 addition & 1 deletion lib/floe/workflow/catcher.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def initialize(_workflow, name, payload)

@error_equals = payload["ErrorEquals"]
@next = payload["Next"]
@result_path = ReferencePath.new(payload.fetch("ResultPath", "$"))
@result_path = wrap_parser_error("ResultPath", payload.fetch("ResultPath", nil)) { ReferencePath.new(payload.fetch("ResultPath", "$")) }

missing_field_error!("ErrorEquals") if !@error_equals.kind_of?(Array) || @error_equals.empty?
end
Expand Down
6 changes: 4 additions & 2 deletions lib/floe/workflow/choice_rule.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
module Floe
class Workflow
class ChoiceRule
include ValidationMixin

class << self
def build(workflow, name, payload)
if (sub_payloads = payload["Not"])
Expand Down Expand Up @@ -33,7 +35,7 @@ def initialize(_workflow, name, payload, children = nil)
@children = children

@next = payload["Next"]
@variable = payload["Variable"]
@variable = wrap_parser_error("Variable", payload["Variable"]) { Path.new(payload["Variable"]) } if payload["Variable"]
end

def true?(*)
Expand All @@ -43,7 +45,7 @@ def true?(*)
private

def variable_value(context, input)
Path.value(variable, context, input)
variable.value(context, input)
end
end
end
Expand Down
4 changes: 4 additions & 0 deletions lib/floe/workflow/path.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ def value(context, input = {})
results = JsonPath.on(obj, path)
results.count < 2 ? results.first : results
end

def to_s
payload
end
end
end
end
4 changes: 2 additions & 2 deletions lib/floe/workflow/states/choice.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ def initialize(workflow, name, payload)
@choices = payload["Choices"].map.with_index { |choice, i| ChoiceRule.build(workflow, name + ["Choices", i.to_s], choice) }
@default = payload["Default"]

@input_path = Path.new(payload.fetch("InputPath", "$"))
@output_path = Path.new(payload.fetch("OutputPath", "$"))
@input_path = wrap_parser_error("InputPath", payload.fetch("InputPath", nil)) { Path.new(payload.fetch("InputPath", "$")) }
@output_path = wrap_parser_error("OutputPath", payload.fetch("OutputPath", nil)) { Path.new(payload.fetch("OutputPath", "$")) }
end

def finish(context)
Expand Down
4 changes: 2 additions & 2 deletions lib/floe/workflow/states/fail.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ def initialize(workflow, name, payload)

@cause = payload["Cause"]
@error = payload["Error"]
@cause_path = Path.new(payload["CausePath"]) if payload["CausePath"]
@error_path = Path.new(payload["ErrorPath"]) if payload["ErrorPath"]
@cause_path = wrap_parser_error("CausePath", payload["CausePath"]) { Path.new(payload["CausePath"]) } if payload["CausePath"]
@error_path = wrap_parser_error("ErrorPath", payload["ErrorPath"]) { Path.new(payload["ErrorPath"]) } if payload["ErrorPath"]
end

def finish(context)
Expand Down
8 changes: 4 additions & 4 deletions lib/floe/workflow/states/pass.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ def initialize(workflow, name, payload)
@end = !!payload["End"]
@result = payload["Result"]

@parameters = PayloadTemplate.new(payload["Parameters"]) if payload["Parameters"]
@input_path = Path.new(payload.fetch("InputPath", "$"))
@output_path = Path.new(payload.fetch("OutputPath", "$"))
@result_path = ReferencePath.new(payload.fetch("ResultPath", "$"))
@parameters = wrap_parser_error("Parameters", payload["Parameters"]) { PayloadTemplate.new(payload["Parameters"]) } if payload["Parameters"]
@input_path = wrap_parser_error("InputPath", payload.fetch("InputPath", nil)) { Path.new(payload.fetch("InputPath", "$")) }
@output_path = wrap_parser_error("OutputPath", payload.fetch("OutputPath", nil)) { Path.new(payload.fetch("OutputPath", "$")) }
@result_path = wrap_parser_error("ResultPath", payload.fetch("ResultPath", nil)) { ReferencePath.new(payload.fetch("ResultPath", "$")) }

validate_state!(workflow)
end
Expand Down
4 changes: 2 additions & 2 deletions lib/floe/workflow/states/succeed.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ class Succeed < Floe::Workflow::State
def initialize(workflow, name, payload)
super

@input_path = Path.new(payload.fetch("InputPath", "$"))
@output_path = Path.new(payload.fetch("OutputPath", "$"))
@input_path = wrap_parser_error("InputPath", payload.fetch("InputPath", nil)) { Path.new(payload.fetch("InputPath", "$")) }
@output_path = wrap_parser_error("OutputPath", payload.fetch("OutputPath", nil)) { Path.new(payload.fetch("OutputPath", "$")) }
end

def finish(context)
Expand Down
12 changes: 6 additions & 6 deletions lib/floe/workflow/states/task.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@ def initialize(workflow, name, payload)
@timeout_seconds = payload["TimeoutSeconds"]
@retry = payload["Retry"].to_a.map.with_index { |retrier, i| Retrier.new(workflow, name + ["Retry", i.to_s], retrier) }
@catch = payload["Catch"].to_a.map.with_index { |catcher, i| Catcher.new(workflow, name + ["Catch", i.to_s], catcher) }
@input_path = Path.new(payload.fetch("InputPath", "$"))
@output_path = Path.new(payload.fetch("OutputPath", "$"))
@result_path = ReferencePath.new(payload.fetch("ResultPath", "$"))
@parameters = PayloadTemplate.new(payload["Parameters"]) if payload["Parameters"]
@result_selector = PayloadTemplate.new(payload["ResultSelector"]) if payload["ResultSelector"]
@credentials = PayloadTemplate.new(payload["Credentials"]) if payload["Credentials"]
@input_path = wrap_parser_error("InputPath", payload.fetch("InputPath", nil)) { Path.new(payload.fetch("InputPath", "$")) }
@output_path = wrap_parser_error("OutputPath", payload.fetch("OutputPath", nil)) { Path.new(payload.fetch("OutputPath", "$")) }
@result_path = wrap_parser_error("ResultPath", payload.fetch("ResultPath", nil)) { ReferencePath.new(payload.fetch("ResultPath", "$")) }
@parameters = wrap_parser_error("Parameters", payload["Parameters"]) { PayloadTemplate.new(payload["Parameters"]) } if payload["Parameters"]
@result_selector = wrap_parser_error("ResultSelector", payload["ResultSelector"]) { PayloadTemplate.new(payload["ResultSelector"]) } if payload["ResultSelector"]
@credentials = wrap_parser_error("Credentials", payload["Credentials"]) { PayloadTemplate.new(payload["Credentials"]) } if payload["Credentials"]

validate_state!(workflow)
end
Expand Down
9 changes: 4 additions & 5 deletions lib/floe/workflow/states/wait.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,10 @@ def initialize(workflow, name, payload)
@end = !!payload["End"]
@seconds = payload["Seconds"]&.to_i
@timestamp = payload["Timestamp"]
@timestamp_path = Path.new(payload["TimestampPath"]) if payload.key?("TimestampPath")
@seconds_path = Path.new(payload["SecondsPath"]) if payload.key?("SecondsPath")

@input_path = Path.new(payload.fetch("InputPath", "$"))
@output_path = Path.new(payload.fetch("OutputPath", "$"))
@timestamp_path = wrap_parser_error("TimestampPath", payload["TimestampPath"]) { Path.new(payload["TimestampPath"]) } if payload.key?("TimestampPath")
@seconds_path = wrap_parser_error("SecondsPath", payload["SecondsPath"]) { Path.new(payload["SecondsPath"]) } if payload.key?("SecondsPath")
@input_path = wrap_parser_error("InputPath", payload["InputPath"]) { Path.new(payload.fetch("InputPath", "$")) }
@output_path = wrap_parser_error("OutputPath", payload["OutputPath"]) { Path.new(payload.fetch("OutputPath", "$")) }

validate_state!(workflow)
end
Expand Down
14 changes: 14 additions & 0 deletions spec/workflow/states/pass_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,20 @@

# it { expect { workflow }.to raise_error(Floe::InvalidWorkflowError, "States.PassState error") }
# end

context "With an invalid Path" do
let(:payload) do
{
"PassState" => {
"Type" => "Pass",
"InputPath" => "bad",
"End" => true
}
}
end

it { expect { workflow }.to raise_error(Floe::InvalidWorkflowError, "States.PassState field \"InputPath\" value \"bad\" Path [bad] must start with \"$\"") }
end
end

describe "#end?" do
Expand Down

0 comments on commit 50bc558

Please sign in to comment.