diff --git a/Package.resolved b/Package.resolved index 8cc2eb4..defa6a5 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "c3efcfd33bc1490f59ae406e4e5292027b2d01cafee9fc625652213505df50fb", + "originHash" : "300df15f5af26da69cfcf959d16ee1b9eada6101dc105a17fc01ddd244d476b4", "pins" : [ { "identity" : "async-http-client", @@ -397,6 +397,15 @@ "version" : "1.6.3" } }, + { + "identity" : "swift-tagged", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-tagged", + "state" : { + "revision" : "3907a9438f5b57d317001dc99f3f11b46882272b", + "version" : "0.10.0" + } + }, { "identity" : "swift-url-routing", "kind" : "remoteSourceControl", diff --git a/Package.swift b/Package.swift index eef32ba..3eddbe8 100644 --- a/Package.swift +++ b/Package.swift @@ -26,6 +26,7 @@ let package = Package( .package(url: "https://github.com/apple/swift-nio.git", from: "2.65.0"), .package(url: "https://github.com/pointfreeco/swift-dependencies", from: "1.0.0"), .package(url: "https://github.com/pointfreeco/swift-snapshot-testing", from: "1.12.0"), + .package(url: "https://github.com/pointfreeco/swift-tagged", from: "0.6.0"), .package(url: "https://github.com/pointfreeco/swift-url-routing.git", from: "0.6.2"), .package(url: "https://github.com/pointfreeco/vapor-routing.git", from: "0.1.3"), .package(url: "https://github.com/pointfreeco/swift-case-paths.git", from: "1.6.0"), @@ -61,6 +62,12 @@ let package = Package( .product(name: "Vapor", package: "vapor"), ] ), + .testTarget( + name: "ApiRouteTests", + dependencies: [ + .target(name: "ManualDCore") + ] + ), .target( name: "AuthClient", dependencies: [ @@ -137,22 +144,17 @@ let package = Package( .target( name: "ManualDCore", dependencies: [ + .product(name: "CasePaths", package: "swift-case-paths"), .product(name: "Dependencies", package: "swift-dependencies"), .product(name: "Fluent", package: "fluent"), + .product(name: "Tagged", package: "swift-tagged"), .product(name: "URLRouting", package: "swift-url-routing"), - .product(name: "CasePaths", package: "swift-case-paths"), - ] - ), - .testTarget( - name: "ApiRouteTests", - dependencies: [ - .target(name: "ManualDCore") ] ), .target( name: "ManualDClient", dependencies: [ - "ManualDCore", + .target(name: "ManualDCore"), .product(name: "Dependencies", package: "swift-dependencies"), .product(name: "DependenciesMacros", package: "swift-dependencies"), ] diff --git a/Sources/App/Middleware/DependenciesMiddleware.swift b/Sources/App/Middleware/DependenciesMiddleware.swift index 8a16843..909d159 100644 --- a/Sources/App/Middleware/DependenciesMiddleware.swift +++ b/Sources/App/Middleware/DependenciesMiddleware.swift @@ -31,7 +31,7 @@ struct DependenciesMiddleware: AsyncMiddleware { try await values.yield { try await withDependencies { $0.apiController = apiController - $0.authClient = .live(on: request) + $0.auth = .live(on: request) $0.database = database // $0.dateFormatter = .liveValue $0.viewController = viewController diff --git a/Sources/AuthClient/Interface.swift b/Sources/AuthClient/Interface.swift index d8817b8..7c90812 100644 --- a/Sources/AuthClient/Interface.swift +++ b/Sources/AuthClient/Interface.swift @@ -5,17 +5,23 @@ import ManualDCore import Vapor extension DependencyValues { - public var authClient: AuthClient { + /// Authentication dependency, for handling authentication tasks. + public var auth: AuthClient { get { self[AuthClient.self] } set { self[AuthClient.self] = newValue } } } +/// Represents authentication tasks that are used in the application. @DependencyClient public struct AuthClient: Sendable { + /// Create a new user and log them in. public var createAndLogin: @Sendable (User.Create) async throws -> User + /// Get the current user. public var currentUser: @Sendable () throws -> User + /// Login a user. public var login: @Sendable (User.Login) async throws -> User + /// Logout a user. public var logout: @Sendable () throws -> Void } diff --git a/Sources/DatabaseClient/Interface.swift b/Sources/DatabaseClient/Interface.swift index 0af0de2..daf7862 100644 --- a/Sources/DatabaseClient/Interface.swift +++ b/Sources/DatabaseClient/Interface.swift @@ -4,22 +4,33 @@ import FluentKit import ManualDCore extension DependencyValues { + /// The database dependency. public var database: DatabaseClient { get { self[DatabaseClient.self] } set { self[DatabaseClient.self] = newValue } } } +/// Represents the database interactions used by the application. @DependencyClient public struct DatabaseClient: Sendable { + /// Database migrations. public var migrations: Migrations + /// Interactions with the projects table. public var projects: Projects + /// Interactions with the rooms table. public var rooms: Rooms + /// Interactions with the equipment table. public var equipment: Equipment + /// Interactions with the component losses table. public var componentLosses: ComponentLosses + /// Interactions with the equivalent lengths table. public var equivalentLengths: EquivalentLengths + /// Interactions with the users table. public var users: Users + /// Interactions with the user profiles table. public var userProfiles: UserProfiles + /// Interactions with the trunk sizes table. public var trunkSizes: TrunkSizes @DependencyClient @@ -147,23 +158,3 @@ extension DatabaseClient: TestDependencyKey { ) } } - -extension DatabaseClient.Migrations: DependencyKey { - public static let testValue = Self() - - public static let liveValue = Self( - all: { - [ - Project.Migrate(), - User.Migrate(), - User.Token.Migrate(), - User.Profile.Migrate(), - ComponentPressureLoss.Migrate(), - EquipmentInfo.Migrate(), - Room.Migrate(), - EquivalentLength.Migrate(), - TrunkSize.Migrate(), - ] - } - ) -} diff --git a/Sources/DatabaseClient/Internal/ComponentPressureLoss.swift b/Sources/DatabaseClient/Internal/ComponentLosses.swift similarity index 100% rename from Sources/DatabaseClient/Internal/ComponentPressureLoss.swift rename to Sources/DatabaseClient/Internal/ComponentLosses.swift diff --git a/Sources/DatabaseClient/Internal/EffectiveLength.swift b/Sources/DatabaseClient/Internal/EquivalentLengths.swift similarity index 100% rename from Sources/DatabaseClient/Internal/EffectiveLength.swift rename to Sources/DatabaseClient/Internal/EquivalentLengths.swift diff --git a/Sources/DatabaseClient/Internal/Migrations.swift b/Sources/DatabaseClient/Internal/Migrations.swift new file mode 100644 index 0000000..b5dd7ac --- /dev/null +++ b/Sources/DatabaseClient/Internal/Migrations.swift @@ -0,0 +1,22 @@ +import Dependencies +import ManualDCore + +extension DatabaseClient.Migrations: DependencyKey { + public static let testValue = Self() + + public static let liveValue = Self( + all: { + [ + Project.Migrate(), + User.Migrate(), + User.Token.Migrate(), + User.Profile.Migrate(), + ComponentPressureLoss.Migrate(), + EquipmentInfo.Migrate(), + Room.Migrate(), + EquivalentLength.Migrate(), + TrunkSize.Migrate(), + ] + } + ) +} diff --git a/Sources/DatabaseClient/Internal/UserProfile.swift b/Sources/DatabaseClient/Internal/UserProfiles.swift similarity index 100% rename from Sources/DatabaseClient/Internal/UserProfile.swift rename to Sources/DatabaseClient/Internal/UserProfiles.swift diff --git a/Sources/FileClient/Interface.swift b/Sources/FileClient/Interface.swift index 359f8ea..346b3fb 100644 --- a/Sources/FileClient/Interface.swift +++ b/Sources/FileClient/Interface.swift @@ -4,6 +4,7 @@ import Foundation import Vapor extension DependencyValues { + /// Dependency used for file operations. public var fileClient: FileClient { get { self[FileClient.self] } set { self[FileClient.self] = newValue } @@ -14,9 +15,27 @@ extension DependencyValues { public struct FileClient: Sendable { public typealias OnCompleteHandler = @Sendable () async throws -> Void - public var writeFile: @Sendable (String, String) async throws -> Void - public var removeFile: @Sendable (String) async throws -> Void - public var streamFile: @Sendable (String, @escaping OnCompleteHandler) async throws -> Response + /// Write contents to a file. + /// + /// > Warning: This will overwrite a file if it exists. + public var writeFile: @Sendable (_ contents: String, _ path: String) async throws -> Void + /// Remove a file. + public var removeFile: @Sendable (_ path: String) async throws -> Void + /// Stream a file. + public var streamFile: + @Sendable (_ path: String, @escaping OnCompleteHandler) async throws -> Response + + /// Stream a file at the given path. + /// + /// - Paramters: + /// - path: The path to the file to stream. + /// - onComplete: Completion handler to run when done streaming the file. + public func streamFile( + at path: String, + onComplete: @escaping OnCompleteHandler = {} + ) async throws -> Response { + try await streamFile(path, onComplete) + } } extension FileClient: TestDependencyKey { diff --git a/Sources/ManualDClient/Helpers.swift b/Sources/ManualDClient/Helpers.swift index a571926..79d45bd 100644 --- a/Sources/ManualDClient/Helpers.swift +++ b/Sources/ManualDClient/Helpers.swift @@ -97,16 +97,16 @@ func roundSize(_ size: Double) throws -> Int { } } -func velocity(cfm: Int, roundSize: Int) -> Int { - let cfm = Double(cfm) +func velocity(cfm: CFM, roundSize: Int) -> Int { + let cfm = Double(cfm.rawValue) let roundSize = Double(roundSize) let velocity = cfm / (pow(roundSize / 24, 2) * 3.14) return Int(round(velocity)) } -func flexSize(_ request: ManualDClient.DuctSizeRequest) throws -> Int { - let cfm = pow(Double(request.designCFM), 0.4) - let fr = pow(request.frictionRate / 1.76, 0.2) +func flexSize(_ cfm: CFM, _ frictionRate: DesignFrictionRate) throws -> Int { + let cfm = pow(Double(cfm.rawValue), 0.4) + let fr = pow(frictionRate.rawValue / 1.76, 0.2) let size = 0.55 * (cfm / fr) return try roundSize(size) } diff --git a/Sources/ManualDClient/Interface.swift b/Sources/ManualDClient/Interface.swift index 89ba90e..60aa216 100644 --- a/Sources/ManualDClient/Interface.swift +++ b/Sources/ManualDClient/Interface.swift @@ -4,6 +4,7 @@ import Logging import ManualDCore extension DependencyValues { + /// Dependency that performs manual-d duct sizing calculations. public var manualD: ManualDClient { get { self[ManualDClient.self] } set { self[ManualDClient.self] = newValue } @@ -15,12 +16,24 @@ extension DependencyValues { /// @DependencyClient public struct ManualDClient: Sendable { - public var ductSize: @Sendable (DuctSizeRequest) async throws -> DuctSizeResponse + public var ductSize: @Sendable (CFM, DesignFrictionRate) async throws -> DuctSizeResponse public var frictionRate: @Sendable (FrictionRateRequest) async throws -> FrictionRate - public var totalEquivalentLength: @Sendable (TotalEquivalentLengthRequest) async throws -> Int public var rectangularSize: @Sendable (RectangularSizeRequest) async throws -> RectangularSizeResponse + public func ductSize( + cfm designCFM: Int, + frictionRate designFrictionRate: Double + ) async throws -> DuctSizeResponse { + try await ductSize(.init(rawValue: designCFM), .init(rawValue: designFrictionRate)) + } + + public func ductSize( + cfm designCFM: Double, + frictionRate designFrictionRate: Double + ) async throws -> DuctSizeResponse { + try await ductSize(.init(rawValue: Int(designCFM)), .init(rawValue: designFrictionRate)) + } } extension ManualDClient: TestDependencyKey { @@ -29,19 +42,6 @@ extension ManualDClient: TestDependencyKey { extension ManualDClient { - public struct DuctSizeRequest: Codable, Equatable, Sendable { - public let designCFM: Int - public let frictionRate: Double - - public init( - designCFM: Int, - frictionRate: Double - ) { - self.designCFM = designCFM - self.frictionRate = frictionRate - } - } - public struct DuctSizeResponse: Codable, Equatable, Sendable { public let calculatedSize: Double @@ -82,31 +82,14 @@ extension ManualDClient { public struct FrictionRateResponse: Codable, Equatable, Sendable { public let availableStaticPressure: Double - public let frictionRate: Double + public let frictionRate: DesignFrictionRate - public init(availableStaticPressure: Double, frictionRate: Double) { + public init(availableStaticPressure: Double, frictionRate: DesignFrictionRate) { self.availableStaticPressure = availableStaticPressure self.frictionRate = frictionRate } } - public struct TotalEquivalentLengthRequest: Codable, Equatable, Sendable { - - public let trunkLengths: [Int] - public let runoutLengths: [Int] - public let effectiveLengthGroups: [EffectiveLengthGroup] - - public init( - trunkLengths: [Int], - runoutLengths: [Int], - effectiveLengthGroups: [EffectiveLengthGroup] - ) { - self.trunkLengths = trunkLengths - self.runoutLengths = runoutLengths - self.effectiveLengthGroups = effectiveLengthGroups - } - } - public struct RectangularSizeRequest: Codable, Equatable, Sendable { public let roundSize: Int public let height: Int diff --git a/Sources/ManualDClient/Live.swift b/Sources/ManualDClient/Live.swift index 62cd048..3ee2193 100644 --- a/Sources/ManualDClient/Live.swift +++ b/Sources/ManualDClient/Live.swift @@ -4,19 +4,19 @@ import ManualDCore extension ManualDClient: DependencyKey { public static let liveValue: Self = .init( - ductSize: { request in - guard request.designCFM > 0 else { + ductSize: { cfm, frictionRate in + guard cfm > 0 else { throw ManualDError(message: "Design CFM should be greater than 0.") } - let fr = pow(request.frictionRate, 0.5) - let ductulatorSize = pow(Double(request.designCFM) / (3.12 * fr), 0.38) + let fr = pow(frictionRate.rawValue, 0.5) + let ductulatorSize = pow(Double(cfm.rawValue) / (3.12 * fr), 0.38) let finalSize = try roundSize(ductulatorSize) - let flexSize = try flexSize(request) + let flexSize = try flexSize(cfm, frictionRate) return .init( calculatedSize: ductulatorSize, finalSize: finalSize, flexSize: flexSize, - velocity: velocity(cfm: request.designCFM, roundSize: finalSize) + velocity: velocity(cfm: cfm, roundSize: finalSize) ) }, frictionRate: { request in @@ -28,14 +28,17 @@ extension ManualDClient: DependencyKey { let totalComponentLosses = request.componentPressureLosses.total let availableStaticPressure = request.externalStaticPressure - totalComponentLosses let frictionRate = availableStaticPressure * 100.0 / Double(request.totalEffectiveLength) - return .init(availableStaticPressure: availableStaticPressure, value: frictionRate) - }, - totalEquivalentLength: { request in - let trunkLengths = request.trunkLengths.reduce(0) { $0 + $1 } - let runoutLengths = request.runoutLengths.reduce(0) { $0 + $1 } - let groupLengths = request.effectiveLengthGroups.totalEffectiveLength - return trunkLengths + runoutLengths + groupLengths + return .init( + availableStaticPressure: availableStaticPressure, + value: .init(rawValue: frictionRate) + ) }, + // totalEquivalentLength: { request in + // let trunkLengths = request.trunkLengths.reduce(0) { $0 + $1 } + // let runoutLengths = request.runoutLengths.reduce(0) { $0 + $1 } + // let groupLengths = request.effectiveLengthGroups.totalEffectiveLength + // return trunkLengths + runoutLengths + groupLengths + // }, rectangularSize: { request in let width = (Double.pi * (pow(Double(request.roundSize) / 2.0, 2.0))) / Double(request.height) return .init(height: request.height, width: Int(width.rounded(.toNearestOrEven))) diff --git a/Sources/ManualDCore/Extensions/Numbers+string.swift b/Sources/ManualDCore/Extensions/Numbers+string.swift index c633eb5..834689d 100644 --- a/Sources/ManualDCore/Extensions/Numbers+string.swift +++ b/Sources/ManualDCore/Extensions/Numbers+string.swift @@ -1,4 +1,17 @@ import Foundation +import Tagged + +extension Tagged where RawValue == Double { + public func string(digits: Int = 2) -> String { + rawValue.string(digits: digits) + } +} + +extension Tagged where RawValue == Int { + public func string() -> String { + rawValue.string() + } +} extension Double { diff --git a/Sources/ManualDCore/FrictionRate.swift b/Sources/ManualDCore/FrictionRate.swift index 5491529..79d2acd 100644 --- a/Sources/ManualDCore/FrictionRate.swift +++ b/Sources/ManualDCore/FrictionRate.swift @@ -7,13 +7,13 @@ public struct FrictionRate: Codable, Equatable, Sendable { /// minus the ``ComponentPressureLoss``es for the project. public let availableStaticPressure: Double /// The calculated design friction rate value. - public let value: Double + public let value: DesignFrictionRate /// Whether the design friction rate is within a valid range. public var hasErrors: Bool { error != nil } public init( availableStaticPressure: Double, - value: Double + value: DesignFrictionRate ) { self.availableStaticPressure = availableStaticPressure self.value = value diff --git a/Sources/ManualDCore/TaggedTypes.swift b/Sources/ManualDCore/TaggedTypes.swift new file mode 100644 index 0000000..4b2a84f --- /dev/null +++ b/Sources/ManualDCore/TaggedTypes.swift @@ -0,0 +1,7 @@ +import Tagged + +public enum CFMTag {} +public typealias CFM = Tagged + +public enum DesignFrictionRateTag {} +public typealias DesignFrictionRate = Tagged diff --git a/Sources/ProjectClient/Internal/ManualDClient+calculateDuctSizes.swift b/Sources/ProjectClient/Internal/ManualDClient+calculateDuctSizes.swift index d0c48c1..d66a71c 100644 --- a/Sources/ProjectClient/Internal/ManualDClient+calculateDuctSizes.swift +++ b/Sources/ProjectClient/Internal/ManualDClient+calculateDuctSizes.swift @@ -52,7 +52,8 @@ extension ManualDClient { let coolingCFM = coolingPercent * Double(sharedRequest.equipmentInfo.coolingCFM) let designCFM = DuctSizes.DesignCFM(heating: heatingCFM, cooling: coolingCFM) let sizes = try await self.ductSize( - .init(designCFM: Int(designCFM.value), frictionRate: sharedRequest.designFrictionRate) + cfm: designCFM.value, + frictionRate: sharedRequest.designFrictionRate ) for n in 1...room.registerCount { @@ -111,7 +112,8 @@ extension ManualDClient { let coolingCFM = coolingPercent * Double(sharedRequest.equipmentInfo.coolingCFM) let designCFM = DuctSizes.DesignCFM(heating: heatingCFM, cooling: coolingCFM) let sizes = try await self.ductSize( - .init(designCFM: Int(designCFM.value), frictionRate: sharedRequest.designFrictionRate) + cfm: designCFM.value, + frictionRate: sharedRequest.designFrictionRate ) var width: Int? = nil if let height = trunk.height { diff --git a/Sources/ProjectClient/Live.swift b/Sources/ProjectClient/Live.swift index 5f9a13a..fa0e4ee 100644 --- a/Sources/ProjectClient/Live.swift +++ b/Sources/ProjectClient/Live.swift @@ -42,13 +42,10 @@ extension ProjectClient: DependencyKey { request: database.makePdfRequest(projectID) ) - let response = try await fileClient.streamFile( - pdfResponse.pdfPath, - { - try await fileClient.removeFile(pdfResponse.htmlPath) - try await fileClient.removeFile(pdfResponse.pdfPath) - } - ) + let response = try await fileClient.streamFile(at: pdfResponse.pdfPath) { + try await fileClient.removeFile(pdfResponse.htmlPath) + try await fileClient.removeFile(pdfResponse.pdfPath) + } response.headers.replaceOrAdd(name: .contentType, value: "application/octet-stream") response.headers.replaceOrAdd( diff --git a/Sources/Styleguide/Badge.swift b/Sources/Styleguide/Badge.swift index 8384ac3..b1016c8 100644 --- a/Sources/Styleguide/Badge.swift +++ b/Sources/Styleguide/Badge.swift @@ -1,4 +1,5 @@ import Elementary +import Tagged public struct Badge: HTML, Sendable where Inner: Sendable { @@ -25,4 +26,12 @@ extension Badge where Inner == Number { public init(number: Double, digits: Int = 2) { self.inner = Number(number, digits: digits) } + + public init(number: Tagged) { + self.inner = Number(number.rawValue) + } + + public init(number: Tagged, digits: Int = 2) { + self.inner = Number(number.rawValue, digits: digits) + } } diff --git a/Sources/ViewController/Interface.swift b/Sources/ViewController/Interface.swift index 36012b5..c7c974d 100644 --- a/Sources/ViewController/Interface.swift +++ b/Sources/ViewController/Interface.swift @@ -54,14 +54,14 @@ extension ViewController: DependencyKey { extension ViewController.Request { func currentUser() throws -> User { - @Dependency(\.authClient.currentUser) var currentUser + @Dependency(\.auth.currentUser) var currentUser return try currentUser() } func authenticate( _ login: User.Login ) async throws -> User { - @Dependency(\.authClient) var auth + @Dependency(\.auth) var auth return try await auth.login(login) } @@ -69,7 +69,7 @@ extension ViewController.Request { func createAndAuthenticate( _ signup: User.Create ) async throws -> User { - @Dependency(\.authClient) var auth + @Dependency(\.auth) var auth return try await auth.createAndLogin(signup) } } diff --git a/Tests/ManualDClientTests/ManualDClientTests.swift b/Tests/ManualDClientTests/ManualDClientTests.swift index ce5d00f..9730792 100644 --- a/Tests/ManualDClientTests/ManualDClientTests.swift +++ b/Tests/ManualDClientTests/ManualDClientTests.swift @@ -24,59 +24,13 @@ struct ManualDClientTests { @Test func ductSize() async throws { - let response = try await manualD.ductSize( - .init(designCFM: 88, frictionRate: 0.06) - ) + let response = try await manualD.ductSize(88, 0.06) #expect(numberFormatter.string(for: response.calculatedSize) == "6.07") #expect(response.finalSize == 7) #expect(response.flexSize == 7) #expect(response.velocity == 329) } - // @Test - // func frictionRate() async throws { - // let response = try await manualD.frictionRate( - // .init( - // externalStaticPressure: 0.5, - // componentPressureLosses: .mock, - // totalEffectiveLength: 185 - // ) - // ) - // #expect(numberFormatter.string(for: response.availableStaticPressure) == "0.11") - // #expect(numberFormatter.string(for: response.frictionRate) == "0.06") - // } - - // @Test - // func frictionRateFails() async throws { - // await #expect(throws: ManualDError.self) { - // _ = try await manualD.frictionRate( - // .init( - // externalStaticPressure: 0.5, - // componentPressureLosses: .mock, - // totalEffectiveLength: 0 - // ) - // ) - // } - // } - - @Test - func totalEffectiveLength() async throws { - let response = try await manualD.totalEquivalentLength( - .init( - trunkLengths: [25], - runoutLengths: [10], - effectiveLengthGroups: [ - // NOTE: These are made up and may not correspond to actual manual-d group tel's. - EffectiveLengthGroup(group: 1, letter: "a", effectiveLength: 20, category: .supply), - EffectiveLengthGroup(group: 2, letter: "a", effectiveLength: 30, category: .supply), - EffectiveLengthGroup(group: 3, letter: "a", effectiveLength: 10, category: .supply), - EffectiveLengthGroup(group: 12, letter: "a", effectiveLength: 10, category: .supply), - ] - ) - ) - #expect(response == 105) - } - @Test func equivalentRectangularDuct() async throws { let response = try await manualD.rectangularSize(.init(round: 7, height: 8)) diff --git a/Tests/ViewControllerTests/ViewControllerTests.swift b/Tests/ViewControllerTests/ViewControllerTests.swift index 0452eca..96178b8 100644 --- a/Tests/ViewControllerTests/ViewControllerTests.swift +++ b/Tests/ViewControllerTests/ViewControllerTests.swift @@ -18,7 +18,7 @@ struct ViewControllerTests { func login() async throws { try await withDependencies { $0.viewController = .liveValue - $0.authClient = .failing + $0.auth = .failing } operation: { @Dependency(\.viewController) var viewController @@ -31,7 +31,7 @@ struct ViewControllerTests { func signup() async throws { try await withDependencies { $0.viewController = .liveValue - $0.authClient = .failing + $0.auth = .failing } operation: { @Dependency(\.viewController) var viewController @@ -163,7 +163,7 @@ struct ViewControllerTests { return try await withDependencies { $0.viewController = .liveValue - $0.authClient.currentUser = { user } + $0.auth.currentUser = { user } $0.database.userProfiles.fetch = { _ in profile } $0.manualD = .liveValue try await updateDependencies(&$0)