import XCTest @testable import LChatCore // 🤖 Twins of the web's sender-attribution helpers (sameSender in ui.js, the // senderName resolution in chat.js) — the run-grouping and bubble-header rules // must fold identically on both platforms, like Presence/presenceLabel. @MainActor final class SenderNameTests: XCTestCase { private func msg(uid: String?, name: String) -> ChatFeedModel.Message { var raw = MessagePayload() raw.uid = uid raw.name = name return ChatFeedModel.Message(id: 1, name: name, text: "hi", mine: false, at: 1_700_000_000, edited: false, raw: raw) } func testSameSenderPrefersUid() { // Same person across a rename (snapshots differ) — still one run. XCTAssertTrue(ChatFeedModel.sameSender(msg(uid: "u1", name: "Dermo"), msg(uid: "u1", name: "Dermot"))) // Two people, even with identical snapshots (both nameless), never group. XCTAssertFalse(ChatFeedModel.sameSender(msg(uid: "u1", name: ""), msg(uid: "u2", name: ""))) } func testSameSenderLegacyFallsBackToName() { XCTAssertTrue(ChatFeedModel.sameSender(msg(uid: nil, name: "Al"), msg(uid: nil, name: "Al"))) XCTAssertFalse(ChatFeedModel.sameSender(msg(uid: nil, name: "Al"), msg(uid: nil, name: "Bo"))) // A nameless legacy pair says nothing about who sent them — no grouping. XCTAssertFalse(ChatFeedModel.sameSender(msg(uid: nil, name: ""), msg(uid: nil, name: ""))) XCTAssertFalse(ChatFeedModel.sameSender(nil, msg(uid: "u1", name: "Al"))) } }