Skip to content

Commit

Permalink
Merge pull request #24 from clemens-schulz/master
Browse files Browse the repository at this point in the history
Added JSON matcher
  • Loading branch information
JanGorman authored Jul 4, 2019
2 parents a274713 + e90be99 commit 5af6c2f
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 1 deletion.
6 changes: 5 additions & 1 deletion Hippolyte.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
77A2EA9F1F6561A30051E45A /* HippolyteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77A2EA9E1F6561A30051E45A /* HippolyteTests.swift */; };
77B806641F63E33A0077A365 /* HTTPStubURLProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77B806631F63E33A0077A365 /* HTTPStubURLProtocol.swift */; };
77B806661F63E5670077A365 /* HTTPRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77B806651F63E5670077A365 /* HTTPRequest.swift */; };
ABD79AD622CD5F24003C9D8B /* JSONMatcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABD79AD522CD5F24003C9D8B /* JSONMatcherTests.swift */; };
E64B0ED3223ACCF900FB35E4 /* Hippolyte.h in Headers */ = {isa = PBXBuildFile; fileRef = 77A290D11F62EADF001E70FA /* Hippolyte.h */; settings = {ATTRIBUTES = (Public, ); }; };
E64B0ED4223ACD0D00FB35E4 /* Hippolyte.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77A290E81F62EDF5001E70FA /* Hippolyte.swift */; };
E64B0ED5223ACD0D00FB35E4 /* StubRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77A290EA1F62EE40001E70FA /* StubRequest.swift */; };
Expand Down Expand Up @@ -67,7 +68,7 @@
/* Begin PBXFileReference section */
7706E6651F822F2C00734A1D /* StubResponseBuilderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StubResponseBuilderTests.swift; sourceTree = "<group>"; };
7766CF9D1F652D8F00B717B2 /* URLHook.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLHook.swift; sourceTree = "<group>"; };
7766CF9F1F652FD100B717B2 /* Matcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Matcher.swift; sourceTree = "<group>"; };
7766CF9F1F652FD100B717B2 /* Matcher.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = Matcher.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
7766CFA11F65311200B717B2 /* URL+HippolyteAdditions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+HippolyteAdditions.swift"; sourceTree = "<group>"; };
7766CFA31F654F1800B717B2 /* DataMatcherTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataMatcherTests.swift; sourceTree = "<group>"; };
7766CFA51F65515000B717B2 /* StringMatcherTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringMatcherTests.swift; sourceTree = "<group>"; };
Expand All @@ -87,6 +88,7 @@
77A2EA9E1F6561A30051E45A /* HippolyteTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HippolyteTests.swift; sourceTree = "<group>"; };
77B806631F63E33A0077A365 /* HTTPStubURLProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPStubURLProtocol.swift; sourceTree = "<group>"; };
77B806651F63E5670077A365 /* HTTPRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPRequest.swift; sourceTree = "<group>"; };
ABD79AD522CD5F24003C9D8B /* JSONMatcherTests.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = JSONMatcherTests.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
E64B0ECB223ACB6300FB35E4 /* Hippolyte.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Hippolyte.framework; sourceTree = BUILT_PRODUCTS_DIR; };
E64B0EE3223ACE8400FB35E4 /* HippolyteTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HippolyteTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
Expand Down Expand Up @@ -171,6 +173,7 @@
7766CFA31F654F1800B717B2 /* DataMatcherTests.swift */,
7766CFA51F65515000B717B2 /* StringMatcherTests.swift */,
7766CFA71F6552B100B717B2 /* RegexMatcherTests.swift */,
ABD79AD522CD5F24003C9D8B /* JSONMatcherTests.swift */,
7766CFAB1F65571800B717B2 /* StubRequestTests.swift */,
7706E6651F822F2C00734A1D /* StubResponseBuilderTests.swift */,
77A2EA9C1F65589C0051E45A /* TestRequest.swift */,
Expand Down Expand Up @@ -416,6 +419,7 @@
files = (
77A2EA9F1F6561A30051E45A /* HippolyteTests.swift in Sources */,
7706E6661F822F2C00734A1D /* StubResponseBuilderTests.swift in Sources */,
ABD79AD622CD5F24003C9D8B /* JSONMatcherTests.swift in Sources */,
7766CFA81F6552B100B717B2 /* RegexMatcherTests.swift in Sources */,
7766CFA41F654F1800B717B2 /* DataMatcherTests.swift in Sources */,
7766CFA61F65515000B717B2 /* StringMatcherTests.swift in Sources */,
Expand Down
31 changes: 31 additions & 0 deletions Hippolyte/Matcher.swift
Original file line number Diff line number Diff line change
Expand Up @@ -112,3 +112,34 @@ public class DataMatcher: Matcher {
}

}

public class JsonMatcher<T: Decodable & Hashable>: Matcher {

let decoder: JSONDecoder
let object: T

public init(object: T) {
self.decoder = JSONDecoder()
self.object = object
}

public override func matches(data: Data?) -> Bool {
guard let data = data, let decodedObject = try? self.decoder.decode(T.self, from: data) else {
return false
}

return object == decodedObject
}

public override func hash(into hasher: inout Hasher) {
hasher.combine(object)
}

override func isEqual(to other: Matcher) -> Bool {
if let theOther = other as? JsonMatcher<T> {
return theOther.object == object
}
return false
}

}
61 changes: 61 additions & 0 deletions HippolyteTests/JSONMatcherTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
//
// JSONMatcherTests.swift
// HippolyteTests_iOS
//
// Created by Clemens on 04.07.19.
// Copyright © 2019 Clemens Schulz. All rights reserved.
//

import XCTest
import Hippolyte

class JSONMatcherTests: XCTestCase {

private struct TestObject: Codable, Hashable {

let id: Int
let name: String?
let foo: Bool
}

func testMatchingObjectMatches() throws {
let object = TestObject(id: 1, name: "name", foo: false)
let matcher = JsonMatcher<TestObject>(object: object)

let encoder = JSONEncoder()
let data = try encoder.encode(object)

XCTAssertTrue(matcher.matches(data: data))
}

func testMismatchingObjectDoesNotMatch() throws {
let object = TestObject(id: 1, name: "name", foo: false)
let matcher = JsonMatcher<TestObject>(object: object)

let otherObject = TestObject(id: 1, name: "other", foo: true)

let encoder = JSONEncoder()
let data = try encoder.encode(otherObject)

XCTAssertFalse(matcher.matches(data: data))
}

func testInstancesWithSameObjectMatch() {
let object = TestObject(id: 1, name: "name", foo: false)
let matcher1 = JsonMatcher<TestObject>(object: object)
let matcher2 = JsonMatcher<TestObject>(object: object)

XCTAssertEqual(matcher1, matcher2)
}

func testInstancesWithDifferentObjectDoNotMatch() {
let object1 = TestObject(id: 1, name: "name", foo: false)
let matcher1 = JsonMatcher<TestObject>(object: object1)

let object2 = TestObject(id: 2, name: "other", foo: true)
let matcher2 = JsonMatcher<TestObject>(object: object2)

XCTAssertNotEqual(matcher1, matcher2)
}

}

0 comments on commit 5af6c2f

Please sign in to comment.