import XCTest @testable import CallsKit /// Spec §15.20's two optional members on the roster, as the native core /// forwards them: absent is none, and a report without them decodes /// exactly as §15.19's did. final class PeerMediaHearingTests: XCTestCase { private func media(_ json: String) throws -> PeerMedia? { let state = try JSONDecoder().decode( RoomState.self, from: Data( #"{"phase":"admitted","peer":"me","boot":"b","waiting":[],"peers":[{"peer":"tony","name":"Tony","kind":"member","gen":1,"media":\#(json)}]}"# .utf8)) return Call.peerMedia("tony", in: state) } func testTheTwoKeyReportStillDecodes() throws { let m = try XCTUnwrap(media(#"{"muted":false,"cameraOff":true}"#)) XCTAssertEqual(m, PeerMedia(muted: false, cameraOff: true)) XCTAssertNil(m.audioBlocked) XCTAssertNil(m.noSoundFrom) } func testTheReceivingHalfDecodes() throws { let m = try XCTUnwrap( media(#"{"muted":false,"cameraOff":false,"audioBlocked":true,"noSoundFrom":["me","bea"]}"#)) XCTAssertEqual(m.audioBlocked, true) XCTAssertEqual(m.noSoundFrom, ["me", "bea"]) XCTAssertEqual( m, PeerMedia(muted: false, cameraOff: false, audioBlocked: true, noSoundFrom: ["me", "bea"])) } func testEitherMemberAlone() throws { XCTAssertEqual(try media(#"{"muted":true,"cameraOff":false,"audioBlocked":true}"#)?.noSoundFrom, nil) XCTAssertEqual(try media(#"{"muted":true,"cameraOff":false,"noSoundFrom":["me"]}"#)?.audioBlocked, nil) } func testAMalformedMemberIsRefusedNotGuessed() { XCTAssertThrowsError(try media(#"{"muted":false,"cameraOff":false,"noSoundFrom":"me"}"#)) XCTAssertThrowsError(try media(#"{"muted":false,"cameraOff":false,"audioBlocked":"yes"}"#)) } }