109 lines
4.2 KiB
Swift
109 lines
4.2 KiB
Swift
import Foundation
|
|
import TermindApplication
|
|
import TermindDomain
|
|
import TermindPersistence
|
|
import Testing
|
|
|
|
@Suite @MainActor
|
|
struct HostProtocolTests {
|
|
@Test
|
|
func hostDefaultsAndRequirementsAreProtocolSpecific() {
|
|
var host = Host(name: "Server", host: "server.invalid")
|
|
#expect(host.sshEnabled)
|
|
#expect(host.sshPort == 22)
|
|
#expect(host.sshCharset == .utf8)
|
|
#expect(!host.telnetEnabled)
|
|
#expect(host.telnetPort == 23)
|
|
#expect(host.telnetCharset == .utf8)
|
|
#expect(host.supportedTerminalProtocols == [.ssh])
|
|
#expect(host.supports(.ssh))
|
|
#expect(!host.supports(.telnet))
|
|
|
|
host.sshEnabled = false
|
|
host.telnetEnabled = true
|
|
#expect(host.preferredTerminalProtocol == .telnet)
|
|
#expect(host.supportedTerminalProtocols == [.telnet])
|
|
}
|
|
|
|
@Test
|
|
func eligibilityFiltersEverySSHBackedUseCase() {
|
|
let ssh = Host(name: "SSH", host: "ssh.invalid")
|
|
let telnet = Host(
|
|
name: "Telnet", host: "telnet.invalid",
|
|
sshEnabled: false, telnetEnabled: true)
|
|
let library = HostLibraryModel(hosts: [ssh, telnet])
|
|
|
|
#expect(library.hosts(matching: "", for: .preferredTerminal).map(\.id) == [ssh.id, telnet.id])
|
|
for useCase in [
|
|
HostUseCase.sshTerminal, .sftp, .jumpHost, .metrics, .portForwarding,
|
|
.snippetExecution, .keyExport,
|
|
] {
|
|
#expect(library.hosts(matching: "", for: useCase).map(\.id) == [ssh.id])
|
|
#expect(throws: HostProtocolUnavailableError.self) {
|
|
try library.require(telnet, for: useCase)
|
|
}
|
|
}
|
|
#expect(CredentialLibraryModel(library: library).searchHosts("").map(\.id) == [ssh.id])
|
|
#expect(ForwardingLibraryModel(library: library).hosts.map(\.id) == [ssh.id])
|
|
#expect(SnippetLibraryModel(library: library).searchHosts("").map(\.id) == [ssh.id])
|
|
}
|
|
|
|
@Test
|
|
func savingRequiresAtLeastOneEnabledProtocol() {
|
|
var host = Host(name: "Disabled", host: "disabled.invalid")
|
|
host.sshEnabled = false
|
|
let library = HostLibraryModel()
|
|
#expect(!library.saveHost(host))
|
|
|
|
host.telnetEnabled = true
|
|
#expect(library.saveHost(host))
|
|
}
|
|
|
|
@Test
|
|
func telnetNoneAllowsManualLoginWhileCustomRequiresPassword() {
|
|
var host = Host(name: "Console", host: "console.invalid", sshEnabled: false, telnetEnabled: true)
|
|
var draft = HostCustomIdentityDraft()
|
|
#expect(draft.isTelnetValid(for: host))
|
|
|
|
draft.selectCustomTelnet(on: &host)
|
|
#expect(!draft.isTelnetValid(for: host))
|
|
draft.telnetUsername = "operator"
|
|
draft.telnetPassword = "secret"
|
|
#expect(draft.isTelnetValid(for: host))
|
|
}
|
|
|
|
@Test
|
|
func telnetCommandUsesOnlyTelnetProfile() throws {
|
|
let identity = Identity(name: "Console", username: "operator", credentialRef: "password")
|
|
var host = Host(
|
|
name: "Console", host: "console.invalid",
|
|
sshEnabled: false, telnetEnabled: true, telnetPort: 2323,
|
|
telnetIdentityID: identity.id)
|
|
host.sshPort = 2222
|
|
let library = HostLibraryModel(hosts: [host], identities: [identity])
|
|
#expect(library.telnetCommand(for: host) == "telnet -l operator console.invalid 2323")
|
|
}
|
|
|
|
@Test
|
|
func version29ProjectionKeepsIndependentProfiles() {
|
|
let sshIdentity = UUID()
|
|
let telnetIdentity = UUID()
|
|
let host = Host(
|
|
name: "Dual", host: "dual.invalid", port: 2222, identityID: sshIdentity,
|
|
charset: .gb18030, sshEnabled: true, telnetEnabled: true, telnetPort: 2323,
|
|
telnetIdentityID: telnetIdentity, telnetCharset: .big5,
|
|
telnetProxy: HostProxy(kind: .socks5, hostname: "proxy.invalid", port: 1080))
|
|
|
|
let restored = PersistentHost(host).value
|
|
#expect(restored.sshEnabled)
|
|
#expect(restored.sshPort == 2222)
|
|
#expect(restored.sshIdentityID == sshIdentity)
|
|
#expect(restored.sshCharset == .gb18030)
|
|
#expect(restored.telnetEnabled)
|
|
#expect(restored.telnetPort == 2323)
|
|
#expect(restored.telnetIdentityID == telnetIdentity)
|
|
#expect(restored.telnetCharset == .big5)
|
|
#expect(restored.telnetProxy?.hostname == "proxy.invalid")
|
|
}
|
|
}
|