-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDatasourceOperationsSpec.swift
More file actions
91 lines (66 loc) · 3.5 KB
/
DatasourceOperationsSpec.swift
File metadata and controls
91 lines (66 loc) · 3.5 KB
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
@testable import DataSourcerer
import Foundation
import Nimble
import Quick
class DatasourceOperationsSpec: QuickSpec {
private lazy var testStringLoadImpulse = LoadImpulse(params: "1", type: .initial)
var stringLoadImpulseEmitter: AnyLoadImpulseEmitter<String> {
return SimpleLoadImpulseEmitter<String>(initialImpulse: testStringLoadImpulse).any
}
private func testDatasource(_ loadImpulseEmitter: AnyLoadImpulseEmitter<String>)
-> ValueStream<ResourceState<String, String, TestStateError>> {
return ValueStream(testStates: OneTwoThreeStringTestStates.oneTwoThreeStringStates,
testError: TestStateError.unknown(description: "Value unavailable"),
loadImpulseEmitter: loadImpulseEmitter)
}
override func spec() {
describe("Datasource.map") {
it("should send mapped values to observer") {
let loadImpulseEmitter = self.stringLoadImpulseEmitter
let datasource = self.testDatasource(loadImpulseEmitter)
let transform: (ResourceState<String, String, TestStateError>) -> Int? = { state in
return (state.value).flatMap({ Int($0.value) })
}
let mapped = datasource.map(transform)
var observedInts: [Int?] = []
let disposable = mapped.observe({ value in
observedInts.append(value)
})
loadImpulseEmitter.emit(loadImpulse: LoadImpulse(params: "2", type: LoadImpulseType(mode: .fullRefresh, issuer: .user)), on: .current)
loadImpulseEmitter.emit(loadImpulse: LoadImpulse(params: "3", type: LoadImpulseType(mode: .fullRefresh, issuer: .user)), on: .current)
disposable.dispose()
let expectedValues = OneTwoThreeStringTestStates.oneTwoThreeStringStates.map(transform)
expect(observedInts).to(contain(expectedValues))
}
it("should release observer after disposal") {
let loadImpulseEmitter = self.stringLoadImpulseEmitter
let datasource = self.testDatasource(loadImpulseEmitter)
let transform: (ResourceState<String, String, TestStateError>) -> Int? = { state in
return (state.value).flatMap({ Int($0.value) })
}
let mapped = datasource.map(transform)
weak var testStr: NSMutableString?
let testScope: () -> Disposable = {
let innerStr = NSMutableString(string: "")
let disposable = mapped.observe({ value in
if let string = value.map({ String($0) }) {
innerStr.append(string)
}
})
testStr = innerStr
return disposable
}
let disposable = testScope()
expect(testStr) == "1"
loadImpulseEmitter.emit(loadImpulse: LoadImpulse(params: "1", type: .initial), on: .current)
expect(testStr) == "11"
disposable.dispose()
// Force synchronous access to disposable observers so assert works synchronously.
// Alternatively, a wait or waitUntil assert could be used, but this is
// less complex.
expect(disposable.isDisposed) == true
expect(testStr).to(beNil())
}
}
}
}