Files
yattee/YatteeTests/InstancesManagerTests.swift
2026-02-08 18:33:56 +01:00

150 lines
4.9 KiB
Swift

//
// InstancesManagerTests.swift
// YatteeTests
//
// Tests for the InstancesManager.
//
import Testing
import Foundation
@testable import Yattee
// MARK: - Instance Filtering Tests
@Suite("Instance Filtering Tests")
@MainActor
struct InstanceFilteringTests {
@Test("Filter YouTube instances")
func filterYouTubeInstances() {
let instances = [
Instance(type: .invidious, url: URL(string: "https://inv.example.com")!),
Instance(type: .piped, url: URL(string: "https://piped.example.com")!),
Instance(type: .peertube, url: URL(string: "https://pt.example.com")!),
]
let youtubeInstances = instances.filter(\.isYouTubeInstance)
#expect(youtubeInstances.count == 2)
#expect(youtubeInstances.allSatisfy { $0.type == .invidious || $0.type == .piped })
}
@Test("Filter PeerTube instances")
func filterPeerTubeInstances() {
let instances = [
Instance(type: .invidious, url: URL(string: "https://inv.example.com")!),
Instance(type: .peertube, url: URL(string: "https://pt1.example.com")!),
Instance(type: .peertube, url: URL(string: "https://pt2.example.com")!),
]
let peertubeInstances = instances.filter(\.isPeerTubeInstance)
#expect(peertubeInstances.count == 2)
#expect(peertubeInstances.allSatisfy { $0.type == .peertube })
}
@Test("Filter enabled instances")
func filterEnabledInstances() {
var enabled = Instance(type: .invidious, url: URL(string: "https://enabled.example.com")!)
enabled.isEnabled = true
var disabled = Instance(type: .invidious, url: URL(string: "https://disabled.example.com")!)
disabled.isEnabled = false
let instances = [enabled, disabled]
let enabledInstances = instances.filter(\.isEnabled)
#expect(enabledInstances.count == 1)
#expect(enabledInstances.first?.url.host == "enabled.example.com")
}
}
// MARK: - Instance Type Tests
@Suite("InstanceType Tests")
@MainActor
struct InstanceTypeTests {
@Test("InstanceType display names")
func displayNames() {
#expect(InstanceType.invidious.displayName == "Invidious")
#expect(InstanceType.piped.displayName == "Piped")
#expect(InstanceType.peertube.displayName == "PeerTube")
}
@Test("InstanceType is Codable")
func codable() throws {
for type in InstanceType.allCases {
let encoded = try JSONEncoder().encode(type)
let decoded = try JSONDecoder().decode(InstanceType.self, from: encoded)
#expect(type == decoded)
}
}
@Test("Instance is Codable")
func instanceCodable() throws {
let instance = Instance(
type: .invidious,
url: URL(string: "https://example.com")!,
name: "Test Instance"
)
let encoded = try JSONEncoder().encode(instance)
let decoded = try JSONDecoder().decode(Instance.self, from: encoded)
#expect(instance.type == decoded.type)
#expect(instance.url == decoded.url)
#expect(instance.name == decoded.name)
}
@Test("Instance array is Codable")
func instanceArrayCodable() throws {
let instances = [
Instance(type: .invidious, url: URL(string: "https://inv.example.com")!),
Instance(type: .piped, url: URL(string: "https://piped.example.com")!),
Instance(type: .peertube, url: URL(string: "https://pt.example.com")!, name: "My PeerTube"),
]
let encoded = try JSONEncoder().encode(instances)
let decoded = try JSONDecoder().decode([Instance].self, from: encoded)
#expect(decoded.count == 3)
#expect(decoded[0].type == .invidious)
#expect(decoded[1].type == .piped)
#expect(decoded[2].name == "My PeerTube")
}
}
// MARK: - Instance Identity Tests
@Suite("Instance Identity Tests")
@MainActor
struct InstanceIdentityTests {
@Test("Instances with same UUID are equal")
func sameUUIDEqual() {
let sharedID = UUID()
let url = URL(string: "https://example.com")!
let instance1 = Instance(id: sharedID, type: .invidious, url: url)
let instance2 = Instance(id: sharedID, type: .invidious, url: url)
#expect(instance1.id == instance2.id)
}
@Test("New instances have unique IDs")
func newInstancesHaveUniqueIDs() {
let instance1 = Instance(type: .invidious, url: URL(string: "https://example.com")!)
let instance2 = Instance(type: .invidious, url: URL(string: "https://example.com")!)
// Each new instance gets a unique UUID
#expect(instance1.id != instance2.id)
}
@Test("Instance ID is stable across name changes")
func idStableAcrossNameChanges() {
var instance = Instance(type: .invidious, url: URL(string: "https://example.com")!)
let originalID = instance.id
instance.name = "New Name"
#expect(instance.id == originalID)
}
}