From 83bce9322516158dd8f048dc1ef5823c172d716b Mon Sep 17 00:00:00 2001 From: Justin Mazzocchi <2831158+jzzocc@users.noreply.github.com> Date: Wed, 9 Sep 2020 21:51:31 -0700 Subject: [PATCH] Cleanup --- ...Service.swift => InstanceURLService.swift} | 6 ++--- ...ts.swift => InstanceURLServiceTests.swift} | 8 +++--- .../ViewModels/AddIdentityViewModel.swift | 27 +++++++++++-------- .../Sources/ViewModels/RootViewModel.swift | 2 +- .../AddIdentityViewModelTests.swift | 10 +++---- .../ViewModelsTests/RootViewModelTests.swift | 6 ++--- 6 files changed, 32 insertions(+), 27 deletions(-) rename ServiceLayer/Sources/ServiceLayer/Services/{InstanceFilterService.swift => InstanceURLService.swift} (96%) rename ServiceLayer/Tests/ServiceLayerTests/{InstanceFilterTests.swift => InstanceURLServiceTests.swift} (89%) diff --git a/ServiceLayer/Sources/ServiceLayer/Services/InstanceFilterService.swift b/ServiceLayer/Sources/ServiceLayer/Services/InstanceURLService.swift similarity index 96% rename from ServiceLayer/Sources/ServiceLayer/Services/InstanceFilterService.swift rename to ServiceLayer/Sources/ServiceLayer/Services/InstanceURLService.swift index 3251387..e6b6941 100644 --- a/ServiceLayer/Sources/ServiceLayer/Services/InstanceFilterService.swift +++ b/ServiceLayer/Sources/ServiceLayer/Services/InstanceURLService.swift @@ -5,7 +5,7 @@ import Combine import Foundation import HTTP -public struct InstanceFilterService { +public struct InstanceURLService { private let httpClient: HTTPClient private var userDefaultsClient: UserDefaultsClient @@ -15,7 +15,7 @@ public struct InstanceFilterService { } } -public extension InstanceFilterService { +public extension InstanceURLService { func isFiltered(url: URL) -> Bool { guard let host = url.host else { return true } @@ -54,7 +54,7 @@ private struct UpdatedFilterTarget: DecodableTarget { let headers: HTTPHeaders? = nil } -private extension InstanceFilterService { +private extension InstanceURLService { var filter: BloomFilter { userDefaultsClient.updatedInstanceFilter ?? Self.defaultFilter } diff --git a/ServiceLayer/Tests/ServiceLayerTests/InstanceFilterTests.swift b/ServiceLayer/Tests/ServiceLayerTests/InstanceURLServiceTests.swift similarity index 89% rename from ServiceLayer/Tests/ServiceLayerTests/InstanceFilterTests.swift rename to ServiceLayer/Tests/ServiceLayerTests/InstanceURLServiceTests.swift index 57e2526..874fe39 100644 --- a/ServiceLayer/Tests/ServiceLayerTests/InstanceFilterTests.swift +++ b/ServiceLayer/Tests/ServiceLayerTests/InstanceURLServiceTests.swift @@ -8,9 +8,9 @@ import CombineExpectations import Stubbing import XCTest -class InstanceFilterServiceTests: XCTestCase { +class InstanceURLServiceTests: XCTestCase { func testFiltering() throws { - let sut = InstanceFilterService(environment: .mock()) + let sut = InstanceURLService(environment: .mock()) let unfilteredInstanceURL = URL(string: "https://unfiltered.instance")! let filteredInstanceURL = URL(string: "https://filtered.instance")! let subdomainFilteredInstanceURL = URL(string: "https://subdomain.filtered.instance")! @@ -22,7 +22,7 @@ class InstanceFilterServiceTests: XCTestCase { func testUpdating() throws { let environment = AppEnvironment.mock() - var sut = InstanceFilterService(environment: environment) + var sut = InstanceURLService(environment: environment) let previouslyFilteredInstanceURL = URL(string: "https://filtered.instance")! let newlyFilteredInstanceURL = URL(string: "https://instance.filtered")! @@ -45,7 +45,7 @@ class InstanceFilterServiceTests: XCTestCase { XCTAssertFalse(sut.isFiltered(url: previouslyFilteredInstanceURL)) XCTAssertTrue(sut.isFiltered(url: newlyFilteredInstanceURL)) - sut = InstanceFilterService(environment: environment) + sut = InstanceURLService(environment: environment) XCTAssertFalse(sut.isFiltered(url: previouslyFilteredInstanceURL)) XCTAssertTrue(sut.isFiltered(url: newlyFilteredInstanceURL)) diff --git a/ViewModels/Sources/ViewModels/AddIdentityViewModel.swift b/ViewModels/Sources/ViewModels/AddIdentityViewModel.swift index b1d7a6a..e01b5bd 100644 --- a/ViewModels/Sources/ViewModels/AddIdentityViewModel.swift +++ b/ViewModels/Sources/ViewModels/AddIdentityViewModel.swift @@ -15,13 +15,13 @@ public final class AddIdentityViewModel: ObservableObject { public let addedIdentityID: AnyPublisher private let allIdentitiesService: AllIdentitiesService - private let instanceFilterService: InstanceFilterService + private let instanceURLService: InstanceURLService private let addedIdentityIDSubject = PassthroughSubject() private var cancellables = Set() - init(allIdentitiesService: AllIdentitiesService, instanceFilterService: InstanceFilterService) { + init(allIdentitiesService: AllIdentitiesService, instanceURLService: InstanceURLService) { self.allIdentitiesService = allIdentitiesService - self.instanceFilterService = instanceFilterService + self.instanceURLService = instanceURLService addedIdentityID = addedIdentityIDSubject.eraseToAnyPublisher() } } @@ -36,7 +36,7 @@ public extension AddIdentityViewModel { } func refreshFilter() { - instanceFilterService.updateFilter() + instanceURLService.updateFilter() .sink { _ in } .store(in: &cancellables) } @@ -46,21 +46,26 @@ private extension AddIdentityViewModel { private static let filteredURL = URL(string: "https://filtered")! private static let HTTPSPrefix = "https://" + static func url(fieldText: String) -> URL? { + if fieldText.hasPrefix(HTTPSPrefix), let prefixedURL = URL(string: fieldText) { + return prefixedURL + } else if let unprefixedURL = URL(string: HTTPSPrefix + fieldText) { + return unprefixedURL + } + + return nil + } + func addIdentity(authenticated: Bool) { let identityID = UUID() - let url: URL - if urlFieldText.hasPrefix(Self.HTTPSPrefix), let prefixedURL = URL(string: urlFieldText) { - url = prefixedURL - } else if let unprefixedURL = URL(string: Self.HTTPSPrefix + urlFieldText) { - url = unprefixedURL - } else { + guard let url = Self.url(fieldText: urlFieldText) else { alertItem = AlertItem(error: AddIdentityError.unableToConnectToInstance) return } - if instanceFilterService.isFiltered(url: url) { + if instanceURLService.isFiltered(url: url) { loading = true DispatchQueue.main.asyncAfter(deadline: .now() + .random(in: 0.01...0.1)) { diff --git a/ViewModels/Sources/ViewModels/RootViewModel.swift b/ViewModels/Sources/ViewModels/RootViewModel.swift index 784b4bb..00dfc2f 100644 --- a/ViewModels/Sources/ViewModels/RootViewModel.swift +++ b/ViewModels/Sources/ViewModels/RootViewModel.swift @@ -51,7 +51,7 @@ public extension RootViewModel { func addIdentityViewModel() -> AddIdentityViewModel { AddIdentityViewModel( allIdentitiesService: allIdentitiesService, - instanceFilterService: InstanceFilterService(environment: environment)) + instanceURLService: InstanceURLService(environment: environment)) } } diff --git a/ViewModels/Tests/ViewModelsTests/AddIdentityViewModelTests.swift b/ViewModels/Tests/ViewModelsTests/AddIdentityViewModelTests.swift index 54993cb..9678eac 100644 --- a/ViewModels/Tests/ViewModelsTests/AddIdentityViewModelTests.swift +++ b/ViewModels/Tests/ViewModelsTests/AddIdentityViewModelTests.swift @@ -15,7 +15,7 @@ class AddIdentityViewModelTests: XCTestCase { let environment = AppEnvironment.mock() let sut = AddIdentityViewModel( allIdentitiesService: try AllIdentitiesService(environment: environment), - instanceFilterService: InstanceFilterService(environment: environment)) + instanceURLService: InstanceURLService(environment: environment)) let addedIDRecorder = sut.addedIdentityID.record() sut.urlFieldText = "https://mastodon.social" @@ -28,7 +28,7 @@ class AddIdentityViewModelTests: XCTestCase { let environment = AppEnvironment.mock() let sut = AddIdentityViewModel( allIdentitiesService: try AllIdentitiesService(environment: environment), - instanceFilterService: InstanceFilterService(environment: environment)) + instanceURLService: InstanceURLService(environment: environment)) let addedIDRecorder = sut.addedIdentityID.record() sut.urlFieldText = "mastodon.social" @@ -41,7 +41,7 @@ class AddIdentityViewModelTests: XCTestCase { let environment = AppEnvironment.mock() let sut = AddIdentityViewModel( allIdentitiesService: try AllIdentitiesService(environment: environment), - instanceFilterService: InstanceFilterService(environment: environment)) + instanceURLService: InstanceURLService(environment: environment)) let recorder = sut.$alertItem.record() XCTAssertNil(try wait(for: recorder.next(), timeout: 1)) @@ -51,14 +51,14 @@ class AddIdentityViewModelTests: XCTestCase { let alertItem = try wait(for: recorder.next(), timeout: 1) - XCTAssertEqual((alertItem?.error as? URLError)?.code, URLError.badURL) + XCTAssertEqual((alertItem?.error as? AddIdentityError), AddIdentityError.unableToConnectToInstance) } func testDoesNotAlertCanceledLogin() throws { let environment = AppEnvironment.mock(webAuthSessionType: CanceledLoginMockWebAuthSession.self) let sut = AddIdentityViewModel( allIdentitiesService: try AllIdentitiesService(environment: environment), - instanceFilterService: InstanceFilterService(environment: environment)) + instanceURLService: InstanceURLService(environment: environment)) let recorder = sut.$alertItem.record() XCTAssertNil(try wait(for: recorder.next(), timeout: 1)) diff --git a/ViewModels/Tests/ViewModelsTests/RootViewModelTests.swift b/ViewModels/Tests/ViewModelsTests/RootViewModelTests.swift index e8ff3f1..1e4197c 100644 --- a/ViewModels/Tests/ViewModelsTests/RootViewModelTests.swift +++ b/ViewModels/Tests/ViewModelsTests/RootViewModelTests.swift @@ -14,7 +14,7 @@ class RootViewModelTests: XCTestCase { let sut = try RootViewModel( environment: .mock(), registerForRemoteNotifications: { Empty().setFailureType(to: Error.self).eraseToAnyPublisher() }) - let recorder = sut.$identification.record() + let recorder = sut.$navigationViewModel.record() XCTAssertNil(try wait(for: recorder.next(), timeout: 1)) @@ -27,8 +27,8 @@ class RootViewModelTests: XCTestCase { addIdentityViewModel.urlFieldText = "https://mastodon.social" addIdentityViewModel.logInTapped() - let mainNavigationViewModel = try wait(for: recorder.next(), timeout: 1)! + let navigationViewModel = try wait(for: recorder.next(), timeout: 1)! - XCTAssertNotNil(mainNavigationViewModel) + XCTAssertNotNil(navigationViewModel) } }