From f5b45e7e69d268726e4c46c215f91e220c98bb78 Mon Sep 17 00:00:00 2001 From: Adam Rocska Date: Thu, 4 Jun 2020 14:35:45 +0200 Subject: [PATCH] Reader coverage. Signed-off-by: Adam Rocska --- Sources/Api/Reader.swift | 4 +- Tests/ApiTests/ReaderTest.swift | 78 +++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 Tests/ApiTests/ReaderTest.swift diff --git a/Sources/Api/Reader.swift b/Sources/Api/Reader.swift index 5372405..bd06cfe 100644 --- a/Sources/Api/Reader.swift +++ b/Sources/Api/Reader.swift @@ -5,9 +5,7 @@ public class Reader where Model: DictionaryInitialisable { private let dbReader: DBReader.Reader - init(dbReader: DBReader.Reader) { - self.dbReader = dbReader - } + init(dbReader: DBReader.Reader) { self.dbReader = dbReader } func lookup(_ ip: IpAddress) -> Model? { guard let dictionary = dbReader.get(ip) else { return nil } diff --git a/Tests/ApiTests/ReaderTest.swift b/Tests/ApiTests/ReaderTest.swift new file mode 100644 index 0000000..3a7d870 --- /dev/null +++ b/Tests/ApiTests/ReaderTest.swift @@ -0,0 +1,78 @@ +import Foundation +import XCTest +@testable import struct MetadataReader.Metadata +@testable import class Api.Reader +import enum Decoder.Payload +import enum IndexReader.IpAddress +import protocol Api.DictionaryInitialisable +import protocol DBReader.Reader + +fileprivate typealias ApiReader = Api.Reader +fileprivate typealias DBReaderReader = DBReader.Reader + +class ReaderTest: XCTestCase { + + func testLookup_returnsNilIfDbReaderLookupResolvedNil() { + let expectedIp: IpAddress = .v4("127.0.0.1") + var dbReaderLookupCalled = false + let mockDBReader = MockDBReader { actualIp in + XCTAssertEqual(expectedIp, actualIp) + dbReaderLookupCalled = true + return nil + } + let reader = ApiReader(dbReader: mockDBReader) + XCTAssertNil(reader.lookup(expectedIp)) + XCTAssertTrue(dbReaderLookupCalled) + } + + func testLookup_returnsTheConstructedModelIfResolved() { + let expectedIp: IpAddress = .v4("127.0.0.1") + var dbReaderLookupCalled = false + let stubDictionary = [ + "testString": Payload.utf8String("test"), + "testMap": Payload.map(["key": Payload.int32(123)]) + ] + let mockDBReader = MockDBReader { actualIp in + XCTAssertEqual(expectedIp, actualIp) + dbReaderLookupCalled = true + return stubDictionary + } + let reader = ApiReader(dbReader: mockDBReader) + let model = reader.lookup(expectedIp) + XCTAssertEqual(stubDictionary, model?.dictionary) + } + +} + +fileprivate class MockDBReader: DBReaderReader { + var metadata = Metadata( + nodeCount: 0, + recordSize: 0, + ipVersion: 0, + databaseType: "", + languages: [], + binaryFormatMajorVersion: 0, + binaryFormatMinorVersion: 0, + buildEpoch: 0, + description: [:], + metadataSectionSize: 0, + databaseSize: 0 + ) + + private let mockGet: (IpAddress) -> [String: Payload]? + + init(mockGet: @escaping (IpAddress) -> [String: Payload]?) { + self.mockGet = mockGet + } + + func get(_ ip: IpAddress) -> [String: Payload]? { return mockGet(ip) } + +} + +struct MockModel: DictionaryInitialisable { + + let dictionary: [String: Payload]? + + init(_ dictionary: [String: Payload]?) { self.dictionary = dictionary } + +} \ No newline at end of file