IGListKit/Examples/Examples-iOS/IGListKitExamples-UITests/DemosViewControllerUITests.swift
Tim Oliver ce09fad401 Harden iOS UI tests to catch potential infinite loops
Summary:
During testing, I noticed some of the UI tests would hang, and the runner would spin for hours.

I'm not sure if this was due to any code changes I made to the sample apps, or if it was just a general change in Xcode 15, but I discovered that some of the UI tests were using a for loop to 'flick' the screen until a UI element came on screen. For whatever reason, the for loop exit condition stopped working, and so now the test was stuck in an infinite loop.

This diff changes the exit condition so it properly works now, and also adds a maximum number of allowed 'flicks' just to absolutely guarantee an infinite loop isn't possible.

Reviewed By: fethica

Differential Revision: D50294913

fbshipit-source-id: 77b789e45cc935735b13192843aa80f512dbd7d8
2023-10-13 22:50:38 -07:00

101 lines
3.5 KiB
Swift

/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import XCTest
final class DemosViewControllerUITests: UITestCase {
func test_whenSelectingTailLoading_thatTailLoadingDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Tail Loading")
}
func test_whenSelectingSearchAutocomplete_thatSearchAutocompleteDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Search Autocomplete")
}
func test_whenSelectingMixedData_thatMixedDataDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Mixed Data")
}
func test_whenSelectingNestedAdapter_thatNestedAdapterDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Nested Adapter")
}
func test_whenSelectingEmptyView_thatEmptyViewDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Empty View")
}
func test_whenSelectingSingleSectionController_thatSingleSectionControllerScreenIsPresented() {
enterAndAssertScreen(withTitle: "Single Section Controller")
}
func test_whenSelectingStoryboard_thatStoryboardDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Storyboard")
}
func test_whenSelectingSingleSectionStoryboard_thatSingleSectionStoryboardDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Single Section Storyboard")
}
func test_whenSelectingWorkingRange_thatWorkingRangeDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Working Range")
}
func test_whenSelectingDiffAlgorithm_thatDiffAlgorithmDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Diff Algorithm")
}
func test_whenSelectingSupplementaryViews_thatSupplementaryViewsDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Supplementary Views")
}
func test_whenSelectingSelfSizingCells_thatSelfSizingCellsDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Self-sizing cells")
}
func test_whenSelectingDisplayDelegate_thatDisplayDelegateDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Display delegate")
}
func test_whenSelectingObjcDemo_thatObjcDemoDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Objc Demo")
}
func test_whenSelectingObjcGeneratedModelDemo_thatObjcGeneratedModelDemoDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Objc Generated Model Demo")
}
func test_whenSelectingCalendarDemo_thatCalendarDemoDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Calendar (auto diffing)")
}
func test_whenSelectingDependencyInjection_thatDependencyInjectionDemoDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Dependency Injection")
}
func test_whenSelectingRecorderCells_thatReorderCellsDemoDetailScreenIsPresented() {
enterAndAssertScreen(withTitle: "Reorder Cells")
}
private func enterAndAssertScreen(withTitle title: String) {
XCUIApplication().activate()
let elem = XCUIApplication().collectionViews.cells.staticTexts[title]
var numberOfTries = 0
while !elem.isHittable {
XCUIApplication().collectionViews.element.swipeUp()
numberOfTries += 1
if numberOfTries >= 10 {
break
}
}
XCTAssertTrue(elem.exists)
elem.tap()
XCTAssertTrue(XCUIApplication().navigationBars[title].exists)
}
}