Files
swift-hvac-toolbox/Tests/ViewControllerTests/ViewControllerTests.swift
Michael Housh a44cc6975d
Some checks failed
CI / ubuntu (push) Failing after 7m22s
CI / macOS (debug, 16.2) (push) Has been cancelled
CI / macOS (release, 16.2) (push) Has been cancelled
feat: Adds psi to feet of head conversion.
2025-03-07 16:27:03 -05:00

158 lines
4.9 KiB
Swift

import Dependencies
import Elementary
import HTMLSnapshotTesting
import Logging
import OrderedCollections
import PsychrometricClientLive
import Routes
import SnapshotTesting
import Testing
@testable import ViewController
@Suite("ViewControllerTests")
struct ViewControllerTests {
let record = SnapshotTestingConfiguration.Record.missing
let logger = Logger(label: "ViewControllerTests")
// swiftlint:disable function_body_length
@Test
func snapShotTests() async throws {
try await withSnapshotTesting(record: record) {
try await withDependencies {
$0.viewController = .liveValue
$0.psychrometricClient = .liveValue
} operation: {
@Dependency(\.viewController) var viewController
let arguments = OrderedSet([
// Attic ventilation
SiteRoute.View.atticVentilation(.index),
.atticVentilation(.submit(.init(
pressureDifferential: 1,
outdoorTemperature: 76,
outdoorDewpoint: 67,
atticTemperature: 76,
atticDewpoint: 76,
atticFloorArea: 1234
))),
// Capacitor
.capacitor(.index),
.capacitor(.index(mode: .size)),
.capacitor(.index(mode: .test)),
.capacitor(.submit(.size(.init(runningAmps: 10.7, lineVoltage: 243, powerFactor: 0.86)))),
.capacitor(.submit(.test(.init(startWindingAmps: 4.3, runToCommonVoltage: 343)))),
// Dehumidifier Sizing
.dehumidifierSize(.index),
.dehumidifierSize(.submit(.init(latentLoad: 3443, temperature: 76, humidity: 67))),
// Filter Pressure Drop
.filterPressureDrop(.index),
.filterPressureDrop(.index(mode: .basic)),
.filterPressureDrop(.index(mode: .fanLaw)),
.filterPressureDrop(.submit(.basic(.init(
systemSize: 2,
climateZone: .hotHumid,
filterType: .pleatedBest,
filterWidth: 20,
filterHeight: 25
)))),
.filterPressureDrop(.submit(.fanLaw(.init(
filterWidth: 20,
filterHeight: 25,
filterDepth: 4,
ratedAirflow: 800,
ratedPressureDrop: 0.1,
designAirflow: 900
)))),
// Heating Balance Point
.heatingBalancePoint(.index),
.heatingBalancePoint(.heatLossFields(mode: .estimated)),
.heatingBalancePoint(.heatLossFields(mode: .known)),
.heatingBalancePoint(.submit(.economic(.init(
fuelType: .propane,
fuelCostPerUnit: 2.43,
fuelAFUE: 90,
costPerKW: 0.13
)))),
.heatingBalancePoint(.submit(.thermal(.init(
systemSize: 2,
capacityAt47: 24600,
capacityAt17: 15100,
heatingDesignTemperature: 5,
buildingHeatLoss: .known(btu: 45667),
climateZone: .five
)))),
// HVAC System Performance
.hvacSystemPerformance(.index),
.hvacSystemPerformance(.submit(.init(
altitude: 800,
airflow: 800,
returnAirTemperature: 76,
returnAirHumidity: 67,
supplyAirTemperature: 56,
supplyAirHumidity: 89,
systemSize: 2
))),
// Mold risk
.moldRisk(.index),
.moldRisk(.submit(.init(temperature: 76, humidity: 67))),
// Psychrometrics
.psychrometrics(.index),
.psychrometrics(.submit(.init(temperature: 76, humidity: 67, altitude: 800))),
// Room pressures
.roomPressure(.index),
.roomPressure(.index(mode: .measuredPressure)),
.roomPressure(.submit(.knownAirflow(.init(
targetRoomPressure: 3,
doorWidth: 30,
doorHeight: 86,
doorUndercut: 1,
supplyAirflow: 200,
preferredGrilleHeight: .fourteen
)))),
.roomPressure(.submit(.measuredPressure(.init(
measuredRoomPressure: 4,
doorWidth: 30,
doorHeight: 86,
doorUndercut: 1,
preferredGrilleHeight: .fourteen
)))),
// Hydronic system pressure
.hydronicSystemPressure(.index),
.hydronicSystemPressure(.submit(.init(height: 12, waterTemperature: 60))),
// Feet of head
.feetOfHead(.index),
.feetOfHead(.submit(.init(pressure: 3.5, waterTemperature: 60)))
])
for route in arguments {
let html = try await viewController.render(route, logger: logger)
assertSnapshot(of: html, as: .html)
}
}
}
}
// swiftlint:enable function_body_length
}
private extension ViewController {
func render(_ route: SiteRoute.View, logger: Logger) async throws -> String {
let html = try await view(.init(route, isHtmxRequest: true, logger: logger))
return html.renderFormatted()
}
}