// // Copyright 2022 New Vector Ltd // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // import XCTest import MatrixSDK private enum Constants { static let roomId = "someRoomId" static let repliedEventId = "repliedEventId" static let repliedEventBody = "Test message" static let repliedEventEditedBody = "Edited message" static let repliedEventNewContentBody = "New content" static let replyBody = "> <@alice:matrix.org> Test message\n\nReply" static let replyFormattedBodyWithItalic = "
In reply to alice
Test message
Reply" static let expectedHTML = "
In reply to alice
Test message
Reply" static let expectedEditedHTML = "
In reply to alice
Edited message
Reply" static let expectedEditedHTMLWithNewContent = "
In reply to alice
New content
Reply" static let expectedEditedHTMLWithParsedItalic = "
In reply to alice
New content
Reply" } class MXKEventFormatterTests: XCTestCase { func testBuildHTMLString() { let formatter = MXKEventFormatter() let repliedEvent = MXEvent() let event = MXEvent() func buildHTML() -> String? { return formatter.buildHTMLString(for: event, inReplyTo: repliedEvent) } // Initial setup. repliedEvent.sender = "alice" repliedEvent.roomId = Constants.roomId repliedEvent.eventId = Constants.repliedEventId repliedEvent.wireType = kMXEventTypeStringRoomMessage repliedEvent.wireContent = [kMXMessageTypeKey: kMXMessageTypeText, kMXMessageBodyKey: Constants.repliedEventBody] event.sender = "bob" event.wireType = kMXEventTypeStringRoomMessage event.wireContent = [ kMXMessageTypeKey: kMXMessageTypeText, kMXMessageBodyKey: Constants.replyBody, kMXEventRelationRelatesToKey: [kMXEventContentRelatesToKeyInReplyTo: ["event_id": Constants.repliedEventId]] ] // Default render. XCTAssertEqual(buildHTML(), Constants.expectedHTML) // Render after edition. repliedEvent.wireContent[kMXMessageBodyKey] = Constants.repliedEventEditedBody XCTAssertEqual(buildHTML(), Constants.expectedEditedHTML) // m.new_content has prioritiy over base content. repliedEvent.wireContent[kMXMessageContentKeyNewContent] = [kMXMessageBodyKey: Constants.repliedEventNewContentBody] XCTAssertEqual(buildHTML(), Constants.expectedEditedHTMLWithNewContent) // If reply's formatted_body is available it's used to construct a brand new HTML. event.wireContent["formatted_body"] = Constants.replyFormattedBodyWithItalic XCTAssertEqual(buildHTML(), Constants.expectedEditedHTMLWithParsedItalic) // If content from replied event is missing. Reply can't be constructed (client will use fallback). repliedEvent.wireContent[kMXMessageBodyKey] = nil repliedEvent.wireContent[kMXMessageContentKeyNewContent] = nil XCTAssertNil(buildHTML()) } }