Skip to content

Commit

Permalink
Check if a workflow payload is valid during sync
Browse files Browse the repository at this point in the history
When syncing a repository and creating workflows check if the payload is
valid and if it isn't set a (hopefully) helpful error message.
  • Loading branch information
agrare committed Nov 14, 2023
1 parent 5036897 commit fc8709e
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,24 @@ def sync
next if filename.start_with?(".") || !filename.end_with?(".asl")

payload = worktree.read_file(filename)
found = current.delete(filename) || self.class.module_parent::Workflow.new(:configuration_script_source_id => id)

found.update!(:name => filename, :manager_id => manager_id, :payload => payload, :payload_type => "json")
payload_valid, payload_error =
begin
Floe::Workflow.new(payload)
true
rescue Floe::InvalidWorkflowError => err
[false, err.message]
end

found = current.delete(filename) || self.class.module_parent::Workflow.new(:configuration_script_source_id => id)

found.update!(
:name => filename,
:manager_id => manager_id,
:payload => payload,
:payload_type => "json",
:payload_valid => payload_valid,
:payload_error => payload_error
)
end
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,12 +194,44 @@ def files_in_repository(git_repo_dir)
record = build_record

expect(record.configuration_script_payloads.first).to have_attributes(
:name => "hello_world.asl",
:payload => a_string_including("\"Comment\": \"hello world\""),
:payload_type => "json"
:name => "hello_world.asl",
:payload => a_string_including("\"Comment\": \"hello world\""),
:payload_type => "json",
:payload_valid => true,
:payload_error => nil
)
end

context "with workflows with invalid json" do
let(:repo_dir_structure) { %w[invalid_json.asl] }

it "sets the payload_valid and payload_error attributes" do
record = build_record
expect(record.configuration_script_payloads.first).to have_attributes(
:name => "invalid_json.asl",
:payload => "{\"Invalid Json\"\n",
:payload_type => "json",
:payload_valid => false,
:payload_error => "unexpected token at '{\"Invalid Json\"\n'"
)
end
end

context "with workflows with missing states" do
let(:repo_dir_structure) { %w[missing_states.asl] }

it "sets the payload_valid and payload_error attributes" do
record = build_record
expect(record.configuration_script_payloads.first).to have_attributes(
:name => "missing_states.asl",
:payload => "{\"Comment\": \"Missing States\"}\n",
:payload_type => "json",
:payload_valid => false,
:payload_error => "Missing field \"States\""
)
end
end

context "with a nested dir" do
let(:nested_repo) { File.join(clone_dir, "hello_world_nested") }

Expand Down
19 changes: 15 additions & 4 deletions spec/support/fake_workflows_repo.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,21 @@ def file_content(full_path)
dummy_workflow_data_for(full_path) if full_path.fnmatch?("**/*.asl", File::FNM_EXTGLOB)
end

def dummy_workflow_data_for(_filename)
<<~WORKFLOW_DATA
{"Comment": "hello world"}
WORKFLOW_DATA
def dummy_workflow_data_for(filename)
case filename.to_s
when /invalid_json.asl$/
<<~WORKFLOW_DATA
{"Invalid Json"
WORKFLOW_DATA
when /missing_states.asl$/
<<~WORKFLOW_DATA
{"Comment": "Missing States"}
WORKFLOW_DATA
else
<<~WORKFLOW_DATA
{"Comment": "hello world", "States": {"Start": {"Type": "Succeed"}}, "StartAt": "Start"}
WORKFLOW_DATA
end
end
end
end
Expand Down

0 comments on commit fc8709e

Please sign in to comment.