diff --git a/lib/approvals.rb b/lib/approvals.rb index 81ae948..fe224db 100644 --- a/lib/approvals.rb +++ b/lib/approvals.rb @@ -13,6 +13,7 @@ require 'approvals/reporters' require 'approvals/filter' require 'approvals/writer' +require 'approvals/verifier' require 'approvals/namers/default_namer' module Approvals diff --git a/lib/approvals/approval.rb b/lib/approvals/approval.rb index 5b85781..90fcd3d 100644 --- a/lib/approvals/approval.rb +++ b/lib/approvals/approval.rb @@ -34,6 +34,10 @@ def writer @writer ||= Writer.for(@format) end + def verifier + @verifier ||= Verifier.for(@format) + end + def verify unless File.exist?(namer.output_dir) FileUtils.mkdir_p(namer.output_dir) @@ -63,6 +67,12 @@ def approved? BINARY_FORMATS = [:binary] def received_matches? + if Verifier.for(@format) + return Verifier.for(@format) + .new(received_path, approved_path) + .verify + end + if BINARY_FORMATS.include?(@format) # Read without ERB IO.read(received_path).chomp == IO.read(approved_path).chomp else diff --git a/lib/approvals/verifier.rb b/lib/approvals/verifier.rb new file mode 100644 index 0000000..fdd6d73 --- /dev/null +++ b/lib/approvals/verifier.rb @@ -0,0 +1,15 @@ +require 'approvals/verifiers/json_verifier' + +module Approvals + module Verifier + REGISTRY = { + json: Verifiers::JsonVerifier, + } + + class << self + def for(format) + REGISTRY[format] + end + end + end +end diff --git a/lib/approvals/verifiers/json_verifier.rb b/lib/approvals/verifiers/json_verifier.rb new file mode 100644 index 0000000..f8db68c --- /dev/null +++ b/lib/approvals/verifiers/json_verifier.rb @@ -0,0 +1,27 @@ +module Approvals + module Verifiers + class JsonVerifier + def initialize(received_path, approved_path) + self.received_path = received_path + self.approved_path = approved_path + end + + def verify + return false unless approved == received + true + end + + private + + attr_accessor :approved_path, :received_path + + def approved + @approved = JSON.parse(File.read(approved_path)) + end + + def received + @receiver = JSON.parse(File.read(received_path)) + end + end + end +end diff --git a/spec/approvals_spec.rb b/spec/approvals_spec.rb index 1414fb4..28a370f 100644 --- a/spec/approvals_spec.rb +++ b/spec/approvals_spec.rb @@ -105,6 +105,17 @@ def filter(data) Approvals.verify json, :format => :json, :namer => namer end + it "verifies json where the pretty generation is different but the content is the same" do + hash = { foo: {} } + + Approvals.verify hash, :format => :json, :namer => namer + end + + it "verifies json with a time object" do + hash = { foo: Time.new(2017,1,1) } + + Approvals.verify hash, :format => :json, :namer => namer + end it "verifies json and is newline agnostic" do json = '{"pet":{"species":"turtle","color":"green","name":"Anthony"}}' diff --git a/spec/fixtures/approvals/approvals_verifies_json_where_the_pretty_generation_is_different_but_the_content_is_the_same.approved.json b/spec/fixtures/approvals/approvals_verifies_json_where_the_pretty_generation_is_different_but_the_content_is_the_same.approved.json new file mode 100644 index 0000000..8a4b9f9 --- /dev/null +++ b/spec/fixtures/approvals/approvals_verifies_json_where_the_pretty_generation_is_different_but_the_content_is_the_same.approved.json @@ -0,0 +1,6 @@ +{ + "foo": { + + + } +} diff --git a/spec/fixtures/approvals/approvals_verifies_json_with_a_time_object.approved.json b/spec/fixtures/approvals/approvals_verifies_json_with_a_time_object.approved.json new file mode 100644 index 0000000..6b9c35e --- /dev/null +++ b/spec/fixtures/approvals/approvals_verifies_json_with_a_time_object.approved.json @@ -0,0 +1,3 @@ +{ + "foo": "2017-01-01 00:00:00 +0100" +} diff --git a/spec/fixtures/json_approval_with_different_whitespace/approved.json b/spec/fixtures/json_approval_with_different_whitespace/approved.json new file mode 100644 index 0000000..fdc1c99 --- /dev/null +++ b/spec/fixtures/json_approval_with_different_whitespace/approved.json @@ -0,0 +1,7 @@ +{ + "foo": { + + + + } +} diff --git a/spec/fixtures/json_approval_with_different_whitespace/received.json b/spec/fixtures/json_approval_with_different_whitespace/received.json new file mode 100644 index 0000000..011b940 --- /dev/null +++ b/spec/fixtures/json_approval_with_different_whitespace/received.json @@ -0,0 +1,3 @@ +{ + "foo": {} +} diff --git a/spec/fixtures/json_approval_with_different_whitespace/received_different_content.json b/spec/fixtures/json_approval_with_different_whitespace/received_different_content.json new file mode 100644 index 0000000..80ee379 --- /dev/null +++ b/spec/fixtures/json_approval_with_different_whitespace/received_different_content.json @@ -0,0 +1,3 @@ +{ + "bar": 1 +} diff --git a/spec/verifiers/json_verifier_spec.rb b/spec/verifiers/json_verifier_spec.rb new file mode 100644 index 0000000..efa2731 --- /dev/null +++ b/spec/verifiers/json_verifier_spec.rb @@ -0,0 +1,33 @@ +require 'spec_helper' + +describe Approvals::Verifiers::JsonVerifier do + subject(:instance) do + described_class.new(received_path, approved_path) + end + + context "with same json content but different formatting" do + let(:received_path) do + "./spec/fixtures/json_approval_with_different_whitespace/received.json" + end + let(:approved_path) do + "./spec/fixtures/json_approval_with_different_whitespace/approved.json" + end + + it "passes verification" do + expect(instance.verify).to be_truthy + end + end + + context "with different json content" do + let(:received_path) do + "./spec/fixtures/json_approval_with_different_whitespace/received_different_content.json" + end + let(:approved_path) do + "./spec/fixtures/json_approval_with_different_whitespace/approved.json" + end + + it "does not passe verification" do + expect(instance.verify).to be_falsy + end + end +end