Skip to content

Commit fe9036c

Browse files
committed
[ADD] ListOrders TDD - ViewUI (visible in ViewController)
- Create a TableViewSpy to spy the UITableView and: + Test if tableView fetch proper orders via reloadData(). - Moreover, test all UITableViewDataSource and UITableViewDelegate function: + Test if tableView display proper number of sections. + Test if tableView display proper number of rows in one section. + Test if tableView configure proper cells. +
1 parent 9a80561 commit fe9036c

File tree

2 files changed

+157
-43
lines changed

2 files changed

+157
-43
lines changed

CleanStore/CleanStore/Scenes/ListOrders/ListOrdersViewController.swift

Lines changed: 73 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -19,62 +19,94 @@ protocol ListOrdersViewControllerInput
1919

2020
protocol ListOrdersViewControllerOutput
2121
{
22-
// func doSomething(request: ListOrdersRequest)
22+
// func doSomething(request: ListOrdersRequest)
2323

2424
func fetchOrders(request: ListOrders_FetchOrders_Request)
2525
}
2626

27-
class ListOrdersViewController: UITableViewController, ListOrdersViewControllerInput
28-
{
29-
var output: ListOrdersViewControllerOutput!
30-
var router: ListOrdersRouter!
31-
32-
// MARK: Object lifecycle
33-
34-
override func awakeFromNib()
35-
{
36-
super.awakeFromNib()
37-
ListOrdersConfigurator.sharedInstance.configure(self)
38-
}
39-
40-
// MARK: View lifecycle
41-
42-
override func viewDidLoad()
43-
{
44-
super.viewDidLoad()
45-
// doSomethingOnLoad()
46-
47-
fetchOrdersOnLoad()
48-
}
49-
50-
// MARK: Event handling
51-
52-
// func doSomethingOnLoad()
53-
// {
54-
// // NOTE: Ask the Interactor to do some work
55-
//
56-
// let request = ListOrdersRequest()
57-
//// output.doSomething(request)
58-
// }
27+
class ListOrdersViewController: UITableViewController, ListOrdersViewControllerInput {
28+
29+
var output: ListOrdersViewControllerOutput!
30+
var router: ListOrdersRouter!
31+
32+
var displayedOrders : [ListOrders_FetchOrders_ViewModel.DisplayedOrder] = []
33+
34+
// MARK: Object lifecycle
35+
36+
override func awakeFromNib()
37+
{
38+
super.awakeFromNib()
39+
ListOrdersConfigurator.sharedInstance.configure(self)
40+
}
41+
42+
// MARK: View lifecycle
43+
44+
override func viewDidLoad()
45+
{
46+
super.viewDidLoad()
47+
// doSomethingOnLoad()
48+
49+
fetchOrdersOnLoad()
50+
}
51+
52+
// MARK: Event handling
53+
54+
// func doSomethingOnLoad()
55+
// {
56+
// // NOTE: Ask the Interactor to do some work
57+
//
58+
// let request = ListOrdersRequest()
59+
//// output.doSomething(request)
60+
// }
5961

6062
func fetchOrdersOnLoad() {
6163

6264
let request = ListOrders_FetchOrders_Request()
6365

6466
output.fetchOrders(request)
6567
}
66-
67-
// MARK: Display logic
68-
69-
func displaySomething(viewModel: ListOrdersViewModel)
70-
{
71-
// NOTE: Display the result from the Presenter
7268

73-
// nameTextField.text = viewModel.name
74-
}
69+
// MARK: Display logic
70+
71+
func displaySomething(viewModel: ListOrdersViewModel)
72+
{
73+
// NOTE: Display the result from the Presenter
74+
75+
// nameTextField.text = viewModel.name
76+
}
7577

7678
func displayFetchedOrders(viewModel: ListOrders_FetchOrders_ViewModel) {
7779

80+
displayedOrders = viewModel.displayedOrders
81+
82+
tableView.reloadData()
83+
}
84+
85+
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
86+
87+
return 1
88+
}
89+
90+
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
91+
92+
return displayedOrders.count
93+
}
94+
95+
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
96+
97+
let displayedOrder = displayedOrders[indexPath.row]
98+
99+
var cell = tableView.dequeueReusableCellWithIdentifier("OrderTableViewCell")
100+
101+
if cell == nil {
102+
103+
cell = UITableViewCell(style: .Value1, reuseIdentifier: "OrderTableViewCell")
104+
}
105+
106+
cell?.textLabel?.text = displayedOrder.date
107+
108+
cell?.detailTextLabel?.text = displayedOrder.total
78109

