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 5d4ed2e
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 5 deletions.
14 changes: 9 additions & 5 deletions lib/govuk_schemas/validator.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
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
ensure_payload_is_json
end

def valid?
Expand All @@ -27,20 +29,22 @@ 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_payload_is_json
self.payload = payload.to_json unless payload.is_a?(String)
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 5d4ed2e

Please sign in to comment.