// // UnconfiguredJellyfinServiceTests.swift // // Copyright 2026 Brendan Szymanski // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // SPDX-License-Identifier: GPL-3.0-or-later // import Testing @testable import LuminateCore /// Proves the placeholder service fails loudly instead of silently doing nothing. /// /// This is what a subtree sees when `.environment(\\.client, ...)` was forgotten, so every route /// into it -- full-arity requirement and reduced-arity convenience alike -- must throw. @Suite struct UnconfiguredJellyfinServiceTests { private let service = UnconfiguredJellyfinService.shared @Test("Reports itself unauthenticated") func neverAuthenticated() { #expect(service.isAuthenticated == false) } @Test("A full-arity requirement throws notConfigured") func requirementThrows() async { await #expect(throws: JellyfinClientError.notConfigured) { _ = try await service.publicUsers() } } @Test("A convenience overload forwards to the requirement and still throws") func convenienceThrows() async { await #expect(throws: JellyfinClientError.notConfigured) { _ = try await service.items() } await #expect(throws: JellyfinClientError.notConfigured) { _ = try await service.image(itemID: "x", type: .primary) } await #expect(throws: JellyfinClientError.notConfigured) { _ = try await service.libraries() } } }