Files
divkit/client/ios/DivKitTests/DivBlockModelingContextTests.swift
babaevmm 95b2190de9 fix LottieExtensionHandler getPreloadURLs
commit_hash:6be2bcdc26bfcc2123469b5970df6b3ed05cfbfc
2025-06-21 14:57:11 +03:00

194 lines
5.4 KiB
Swift

@testable import DivKit
import DivKitTestsSupport
import LayoutKit
import XCTest
final class DivBlockModelingContextTests: XCTestCase {
func test_parentPath_InitiallyEqualsToCardId() {
let context = DivBlockModelingContext(cardId: "card_id")
XCTAssertEqual("card_id", context.path)
}
func test_parentPath_ContainsAdditionalId() {
let context = DivBlockModelingContext(
cardId: "card_id",
additionalId: "additional_id"
)
XCTAssertEqual(UIElementPath("card_id") + "additional_id", context.path)
}
func test_modifying_cardLogId() {
let context = DivBlockModelingContext()
.modifying(cardLogId: "new_card_log_id")
XCTAssertEqual(context.cardLogId, "new_card_log_id")
}
func test_modifying_pathSuffix() {
let cardId = "custom_card_id"
let pathSuffix = "path_suffix"
let context = DivBlockModelingContext(
cardId: DivCardID(rawValue: cardId)
).modifying(pathSuffix: pathSuffix)
let expectedPath = UIElementPath(cardId) + pathSuffix
XCTAssertEqual(context.path, expectedPath)
_ = context.expressionResolver.resolveString(expression("@{invalid}"))
XCTAssertEqual(context.errorsStorage.errors[0].path, expectedPath)
}
func test_modifying_parentPath_ProvidesAccessToLocalVariables() {
let context = DivBlockModelingContext()
let elementSuffix = "element_id"
let elementPath = context.path + "element_id"
context.variablesStorage.initializeIfNeeded(
path: elementPath,
variables: ["local_var": .string("value")]
)
let elementContext = context.modifying(pathSuffix: elementSuffix)
XCTAssertEqual(
"value",
elementContext.expressionResolver.resolveString(expression("@{local_var}"))
)
}
func test_modifying_parentDivStatePath() {
let divStatePath = DivStatePath.makeDivStatePath(from: "0/div_state")
let context = DivBlockModelingContext()
.modifying(parentDivStatePath: divStatePath)
XCTAssertEqual(context.parentDivStatePath, divStatePath)
}
func test_modifying_sizeModifier() {
let sizeModifier = MockSizeModifier()
let context = DivBlockModelingContext()
.modifying(sizeModifier: sizeModifier)
XCTAssertIdentical(context.sizeModifier as! MockSizeModifier, sizeModifier)
}
func test_modifying_errorsStorage() {
let errorsStorage = DivErrorsStorage(errors: [])
let context = DivBlockModelingContext()
.modifying(errorsStorage: errorsStorage)
XCTAssertIdentical(context.errorsStorage, errorsStorage)
_ = context.expressionResolver.resolveString(expression("@{invalid}"))
XCTAssertEqual(errorsStorage.errors.count, 1)
}
func test_modifying_prototypeParams_AddsVariableToExpressionResolver() {
let context = DivBlockModelingContext().modifying(
prototypeParams: PrototypeParams(
index: 1,
variableName: "it",
value: ["key": "value"]
)
)
XCTAssertEqual(
context.expressionResolver.resolveString(expression("@{it.getString('key')}")),
"value"
)
}
func test_modifying_prototypeParams_AddsIndexVariableToExpressionResolver() {
let context = DivBlockModelingContext().modifying(
prototypeParams: PrototypeParams(
index: 1,
variableName: "it",
value: ["key": "value"]
)
)
XCTAssertEqual(
context.expressionResolver.resolveNumeric(expression("@{index}")),
1
)
}
func test_cloneForTooltip() {
let context = DivBlockModelingContext(cardId: "card_id")
.modifying(pathSuffix: "0")
.modifying(pathSuffix: "element_id")
let tooltipContext = context.cloneForTooltip(tooltipId: "tooltip_id")
XCTAssertEqual(
DivViewId(cardId: "card_id", additionalId: "tooltip_id"),
tooltipContext.viewId
)
XCTAssertEqual(
UIElementPath("card_id") + "tooltip_id",
tooltipContext.path
)
}
func test_WhenHasNoExtensionHandler_AddsErrorToErrorStorage() throws {
let context = DivBlockModelingContext()
_ = try DivDataTemplate.make(
fromFile: "div-with-extension-handler",
subdirectory: "div-context",
context: context
)
XCTAssertEqual(context.errorsStorage.errors.count, 1)
}
func testWhenModifyOtherPropertiesToNil_contextIsNotChanged() throws {
let parentContext = DivBlockModelingContext().modifying(
cardLogId: "card_log_id",
pathSuffix: "path_suffix",
parentDivStatePath: .makeDivStatePath(from: "div_id")
)
let childContext = parentContext.modifying(
cardLogId: nil,
pathSuffix: nil,
parentDivStatePath: nil
)
XCTAssertEqual(childContext.cardLogId, parentContext.cardLogId)
XCTAssertEqual(childContext.path, parentContext.path)
XCTAssertEqual(childContext.parentDivStatePath, parentContext.parentDivStatePath)
}
func test_WhenModifyIdPropertiesToNil_propertiesAreNil() throws {
let parentContext = DivBlockModelingContext().modifying(
overridenId: "overriden_id",
currentDivId: "current_div_id",
pathSuffix: "arbitrary_parent_path_suffix"
)
let childContext = parentContext.modifying(
overridenId: nil,
currentDivId: nil,
pathSuffix: "arbitrary_child_path_suffix"
)
XCTAssertNil(childContext.overridenId)
XCTAssertNil(childContext.currentDivId)
}
}
private final class MockSizeModifier: DivSizeModifier {
func transformWidth(_ width: DivSize) -> DivSize {
width
}
func transformHeight(_ height: DivSize) -> DivSize {
height
}
}