Skip to content

Commit

Permalink
Ensure the validator can handle the payload being JSON
Browse files Browse the repository at this point in the history
At the moment, there's some disparity between how applications that
user Minitest and applications that use RSpec pass their payloads.

RSpec applications pass the payload as JSON and Minitest applications
pass it as a Hash.

Currently, the payload is being converted to JSON before being validated
by `JSON.fully_validate`. If the object is already JSON then .to_json is
called again. This means when JSON.parse is called on the object it does
not convert it back to a hash.

This commit updates the validator to ensure that the payload is
converted to JSON if the object passed is not a string.
  • Loading branch information
davidgisbey committed Jul 22, 2022
1 parent 7abd403 commit f9e3171
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 6 deletions.
17 changes: 11 additions & 6 deletions lib/govuk_schemas/validator.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
module GovukSchemas
class Validator
attr_reader :schema_name, :type, :payload
attr_reader :schema_name, :type
attr_accessor :payload

def initialize(schema_name, type, payload)
@schema_name = schema_name
@type = type
@payload = payload
@payload = ensure_json(payload)
end

def valid?
Expand All @@ -27,20 +28,24 @@ def error_message

def errors
schema = Schema.find("#{type}_schema": schema_name)
validator = JSON::Validator.fully_validate(schema, payload.to_json)
validator = JSON::Validator.fully_validate(schema, payload)
validator.map { |message| "- " + humanized_error(message) }.join("\n")
end

def formatted_payload
return payload if payload.is_a?(String)

JSON.pretty_generate(payload)
JSON.pretty_generate(JSON.parse(payload))
end

def humanized_error(message)
message.gsub("The property '#/'", "The item")
.gsub(/in schema [0-9a-f\-]+/, "")
.strip
end

def ensure_json(payload)
return payload if payload.is_a?(String)

payload.to_json
end
end
end
7 changes: 7 additions & 0 deletions spec/lib/validator_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@

expect(validator.valid?).to eq false
end

it "handles the payload being passed as json" do
example = GovukSchemas::RandomExample.for_schema(publisher_schema: "placeholder").to_json
validator = described_class.new("placeholder", "publisher", example)

expect(validator.valid?).to eq true
end
end

describe "#error_message" do
Expand Down

0 comments on commit f9e3171

Please sign in to comment.