Files
Termind/FrameworkTests/MetricsHostAccessTests.swift

73 lines
3.0 KiB
Swift

// SPDX-FileCopyrightText: 2026 Kaede Akino
// SPDX-License-Identifier: GPL-3.0-only
import Foundation
import TermindApplication
import TermindDomain
import Testing
@Suite @MainActor
struct MetricsHostAccessTests {
@Test(arguments: [false, true])
func lockedTargetsAndJumpsKeepSelectionsAndCacheWithoutStartingWorkers(lockedJump: Bool) throws {
var hosts = (0..<4).map {
TermindDomain.Host(
name: "Host \($0)", host: "host\($0).invalid",
createdAt: Date(timeIntervalSince1970: Double($0)))
}
if lockedJump { hosts[0].jumpHostID = hosts[3].id }
let target = hosts[lockedJump ? 0 : 3]
let library = HostLibraryModel(hosts: hosts)
let preferences = LockedMetricsPreferences()
let model = ServerMetricsModel(
hosts: library, preferences: preferences,
makeSampler: { preconditionFailure("A locked or paused monitor must not create a sampler") })
model.suspend()
defer { model.shutdown() }
#expect(model.add(target))
let server = try #require(model.servers.first)
server.point = MetricsPoint(date: .now, cpu: 75)
server.history = [try #require(server.point)]
library.hostAccess.entitlement = .free
model.reconcile()
model.resume()
model.reconcile()
#expect(server.isHostLocked)
#expect(!server.isConnecting)
#expect(!server.showsConnectionJourney)
#expect(model.snapshot(for: target.id)?.state == .locked)
#expect(server.point?.cpu == 75)
#expect(server.history.count == 1)
#expect(preferences.values.map(\.id) == [target.id])
model.remove(target.id)
#expect(model.servers.isEmpty)
#expect(preferences.values.isEmpty)
}
@Test(arguments: [EntitlementStatus.loading, .verificationFailed])
func unresolvedAccessIsNotPresentedAsAQuotaLock(status: EntitlementStatus) throws {
let hosts = (0..<4).map {
TermindDomain.Host(
name: "Host \($0)", host: "host\($0).invalid",
createdAt: Date(timeIntervalSince1970: Double($0)))
}
let library = HostLibraryModel(hosts: hosts)
library.hostAccess.entitlement = status
let model = ServerMetricsModel(
hosts: library, preferences: LockedMetricsPreferences(),
makeSampler: { preconditionFailure("Unresolved access must not start a sampler") })
defer { model.shutdown() }
#expect(model.add(hosts[3]))
let server = try #require(model.servers.first)
#expect(!server.isHostLocked)
#expect(server.hostAccessError != nil)
#expect(model.snapshot(for: server.id)?.state == (status == .loading ? .connecting : .failed))
}
}
@MainActor private final class LockedMetricsPreferences: MetricsConfigurationStoring {
var values: [MetricsSelection] = []
func load() -> [MetricsSelection] { values }
func save(_ selections: [MetricsSelection]) { values = selections }
}