import XCTest @testable import MusicBridge final class LiveActivityTests: XCTestCase { @MainActor func testSnapshotUsesTrackRelativePosition() throws { let state = try fixture(position: 130, start: 100, end: 300) let content = LiveActivityManager.content(state, now: Date(timeIntervalSince1970: 1000)) XCTAssertEqual(content.position, 30) XCTAssertEqual(content.duration, 200) XCTAssertEqual(content.progress, 0.15, accuracy: 0.001) XCTAssertEqual(content.updatedAt, Date(timeIntervalSince1970: 1000)) } @MainActor func testOversizedUnicodeMetadataStaysBelowActivityKitBudget() throws { let malicious = String(repeating: "🎵\u{301}", count: 5000) let state = try fixture(title: malicious, artist: malicious) let content = LiveActivityManager.content(state) XCTAssertLessThanOrEqual(content.title.utf8.count, 256) XCTAssertLessThanOrEqual(content.artist.utf8.count, 256) let data = try JSONEncoder().encode(content) XCTAssertLessThan(data.count, 2048) XCTAssertEqual(try JSONDecoder().decode(MusicActivityAttributes.ContentState.self, from: data), content) } @MainActor func testUnknownDurationAndPausedState() throws { let state = try fixture(title: "", playback: "Paused", position: 42, start: 0, end: 0) let content = LiveActivityManager.content(state) XCTAssertEqual(content.title, "Без названия") XCTAssertFalse(content.playing) XCTAssertEqual(content.progress, 0) XCTAssertTrue(content.connected) } private func fixture(title: String = "Track", artist: String = "Artist", playback: String = "Playing", position: Double = 42, start: Double = 0, end: Double = 200) throws -> MediaState { let url = Bundle(for: Self.self).url(forResource: "state-v1", withExtension: "json")! var json = try JSONSerialization.jsonObject(with: Data(contentsOf: url)) as! [String: Any] json["title"] = title; json["artist"] = artist; json["playbackStatus"] = playback json["positionSeconds"] = position; json["startSeconds"] = start; json["endSeconds"] = end return try JSONDecoder().decode(MediaState.self, from: JSONSerialization.data(withJSONObject: json)) } }