// // CoordinatorTests.swift // ReviewsCoordinationTest // // Created by Javier Cicchelli on 21/03/2024. // Copyright © 2024 Röck+Cöde. All rights reserved. // import ReviewsCoordinationKit import UIKit import XCTest final class CoordinatorTests: XCTestCase { // MARK: Properties private var router: SpyRouter! private var coordinator: Coordinator! // MARK: Tests func testPresent_withoutOnDismissClosure() { // Executing this test on the main thread is required as a `UIViewController` instance in being initialised here. DispatchQueue.main.async { // GIVEN self.router = SpyRouter() self.coordinator = SomeCoordinator(router: self.router) // WHEN self.coordinator.present( animated: false, onDismiss: nil ) // THEN XCTAssertTrue(self.coordinator.children.isEmpty) XCTAssertEqual(self.router.state, .presented) XCTAssertTrue(self.router.viewController is SomeViewController) XCTAssertFalse(self.router.animated ?? true) XCTAssertNil(self.router.onDismiss) } } func testPresent_withOnDismissClosure() { // Executing this test on the main thread is required as a `UIViewController` instance in being initialised here. DispatchQueue.main.async { // GIVEN self.router = SpyRouter() self.coordinator = OtherCoordinator(router: self.router) // WHEN self.coordinator.present(animated: true) {} // THEN XCTAssertTrue(self.coordinator.children.isEmpty) XCTAssertEqual(self.router.state, .presented) XCTAssertTrue(self.router.viewController is OtherViewController) XCTAssertTrue(self.router.animated ?? false) XCTAssertNotNil(self.router.onDismiss) } } func testPresentChild_withoutOnDismissClosure() { // Executing this test on the main thread is required as a `UIViewController` instance in being initialised here. DispatchQueue.main.async { // GIVEN self.router = SpyRouter() self.coordinator = SomeCoordinator(router: self.router) let child = OtherCoordinator(router: self.router) // WHEN self.coordinator.present( child: child, animated: false ) // THEN XCTAssertFalse(self.coordinator.children.isEmpty) XCTAssertEqual(self.coordinator.children.count, 1) XCTAssertEqual(self.router.state, .presented) XCTAssertTrue(self.router.viewController is OtherViewController) XCTAssertFalse(self.router.animated ?? true) XCTAssertNil(self.router.onDismiss) } } func testPresentChild_withOnDismissClosure() { // Executing this test on the main thread is required as a `UIViewController` instance in being initialised here. DispatchQueue.main.async { // GIVEN self.router = SpyRouter() self.coordinator = OtherCoordinator(router: self.router) let child = SomeCoordinator(router: self.router) // WHEN self.coordinator.present( child: child, animated: true ) {} // THEN XCTAssertFalse(self.coordinator.children.isEmpty) XCTAssertEqual(self.coordinator.children.count, 1) XCTAssertEqual(self.router.state, .presented) XCTAssertTrue(self.router.viewController is SomeViewController) XCTAssertTrue(self.router.animated ?? false) XCTAssertNotNil(self.router.onDismiss) } } func testDismiss_notAnimated() { // GIVEN router = SpyRouter() coordinator = OtherCoordinator(router: router) // WHEN coordinator.dismiss(animated: false) // THEN XCTAssertTrue(coordinator.children.isEmpty) XCTAssertEqual(router.state, .dismissed) XCTAssertNil(router.viewController) XCTAssertFalse(router.animated ?? true) XCTAssertNil(router.onDismiss) } func testDismiss_animated() { // GIVEN router = SpyRouter() coordinator = OtherCoordinator(router: router) // WHEN coordinator.dismiss(animated: true) // THEN XCTAssertTrue(coordinator.children.isEmpty) XCTAssertEqual(router.state, .dismissed) XCTAssertNil(router.viewController) XCTAssertTrue(router.animated ?? false) XCTAssertNil(router.onDismiss) } }