diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d1ddab..931d0ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 4.4.1 + +* Fix `Validator` module to handle JSON or other object types being passed as the payload ([#68](https://github.com/alphagov/govuk_schemas/pull/68)) + # 4.4.0 * Adds support for applications that use Minitest by adding an `AssertMatchers` module ([#66](https://github.com/alphagov/govuk_schemas/pull/66)) diff --git a/lib/govuk_schemas/validator.rb b/lib/govuk_schemas/validator.rb index 01f5fbd..e75c242 100644 --- a/lib/govuk_schemas/validator.rb +++ b/lib/govuk_schemas/validator.rb @@ -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? @@ -27,14 +28,12 @@ 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) @@ -42,5 +41,11 @@ def humanized_error(message) .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 diff --git a/lib/govuk_schemas/version.rb b/lib/govuk_schemas/version.rb index 6fe3b83..4ea70c9 100644 --- a/lib/govuk_schemas/version.rb +++ b/lib/govuk_schemas/version.rb @@ -1,4 +1,4 @@ module GovukSchemas # @private - VERSION = "4.4.0".freeze + VERSION = "4.4.1".freeze end diff --git a/spec/lib/validator_spec.rb b/spec/lib/validator_spec.rb index 88ca00b..212f4f0 100644 --- a/spec/lib/validator_spec.rb +++ b/spec/lib/validator_spec.rb @@ -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