import XCTest @testable import MatchLiveTv @MainActor final class ScoreControllerTests: XCTestCase { func testBindNewSessionResetsScoreToZero() { let controller = ScoreController( scoreRepository: ScoreRepository(api: MatchLiveAPI()), sessionCable: SessionCableService() ) var previous = ScoreState() previous.homePoints = 3 previous.awayPoints = 3 controller.bind(sessionId: "session-1", initial: previous) XCTAssertEqual(controller.score.homePoints, 3) controller.bind(sessionId: "session-2", initial: nil) XCTAssertEqual(controller.score.homePoints, 0) XCTAssertEqual(controller.score.awayPoints, 0) } func testBindNewSessionUsesServerInitialState() { let controller = ScoreController( scoreRepository: ScoreRepository(api: MatchLiveAPI()), sessionCable: SessionCableService() ) controller.bind(sessionId: "session-1", initial: ScoreState(homePoints: 2, awayPoints: 1)) var fresh = ScoreState() fresh.homePoints = 1 fresh.awayPoints = 0 controller.bind(sessionId: "session-2", initial: fresh) XCTAssertEqual(controller.score.homePoints, 1) XCTAssertEqual(controller.score.awayPoints, 0) } func testIncrementHomeUpdatesPublishedScore() { let controller = ScoreController( scoreRepository: ScoreRepository(api: MatchLiveAPI()), sessionCable: SessionCableService() ) controller.bind(sessionId: "session-1", initial: ScoreState()) controller.incrementHome() XCTAssertEqual(controller.score.homePoints, 1) } func testApplyBoardActionOptimisticThenConfirm() async { let api = MatchLiveAPI() let controller = ScoreController( scoreRepository: ScoreRepository(api: api), sessionCable: SessionCableService() ) controller.bind(sessionId: "session-1", initial: ScoreState()) // Senza backend: fallisce e ripristina — ma l'ottimistico deve almeno scattare durante la chiamata. // Verifichiamo solo che applyOptimistic funzioni via applyAction locale. controller.applyAction("home_point") XCTAssertEqual(controller.score.homePoints, 1) } }