Complete app features and relay cleanup

This commit is contained in:
diyaa
2026-07-26 17:36:46 +02:00
parent 53fa92d222
commit 2bd9c1b3ae
25 changed files with 2204 additions and 188 deletions
@@ -0,0 +1,19 @@
import XCTest
@testable import FchatiApp
final class ChatMessageBubbleTests: XCTestCase {
func testMessageKeepsMarkdownBodyForRendering() {
let message = ChatMessage(
id: "message-id",
from: "peer-id",
fromName: "Alex",
body: "Hello, **world**",
sentAt: Date(),
attachment: nil,
isRead: false
)
XCTAssertEqual(message.body, "Hello, **world**")
XCTAssertNotNil(try? AttributedString(markdown: message.body))
}
}
@@ -0,0 +1,27 @@
import XCTest
@testable import FchatiApp
final class MessageStoreModelTests: XCTestCase {
func testMessageRoundTripPreservesAttachmentAndReadStatus() throws {
let message = ChatMessage(
id: "message-id",
from: "peer-id",
fromName: "Alex",
body: "Shared a file: photo.jpg",
sentAt: Date(timeIntervalSince1970: 1_721_995_200),
attachment: AttachmentInfo(fileID: "file-id", name: "photo.jpg", size: 128),
isRead: false
)
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let encodedMessage = try encoder.encode(message)
let decodedMessage = try decoder.decode(ChatMessage.self, from: encodedMessage)
XCTAssertEqual(decodedMessage.id, message.id)
XCTAssertEqual(decodedMessage.attachment, message.attachment)
XCTAssertEqual(decodedMessage.isRead, message.isRead)
}
}
@@ -0,0 +1,10 @@
import XCTest
@testable import FchatiApp
final class PairingViewModelTests: XCTestCase {
func testPairingCodeIsUppercasedAndPrefixed() {
XCTAssertEqual(PairingViewModel.normalizedCode(from: "ab3k7q"), "FCHT-AB3K7Q")
XCTAssertEqual(PairingViewModel.normalizedCode(from: "fcht-ab3k7q"), "FCHT-AB3K7Q")
XCTAssertEqual(PairingViewModel.normalizedCode(from: " FCHT-ab3k7q "), "FCHT-AB3K7Q")
}
}
@@ -0,0 +1,36 @@
import XCTest
@testable import FchatiApp
final class RelayAPIResponseTests: XCTestCase {
func testPairingCreateResponseDecodesServerPayload() throws {
let data = Data(
"""
{"code":"FCHT-AB3K7Q","token":"creator-token","peerID":"creator-id","expiresAt":"2026-07-26T12:00:00Z"}
""".utf8
)
let response = try JSONDecoder().decode(PairingCreateResponse.self, from: data)
XCTAssertEqual(response.code, "FCHT-AB3K7Q")
XCTAssertEqual(response.peerID, "creator-id")
}
func testPairingJoinAndFileUploadResponsesDecodeServerPayloads() throws {
let pairingData = Data(
"""
{"token":"joiner-token","peerID":"joiner-id","peer":{"id":"creator-id","displayName":"Alex"}}
""".utf8
)
let fileData = Data(
"""
{"id":"file-id","name":"photo.jpg","size":128}
""".utf8
)
let pairingResponse = try JSONDecoder().decode(PairingJoinResponse.self, from: pairingData)
let fileResponse = try JSONDecoder().decode(FileUploadResponse.self, from: fileData)
XCTAssertEqual(pairingResponse.peer, PeerInfo(id: "creator-id", displayName: "Alex"))
XCTAssertEqual(fileResponse, FileUploadResponse(id: "file-id", name: "photo.jpg", size: 128))
}
}
@@ -0,0 +1,21 @@
import XCTest
@testable import FchatiApp
final class WSMessageTests: XCTestCase {
func testMessageRoundTripPreservesServerFields() throws {
let message = WSMessage(
type: "chat.message",
id: "message-id",
body: "Hello",
from: "peer-id",
fromName: "Alex"
)
let decodedMessage = try JSONDecoder().decode(
WSMessage.self,
from: JSONEncoder().encode(message)
)
XCTAssertEqual(decodedMessage, message)
}
}