vibetunnel/ios/VibeTunnelTests/Services/SSEClientTests.swift
Igor Tarasenko 9fad6301a0
feat: Add Bonjour/mDNS service discovery for iOS app (#226)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2025-07-05 11:34:36 +01:00

87 lines
2.8 KiB
Swift

import Foundation
import Testing
@testable import VibeTunnel
// MARK: - Mock Delegate
@MainActor
class MockSSEClientDelegate: SSEClientDelegate {
var receivedEvents: [SSEClient.SSEEvent] = []
var lastClient: SSEClient?
nonisolated func sseClient(_ client: SSEClient, didReceiveEvent event: SSEClient.SSEEvent) {
Task { @MainActor in
lastClient = client
receivedEvents.append(event)
}
}
func reset() {
receivedEvents.removeAll()
lastClient = nil
}
}
@Suite("SSEClient Tests", .tags(.networking, .services))
struct SSEClientTests {
@Test("SSE client initialization")
@MainActor
func sseClientInit() {
let url = URL(string: "http://localhost:8888/api/sessions/test/stream")!
let client = SSEClient(url: url, authenticationService: nil)
// Test basic initialization
#expect(client.delegate == nil)
}
@Test("SSE client delegate pattern")
@MainActor
func delegatePattern() {
let url = URL(string: "http://localhost:8888/api/sessions/test/stream")!
let client = SSEClient(url: url, authenticationService: nil)
// Set up delegate
let mockDelegate = MockSSEClientDelegate()
client.delegate = mockDelegate
#expect(client.delegate != nil)
}
@Test("SSE client with authentication service")
@MainActor
func clientWithAuth() {
let url = URL(string: "http://localhost:8888/api/sessions/test/stream")!
let authService = AuthenticationService(
apiClient: APIClient.shared,
serverConfig: TestFixtures.validServerConfig
)
let client = SSEClient(url: url, authenticationService: authService)
#expect(client.delegate == nil)
}
@Test("SSE event enum cases", .disabled("SSEEvent is internal to SSEClient"))
@MainActor
func eventEnumCases() {
// Test that we can reference the event types
// Note: SSEEvent is internal to SSEClient, so this test validates the enum structure exists
// This test is disabled because SSEEvent may not be publicly accessible
// If needed, this would test the SSEClient.SSEEvent enum cases:
// - .terminalOutput(timestamp: Double, type: String, data: String)
// - .exit(exitCode: Int, sessionId: String)
// - .error(String)
}
@Test("SSE client start/stop lifecycle", .disabled("Requires network mocking"))
@MainActor
func startStopLifecycle() {
let url = URL(string: "http://localhost:8888/api/sessions/test/stream")!
let client = SSEClient(url: url, authenticationService: nil)
// Test basic start/stop functionality
// Note: These methods may trigger actual network requests, so test is disabled
client.start()
client.stop()
}
}