// Copyright © 2015 Abhishek Banthia import CoreModelKit import XCTest @testable import Clocker class SearchDataSourceTests: XCTestCase { private var subject: SearchDataSource! private func setupSubject(searchText: String = "") { let mockSearchField = NSSearchField() mockSearchField.stringValue = searchText subject = SearchDataSource(with: mockSearchField, location: .preferences) } private func setupMockData() { subject.searchTimezones("los") XCTAssertTrue(subject.calculateChangesets()) let mockTimezone = TimezoneData() mockTimezone.timezoneID = "PST" mockTimezone.formattedAddress = "Los Angeles" subject.setFilteredArrayValue([mockTimezone]) subject.searchTimezones("los") XCTAssertTrue(subject.calculateChangesets()) } override func tearDownWithError() throws { subject = nil try super.tearDownWithError() } func testSearchTimezones() { setupSubject(searchText: "") // Test capitalized string subject.searchTimezones("MUMBAI") XCTAssert(subject.timezoneFilteredArray.isEmpty == false) // Test sentence-cased string subject.searchTimezones("Delhi") XCTAssert(subject.timezoneFilteredArray.isEmpty == false) // Test lower-cased string subject.searchTimezones("california") XCTAssert(subject.timezoneFilteredArray.isEmpty == false) } func testCalculateChangesets() { setupSubject(searchText: "los") setupMockData() subject.cleanupFilterArray() subject.searchTimezones("los") XCTAssertTrue(subject.calculateChangesets()) } func testRetrieveResult() throws { setupSubject(searchText: "los") setupMockData() // 0 will translate to a city search result let result1 = subject.retrieveResult(0) let unwrap = try XCTUnwrap(result1) if let metadata = unwrap as? CoreModelKit.TimezoneData { XCTAssert(metadata.timezoneID == "PST") } // 1 will translate to a timezone search result let result2 = subject.retrieveResult(1) let unwrap2 = try XCTUnwrap(result2) if let metadata = unwrap2 as? TimezoneMetadata { XCTAssert(metadata.timezone.name == "America/Santa_Isabel") } // Test placeForRow let rowType = subject.placeForRow(0) XCTAssert(rowType == .city) let rowType1 = subject.placeForRow(1) XCTAssert(rowType1 == .timezone) // Test count XCTAssertEqual(subject.resultsCount(), 5) // Test retrieveFilteredResultFromGoogleAPI let firstResult = try XCTUnwrap(subject.retrieveFilteredResultFromGoogleAPI(0)) XCTAssert(firstResult.timezoneID == "PST") // filteredArray should only have a count of 1 XCTAssertNil(subject.retrieveFilteredResultFromGoogleAPI(1)) } func testTableViewDataSourceMethods() { let mockTableView = NSTableView(frame: CGRect.zero) setupSubject(searchText: "los") setupMockData() let resultsCount = subject.numberOfRows(in: mockTableView) XCTAssertEqual(resultsCount, 5) XCTAssert(subject.tableView(mockTableView, heightOfRow: 0) == 30) } func testRetrieveSelectedTimezone() { setupSubject(searchText: "los") setupMockData() let result = subject.retrieveSelectedTimezone(0) let possibleOutcomes = Set(["PDT", "PST"]) XCTAssert(possibleOutcomes.contains(result.timezone.abbreviation ?? "NA"), "Result timezone is actually \(result.timezone.abbreviation ?? "NA")") } func testRetrieveSelectedTimezoneWithEmptySearchField() { // Setup subject with an empty search field setupSubject(searchText: UserDefaultKeys.emptyString) subject.searchTimezones("los") XCTAssertFalse(subject.calculateChangesets()) let mockTimezone = TimezoneData() mockTimezone.timezoneID = "PST" mockTimezone.formattedAddress = "Los Angeles" subject.setFilteredArrayValue([mockTimezone]) subject.searchTimezones("los") XCTAssertFalse(subject.calculateChangesets()) let result = subject.retrieveSelectedTimezone(1) XCTAssert(result.timezone.abbreviation == "GMT") } func testRetrieveSelectedTimezoneWithEmptySearchFieldWithoutSearchResults() { // Setup subject with an empty search field setupSubject(searchText: "los") setupMockData() subject.cleanupFilterArray() let result = subject.retrieveResult(0) XCTAssertNil(result) } }