Skip to content

Commit 943cc97

Browse files
author
Florian Rieger
authored
Merge pull request #20 from AppCron/get-interactor-for-request
Get interactor for request
2 parents 032b774 + 0645e91 commit 943cc97

5 files changed

Lines changed: 95 additions & 95 deletions

File tree

Sources/ACInteractor/InteractorExecutor.swift

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ open class InteractorExecutor {
77

88
private var interactors = Dictionary<String, AnyObject>()
99

10-
// MARK: Register
10+
// MARK: - Register
1111

1212
public func registerInteractor<InteractorProtocol: Interactor, Response>
1313
(_ interactor: InteractorProtocol, request: InteractorRequest<Response>)
@@ -16,7 +16,7 @@ open class InteractorExecutor {
1616
interactors[key] = InteractorWrapper(interactor: interactor)
1717
}
1818

19-
// MARK: Execute
19+
// MARK: - Execute
2020

2121
open func execute<Request: InteractorRequestProtocol>(_ request: Request) {
2222
let key = String(describing: request)
@@ -35,7 +35,20 @@ open class InteractorExecutor {
3535
wrapper.execute(request)
3636
}
3737

38-
// MARK: Error Handling
38+
// MARK: - GetInteractor
39+
40+
open func getInteractor<Request: InteractorRequestProtocol>(request: Request) -> AnyObject? {
41+
let key = String(describing: request)
42+
let optional = interactors[key]
43+
44+
guard let wrapper = optional as? InteractorWrapper<Request> else {
45+
return nil
46+
}
47+
48+
return wrapper.wrappedInteractor
49+
}
50+
51+
// MARK: - Error Handling
3952

4053
private func fireErrorOnRequest(_ request: ErrorRequestProtocol, errorMessage: String) {
4154
let error = InteractorError(message: errorMessage)

Tests/ACInteractorTests/InteractorErrorTests.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ class InteractorErrorTests: XCTestCase {
88

99
override func setUp() {
1010
super.setUp()
11-
// Put setup code here. This method is called before the invocation of each test method in the class.
1211

1312
testError = NSError(domain: "com.appcron", code: 42, userInfo: [NSLocalizedDescriptionKey: "testMessage"])
1413

Tests/ACInteractorTests/InteractorExecutorTests.swift

Lines changed: 29 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -14,48 +14,34 @@ class InteractorExecutorTests: XCTestCase {
1414

1515
override func setUp() {
1616
super.setUp()
17-
// Put setup code here. This method is called before the invocation of each test method in the class.
1817

1918
firstRequest.onError = { [unowned self] (error: InteractorError) -> Void in
2019
self.errorMessageFromFirstRequest = error.message
2120
}
2221
}
2322

24-
// MARK: registerInteractor
23+
// MARK: - registerInteractor
2524

2625
func testRegisterInteractor_succeeds(){
2726
// Act
2827
executor.registerInteractor(firstInteractor, request: firstRequest)
2928
}
3029

31-
// MARK: execute
32-
33-
func testExecute_withInteractorAndRequest_callsExecuteOnInteractor() {
30+
func testRegisterInteractor_callsErrorClosureOnRequest_whenInteractorDoesNotMatchRequest() {
3431
// Arrange
35-
executor.registerInteractor(firstInteractor, request: firstRequest)
32+
executor.registerInteractor(secondInteractor, request: firstRequest)
3633

3734
// Act
3835
executor.execute(firstRequest)
3936

4037
// Assert
41-
XCTAssertEqual(firstInteractor.numberOfExceuteCalls, 1)
42-
XCTAssert(firstInteractor.executedRequest === firstRequest)
38+
let expected = "ACInteractor.ACInteractorExecutor: Request does not match execute function of registered Interactor!"
39+
XCTAssertEqual(errorMessageFromFirstRequest, expected)
4340
}
4441

45-
func testExecute_withTwoInteractors_executeOnSecond_callsExecuteOnSecondInteractor() {
46-
// Arrange
47-
executor.registerInteractor(firstInteractor, request: firstRequest)
48-
executor.registerInteractor(secondInteractor, request: secondRequest)
49-
50-
// Act
51-
executor.execute(secondRequest)
52-
53-
// Assert
54-
XCTAssertEqual(secondInteractor.numberOfExceuteCalls, 1)
55-
XCTAssert(secondInteractor.executedRequest === secondRequest)
56-
}
42+
// MARK: - execute
5743

58-
func testExecute_withTwoInteractors_executeOnBoth_callsExecuteOnEachInteractor() {
44+
func testExecute_callsExecuteOnInteractor_thatIsRegisteredForRequest() {
5945
// Arrange
6046
executor.registerInteractor(firstInteractor, request: firstRequest)
6147
executor.registerInteractor(secondInteractor, request: secondRequest)
@@ -65,14 +51,17 @@ class InteractorExecutorTests: XCTestCase {
6551
executor.execute(secondRequest)
6652

6753
// Assert
68-
XCTAssertEqual(firstInteractor.numberOfExceuteCalls, 1)
69-
XCTAssert(firstInteractor.executedRequest === firstRequest)
54+
XCTAssertEqual(firstInteractor.executedRequests.count, 1)
55+
XCTAssert(firstInteractor.executedRequests.first === firstRequest)
7056

71-
XCTAssertEqual(secondInteractor.numberOfExceuteCalls, 1)
72-
XCTAssert(secondInteractor.executedRequest === secondRequest)
57+
XCTAssertEqual(secondInteractor.executedRequests.count, 1)
58+
XCTAssert(secondInteractor.executedRequests.first === secondRequest)
7359
}
7460

75-
func testExecute_withUnknownRequest_callsErrorOnRequest() {
61+
func testExecute_callsErrorOnRequest_whenNoInteractorIsRegisteredForRequest() {
62+
// Arrange
63+
executor.registerInteractor(secondInteractor, request: secondRequest)
64+
7665
// Act
7766
executor.execute(firstRequest)
7867

@@ -81,47 +70,28 @@ class InteractorExecutorTests: XCTestCase {
8170
XCTAssertEqual(errorMessageFromFirstRequest, expected)
8271
}
8372

84-
func testExecute_withMismatchRequest_callsErrorOnRequest() {
73+
// MARK: - getInteractor
74+
75+
func testGetInteractor_returnsInteractor_registeredForRequest() {
8576
// Arrange
86-
executor.registerInteractor(secondInteractor, request: firstRequest)
77+
executor.registerInteractor(firstInteractor, request: firstRequest)
78+
executor.registerInteractor(secondInteractor, request: secondRequest)
8779

8880
// Act
89-
executor.execute(firstRequest)
81+
let firstResult = executor.getInteractor(request: firstRequest)
82+
let secondResult = executor.getInteractor(request: secondRequest)
9083

9184
// Assert
92-
let expected = "ACInteractor.ACInteractorExecutor: Request does not match execute function of registered Interactor!"
93-
XCTAssertEqual(errorMessageFromFirstRequest, expected)
85+
XCTAssert(firstResult === firstInteractor)
86+
XCTAssert(secondResult === secondInteractor)
9487
}
9588

96-
97-
// MARK: Test Interactors
98-
99-
class FirstInteractor: Interactor {
100-
var numberOfExceuteCalls = 0
101-
var executedRequest: Request?
102-
103-
class Request: InteractorRequest<NSString> {
104-
}
105-
106-
func execute(_ request: Request) {
107-
numberOfExceuteCalls += 1
108-
executedRequest = request
109-
}
110-
}
111-
112-
class SecondInteractor: Interactor {
113-
var numberOfExceuteCalls = 0
114-
var executedRequest: Request?
115-
116-
class Request: InteractorRequest<NSString> {
117-
}
89+
func testGetInteractor_returnsNil_whenNoInteractorIsRegisteredForRequest() {
90+
// Act
91+
let result = executor.getInteractor(request: firstRequest)
11892

119-
func execute(_ request: Request) {
120-
numberOfExceuteCalls += 1
121-
executedRequest = request
122-
}
93+
// Assert
94+
XCTAssertNil(result)
12395
}
12496

12597
}
126-
127-

Tests/ACInteractorTests/LazyInteractorTests.swift

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ class LazyInteractorTests: XCTestCase {
99

1010
override func setUp() {
1111
super.setUp()
12-
// Put setup code here. This method is called before the invocation of each test method in the class.
13-
1412
lazyInteractor = LazyInteractor(factory: testFactory)
1513
}
1614

@@ -56,36 +54,8 @@ class LazyInteractorTests: XCTestCase {
5654

5755
// Assert
5856
let interactor = lazyInteractor.getInteractor()
59-
XCTAssertEqual(interactor.numberOfExceuteCalls, 1)
60-
XCTAssert(interactor.executedRequest === request)
57+
XCTAssertEqual(interactor.executedRequests.count, 1)
58+
XCTAssert(interactor.executedRequests.first === request)
6159
}
6260

63-
// MARK: Test Interactor
64-
65-
class TestInteractor: Interactor {
66-
let dependency: String
67-
var numberOfExceuteCalls = 0
68-
var executedRequest: Request?
69-
70-
var handledErrorRequest: ErrorRequestProtocol?
71-
var handledError: Error?
72-
73-
init(dependency: String) {
74-
self.dependency = dependency
75-
}
76-
77-
class Request: InteractorRequest<NSString> {
78-
}
79-
80-
func execute(_ request: Request) {
81-
numberOfExceuteCalls += 1
82-
executedRequest = request
83-
}
84-
85-
func handleError(_ request: ErrorRequestProtocol, error: Error) {
86-
handledErrorRequest = request
87-
handledError = error
88-
}
89-
}
90-
9161
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import Foundation
2+
@testable import ACInteractor
3+
4+
class TestInteractor: Interactor {
5+
6+
class Request: InteractorRequest<String> {
7+
}
8+
9+
let dependency: String
10+
private(set) var executedRequests = [Request]()
11+
12+
init(dependency: String) {
13+
self.dependency = dependency
14+
}
15+
16+
func execute(_ request: Request) {
17+
executedRequests.append(request)
18+
}
19+
20+
}
21+
22+
23+
class FirstInteractor: Interactor {
24+
25+
var executedRequests = [Request]()
26+
27+
class Request: InteractorRequest<NSString> {
28+
}
29+
30+
func execute(_ request: Request) {
31+
executedRequests.append(request)
32+
}
33+
34+
}
35+
36+
37+
class SecondInteractor: Interactor {
38+
39+
var executedRequests = [Request]()
40+
41+
class Request: InteractorRequest<NSString> {
42+
}
43+
44+
func execute(_ request: Request) {
45+
executedRequests.append(request)
46+
}
47+
48+
}

0 commit comments

Comments
 (0)