Skip to content

Commit

Permalink
make json format approvals resilient to differences in pretty json fo…
Browse files Browse the repository at this point in the history
…rmatting
  • Loading branch information
Goltergaul committed Nov 30, 2017
1 parent 05f658c commit 0d776cb
Show file tree
Hide file tree
Showing 11 changed files with 119 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/approvals.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
require 'approvals/reporters'
require 'approvals/filter'
require 'approvals/writer'
require 'approvals/verifier'
require 'approvals/namers/default_namer'

module Approvals
Expand Down
10 changes: 10 additions & 0 deletions lib/approvals/approval.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
15 changes: 15 additions & 0 deletions lib/approvals/verifier.rb
Original file line number Diff line number Diff line change
@@ -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
27 changes: 27 additions & 0 deletions lib/approvals/verifiers/json_verifier.rb
Original file line number Diff line number Diff line change
@@ -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
11 changes: 11 additions & 0 deletions spec/approvals_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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"}}'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"foo": {


}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"foo": "2017-01-01 00:00:00 +0100"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"foo": {



}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"foo": {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"bar": 1
}
33 changes: 33 additions & 0 deletions spec/verifiers/json_verifier_spec.rb
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 0d776cb

Please sign in to comment.