-
Notifications
You must be signed in to change notification settings - Fork 66
/
PresenterTests.swift
125 lines (99 loc) · 3.62 KB
/
PresenterTests.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
//
// PresenterTests.swift
// Viperit
//
// Created by Ferran Abelló on 21/03/2017.
// Copyright © 2017 Ferran Abelló. All rights reserved.
//
import XCTest
import Viperit
//MARK: - Timeout
private let kTimeout: TimeInterval = 0.5
//MARK: - View Lifecycle
private let kViewHasLoaded = "viewHasLoaded"
private let kViewIsAboutToAppear = "viewIsAboutToAppear"
private let kViewHasAppeared = "viewHasAppeared"
private let kViewIsAboutToDisappear = "viewIsAboutToDisappear"
private let kViewHasDisappeared = "viewHasDisappeared"
//MARK: - Setup methods
private let kSetupView = "setupView"
//MARK: - Mock Presenter
private class MockPresenter: Presenter, SamplePresenterInterface {
var expectation: XCTestExpectation!
var methodExpected: String!
private func assert(method: String) {
if methodExpected == method {
XCTAssert(true)
expectation.fulfill()
}
}
override func viewHasLoaded() {
super.viewHasLoaded()
assert(method: kViewHasLoaded)
}
override func viewIsAboutToAppear() {
super.viewIsAboutToAppear()
assert(method: kViewIsAboutToAppear)
}
override func viewHasAppeared() {
super.viewHasAppeared()
assert(method: kViewHasAppeared)
}
override func viewIsAboutToDisappear() {
super.viewIsAboutToDisappear()
assert(method: kViewIsAboutToDisappear)
}
override func viewHasDisappeared() {
super.viewHasDisappeared()
assert(method: kViewHasDisappeared)
}
override func setupView(data: Any) {
super.setupView(data: data)
assert(method: kSetupView)
}
}
//MARK: - Presenter Tests
class PresenterTests: XCTestCase {
private func createTestModuleWithMockPresenter(methodToTest: String) -> Module {
var module = TestModules.sample.build(bundle: Bundle(for: SampleRouter.self))
let mockPresenter = MockPresenter()
mockPresenter.expectation = expectation(description: "Expecting method: \(methodToTest)")
mockPresenter.methodExpected = methodToTest
module.injectMock(presenter: mockPresenter)
return module
}
private func expectViewLifecycle(method: String) {
let module = createTestModuleWithMockPresenter(methodToTest: method)
//Simulate view lifecycle
_ = module.view.viewController.view
module.view.viewWillAppear(false)
module.view.viewDidAppear(false)
module.view.viewWillDisappear(false)
module.view.viewDidDisappear(false)
expect(timeout: kTimeout, errorMessage: "\(method) timed out (> \(kTimeout)s")
}
func testViewHasLoaded() {
expectViewLifecycle(method: kViewHasLoaded)
}
func testViewIsAboutToAppear() {
expectViewLifecycle(method: kViewIsAboutToAppear)
}
func testViewHasAppeared() {
expectViewLifecycle(method: kViewHasAppeared)
}
func testSetupView() {
let mockView = UIViewController()
_ = mockView.view
let module = createTestModuleWithMockPresenter(methodToTest: kSetupView)
let router = module.router as! SampleRouter
//Simulate show module with router function using setup data
router.show(from: mockView, setupData: "randomData")
expect(timeout: kTimeout, errorMessage: "\(kSetupView) timed out (> \(kTimeout)s")
}
func expect(timeout: TimeInterval, errorMessage: String) {
waitForExpectations(timeout: timeout) { error in
guard error != nil else { return }
XCTFail(errorMessage)
}
}
}