metatext/Development Assets/DevelopmentModels.swift

134 lines
4.2 KiB
Swift
Raw Normal View History

2020-07-31 21:40:57 +00:00
// Copyright © 2020 Metabolist. All rights reserved.
import Foundation
import Combine
// swiftlint:disable force_try
private let decoder = MastodonDecoder()
private var cancellables = Set<AnyCancellable>()
2020-08-02 22:23:01 +00:00
private let devInstanceURL = URL(string: "https://mastodon.social")!
2020-07-31 21:40:57 +00:00
private let devIdentityID = "DEVELOPMENT_IDENTITY_ID"
2020-08-02 22:23:01 +00:00
private let devAccessToken = "DEVELOPMENT_ACCESS_TOKEN"
2020-07-31 21:40:57 +00:00
extension Secrets {
2020-08-02 22:23:01 +00:00
static func fresh() -> Secrets { Secrets(keychain: FakeKeychain()) }
2020-07-31 21:40:57 +00:00
static let development: Secrets = {
2020-08-02 22:23:01 +00:00
let secrets = Secrets.fresh()
2020-07-31 21:40:57 +00:00
try! secrets.set("DEVELOPMENT_CLIENT_ID", forItem: .clientID, forIdentityID: devIdentityID)
try! secrets.set("DEVELOPMENT_CLIENT_SECRET", forItem: .clientSecret, forIdentityID: devIdentityID)
2020-08-02 22:23:01 +00:00
try! secrets.set(devAccessToken, forItem: .accessToken, forIdentityID: devIdentityID)
2020-07-31 21:40:57 +00:00
return secrets
}()
}
2020-08-02 22:23:01 +00:00
extension Preferences {
static func fresh() -> Preferences { Preferences(userDefaults: FakeUserDefaults()) }
static let development: Preferences = {
let preferences = Preferences.fresh()
preferences[.recentIdentityID] = devIdentityID
return preferences
}()
}
2020-07-31 21:40:57 +00:00
extension MastodonClient {
2020-08-02 22:23:01 +00:00
static func fresh() -> MastodonClient { MastodonClient(configuration: .stubbing) }
static let development: MastodonClient = {
let client = MastodonClient.fresh()
client.instanceURL = devInstanceURL
client.accessToken = devAccessToken
return client
}()
2020-07-31 21:40:57 +00:00
}
extension Account {
static let development = try! decoder.decode(Account.self, from: Data(officialAccountJSON.utf8))
}
extension Instance {
static let development = try! decoder.decode(Instance.self, from: Data(officialInstanceJSON.utf8))
}
extension IdentityDatabase {
2020-08-02 22:23:01 +00:00
static func fresh() -> IdentityDatabase { try! IdentityDatabase(inMemory: true) }
2020-07-31 21:40:57 +00:00
static var development: IdentityDatabase = {
2020-08-02 22:23:01 +00:00
let db = IdentityDatabase.fresh()
2020-07-31 21:40:57 +00:00
2020-08-02 22:23:01 +00:00
db.createIdentity(id: devIdentityID, url: devInstanceURL)
2020-07-31 21:40:57 +00:00
.receive(on: ImmediateScheduler.shared)
.sink(receiveCompletion: { _ in }, receiveValue: { _ in })
.store(in: &cancellables)
db.updateAccount(.development, forIdentityID: devIdentityID)
.receive(on: ImmediateScheduler.shared)
.sink(receiveCompletion: { _ in }, receiveValue: { _ in })
.store(in: &cancellables)
db.updateInstance(.development, forIdentityID: devIdentityID)
.receive(on: ImmediateScheduler.shared)
.sink(receiveCompletion: { _ in }, receiveValue: { _ in })
.store(in: &cancellables)
return db
}()
}
extension Identity {
2020-08-02 07:02:03 +00:00
static let development: Identity = {
var identity: Identity?
IdentityDatabase.development.identityObservation(id: devIdentityID)
.assertNoFailure()
.sink(receiveValue: { identity = $0 })
.store(in: &cancellables)
return identity!
}()
2020-07-31 21:40:57 +00:00
}
2020-08-02 22:23:01 +00:00
extension AppEnvironment {
static func fresh(
2020-08-03 15:20:51 +00:00
URLSessionConfiguration: URLSessionConfiguration = .stubbing,
2020-08-02 22:23:01 +00:00
identityDatabase: IdentityDatabase = .fresh(),
preferences: Preferences = .fresh(),
secrets: Secrets = .fresh(),
webAuthSessionType: WebAuthSession.Type = SuccessfulStubbingWebAuthSession.self) -> AppEnvironment {
AppEnvironment(
2020-08-03 15:20:51 +00:00
URLSessionConfiguration: URLSessionConfiguration,
2020-08-02 22:23:01 +00:00
identityDatabase: identityDatabase,
preferences: preferences,
secrets: secrets,
webAuthSessionType: webAuthSessionType)
}
static let development = AppEnvironment(
2020-08-03 15:20:51 +00:00
URLSessionConfiguration: .stubbing,
2020-07-31 21:40:57 +00:00
identityDatabase: .development,
2020-08-02 22:23:01 +00:00
preferences: .development,
secrets: .development,
webAuthSessionType: SuccessfulStubbingWebAuthSession.self)
}
2020-08-03 15:20:51 +00:00
extension RootViewModel {
static let development = RootViewModel(environment: .development)
}
extension MainNavigationViewModel {
static let development = RootViewModel.development.mainNavigationViewModel(identityID: devIdentityID)!
}
extension SettingsViewModel {
static let development = MainNavigationViewModel.development.settingsViewModel()
2020-07-31 21:40:57 +00:00
}
// swiftlint:enable force_try