-
-
Notifications
You must be signed in to change notification settings - Fork 157
/
PipelineSpec.swift
126 lines (112 loc) · 3.81 KB
/
PipelineSpec.swift
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
//
// PipelineSpec.swift
// Siesta
//
// Created by Paul on 2016/6/4.
// Copyright © 2016 Bust Out Solutions. All rights reserved.
//
import Siesta
import Foundation
import Quick
import Nimble
class PipelineSpec: ResourceSpecBase
{
override func resourceSpec(_ service: @escaping () -> Service, _ resource: @escaping () -> Resource)
{
beforeEach
{
configureStageNameAppenders(in: service())
}
describe("stage order")
{
it("determines transformer order")
{
stubAndAwaitRequest(for: resource())
expect(resource().text) == "decparmodcle"
}
it("can reorder transformers already added")
{
service().configure
{ $0.pipeline.order = [.rawData, .parsing, .cleanup, .model, .decoding] }
stubAndAwaitRequest(for: resource())
expect(resource().text) == "parclemoddec"
}
it("will skip unlisted stages")
{
service().configure
{ $0.pipeline.order = [.parsing, .decoding] }
stubAndAwaitRequest(for: resource())
expect(resource().text) == "pardec"
}
it("supports custom keys")
{
service().configure
{
$0.pipeline.order.insert(.funk, at: 3)
$0.pipeline.order.insert(.silence, at: 1)
$0.pipeline[.funk].add(stringAppendingTransformer("♫"))
}
stubAndAwaitRequest(for: resource())
expect(resource().text) == "decpar♫modcle"
}
}
describe("individual stage")
{
it("runs transformers in the order added")
{
service().configure
{
for solfegg in ["do", "re", "mi"]
{ $0.pipeline[.decoding].add(stringAppendingTransformer(solfegg)) }
}
stubAndAwaitRequest(for: resource())
expect(resource().text) == "decdoremiparmodcle"
}
it("can clear and replace transformers")
{
service().configure
{
$0.pipeline[.model].removeTransformers()
$0.pipeline[.model].add(stringAppendingTransformer("ti"))
}
stubAndAwaitRequest(for: resource())
expect(resource().text) == "decparticle"
}
}
it("can clear previously configured transformers")
{
service().configure
{ $0.pipeline.clear() }
stubAndAwaitRequest(for: resource())
expect(resource().latestData?.content is NSData) == true
}
}
}
private func stringAppendingTransformer(_ word: String) -> ResponseContentTransformer<Any,String>
{
return ResponseContentTransformer
{
let stringContent = $0.text
guard !stringContent.contains("error on \(word)") else
{ return nil }
return stringContent + word
}
}
func configureStageNameAppenders(in service: Service)
{
service.configure
{
$0.pipeline.clear()
for stage in [.decoding, .parsing, .model, .cleanup] as [PipelineStageKey]
{
$0.pipeline[stage].add(
stringAppendingTransformer(String(stage.description.prefix(3))))
}
}
}
extension PipelineStageKey
{
fileprivate static let
funk = PipelineStageKey(description: "funk"),
silence = PipelineStageKey(description: "silence")
}