RIBsTests/Workflow/WorkflowTests.swift (162 lines of code) (raw):

// // Copyright (c) 2017. Uber Technologies // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // import XCTest import RxSwift @testable import RIBs final class WorkerflowTests: XCTestCase { func test_nestedStepsDoNotRepeat() { var outerStep1RunCount = 0 var outerStep2RunCount = 0 var outerStep3RunCount = 0 var innerStep1RunCount = 0 var innerStep2RunCount = 0 var innerStep3RunCount = 0 let emptyObservable = Observable.just(((), ())) let workflow = Workflow<String>() _ = workflow .onStep { (mock) -> Observable<((), ())> in outerStep1RunCount += 1 return emptyObservable } .onStep { (_, _) -> Observable<((), ())> in outerStep2RunCount += 1 return emptyObservable } .onStep { (_, _) -> Observable<((), ())> in outerStep3RunCount += 1 let innerStep: Step<String, (), ()>? = emptyObservable.fork(workflow) innerStep? .onStep({ (_, _) -> Observable<((), ())> in innerStep1RunCount += 1 return emptyObservable }) .onStep({ (_, _) -> Observable<((), ())> in innerStep2RunCount += 1 return emptyObservable }) .onStep({ (_, _) -> Observable<((), ())> in innerStep3RunCount += 1 return emptyObservable }) .commit() return emptyObservable } .commit() .subscribe("Test Actionable Item") XCTAssertEqual(outerStep1RunCount, 1, "Outer step 1 should not have been run more than once") XCTAssertEqual(outerStep2RunCount, 1, "Outer step 2 should not have been run more than once") XCTAssertEqual(outerStep3RunCount, 1, "Outer step 3 should not have been run more than once") XCTAssertEqual(innerStep1RunCount, 1, "Inner step 1 should not have been run more than once") XCTAssertEqual(innerStep2RunCount, 1, "Inner step 2 should not have been run more than once") XCTAssertEqual(innerStep3RunCount, 1, "Inner step 3 should not have been run more than once") } func test_workflowReceivesError() { let workflow = TestWorkflow() let emptyObservable = Observable.just(((), ())) _ = workflow .onStep { _ -> Observable<((), ())> in return emptyObservable } .onStep { _, _ -> Observable<((), ())> in return emptyObservable } .onStep { _, _ -> Observable<((), ())> in return Observable.error(WorkflowTestError.error) } .onStep { _, _ -> Observable<((), ())> in return emptyObservable } .commit() .subscribe(()) XCTAssertEqual(0, workflow.completeCallCount) XCTAssertEqual(0, workflow.forkCallCount) XCTAssertEqual(1, workflow.errorCallCount) } func test_workflowDidComplete() { let workflow = TestWorkflow() let emptyObservable = Observable.just(((), ())) _ = workflow .onStep { _ -> Observable<((), ())> in return emptyObservable } .onStep { _, _ -> Observable<((), ())> in return emptyObservable } .onStep { _, _ -> Observable<((), ())> in return emptyObservable } .commit() .subscribe(()) XCTAssertEqual(1, workflow.completeCallCount) XCTAssertEqual(0, workflow.forkCallCount) XCTAssertEqual(0, workflow.errorCallCount) } func test_workflowDidFork() { let workflow = TestWorkflow() let emptyObservable = Observable.just(((), ())) _ = workflow .onStep { _ -> Observable<((), ())> in return emptyObservable } .onStep { _, _ -> Observable<((), ())> in return emptyObservable } .onStep { _, _ -> Observable<((), ())> in return emptyObservable } .onStep { _, _ -> Observable<((), ())> in let forkedStep: Step<(), (), ()>? = emptyObservable.fork(workflow) forkedStep? .onStep { _, _ -> Observable<((), ())> in return emptyObservable } .commit() return emptyObservable } .commit() .subscribe(()) XCTAssertEqual(1, workflow.completeCallCount) XCTAssertEqual(1, workflow.forkCallCount) XCTAssertEqual(0, workflow.errorCallCount) } func test_fork_verifySingleInvocationAtRoot() { let workflow = TestWorkflow() var rootCallCount = 0 let emptyObservable = Observable.just(((), ())) let rootStep = workflow .onStep { _ -> Observable<((), ())> in rootCallCount += 1 return emptyObservable } let firstFork: Step<(), (), ()>? = rootStep.asObservable().fork(workflow) _ = firstFork? .onStep { (_, _) -> Observable<((), ())> in return Observable.just(((), ())) } .commit() let secondFork: Step<(), (), ()>? = rootStep.asObservable().fork(workflow) _ = secondFork? .onStep { (_, _) -> Observable<((), ())> in return Observable.just(((), ())) } .commit() XCTAssertEqual(0, rootCallCount) _ = workflow.subscribe(()) XCTAssertEqual(1, rootCallCount) } } private enum WorkflowTestError: Error { case error } private class TestWorkflow: Workflow<()> { var completeCallCount = 0 var errorCallCount = 0 var forkCallCount = 0 override func didComplete() { completeCallCount += 1 } override func didFork() { forkCallCount += 1 } override func didReceiveError(_ error: Error) { errorCallCount += 1 } }