46 lines
2.3 KiB
Swift
46 lines
2.3 KiB
Swift
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))
|
|
}
|
|
}
|