Refactoring
This commit is contained in:
parent
c2e97de97b
commit
ebfc69e247
|
@ -144,6 +144,7 @@
|
||||||
D0EC8DCC24DFA06700A08489 /* IdentitiesService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EC8DCA24DFA06700A08489 /* IdentitiesService.swift */; };
|
D0EC8DCC24DFA06700A08489 /* IdentitiesService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EC8DCA24DFA06700A08489 /* IdentitiesService.swift */; };
|
||||||
D0EC8DCE24DFB64200A08489 /* AuthenticationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EC8DCD24DFB64200A08489 /* AuthenticationService.swift */; };
|
D0EC8DCE24DFB64200A08489 /* AuthenticationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EC8DCD24DFB64200A08489 /* AuthenticationService.swift */; };
|
||||||
D0EC8DCF24DFB64200A08489 /* AuthenticationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EC8DCD24DFB64200A08489 /* AuthenticationService.swift */; };
|
D0EC8DCF24DFB64200A08489 /* AuthenticationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EC8DCD24DFB64200A08489 /* AuthenticationService.swift */; };
|
||||||
|
D0EC8DD424DFE38900A08489 /* AuthenticationServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EC8DD324DFE38900A08489 /* AuthenticationServiceTests.swift */; };
|
||||||
D0ED1B6E24CE100C00B4899C /* AddIdentityViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ED1B6D24CE100C00B4899C /* AddIdentityViewModelTests.swift */; };
|
D0ED1B6E24CE100C00B4899C /* AddIdentityViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ED1B6D24CE100C00B4899C /* AddIdentityViewModelTests.swift */; };
|
||||||
D0ED1BB724CE47F400B4899C /* WebAuthSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ED1BB624CE47F400B4899C /* WebAuthSession.swift */; };
|
D0ED1BB724CE47F400B4899C /* WebAuthSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ED1BB624CE47F400B4899C /* WebAuthSession.swift */; };
|
||||||
D0ED1BB824CE47F400B4899C /* WebAuthSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ED1BB624CE47F400B4899C /* WebAuthSession.swift */; };
|
D0ED1BB824CE47F400B4899C /* WebAuthSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ED1BB624CE47F400B4899C /* WebAuthSession.swift */; };
|
||||||
|
@ -251,6 +252,7 @@
|
||||||
D0EC8DC724DF8B3C00A08489 /* SecretsService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretsService.swift; sourceTree = "<group>"; };
|
D0EC8DC724DF8B3C00A08489 /* SecretsService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretsService.swift; sourceTree = "<group>"; };
|
||||||
D0EC8DCA24DFA06700A08489 /* IdentitiesService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdentitiesService.swift; sourceTree = "<group>"; };
|
D0EC8DCA24DFA06700A08489 /* IdentitiesService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdentitiesService.swift; sourceTree = "<group>"; };
|
||||||
D0EC8DCD24DFB64200A08489 /* AuthenticationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationService.swift; sourceTree = "<group>"; };
|
D0EC8DCD24DFB64200A08489 /* AuthenticationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationService.swift; sourceTree = "<group>"; };
|
||||||
|
D0EC8DD324DFE38900A08489 /* AuthenticationServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationServiceTests.swift; sourceTree = "<group>"; };
|
||||||
D0ED1B6D24CE100C00B4899C /* AddIdentityViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddIdentityViewModelTests.swift; sourceTree = "<group>"; };
|
D0ED1B6D24CE100C00B4899C /* AddIdentityViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddIdentityViewModelTests.swift; sourceTree = "<group>"; };
|
||||||
D0ED1BB624CE47F400B4899C /* WebAuthSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebAuthSession.swift; sourceTree = "<group>"; };
|
D0ED1BB624CE47F400B4899C /* WebAuthSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebAuthSession.swift; sourceTree = "<group>"; };
|
||||||
D0ED1BC024CED48800B4899C /* HTTPClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPClient.swift; sourceTree = "<group>"; };
|
D0ED1BC024CED48800B4899C /* HTTPClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPClient.swift; sourceTree = "<group>"; };
|
||||||
|
@ -428,8 +430,9 @@
|
||||||
D0666A2224C677B400F3F04B /* Tests */ = {
|
D0666A2224C677B400F3F04B /* Tests */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
D0ED1B6C24CE0EED00B4899C /* View Models */,
|
|
||||||
D0666A2524C677B400F3F04B /* Info.plist */,
|
D0666A2524C677B400F3F04B /* Info.plist */,
|
||||||
|
D0EC8DD024DFE34F00A08489 /* Services */,
|
||||||
|
D0ED1B6C24CE0EED00B4899C /* View Models */,
|
||||||
);
|
);
|
||||||
path = Tests;
|
path = Tests;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -531,6 +534,14 @@
|
||||||
path = "Mastodon API Stubs";
|
path = "Mastodon API Stubs";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
D0EC8DD024DFE34F00A08489 /* Services */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
D0EC8DD324DFE38900A08489 /* AuthenticationServiceTests.swift */,
|
||||||
|
);
|
||||||
|
path = Services;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
D0ED1B6C24CE0EED00B4899C /* View Models */ = {
|
D0ED1B6C24CE0EED00B4899C /* View Models */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -914,6 +925,7 @@
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
D0EC8DD424DFE38900A08489 /* AuthenticationServiceTests.swift in Sources */,
|
||||||
D0ED1B6E24CE100C00B4899C /* AddIdentityViewModelTests.swift in Sources */,
|
D0ED1B6E24CE100C00B4899C /* AddIdentityViewModelTests.swift in Sources */,
|
||||||
D052BBC724D749C800A80A7A /* RootViewModelTests.swift in Sources */,
|
D052BBC724D749C800A80A7A /* RootViewModelTests.swift in Sources */,
|
||||||
);
|
);
|
||||||
|
|
|
@ -4,36 +4,33 @@ import Foundation
|
||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
class IdentityService {
|
class IdentityService {
|
||||||
@Published var identity: Identity
|
@Published private(set) var identity: Identity
|
||||||
let observationErrors: AnyPublisher<Error, Never>
|
let observationErrors: AnyPublisher<Error, Never>
|
||||||
|
|
||||||
private let networkClient: MastodonClient
|
private let networkClient: MastodonClient
|
||||||
private let environment: AppEnvironment
|
private let environment: AppEnvironment
|
||||||
private let observationErrorsInput = PassthroughSubject<Error, Never>()
|
private let observationErrorsInput = PassthroughSubject<Error, Never>()
|
||||||
private var cancellables = Set<AnyCancellable>()
|
|
||||||
|
|
||||||
init(identityID: UUID, environment: AppEnvironment) throws {
|
init(identityID: UUID, environment: AppEnvironment) throws {
|
||||||
self.environment = environment
|
self.environment = environment
|
||||||
observationErrors = observationErrorsInput.eraseToAnyPublisher()
|
observationErrors = observationErrorsInput.eraseToAnyPublisher()
|
||||||
networkClient = MastodonClient(configuration: environment.URLSessionConfiguration)
|
|
||||||
networkClient.accessToken = try SecretsService(
|
|
||||||
identityID: identityID,
|
|
||||||
keychainService: environment.keychainService)
|
|
||||||
.item(.accessToken)
|
|
||||||
|
|
||||||
let observation = environment.identityDatabase.identityObservation(id: identityID).share()
|
let observation = environment.identityDatabase.identityObservation(id: identityID).share()
|
||||||
|
|
||||||
var initialIdentity: Identity?
|
var initialIdentity: Identity?
|
||||||
|
|
||||||
observation.first().sink(
|
_ = observation.first().sink(
|
||||||
receiveCompletion: { _ in },
|
receiveCompletion: { _ in },
|
||||||
receiveValue: { initialIdentity = $0 })
|
receiveValue: { initialIdentity = $0 })
|
||||||
.store(in: &cancellables)
|
|
||||||
|
|
||||||
guard let identity = initialIdentity else { throw IdentityDatabaseError.identityNotFound }
|
guard let identity = initialIdentity else { throw IdentityDatabaseError.identityNotFound }
|
||||||
|
|
||||||
self.identity = identity
|
self.identity = identity
|
||||||
|
networkClient = MastodonClient(configuration: environment.URLSessionConfiguration)
|
||||||
networkClient.instanceURL = identity.url
|
networkClient.instanceURL = identity.url
|
||||||
|
networkClient.accessToken = try SecretsService(
|
||||||
|
identityID: identityID,
|
||||||
|
keychainService: environment.keychainService)
|
||||||
|
.item(.accessToken)
|
||||||
|
|
||||||
observation.catch { [weak self] error -> Empty<Identity, Never> in
|
observation.catch { [weak self] error -> Empty<Identity, Never> in
|
||||||
self?.observationErrorsInput.send(error)
|
self?.observationErrorsInput.send(error)
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
// Copyright © 2020 Metabolist. All rights reserved.
|
||||||
|
|
||||||
|
import XCTest
|
||||||
|
import Combine
|
||||||
|
import CombineExpectations
|
||||||
|
@testable import Metatext
|
||||||
|
|
||||||
|
class AuthenticationServiceTests: XCTestCase {
|
||||||
|
func testAddIdentity() throws {
|
||||||
|
let environment = AppEnvironment.fresh()
|
||||||
|
let sut = AuthenticationService(environment: environment)
|
||||||
|
let instanceURL = URL(string: "https://mastodon.social")!
|
||||||
|
let addedIDRecorder = sut.authenticate(instanceURL: instanceURL).record()
|
||||||
|
|
||||||
|
let addedIdentityID = try wait(for: addedIDRecorder.next(), timeout: 1)
|
||||||
|
let identityRecorder = environment.identityDatabase.identityObservation(id: addedIdentityID).record()
|
||||||
|
let addedIdentity = try wait(for: identityRecorder.next(), timeout: 1)
|
||||||
|
|
||||||
|
XCTAssertEqual(addedIdentity.id, addedIdentityID)
|
||||||
|
XCTAssertEqual(addedIdentity.url, URL(string: "https://mastodon.social")!)
|
||||||
|
|
||||||
|
let secretsService = SecretsService(identityID: addedIdentity.id, keychainService: environment.keychainService)
|
||||||
|
|
||||||
|
XCTAssertEqual(
|
||||||
|
try secretsService.item(.clientID) as String?, "AUTHORIZATION_CLIENT_ID_STUB_VALUE")
|
||||||
|
XCTAssertEqual(
|
||||||
|
try secretsService.item(.clientSecret) as String?, "AUTHORIZATION_CLIENT_SECRET_STUB_VALUE")
|
||||||
|
XCTAssertEqual(
|
||||||
|
try secretsService.item(.accessToken) as String?, "ACCESS_TOKEN_STUB_VALUE")
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,17 +18,7 @@ class AddIdentityViewModelTests: XCTestCase {
|
||||||
let identityRecorder = environment.identityDatabase.identityObservation(id: addedIdentityID).record()
|
let identityRecorder = environment.identityDatabase.identityObservation(id: addedIdentityID).record()
|
||||||
let addedIdentity = try wait(for: identityRecorder.next(), timeout: 1)
|
let addedIdentity = try wait(for: identityRecorder.next(), timeout: 1)
|
||||||
|
|
||||||
XCTAssertEqual(addedIdentity.id, addedIdentityID)
|
|
||||||
XCTAssertEqual(addedIdentity.url, URL(string: "https://mastodon.social")!)
|
XCTAssertEqual(addedIdentity.url, URL(string: "https://mastodon.social")!)
|
||||||
|
|
||||||
let secretsService = SecretsService(identityID: addedIdentity.id, keychainService: environment.keychainService)
|
|
||||||
|
|
||||||
XCTAssertEqual(
|
|
||||||
try secretsService.item(.clientID) as String?, "AUTHORIZATION_CLIENT_ID_STUB_VALUE")
|
|
||||||
XCTAssertEqual(
|
|
||||||
try secretsService.item(.clientSecret) as String?, "AUTHORIZATION_CLIENT_SECRET_STUB_VALUE")
|
|
||||||
XCTAssertEqual(
|
|
||||||
try secretsService.item(.accessToken) as String?, "ACCESS_TOKEN_STUB_VALUE")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func testAddIdentityWithoutScheme() throws {
|
func testAddIdentityWithoutScheme() throws {
|
||||||
|
|
Loading…
Reference in New Issue