Баннер Telegram-паритета и прямой переход в чат по тапу

This commit is contained in:
2026-04-13 23:34:54 +05:00
parent 05420337cc
commit 69ac9cd270
17 changed files with 1104 additions and 444 deletions

View File

@@ -0,0 +1,115 @@
import XCTest
@testable import Rosetta
/// Tests for ChatList bottom inset bug fix.
/// Bug: Unwanted horizontal strip appears at bottom of ChatList (not in Calls/Settings).
/// Fix: keep platform-specific bottom inset (72 on iOS < 26 custom tab bar, 0 on iOS 26+).
final class ChatListBottomInsetTests: XCTestCase {
var controller: ChatListCollectionController!
override func setUp() {
super.setUp()
controller = ChatListCollectionController()
}
override func tearDown() {
controller = nil
super.tearDown()
}
private var expectedBottomInset: CGFloat {
if #available(iOS 26, *) {
return 0
} else {
return 72
}
}
// MARK: - RED Phase Tests (These FAIL before fix, PASS after fix)
/// Test 1: contentInset.bottom should match active tab implementation.
func testContentInsetBottomMatchesPlatform() {
// Force view load to trigger setupCollectionView()
_ = controller.view
let collectionView = controller.value(forKey: "collectionView") as? UICollectionView
XCTAssertNotNil(collectionView, "Collection view should be initialized")
// iOS 26+: native TabView handles inset automatically (0 here).
// iOS < 26: custom floating tab bar needs 72pt manual inset.
XCTAssertEqual(
collectionView?.contentInset.bottom,
expectedBottomInset,
"Bottom inset should match platform-specific tab bar behavior"
)
}
/// Test 2: Verify automatic safe area adjustment is enabled
func testContentInsetAdjustmentBehaviorIsAutomatic() {
_ = controller.view
let collectionView = controller.value(forKey: "collectionView") as? UICollectionView
XCTAssertNotNil(collectionView, "Collection view should be initialized")
XCTAssertEqual(
collectionView?.contentInsetAdjustmentBehavior,
.automatic,
"Should use automatic adjustment (respects tab bar safe area)"
)
}
/// Test 3: Verify no excessive bottom inset (must not exceed custom tab bar space).
func testBottomInsetIsNotExcessive() {
_ = controller.view
let collectionView = controller.value(forKey: "collectionView") as? UICollectionView
XCTAssertNotNil(collectionView, "Collection view should be initialized")
let maxReasonableInset: CGFloat = 72
XCTAssertLessThanOrEqual(
collectionView?.contentInset.bottom ?? 0,
maxReasonableInset,
"Bottom inset should not exceed \(maxReasonableInset)pt"
)
}
// MARK: - Integration Tests
/// Test 4: Verify controller can be instantiated without crashes
func testControllerInitialization() {
XCTAssertNotNil(controller, "Controller should initialize successfully")
_ = controller.view
XCTAssertNotNil(controller.view, "View should load without crashes")
}
/// Test 5: Verify collection view constraints are properly set
func testCollectionViewConstraints() {
_ = controller.view
let collectionView = controller.value(forKey: "collectionView") as? UICollectionView
XCTAssertNotNil(collectionView, "Collection view should be initialized")
// Collection view should be edge-to-edge (no custom insets)
XCTAssertFalse(
collectionView?.translatesAutoresizingMaskIntoConstraints ?? true,
"Should use Auto Layout constraints"
)
}
// MARK: - Performance Tests
/// Test 6: Verify content inset query is fast (not computed on every access)
func testContentInsetPerformance() {
_ = controller.view
let collectionView = controller.value(forKey: "collectionView") as? UICollectionView
XCTAssertNotNil(collectionView)
measure {
for _ in 0..<1000 {
_ = collectionView?.contentInset.bottom
}
}
}
}