Skip to content

Commit 33130f3

Browse files
author
Jay Herron
committed
Adds convenience methods and passing tests
1 parent f1d9ece commit 33130f3

File tree

4 files changed

+139
-43
lines changed

4 files changed

+139
-43
lines changed

Sources/GraphQL/GraphQL.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import Foundation
22
import NIO
3-
import RxSwift
43

54
public struct GraphQLResult : Equatable, Codable, CustomStringConvertible {
65
public var data: Map?

Sources/GraphQL/Subscription/EventStream.swift

Lines changed: 67 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,81 @@
22

33
import RxSwift
44

5+
/// Abstract event stream class - Should be overridden for actual implementations
56
public class EventStream<Element> {
6-
/// This class should be overridden
7-
func transform<To>(_ closure: @escaping (Element) throws -> To) -> EventStream<To> {
7+
/// Template method for mapping an event stream to a new generic type - MUST be overridden by implementing types.
8+
func map<To>(_ closure: @escaping (Element) throws -> To) -> EventStream<To> {
89
fatalError("This function should be overridden by implementing classes")
910
}
1011
}
1112

12-
//extension Observable: EventStream<Element> {
13-
// func transform<To>(_ closure: @escaping (Element) throws -> To) -> EventStream<To> {
14-
// return self.map(closure)
15-
// }
16-
//}
1713

14+
// TODO: Put in separate GraphQLRxSwift package
15+
16+
// EventStream wrapper for Observable
1817
public class ObservableEventStream<Element> : EventStream<Element> {
19-
var observable: Observable<Element>
20-
init(observable: Observable<Element>) {
18+
public var observable: Observable<Element>
19+
init(_ observable: Observable<Element>) {
2120
self.observable = observable
2221
}
23-
override func transform<To>(_ closure: @escaping (Element) throws -> To) -> EventStream<To> {
24-
return ObservableEventStream<To>(observable: observable.map(closure))
22+
override func map<To>(_ closure: @escaping (Element) throws -> To) -> EventStream<To> {
23+
return ObservableEventStream<To>(observable.map(closure))
24+
}
25+
}
26+
// Convenience types
27+
public typealias ObservableSourceEventStream = ObservableEventStream<Future<Any>>
28+
public typealias ObservableSubscriptionEventStream = ObservableEventStream<Future<GraphQLResult>>
29+
30+
extension Observable {
31+
// Convenience method for wrapping Observables in EventStreams
32+
public func toEventStream() -> ObservableEventStream<Element> {
33+
return ObservableEventStream(self)
2534
}
2635
}
36+
37+
38+
// TODO: Delete notes below
39+
40+
// Protocol attempts
41+
42+
//protocol EventStreamP {
43+
// associatedtype Element
44+
// func transform<To>(_ closure: @escaping (Element) throws -> To) -> EventStreamP // How to specify that returned associated type is 'To'
45+
//}
46+
//extension Observable: EventStreamP {
47+
// func transform<To>(_ closure: @escaping (Element) throws -> To) -> EventStreamP {
48+
// return self.map(closure)
49+
// }
50+
//}
51+
52+
// Try defining element in closure return
53+
//protocol EventStreamP {
54+
// associatedtype Element
55+
// func transform<ResultStream: EventStreamP>(_ closure: @escaping (Element) throws -> ResultStream.Element) -> ResultStream
56+
//}
57+
//extension Observable: EventStreamP {
58+
// func transform<ResultStream: EventStreamP>(_ closure: @escaping (Element) throws -> ResultStream.Element) -> ResultStream {
59+
// return self.map(closure) // Observable<ResultStream.Element> isn't recognized as a ResultStream
60+
// }
61+
//}
62+
63+
// Try absorbing generic type into function
64+
//protocol EventStreamP {
65+
// func transform<From, To>(_ closure: @escaping (From) throws -> To) -> EventStreamP
66+
//}
67+
//extension Observable: EventStreamP {
68+
// func transform<From, To>(_ closure: @escaping (From) throws -> To) -> EventStreamP {
69+
// return self.map(closure) // Doesn't recognize that Observable.Element is the same as From
70+
// }
71+
//}
72+
73+
// Try opaque types
74+
//protocol EventStreamP {
75+
// associatedtype Element
76+
// func transform<To>(_ closure: @escaping (Element) throws -> To) -> some EventStreamP
77+
//}
78+
//extension Observable: EventStreamP {
79+
// func transform<To>(_ closure: @escaping (Element) throws -> To) -> some EventStreamP {
80+
// return self.map(closure)
81+
// }
82+
//}

Sources/GraphQL/Subscription/Subscribe.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import Dispatch
22
import Runtime
3-
import RxSwift
43
import NIO
54

65
/**
@@ -53,7 +52,7 @@ func subscribe(
5352

5453
return sourceFuture.map{ sourceResult -> SubscriptionResult in
5554
if let sourceStream = sourceResult.stream {
56-
let subscriptionStream = sourceStream.transform { eventPayload -> Future<GraphQLResult> in
55+
let subscriptionStream = sourceStream.map { eventPayload -> Future<GraphQLResult> in
5756

5857
// For each payload yielded from a subscription, map it over the normal
5958
// GraphQL `execute` function, with `payload` as the rootValue.

Tests/GraphQLTests/Subscription/SubscriptionTests.swift

Lines changed: 71 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,17 @@ class SubscriptionTests : XCTestCase {
3232
request: query,
3333
eventLoopGroup: eventLoopGroup
3434
).wait()
35-
print(subscriptionResult)
36-
let subscription = subscriptionResult.stream! as! ObservableEventStream<Future<GraphQLResult>>
35+
guard let subscription = subscriptionResult.stream else {
36+
XCTFail(subscriptionResult.errors.description)
37+
return
38+
}
39+
guard let stream = subscription as? ObservableSubscriptionEventStream else {
40+
XCTFail("stream isn't ObservableSubscriptionEventStream")
41+
return
42+
}
3743

3844
var currentResult = GraphQLResult()
39-
let _ = subscription.observable.subscribe { event in
45+
let _ = stream.observable.subscribe { event in
4046
currentResult = try! event.element!.wait()
4147
}.disposed(by: db.disposeBag)
4248

@@ -86,7 +92,7 @@ class SubscriptionTests : XCTestCase {
8692
))
8793
},
8894
subscribe: {_, _, _, eventLoopGroup, _ throws -> EventLoopFuture<Any?> in
89-
return eventLoopGroup.next().makeSucceededFuture(db.publisher)
95+
return eventLoopGroup.next().makeSucceededFuture(db.publisher.toEventStream())
9096
}
9197
),
9298
"notImportantEmail": GraphQLField(
@@ -104,7 +110,7 @@ class SubscriptionTests : XCTestCase {
104110
))
105111
},
106112
subscribe: {_, _, _, eventLoopGroup, _ throws -> EventLoopFuture<Any?> in
107-
return eventLoopGroup.next().makeSucceededFuture(db.publisher)
113+
return eventLoopGroup.next().makeSucceededFuture(db.publisher.toEventStream())
108114
}
109115
)
110116
]
@@ -123,10 +129,14 @@ class SubscriptionTests : XCTestCase {
123129
}
124130
}
125131
}
126-
""") as! ObservableEventStream<Future<GraphQLResult>>
132+
""")
133+
guard let stream = subscription as? ObservableSubscriptionEventStream else {
134+
XCTFail("stream isn't ObservableSubscriptionEventStream")
135+
return
136+
}
127137

128138
var currentResult = GraphQLResult()
129-
let _ = subscription.observable.subscribe { event in
139+
let _ = stream.observable.subscribe { event in
130140
currentResult = try! event.element!.wait()
131141
}.disposed(by: db.disposeBag)
132142

@@ -172,7 +182,7 @@ class SubscriptionTests : XCTestCase {
172182
},
173183
subscribe: {_, _, _, eventLoopGroup, _ throws -> EventLoopFuture<Any?> in
174184
didResolveImportantEmail = true
175-
return eventLoopGroup.next().makeSucceededFuture(db.publisher)
185+
return eventLoopGroup.next().makeSucceededFuture(db.publisher.toEventStream())
176186
}
177187
),
178188
"notImportantEmail": GraphQLField(
@@ -182,7 +192,7 @@ class SubscriptionTests : XCTestCase {
182192
},
183193
subscribe: {_, _, _, eventLoopGroup, _ throws -> EventLoopFuture<Any?> in
184194
didResolveNonImportantEmail = true
185-
return eventLoopGroup.next().makeSucceededFuture(db.publisher)
195+
return eventLoopGroup.next().makeSucceededFuture(db.publisher.toEventStream())
186196
}
187197
)
188198
]
@@ -193,9 +203,13 @@ class SubscriptionTests : XCTestCase {
193203
importantEmail
194204
notImportantEmail
195205
}
196-
""") as! ObservableEventStream<Future<GraphQLResult>>
197-
198-
let _ = subscription.observable.subscribe{ event in
206+
""")
207+
guard let stream = subscription as? ObservableSubscriptionEventStream else {
208+
XCTFail("stream isn't ObservableSubscriptionEventStream")
209+
return
210+
}
211+
212+
let _ = stream.observable.subscribe{ event in
199213
let _ = try! event.element!.wait()
200214
}.disposed(by: db.disposeBag)
201215
db.trigger(email: Email(
@@ -360,10 +374,14 @@ class SubscriptionTests : XCTestCase {
360374
}
361375
}
362376
}
363-
""") as! ObservableEventStream<Future<GraphQLResult>>
377+
""")
378+
guard let stream = subscription as? ObservableSubscriptionEventStream else {
379+
XCTFail("stream isn't ObservableSubscriptionEventStream")
380+
return
381+
}
364382

365383
var currentResult = GraphQLResult()
366-
let _ = subscription.observable.subscribe { event in
384+
let _ = stream.observable.subscribe { event in
367385
currentResult = try! event.element!.wait()
368386
}.disposed(by: db.disposeBag)
369387

@@ -403,17 +421,21 @@ class SubscriptionTests : XCTestCase {
403421
}
404422
}
405423
}
406-
""") as! ObservableEventStream<Future<GraphQLResult>>
424+
""")
425+
guard let stream = subscription as? ObservableSubscriptionEventStream else {
426+
XCTFail("stream isn't ObservableSubscriptionEventStream")
427+
return
428+
}
407429

408430
// Subscription 1
409431
var sub1Value = GraphQLResult()
410-
let _ = subscription.observable.subscribe { event in
432+
let _ = stream.observable.subscribe { event in
411433
sub1Value = try! event.element!.wait()
412434
}.disposed(by: db.disposeBag)
413435

414436
// Subscription 2
415437
var sub2Value = GraphQLResult()
416-
let _ = subscription.observable.subscribe { event in
438+
let _ = stream.observable.subscribe { event in
417439
sub2Value = try! event.element!.wait()
418440
}.disposed(by: db.disposeBag)
419441

@@ -457,10 +479,14 @@ class SubscriptionTests : XCTestCase {
457479
}
458480
}
459481
}
460-
""") as! ObservableEventStream<Future<GraphQLResult>>
482+
""")
483+
guard let stream = subscription as? ObservableSubscriptionEventStream else {
484+
XCTFail("stream isn't ObservableSubscriptionEventStream")
485+
return
486+
}
461487

462488
var currentResult = GraphQLResult()
463-
let _ = subscription.observable.subscribe { event in
489+
let _ = stream.observable.subscribe { event in
464490
currentResult = try! event.element!.wait()
465491
print(currentResult)
466492
}.disposed(by: db.disposeBag)
@@ -521,10 +547,14 @@ class SubscriptionTests : XCTestCase {
521547
}
522548
}
523549
}
524-
""") as! ObservableEventStream<Future<GraphQLResult>>
550+
""")
551+
guard let stream = subscription as? ObservableSubscriptionEventStream else {
552+
XCTFail("stream isn't ObservableSubscriptionEventStream")
553+
return
554+
}
525555

526556
var currentResult = GraphQLResult()
527-
let _ = subscription.observable.subscribe { event in
557+
let _ = stream.observable.subscribe { event in
528558
currentResult = try! event.element!.wait()
529559
}.disposed(by: db.disposeBag)
530560

@@ -597,10 +627,14 @@ class SubscriptionTests : XCTestCase {
597627
}
598628
}
599629
}
600-
""") as! ObservableEventStream<Future<GraphQLResult>>
630+
""")
631+
guard let stream = subscription as? ObservableSubscriptionEventStream else {
632+
XCTFail("stream isn't ObservableSubscriptionEventStream")
633+
return
634+
}
601635

602636
var currentResult = GraphQLResult()
603-
let subscriber = subscription.observable.subscribe { event in
637+
let subscriber = stream.observable.subscribe { event in
604638
currentResult = try! event.element!.wait()
605639
}
606640

@@ -659,7 +693,7 @@ class SubscriptionTests : XCTestCase {
659693
))
660694
},
661695
subscribe: {_, _, _, eventLoopGroup, _ throws -> EventLoopFuture<Any?> in
662-
return eventLoopGroup.next().makeSucceededFuture(db.publisher)
696+
return eventLoopGroup.next().makeSucceededFuture(db.publisher.toEventStream())
663697
}
664698
)
665699

@@ -671,10 +705,14 @@ class SubscriptionTests : XCTestCase {
671705
}
672706
}
673707
}
674-
""") as! ObservableEventStream<Future<GraphQLResult>>
708+
""")
709+
guard let stream = subscription as? ObservableSubscriptionEventStream else {
710+
XCTFail("stream isn't ObservableSubscriptionEventStream")
711+
return
712+
}
675713

676714
var currentResult = GraphQLResult()
677-
let _ = subscription.observable.subscribe { event in
715+
let _ = stream.observable.subscribe { event in
678716
currentResult = try! event.element!.wait()
679717
}.disposed(by: db.disposeBag)
680718

@@ -744,10 +782,14 @@ class SubscriptionTests : XCTestCase {
744782
}
745783
}
746784
}
747-
""") as! ObservableEventStream<Future<GraphQLResult>>
785+
""")
786+
guard let stream = subscription as? ObservableSubscriptionEventStream else {
787+
XCTFail("stream isn't ObservableSubscriptionEventStream")
788+
return
789+
}
748790

749791
var currentResult = GraphQLResult()
750-
let _ = subscription.observable.subscribe { event in
792+
let _ = stream.observable.subscribe { event in
751793
currentResult = try! event.element!.wait()
752794
}.disposed(by: db.disposeBag)
753795

@@ -896,7 +938,7 @@ class EmailDb {
896938
return true
897939
}
898940
}
899-
return eventLoopGroup.next().makeSucceededFuture(filtered)
941+
return eventLoopGroup.next().makeSucceededFuture(filtered.toEventStream())
900942
}
901943
)
902944
}

0 commit comments

Comments
 (0)