Skip to content

Commit c29ebc3

Browse files
committed
[ADD] CreateOrder TDD - Interactor
- Create a InteractorSpy to: + Test if the Interactor pass proper data shipping methods to the Presenter. + Test if the Interactor ask the Presenter to format the expiration date.
1 parent a9f9dcd commit c29ebc3

File tree

7 files changed

+273
-35
lines changed

7 files changed

+273
-35
lines changed

CleanStore/CleanStore.xcodeproj/project.pbxproj

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
4C1FC6671C860B4800465006 /* ListOrdersPresenterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1FC6631C860B4800465006 /* ListOrdersPresenterTests.swift */; };
2020
4C1FC6681C860B4800465006 /* ListOrdersViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1FC6641C860B4800465006 /* ListOrdersViewControllerTests.swift */; };
2121
4C1FC6691C860B4800465006 /* ListOrdersWorkerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1FC6651C860B4800465006 /* ListOrdersWorkerTests.swift */; };
22+
4C49C8241C87D865008CCD47 /* CreateOrderInteractorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C49C8201C87D865008CCD47 /* CreateOrderInteractorTests.swift */; };
23+
4C49C8251C87D865008CCD47 /* CreateOrderPresenterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C49C8211C87D865008CCD47 /* CreateOrderPresenterTests.swift */; };
24+
4C49C8261C87D865008CCD47 /* CreateOrderViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C49C8221C87D865008CCD47 /* CreateOrderViewControllerTests.swift */; };
25+
4C49C8271C87D865008CCD47 /* CreateOrderWorkerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C49C8231C87D865008CCD47 /* CreateOrderWorkerTests.swift */; };
2226
4C866E051C82F8E00022DE6B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C866E041C82F8E00022DE6B /* AppDelegate.swift */; };
2327
4C866E0A1C82F8E00022DE6B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C866E081C82F8E00022DE6B /* Main.storyboard */; };
2428
4C866E0C1C82F8E00022DE6B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C866E0B1C82F8E00022DE6B /* Assets.xcassets */; };
@@ -58,6 +62,10 @@
5862
4C1FC6631C860B4800465006 /* ListOrdersPresenterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ListOrdersPresenterTests.swift; path = Scenes/ListOrders/ListOrdersPresenterTests.swift; sourceTree = "<group>"; };
5963
4C1FC6641C860B4800465006 /* ListOrdersViewControllerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ListOrdersViewControllerTests.swift; path = Scenes/ListOrders/ListOrdersViewControllerTests.swift; sourceTree = "<group>"; };
6064
4C1FC6651C860B4800465006 /* ListOrdersWorkerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ListOrdersWorkerTests.swift; path = Scenes/ListOrders/ListOrdersWorkerTests.swift; sourceTree = "<group>"; };
65+
4C49C8201C87D865008CCD47 /* CreateOrderInteractorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CreateOrderInteractorTests.swift; path = Scenes/CreateOrder/CreateOrderInteractorTests.swift; sourceTree = "<group>"; };
66+
4C49C8211C87D865008CCD47 /* CreateOrderPresenterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CreateOrderPresenterTests.swift; path = Scenes/CreateOrder/CreateOrderPresenterTests.swift; sourceTree = "<group>"; };
67+
4C49C8221C87D865008CCD47 /* CreateOrderViewControllerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CreateOrderViewControllerTests.swift; path = Scenes/CreateOrder/CreateOrderViewControllerTests.swift; sourceTree = "<group>"; };
68+
4C49C8231C87D865008CCD47 /* CreateOrderWorkerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CreateOrderWorkerTests.swift; path = Scenes/CreateOrder/CreateOrderWorkerTests.swift; sourceTree = "<group>"; };
6169
4C866E011C82F8E00022DE6B /* CleanStore.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CleanStore.app; sourceTree = BUILT_PRODUCTS_DIR; };
6270
4C866E041C82F8E00022DE6B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
6371
4C866E091C82F8E00022DE6B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
@@ -120,6 +128,7 @@
120128
isa = PBXGroup;
121129
children = (
122130
4C1FC6611C860B2200465006 /* ListOrders */,
131+
4C49C8281C87DCB8008CCD47 /* CreateOrder */,
123132
);
124133
name = Scenes;
125134
sourceTree = "<group>";
@@ -135,6 +144,17 @@
135144
name = ListOrders;
136145
sourceTree = "<group>";
137146
};
147+
4C49C8281C87DCB8008CCD47 /* CreateOrder */ = {
148+
isa = PBXGroup;
149+
children = (
150+
4C49C8201C87D865008CCD47 /* CreateOrderInteractorTests.swift */,
151+
4C49C8211C87D865008CCD47 /* CreateOrderPresenterTests.swift */,
152+
4C49C8221C87D865008CCD47 /* CreateOrderViewControllerTests.swift */,
153+
4C49C8231C87D865008CCD47 /* CreateOrderWorkerTests.swift */,
154+
);
155+
name = CreateOrder;
156+
sourceTree = "<group>";
157+
};
138158
4C866DF81C82F8E00022DE6B = {
139159
isa = PBXGroup;
140160
children = (
@@ -313,8 +333,12 @@
313333
files = (
314334
4C1FC6671C860B4800465006 /* ListOrdersPresenterTests.swift in Sources */,
315335
4C1FC6661C860B4800465006 /* ListOrdersInteractorTests.swift in Sources */,
336+
4C49C8241C87D865008CCD47 /* CreateOrderInteractorTests.swift in Sources */,
316337
4C1FC6691C860B4800465006 /* ListOrdersWorkerTests.swift in Sources */,
338+
4C49C8271C87D865008CCD47 /* CreateOrderWorkerTests.swift in Sources */,
317339
4C1FC6681C860B4800465006 /* ListOrdersViewControllerTests.swift in Sources */,
340+
4C49C8261C87D865008CCD47 /* CreateOrderViewControllerTests.swift in Sources */,
341+
4C49C8251C87D865008CCD47 /* CreateOrderPresenterTests.swift in Sources */,
318342
);
319343
runOnlyForDeploymentPostprocessing = 0;
320344
};

CleanStore/CleanStore/Scenes/CreateOrderInteractor.swift

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import UIKit
1313

1414
protocol CreateOrderInteractorInput
1515
{
16-
func doSomething(request: CreateOrderRequest)
16+
// func doSomething(request: CreateOrderRequest)
1717

1818
var shippingMethods : [String] { get }
1919

@@ -22,9 +22,9 @@ protocol CreateOrderInteractorInput
2222

2323
protocol CreateOrderInteractorOutput
2424
{
25-
func presentSomething(response: CreateOrderResponse)
25+
// func presentSomething(response: CreateOrderResponse)
2626

27-
func presentExpirationDate (response: CreateOrder_FormatExpirationDate_Response)
27+
func presentExpirationDate(response: CreateOrder_FormatExpirationDate_Response)
2828
}
2929

3030
class CreateOrderInteractor: CreateOrderInteractorInput {
@@ -39,18 +39,18 @@ class CreateOrderInteractor: CreateOrderInteractorInput {
3939

4040
// MARK: Business logic
4141

42-
func doSomething(request: CreateOrderRequest)
43-
{
44-
// NOTE: Create some Worker to do the work
45-
46-
worker = CreateOrderWorker()
47-
worker.doSomeWork()
48-
49-
// NOTE: Pass the result to the Presenter
50-
51-
let response = CreateOrderResponse()
52-
output.presentSomething(response)
53-
}
42+
// func doSomething(request: CreateOrderRequest)
43+
// {
44+
// // NOTE: Create some Worker to do the work
45+
//
46+
// worker = CreateOrderWorker()
47+
// worker.doSomeWork()
48+
//
49+
// // NOTE: Pass the result to the Presenter
50+
//
51+
// let response = CreateOrderResponse()
52+
// output.presentSomething(response)
53+
// }
5454

5555
// MARK: Expiration date
5656

CleanStore/CleanStore/Scenes/CreateOrderPresenter.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ import UIKit
1313

1414
protocol CreateOrderPresenterInput
1515
{
16-
func presentSomething(response: CreateOrderResponse)
16+
// func presentSomething(response: CreateOrderResponse)
1717

1818
func presentExpirationDate(response: CreateOrder_FormatExpirationDate_Response)
1919
}
2020

2121
protocol CreateOrderPresenterOutput: class
2222
{
23-
func displaySomething(viewModel: CreateOrderViewModel)
23+
// func displaySomething(viewModel: CreateOrderViewModel)
2424

2525
func displayExpirationDate(viewModel: CreateOrder_FormatExpirationDate_ViewModel)
2626
}
@@ -42,13 +42,13 @@ class CreateOrderPresenter: CreateOrderPresenterInput {
4242

4343
// MARK: Presentation logic
4444

45-
func presentSomething(response: CreateOrderResponse)
46-
{
47-
// NOTE: Format the response from the Interactor and pass the result back to the View Controller
48-
49-
let viewModel = CreateOrderViewModel()
50-
output.displaySomething(viewModel)
51-
}
45+
// func presentSomething(response: CreateOrderResponse)
46+
// {
47+
// // NOTE: Format the response from the Interactor and pass the result back to the View Controller
48+
//
49+
// let viewModel = CreateOrderViewModel()
50+
// output.displaySomething(viewModel)
51+
// }
5252

5353
// MARK: Expiration date
5454
func presentExpirationDate(response: CreateOrder_FormatExpirationDate_Response) {

CleanStore/CleanStore/Scenes/CreateOrderViewController.swift

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ import UIKit
1313

1414
protocol CreateOrderViewControllerInput
1515
{
16-
func displaySomething(viewModel: CreateOrderViewModel)
16+
// func displaySomething(viewModel: CreateOrderViewModel)
1717

1818
func displayExpirationDate(viewModel: CreateOrder_FormatExpirationDate_ViewModel)
1919
}
2020

2121
protocol CreateOrderViewControllerOutput
2222
{
23-
func doSomething(request: CreateOrderRequest)
23+
// func doSomething(request: CreateOrderRequest)
2424

2525
var shippingMethods : [String] { get }
2626

@@ -73,7 +73,7 @@ class CreateOrderViewController: UITableViewController, CreateOrderViewControlle
7373

7474

7575

76-
doSomethingOnLoad()
76+
// doSomethingOnLoad()
7777

7878
configurePickers()
7979
}
@@ -87,14 +87,14 @@ class CreateOrderViewController: UITableViewController, CreateOrderViewControlle
8787

8888
// MARK: Event handling
8989

90-
func doSomethingOnLoad()
91-
{
92-
// NOTE: Ask the Interactor to do some work
93-
94-
let request = CreateOrderRequest()
95-
96-
output.doSomething(request)
97-
}
90+
// func doSomethingOnLoad()
91+
// {
92+
// // NOTE: Ask the Interactor to do some work
93+
//
94+
// let request = CreateOrderRequest()
95+
//
96+
// output.doSomething(request)
97+
// }
9898

9999
// MARK: Display logic
100100

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
//
2+
// CreateOrderInteractorTests.swift
3+
// CleanStore
4+
//
5+
// Created by Hiep Nguyen on 3/3/16.
6+
// Copyright (c) 2016 Zyncas. All rights reserved.
7+
//
8+
// This file was generated by the Clean Swift Xcode Templates so you can apply
9+
// clean architecture to your iOS and Mac projects, see http://clean-swift.com
10+
//
11+
12+
@testable import CleanStore
13+
import XCTest
14+
15+
class CreateOrderInteractorTests: XCTestCase
16+
{
17+
// MARK: Subject under test
18+
19+
var sut: CreateOrderInteractor!
20+
21+
// MARK: Test lifecycle
22+
23+
override func setUp()
24+
{
25+
super.setUp()
26+
setupCreateOrderInteractor()
27+
}
28+
29+
override func tearDown()
30+
{
31+
super.tearDown()
32+
}
33+
34+
// MARK: Test setup
35+
36+
func setupCreateOrderInteractor()
37+
{
38+
sut = CreateOrderInteractor()
39+
}
40+
41+
// MARK: Test doubles
42+
43+
class CreateOrderInteractorOutputSpy : CreateOrderInteractorOutput {
44+
45+
var presentExpirationDateCalled = false
46+
47+
func presentExpirationDate(response: CreateOrder_FormatExpirationDate_Response) {
48+
49+
presentExpirationDateCalled = true
50+
}
51+
}
52+
53+
// MARK: Tests
54+
55+
func testFormatExpirationDateShouldAskPresenterToFormatExpirationDate() {
56+
57+
// Given
58+
59+
let createOrderInteractorOutputSpy = CreateOrderInteractorOutputSpy()
60+
61+
sut.output = createOrderInteractorOutputSpy
62+
63+
// When
64+
65+
let request = CreateOrder_FormatExpirationDate_Request(date: NSDate())
66+
67+
sut.formatExpirationDate(request)
68+
69+
// Then
70+
71+
XCTAssert(createOrderInteractorOutputSpy.presentExpirationDateCalled, "Formatting an expiration date should ask presenter to do it")
72+
}
73+
74+
func testShippingMethodsShouldReturnAllAvailableShippingMethods() {
75+
76+
// Given
77+
78+
let allAvailableShippingMethods = ["Standard Shipping", "2-day Shipping", "1-day Shipping"]
79+
80+
// When
81+
82+
let returnedShippingMethods = sut.shippingMethods
83+
84+
// Then
85+
86+
XCTAssertEqual(returnedShippingMethods, allAvailableShippingMethods, "Shipping Methods should list all available shipping methods")
87+
}
88+
89+
func testSomething()
90+
{
91+
// Given
92+
93+
// When
94+
95+
// Then
96+
}
97+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
//
2+
// CreateOrderViewControllerTests.swift
3+
// CleanStore
4+
//
5+
// Created by Hiep Nguyen on 3/3/16.
6+
// Copyright (c) 2016 Zyncas. All rights reserved.
7+
//
8+
// This file was generated by the Clean Swift Xcode Templates so you can apply
9+
// clean architecture to your iOS and Mac projects, see http://clean-swift.com
10+
//
11+
12+
@testable import CleanStore
13+
import XCTest
14+
15+
class CreateOrderViewControllerTests: XCTestCase
16+
{
17+
// MARK: Subject under test
18+
19+
var sut: CreateOrderViewController!
20+
var window: UIWindow!
21+
22+
// MARK: Test lifecycle
23+
24+
override func setUp()
25+
{
26+
super.setUp()
27+
window = UIWindow()
28+
setupCreateOrderViewController()
29+
}
30+
31+
override func tearDown()
32+
{
33+
window = nil
34+
super.tearDown()
35+
}
36+
37+
// MARK: Test setup
38+
39+
func setupCreateOrderViewController()
40+
{
41+
let bundle = NSBundle.mainBundle()
42+
let storyboard = UIStoryboard(name: "Main", bundle: bundle)
43+
sut = storyboard.instantiateViewControllerWithIdentifier("CreateOrderViewController") as! CreateOrderViewController
44+
}
45+
46+
func loadView()
47+
{
48+
window.addSubview(sut.view)
49+
NSRunLoop.currentRunLoop().runUntilDate(NSDate())
50+
}
51+
52+
// MARK: Test doubles
53+
54+
// MARK: Tests
55+
56+
func testSomething()
57+
{
58+
// Given
59+
60+
// When
61+
62+
// Then
63+
}
64+
}

0 commit comments

Comments
 (0)