110+
return cell!
79111
}
80112
}

CleanStore/CleanStoreTests/Scenes/ListOrders/ListOrdersViewControllerTests.swift

Lines changed: 84 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,19 @@ class ListOrdersViewControllerTests: XCTestCase
6565
}
6666
}
6767

68+
class TableViewSpy: UITableView {
69+
70+
// MARK: Method call expectations
71+
72+
var reloadDataCalled = false
73+
74+
// Spied methods
75+
76+
override func reloadData() {
77+
78+
reloadDataCalled = true
79+
}
80+
}
6881
// MARK: Tests
6982

7083
func testShouldFetchOrdersWhenViewIsLoaded() {
@@ -84,12 +97,81 @@ class ListOrdersViewControllerTests: XCTestCase
8497
XCTAssert(listOrdersViewControllerOutputSpy.fetchOrdersCalled, "Should fetch orders when view is loaded")
8598
}
8699

87-
func testSomething()
88-
{
100+
func testShouldDisplayFetchedOrders() {
101+
102+
// Given
103+
104+
let tableViewSpy = TableViewSpy()
105+
106+
sut.tableView = tableViewSpy
107+
108+
// When
109+
110+
let displayedOrders = [ListOrders_FetchOrders_ViewModel.DisplayedOrder(id: "doyle", date: "03/03/16", email: "peihsen.doyle@gmail.com", name: "Nguyen Hieu Hiep", total: "$1.23")]
111+
112+
let viewModel = ListOrders_FetchOrders_ViewModel(displayedOrders: displayedOrders)
113+
114+
sut.displayFetchedOrders(viewModel)
115+
116+
// Then
117+
118+
XCTAssert(tableViewSpy.reloadDataCalled, "Displaying fetched orders should reload the table view")
119+
}
120+
121+
func testNumberOfSectionsInTableViewShouldAlwaysBeOne() {
122+
89123
// Given
90124

125+
let tableView = sut.tableView
126+
91127
// When
92128

129+
let numberOfSections = sut.numberOfSectionsInTableView(tableView)
130+
93131
// Then
132+
133+
XCTAssertEqual(numberOfSections, 1, "Should be the same")
134+
}
135+
136+
func testNumberOfRowsInAnySectionShouldEqaulNumberOfOrdersToDisplay() {
137+
138+
// Given
139+
140+
let tableView = sut.tableView
141+
142+
// When
143+
144+
let testDisplayedOrders = [ListOrders_FetchOrders_ViewModel.DisplayedOrder(id: "doyle", date: "03/03/16", email: "peihsen.doyle@gmail.com", name: "Nguyen Hieu Hiep", total: "$1.23")]
145+
146+
sut.displayedOrders = testDisplayedOrders
147+
148+
// Then
149+
150+
let numberOfRows = tableView.numberOfRowsInSection(0)
151+
152+
XCTAssertEqual(numberOfRows, testDisplayedOrders.count, "Number of test displayed orders should be the same as numberOfRows")
153+
}
154+
155+
func testShouldConfigureTableViewCellToDisplayOrder() {
156+
157+
// Given
158+
159+
let tableView = sut.tableView
160+
161+
// When
162+
163+
let testDisplayedOrders = [ListOrders_FetchOrders_ViewModel.DisplayedOrder(id: "doyle", date: "03/03/16", email: "peihsen.doyle@gmail.com", name: "Nguyen Hieu Hiep", total: "$1.23")]
164+
165+
sut.displayedOrders = testDisplayedOrders
166+
167+
let indexPath = NSIndexPath(forRow: 0, inSection: 0)
168+
169+
let cell = sut.tableView(tableView, cellForRowAtIndexPath: indexPath)
170+
171+
// Then
172+
173+
XCTAssertEqual(cell.textLabel?.text, "03/03/16", "Should be the same")
174+
175+
XCTAssertEqual(cell.detailTextLabel?.text, "$1.23", "Should be the same")
94176
}
95177
}

0 commit comments

Comments
 (0)