bubble-wrap 0.4.0 → 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +9 -0
- data/GEM.md +104 -0
- data/HACKING.md +101 -0
- data/README.md +32 -4
- data/Rakefile +8 -9
- data/bubble-wrap.gemspec +2 -1
- data/lib/bubble-wrap/core.rb +1 -1
- data/lib/bubble-wrap/ext.rb +2 -2
- data/lib/bubble-wrap/ext/motion_project_app.rb +3 -3
- data/lib/bubble-wrap/ext/motion_project_config.rb +1 -0
- data/lib/bubble-wrap/http.rb +1 -1
- data/lib/bubble-wrap/loader.rb +3 -3
- data/lib/bubble-wrap/requirement.rb +1 -1
- data/lib/bubble-wrap/test.rb +8 -0
- data/lib/bubble-wrap/version.rb +1 -1
- data/lib_spec/bubble-wrap/ext/motion_project_app_spec.rb +138 -0
- data/lib_spec/bubble-wrap/requirement/path_manipulation_spec.rb +11 -12
- data/lib_spec/bubble-wrap/requirement_spec.rb +23 -22
- data/lib_spec/bubble-wrap_spec.rb +2 -1
- data/motion/core/app.rb +5 -0
- data/motion/core/device/screen.rb +2 -2
- data/motion/core/kvo.rb +91 -0
- data/motion/core/persistence.rb +7 -5
- data/motion/core/time.rb +15 -4
- data/motion/http.rb +54 -33
- data/{lib/tests → motion}/test_suite_delegate.rb +0 -0
- data/spec/core/app_spec.rb +15 -5
- data/spec/core/device/screen_spec.rb +8 -8
- data/spec/core/kvo_spec.rb +191 -0
- data/spec/core/ns_index_path_spec.rb +0 -1
- data/spec/core/persistence_spec.rb +28 -6
- data/spec/core/time_spec.rb +15 -0
- data/spec/http_spec.rb +434 -280
- metadata +95 -56
- data/spec_helper_patch.diff +0 -31
File without changes
|
data/spec/core/app_spec.rb
CHANGED
@@ -13,13 +13,13 @@ describe BubbleWrap::App do
|
|
13
13
|
|
14
14
|
describe '.notification_center' do
|
15
15
|
it 'should be a NSNotificationCenter' do
|
16
|
-
BW::App.notification_center.
|
16
|
+
BW::App.notification_center.should == NSNotificationCenter.defaultCenter
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
describe '.user_cache' do
|
21
21
|
it 'should be a NSUserDefaults' do
|
22
|
-
BW::App.user_cache.
|
22
|
+
BW::App.user_cache.should == NSUserDefaults.standardUserDefaults
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -55,6 +55,9 @@ describe BubbleWrap::App do
|
|
55
55
|
it 'returns a hash' do
|
56
56
|
BW::App.states.class.should == Hash
|
57
57
|
end
|
58
|
+
it "returns the real instance variable" do
|
59
|
+
BW::App.states.should == BW::App.instance_variable_get(:@states)
|
60
|
+
end
|
58
61
|
end
|
59
62
|
|
60
63
|
describe '.name' do
|
@@ -70,14 +73,21 @@ describe BubbleWrap::App do
|
|
70
73
|
end
|
71
74
|
|
72
75
|
describe '.frame' do
|
73
|
-
it 'returns
|
74
|
-
BW::App.frame.
|
76
|
+
it 'returns Application Frame' do
|
77
|
+
BW::App.frame.should == UIScreen.mainScreen.applicationFrame
|
75
78
|
end
|
76
79
|
end
|
77
80
|
|
81
|
+
describe '.bounds' do
|
82
|
+
it 'returns Main Screen bounds' do
|
83
|
+
BW::App.bounds.should == UIScreen.mainScreen.bounds
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
|
78
88
|
describe '.delegate' do
|
79
89
|
it 'returns a TestSuiteDelegate' do
|
80
|
-
BW::App.delegate.
|
90
|
+
BW::App.delegate.should == UIApplication.sharedApplication.delegate
|
81
91
|
end
|
82
92
|
end
|
83
93
|
|
@@ -111,42 +111,42 @@ describe BubbleWrap::Device::Screen do
|
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
-
describe '.
|
114
|
+
describe '.width_for_orientation' do
|
115
115
|
describe ':landscape_left' do
|
116
116
|
it 'returns the current device screen height' do
|
117
|
-
BW::Device::Screen.
|
117
|
+
BW::Device::Screen.width_for_orientation(:landscape_left).should == BW::Device::Screen.height
|
118
118
|
end
|
119
119
|
end
|
120
120
|
|
121
121
|
describe ':landscape_right' do
|
122
122
|
it 'returns the current device screen height' do
|
123
|
-
BW::Device::Screen.
|
123
|
+
BW::Device::Screen.width_for_orientation(:landscape_right).should == BW::Device::Screen.height
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
127
127
|
describe 'default' do
|
128
128
|
it 'returns the current device screen width' do
|
129
|
-
BW::Device::Screen.
|
129
|
+
BW::Device::Screen.width_for_orientation.should == BW::Device::Screen.width
|
130
130
|
end
|
131
131
|
end
|
132
132
|
end
|
133
133
|
|
134
|
-
describe '.
|
134
|
+
describe '.height_for_orientation' do
|
135
135
|
describe ':landscape_left' do
|
136
136
|
it 'returns the current device screen width' do
|
137
|
-
BW::Device::Screen.
|
137
|
+
BW::Device::Screen.height_for_orientation(:landscape_left).should == BW::Device::Screen.width
|
138
138
|
end
|
139
139
|
end
|
140
140
|
|
141
141
|
describe ':landscape_right' do
|
142
142
|
it 'returns the current device screen width' do
|
143
|
-
BW::Device::Screen.
|
143
|
+
BW::Device::Screen.height_for_orientation(:landscape_right).should == BW::Device::Screen.width
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
147
147
|
describe 'default' do
|
148
148
|
it 'returns the current device screen height' do
|
149
|
-
BW::Device::Screen.
|
149
|
+
BW::Device::Screen.height_for_orientation.should == BW::Device::Screen.height
|
150
150
|
end
|
151
151
|
end
|
152
152
|
end
|
@@ -0,0 +1,191 @@
|
|
1
|
+
describe "KVOHelper" do
|
2
|
+
|
3
|
+
class KvoExample
|
4
|
+
include BW::KVO
|
5
|
+
|
6
|
+
attr_accessor :label
|
7
|
+
attr_accessor :items
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@items = [ "Apple", "Banana", "Chickpeas" ]
|
11
|
+
|
12
|
+
@label = UILabel.alloc.initWithFrame [[0,0],[320, 30]]
|
13
|
+
@label.text = "Foo"
|
14
|
+
end
|
15
|
+
|
16
|
+
# Test helper
|
17
|
+
|
18
|
+
def observe_label(&block)
|
19
|
+
observe(@label, "text", &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def observe_collection(&block)
|
23
|
+
observe(self, "items", &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def unobserve_label
|
27
|
+
unobserve(@label, "text")
|
28
|
+
end
|
29
|
+
|
30
|
+
# def unobserve_all
|
31
|
+
#unobserve(@label, "text")
|
32
|
+
#unobserve(self, "items")
|
33
|
+
#end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
describe "Callbacks" do
|
39
|
+
before do
|
40
|
+
@example = KvoExample.new
|
41
|
+
end
|
42
|
+
|
43
|
+
after do
|
44
|
+
@example = nil
|
45
|
+
end
|
46
|
+
|
47
|
+
# add
|
48
|
+
|
49
|
+
it "should add an observer block" do
|
50
|
+
target = Object.new
|
51
|
+
block = lambda { |old_value, new_value| }
|
52
|
+
@example.send(:add_observer_block, target, "key_path", &block)
|
53
|
+
@example.send(:registered?, target, "key_path").should == true
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should not add an observer block if the key path is not present" do
|
57
|
+
target = Object.new
|
58
|
+
block = lambda { |old_value, new_value| }
|
59
|
+
@example.send(:add_observer_block, target, nil, &block)
|
60
|
+
@example.send(:registered?, target, nil).should == false
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should not add an observer block if the block is not present" do
|
64
|
+
target = Object.new
|
65
|
+
@example.send(:add_observer_block, target, "key_path")
|
66
|
+
@example.send(:registered?, target, "key_path").should == false
|
67
|
+
end
|
68
|
+
|
69
|
+
# remove
|
70
|
+
|
71
|
+
it "should remove an observer block" do
|
72
|
+
target = Object.new
|
73
|
+
block = lambda { |old_value, new_value| }
|
74
|
+
@example.send(:add_observer_block, target, "key_path", &block)
|
75
|
+
@example.send(:remove_observer_block, target, "key_path")
|
76
|
+
@example.send(:registered?, target, "key_path").should == false
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should not remove an observer block if the target is not present" do
|
80
|
+
target = Object.new
|
81
|
+
block = lambda { |old_value, new_value| }
|
82
|
+
@example.send(:add_observer_block, target, "key_path", &block)
|
83
|
+
@example.send(:remove_observer_block, nil, "key_path")
|
84
|
+
@example.send(:registered?, target, "key_path").should == true
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should not remove an observer block if the key path is not present" do
|
88
|
+
target = Object.new
|
89
|
+
block = lambda { |old_value, new_value| }
|
90
|
+
@example.send(:add_observer_block, target, "key_path", &block)
|
91
|
+
@example.send(:remove_observer_block, target, nil)
|
92
|
+
@example.send(:registered?, target, "key_path").should == true
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should remove only one observer block" do
|
96
|
+
target = Object.new
|
97
|
+
block = lambda { |old_value, new_value| }
|
98
|
+
@example.send(:add_observer_block, target, "key_path1", &block)
|
99
|
+
@example.send(:add_observer_block, target, "key_path2", &block)
|
100
|
+
@example.send(:remove_observer_block, target, "key_path1")
|
101
|
+
@example.send(:registered?, target, "key_path1").should == false
|
102
|
+
@example.send(:registered?, target, "key_path2").should == true
|
103
|
+
end
|
104
|
+
|
105
|
+
# remove all
|
106
|
+
|
107
|
+
it "should remove all observer blocks" do
|
108
|
+
target = Object.new
|
109
|
+
block = lambda { |old_value, new_value| }
|
110
|
+
@example.send(:add_observer_block, target, "key_path1", &block)
|
111
|
+
@example.send(:add_observer_block, target, "key_path2", &block)
|
112
|
+
@example.send(:remove_all_observer_blocks)
|
113
|
+
@example.send(:registered?, target, "key_path1").should == false
|
114
|
+
@example.send(:registered?, target, "key_path2").should == false
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "API" do
|
120
|
+
before do
|
121
|
+
@example = KvoExample.new
|
122
|
+
end
|
123
|
+
|
124
|
+
after do
|
125
|
+
@example.unobserve_all
|
126
|
+
@example = nil
|
127
|
+
end
|
128
|
+
|
129
|
+
# observe
|
130
|
+
|
131
|
+
it "should observe a key path" do
|
132
|
+
observed = false
|
133
|
+
@example.observe_label do |old_value, new_value|
|
134
|
+
observed = true
|
135
|
+
old_value.should == "Foo"
|
136
|
+
new_value.should == "Bar"
|
137
|
+
end
|
138
|
+
|
139
|
+
@example.label.text = "Bar"
|
140
|
+
observed.should == true
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should observe a key path with more than one block" do
|
144
|
+
observed_one = false
|
145
|
+
observed_two = false
|
146
|
+
observed_three = false
|
147
|
+
@example.observe_label do |old_value, new_value|
|
148
|
+
observed_one = true
|
149
|
+
end
|
150
|
+
@example.observe_label do |old_value, new_value|
|
151
|
+
observed_two = true
|
152
|
+
end
|
153
|
+
@example.observe_label do |old_value, new_value|
|
154
|
+
observed_three = true
|
155
|
+
end
|
156
|
+
|
157
|
+
@example.label.text = "Bar"
|
158
|
+
observed_one.should == true
|
159
|
+
observed_two.should == true
|
160
|
+
observed_three.should == true
|
161
|
+
end
|
162
|
+
|
163
|
+
# unobserve
|
164
|
+
|
165
|
+
it "should unobserve a key path" do
|
166
|
+
observed = false
|
167
|
+
@example.observe_label do |old_value, new_value|
|
168
|
+
observed = true
|
169
|
+
end
|
170
|
+
@example.unobserve_label
|
171
|
+
|
172
|
+
@example.label.text = "Bar"
|
173
|
+
observed.should == false
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
|
178
|
+
=begin
|
179
|
+
it "should be able to observe a collection" do
|
180
|
+
observed = false
|
181
|
+
@example.observe_collection do |old_value, new_value, indexes|
|
182
|
+
puts "#{collection} #{old_value} #{new_value} #{indexes}"
|
183
|
+
observed = true
|
184
|
+
end
|
185
|
+
|
186
|
+
@example.items << "Dragonfruit"
|
187
|
+
observed.should == true
|
188
|
+
end
|
189
|
+
=end
|
190
|
+
|
191
|
+
end
|
@@ -1,20 +1,42 @@
|
|
1
1
|
describe BubbleWrap::Persistence do
|
2
2
|
|
3
3
|
describe '.app_key' do
|
4
|
+
|
5
|
+
it "caches the @app_key" do
|
6
|
+
BubbleWrap::Persistence.instance_variable_get(:@app_key).should.equal nil
|
7
|
+
BubbleWrap::Persistence.app_key
|
8
|
+
BubbleWrap::Persistence.instance_variable_get(:@app_key).should.not.equal nil
|
9
|
+
end
|
10
|
+
|
4
11
|
it 'delegates to BubbleWrap::App.idenfitier' do
|
5
12
|
BubbleWrap::Persistence.app_key.should == BubbleWrap::App.identifier
|
6
13
|
end
|
14
|
+
|
7
15
|
end
|
8
16
|
|
9
|
-
|
10
|
-
|
17
|
+
|
18
|
+
describe "storing objects" do
|
19
|
+
it 'can persist simple objects' do
|
20
|
+
lambda do
|
21
|
+
BubbleWrap::Persistence['arbitraryNumber'] = 42
|
22
|
+
end.
|
23
|
+
should.not.raise(Exception)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "must call synchronize" do
|
27
|
+
storage = NSUserDefaults.standardUserDefaults
|
28
|
+
def storage.synchronize; @sync_was_called = true; end
|
29
|
+
|
11
30
|
BubbleWrap::Persistence['arbitraryNumber'] = 42
|
12
|
-
|
13
|
-
|
31
|
+
storage.instance_variable_get(:@sync_was_called).should.equal true
|
32
|
+
end
|
33
|
+
|
14
34
|
end
|
15
35
|
|
16
|
-
|
17
|
-
|
36
|
+
describe "retrieving objects" do
|
37
|
+
it 'can retrieve persisted objects' do
|
38
|
+
BubbleWrap::Persistence['arbitraryNumber'].should == 42
|
39
|
+
end
|
18
40
|
end
|
19
41
|
|
20
42
|
end
|
data/spec/core/time_spec.rb
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
describe "Time" do
|
2
2
|
|
3
|
+
describe "Caching the date formatter" do
|
4
|
+
|
5
|
+
it "should reuse the created formatter" do
|
6
|
+
#this is a bad test, relies on implementation.
|
7
|
+
#I'll rewrite it when the better idea comes on my mind..
|
8
|
+
100.times do
|
9
|
+
Time.iso8601("2011-04-11T13:22:21Z")
|
10
|
+
end
|
11
|
+
Thread.current[:date_formatters].count.should.equal 1
|
12
|
+
Thread.current[:date_formatters]["yyyy-MM-dd'T'HH:mm:ss'Z'"].should.not.equal nil
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
|
3
18
|
describe "parsing an iso8601 formatted time to a Time object" do
|
4
19
|
before do
|
5
20
|
@time = Time.iso8601("2012-05-31T19:41:33Z")
|
data/spec/http_spec.rb
CHANGED
@@ -1,385 +1,539 @@
|
|
1
1
|
describe "HTTP" do
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
describe "HTTP::Response" do
|
6
3
|
before do
|
7
|
-
@
|
4
|
+
@localhost_url = 'http://localhost'
|
8
5
|
end
|
9
6
|
|
10
|
-
|
11
|
-
@response.instance_variable_get(:@status_code).should == 200
|
12
|
-
@response.instance_variable_get(:@url).should == 'http://localhost'
|
13
|
-
end
|
7
|
+
describe "Core HTTP method calls" do
|
14
8
|
|
9
|
+
def test_http_method(method)
|
10
|
+
called = false
|
11
|
+
delegator = Proc.new { |r, q| @the_response = r; @the_query = q; called = true }
|
12
|
+
query = BubbleWrap::HTTP.send(method, @localhost_url, { name: 'bubble-wrap', action: delegator })
|
13
|
+
query.should.not.equal nil
|
14
|
+
query.method.should.equal method.to_s.upcase
|
15
|
+
query.options[:name].should.equal 'bubble-wrap'
|
16
|
+
query.instance_variable_get(:@delegator).should.equal delegator
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
[100..101, 300..307, 400..417, 500..505].inject([]){|codes, rg| codes += rg.to_a}.each do |code|
|
22
|
-
BubbleWrap::HTTP::Response.new({status_code: code}).ok?.should.be.false
|
18
|
+
query.connectionDidFinishLoading(query.connection)
|
19
|
+
query.should.be.same_as @the_query
|
20
|
+
query.response.should.be.same_as @the_response
|
21
|
+
called.should.equal true
|
23
22
|
end
|
24
|
-
end
|
25
23
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
@response.should.respond_to :status_code=
|
32
|
-
@response.should.respond_to :error_message=
|
33
|
-
end
|
24
|
+
it ".get .post .put .delete .head .patch should properly generate the HTTP::Query" do
|
25
|
+
[:get, :post, :put, :delete, :head, :patch].each do |method|
|
26
|
+
test_http_method method
|
27
|
+
end
|
28
|
+
end
|
34
29
|
|
35
|
-
|
30
|
+
it "uses the block instead of action passed in " do
|
31
|
+
[:get, :post, :put, :delete, :head, :patch].each do |method|
|
32
|
+
called = false
|
33
|
+
expected_delegator = Proc.new {|response| called = true }
|
36
34
|
|
37
|
-
|
35
|
+
query = BubbleWrap::HTTP.send(method, @localhost_url, { action: 'not_valid' }, &expected_delegator)
|
36
|
+
query.instance_variable_get(:@delegator).should.equal expected_delegator
|
37
|
+
query.connectionDidFinishLoading(query.connection)
|
38
|
+
called.should.equal true
|
39
|
+
end
|
40
|
+
end
|
38
41
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
@options = { action: @action,
|
53
|
-
payload: @payload,
|
54
|
-
credentials: @credentials,
|
55
|
-
headers: @headers,
|
56
|
-
cache_policy: @cache_policy,
|
57
|
-
leftover_option: @leftover_option
|
58
|
-
}
|
59
|
-
@query = BubbleWrap::HTTP::Query.new( 'http://localhost' , :get, @options )
|
60
|
-
end
|
42
|
+
[:get, :post, :put, :delete, :head, :patch].each do |verb|
|
43
|
+
it "has access to the proper response scope for #{verb} request" do
|
44
|
+
class WatchedObj; attr_accessor :test_value end
|
45
|
+
@watched_object = WatchedObj.new
|
46
|
+
@name = 'Matt'
|
47
|
+
query = BubbleWrap::HTTP.send(verb, @localhost_url) do |response|
|
48
|
+
@watched_object.test_value = @name
|
49
|
+
end
|
50
|
+
wait_for_change(@watched_object, 'test_value') do
|
51
|
+
@watched_object.test_value.should == 'Matt'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
61
55
|
|
62
|
-
it "has appropriate attributes" do
|
63
|
-
@query.should.respond_to :request=
|
64
|
-
@query.should.respond_to :connection=
|
65
|
-
@query.should.respond_to :credentials=
|
66
|
-
@query.should.respond_to :proxy_credential=
|
67
|
-
@query.should.respond_to :post_data=
|
68
|
-
|
69
|
-
@query.should.respond_to :method
|
70
|
-
@query.should.respond_to :response
|
71
|
-
@query.should.respond_to :status_code
|
72
|
-
@query.should.respond_to :response_headers
|
73
|
-
@query.should.respond_to :response_size
|
74
|
-
@query.should.respond_to :options
|
75
56
|
end
|
76
57
|
|
77
|
-
describe "When initialized" do
|
78
58
|
|
79
|
-
|
80
|
-
|
59
|
+
describe "HTTP::Response" do
|
60
|
+
before do
|
61
|
+
@response = BubbleWrap::HTTP::Response.new({ status_code: 200, url: 'http://localhost' })
|
81
62
|
end
|
82
63
|
|
83
|
-
it
|
84
|
-
@
|
85
|
-
@
|
64
|
+
it 'should turn the initialization Hash to instance variables' do
|
65
|
+
@response.instance_variable_get(:@status_code).should == 200
|
66
|
+
@response.instance_variable_get(:@url).should == 'http://localhost'
|
86
67
|
end
|
87
68
|
|
88
|
-
it "
|
89
|
-
|
90
|
-
|
69
|
+
it "says OK status code 20x" do
|
70
|
+
@response.ok?.should.equal true
|
71
|
+
(200..209).each do |code|
|
72
|
+
BubbleWrap::HTTP::Response.new({status_code: code}).ok?.should.be.true
|
73
|
+
end
|
74
|
+
[100..101, 300..307, 400..417, 500..505].inject([]){|codes, rg| codes += rg.to_a}.each do |code|
|
75
|
+
BubbleWrap::HTTP::Response.new({status_code: code}).ok?.should.be.false
|
76
|
+
end
|
91
77
|
end
|
92
78
|
|
93
|
-
it "
|
94
|
-
@
|
79
|
+
it "updates ivars when calling update" do
|
80
|
+
@response.update( { one: 'one', two: 'two' } )
|
81
|
+
@response.instance_variable_get(:@one).should.equal 'one'
|
82
|
+
@response.instance_variable_get(:@two).should.equal 'two'
|
95
83
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
new_query.credentials.should.equal new_credentials
|
101
|
-
options.should.be.empty
|
84
|
+
@response.update( { one: 'three', two: 'four' } )
|
85
|
+
@response.instance_variable_get(:@one).should.equal 'three'
|
86
|
+
@response.instance_variable_get(:@two).should.equal 'four'
|
102
87
|
end
|
103
88
|
|
104
|
-
it "
|
105
|
-
|
106
|
-
@
|
107
|
-
@
|
89
|
+
it "has appropriate attributes" do
|
90
|
+
@response.should.respond_to :body
|
91
|
+
@response.should.respond_to :headers
|
92
|
+
@response.should.respond_to :url
|
93
|
+
@response.should.respond_to :status_code=
|
94
|
+
@response.should.respond_to :error_message=
|
108
95
|
end
|
109
96
|
|
110
|
-
|
111
|
-
@query.instance_variable_get(:@timeout).should == 30
|
112
|
-
|
113
|
-
options = {timeout: 10}
|
114
|
-
new_query = BubbleWrap::HTTP::Query.new( 'http://localhost/', :get, options)
|
115
|
-
|
116
|
-
new_query.instance_variable_get(:@timeout).should == 10
|
117
|
-
options.should.be.empty
|
118
|
-
end
|
97
|
+
end
|
119
98
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
@
|
124
|
-
|
99
|
+
describe "HTTP::Query" do
|
100
|
+
|
101
|
+
before do
|
102
|
+
@credentials = { username: 'mneorr', password: '123456xx!@crazy' }
|
103
|
+
@payload = {
|
104
|
+
user: { name: 'marin', surname: 'usalj' },
|
105
|
+
twitter: '@mneorr',
|
106
|
+
website: 'mneorr.com',
|
107
|
+
values: ['apple', 'orange', 'peach'],
|
108
|
+
credentials: @credentials
|
109
|
+
}
|
110
|
+
@action = lambda{|fa, ke|}
|
111
|
+
@cache_policy = 24234
|
112
|
+
@leftover_option = 'trololo'
|
113
|
+
@headers = { 'User-Agent' => "Mozilla/5.0 (X11; Linux x86_64; rv:12.0) \n Gecko/20100101 Firefox/12.0" }
|
114
|
+
@options = { action: @action,
|
115
|
+
payload: @payload,
|
116
|
+
credentials: @credentials,
|
117
|
+
headers: @headers,
|
118
|
+
cache_policy: @cache_policy,
|
119
|
+
leftover_option: @leftover_option
|
120
|
+
}
|
121
|
+
@query = BubbleWrap::HTTP::Query.new( @localhost_url , :get, @options )
|
122
|
+
end
|
123
|
+
|
124
|
+
it "has appropriate attributes" do
|
125
|
+
@query.should.respond_to :request=
|
126
|
+
@query.should.respond_to :connection=
|
127
|
+
@query.should.respond_to :credentials=
|
128
|
+
@query.should.respond_to :proxy_credential=
|
129
|
+
@query.should.respond_to :post_data=
|
130
|
+
|
131
|
+
@query.should.respond_to :method
|
132
|
+
@query.should.respond_to :response
|
133
|
+
@query.should.respond_to :status_code
|
134
|
+
@query.should.respond_to :response_headers
|
135
|
+
@query.should.respond_to :response_size
|
136
|
+
@query.should.respond_to :options
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "When initialized" do
|
140
|
+
|
141
|
+
it "should upcase the HTTP method" do
|
142
|
+
@query.method.should.equal "GET"
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should set the deleted delegator from options" do
|
146
|
+
@query.instance_variable_get(:@delegator).should.equal @action
|
147
|
+
@options.should.not.has_key? :action
|
148
|
+
end
|
149
|
+
|
150
|
+
it "should set self as the delegator if action was not passed in" do
|
151
|
+
new_query = BubbleWrap::HTTP::Query.new( 'http://localhost', :get, {})
|
152
|
+
new_query.instance_variable_get(:@delegator).should.equal new_query
|
153
|
+
end
|
154
|
+
|
155
|
+
it "should merge :username and :password in loaded credentials" do
|
156
|
+
@query.credentials.should.equal @credentials
|
157
|
+
|
158
|
+
options = { credentials: {} }
|
159
|
+
new_query = BubbleWrap::HTTP::Query.new( @localhost_url, :get, options)
|
160
|
+
|
161
|
+
generated_credentials = {:username => '', :password => ''}
|
162
|
+
new_query.credentials.should.equal generated_credentials
|
163
|
+
options.should.be.empty
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should set payload from options{} to @payload" do
|
167
|
+
payload = "user[name]=marin&user[surname]=usalj&twitter=@mneorr&website=mneorr.com&values[]=apple&values[]=orange&values[]=peach&credentials[username]=mneorr&credentials[password]=123456xx!@crazy"
|
168
|
+
@query.instance_variable_get(:@payload).should.equal payload
|
169
|
+
@options.should.not.has_key? :payload
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should set default timeout to 30s or the one from hash" do
|
173
|
+
@query.instance_variable_get(:@timeout).should == 30
|
174
|
+
|
175
|
+
options = {timeout: 10}
|
176
|
+
new_query = BubbleWrap::HTTP::Query.new( @localhost_url, :get, options)
|
177
|
+
|
178
|
+
new_query.instance_variable_get(:@timeout).should == 10
|
179
|
+
options.should.be.empty
|
180
|
+
end
|
181
|
+
|
182
|
+
it "should delete :headers from options and escape Line Feeds" do
|
183
|
+
escaped_lf = {"User-Agent"=>"Mozilla/5.0 (X11; Linux x86_64; rv:12.0) \\n Gecko/20100101 Firefox/12.0"}
|
184
|
+
@query.instance_variable_get(:@headers).should.equal escaped_lf
|
185
|
+
end
|
186
|
+
|
187
|
+
it "should delete :cache_policy or set NSURLRequestUseProtocolCachePolicy" do
|
188
|
+
@query.instance_variable_get(:@cache_policy).should.equal @cache_policy
|
189
|
+
@options.should.not.has_key? :cache_policy
|
190
|
+
|
191
|
+
new_query = BubbleWrap::HTTP::Query.new( @localhost_url, :get, {})
|
192
|
+
new_query.instance_variable_get(:@cache_policy).should.equal NSURLRequestUseProtocolCachePolicy
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should set the rest of options{} to ivar @options" do
|
196
|
+
@query.options.size.should.equal 1
|
197
|
+
@query.options.values[0].should.equal @leftover_option
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should create a new response before instantiating a new request" do
|
201
|
+
@query.response.should.not.equal nil
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should call initiate_request with the URL passed in" do
|
205
|
+
processed_url = "http://localhost?user%5Bname%5D=marin&user%5Bsurname%5D=usalj&twitter=@mneorr&website=mneorr.com&values%5B%5D=apple&values%5B%5D=orange&values%5B%5D=peach&credentials%5Busername%5D=mneorr&credentials%5Bpassword%5D=123456xx!@crazy"
|
206
|
+
@query.instance_variable_get(:@url).description.should.equal processed_url
|
207
|
+
end
|
208
|
+
|
209
|
+
it "should start the connection" do
|
210
|
+
@query.connection.was_started.should.equal true
|
211
|
+
end
|
212
|
+
|
213
|
+
it "should turn on the network indicator" do
|
214
|
+
UIApplication.sharedApplication.isNetworkActivityIndicatorVisible.should.equal true
|
215
|
+
end
|
125
216
|
|
126
|
-
it "should delete :cache_policy or set NSURLRequestUseProtocolCachePolicy" do
|
127
|
-
@query.instance_variable_get(:@cachePolicy).should.equal @cache_policy
|
128
|
-
@options.should.not.has_key? :cache_policy
|
129
|
-
|
130
|
-
new_query = BubbleWrap::HTTP::Query.new( 'http://fakehost.local/', :get, {})
|
131
|
-
new_query.instance_variable_get(:@cachePolicy).should.equal NSURLRequestUseProtocolCachePolicy
|
132
217
|
end
|
133
218
|
|
134
|
-
|
135
|
-
@query.options.size.should.equal 1
|
136
|
-
@query.options.values[0].should.equal @leftover_option
|
137
|
-
end
|
219
|
+
describe "initiate request" do
|
138
220
|
|
139
|
-
|
140
|
-
|
141
|
-
|
221
|
+
before do
|
222
|
+
@url_string = 'http://initiated-request.dev/to convert'
|
223
|
+
@payload = { name: 'apple', model: 'macbook'}
|
224
|
+
@headers = { fake: 'headers' }
|
225
|
+
@get_query = BubbleWrap::HTTP::Query.new( @url_string , :get, { headers: @headers, payload: @payload } )
|
226
|
+
@get_query.initiate_request @url_string
|
227
|
+
end
|
142
228
|
|
143
|
-
|
144
|
-
|
145
|
-
@query.instance_variable_get(:@url).description.should.equal processed_url
|
146
|
-
end
|
229
|
+
it "should check if @payload is a hash before generating params" do
|
230
|
+
@get_query.instance_variable_get(:@payload).should.equal 'name=apple&model=macbook'
|
147
231
|
|
148
|
-
|
149
|
-
|
150
|
-
|
232
|
+
query_string_payload = BubbleWrap::HTTP::Query.new( 'nil' , :get, { payload: "name=apple&model=macbook"} )
|
233
|
+
query_string_payload.instance_variable_get(:@payload).should.equal 'name=apple&model=macbook'
|
234
|
+
end
|
151
235
|
|
152
|
-
|
153
|
-
|
154
|
-
|
236
|
+
it "should check if payload is nil" do
|
237
|
+
nil_payload = BubbleWrap::HTTP::Query.new( 'nil' , :post, {} )
|
238
|
+
lambda{ nil_payload.initiate_request('fake') }.should.not.raise NoMethodError
|
239
|
+
end
|
155
240
|
|
156
|
-
|
241
|
+
it "should set the payload in URL only for GET request" do
|
242
|
+
[:post, :put, :delete, :head, :patch].each do |method|
|
243
|
+
query = BubbleWrap::HTTP::Query.new( @localhost_url , method, { payload: @payload } )
|
244
|
+
query.instance_variable_get(:@url).description.should.equal @localhost_url
|
245
|
+
end
|
246
|
+
end
|
157
247
|
|
158
|
-
|
248
|
+
it "sets the HTTPBody DATA to @request for all methods except GET" do
|
159
249
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
@get_query = BubbleWrap::HTTP::Query.new( 'nil' , :get, { payload: {name: 'apple', model: 'macbook'} } )
|
164
|
-
@get_query.initiate_request @url_string
|
165
|
-
|
166
|
-
@post_query = BubbleWrap::HTTP::Query.new( 'nil' , :post, { payload: {name: 'apple', model: 'macbook'}} )
|
167
|
-
@post_query.initiate_request @url_string
|
168
|
-
end
|
250
|
+
[:post, :put, :delete, :head, :patch].each do |method|
|
251
|
+
query = BubbleWrap::HTTP::Query.new( 'nil' , method, { payload: @payload } )
|
252
|
+
real_payload = NSString.alloc.initWithData(query.request.HTTPBody, encoding:NSUTF8StringEncoding)
|
169
253
|
|
170
|
-
|
171
|
-
|
254
|
+
real_payload.should.equal 'name=apple&model=macbook'
|
255
|
+
end
|
172
256
|
|
173
|
-
|
174
|
-
query_string_payload.instance_variable_get(:@payload).should.equal 'name=apple&model=macbook'
|
175
|
-
end
|
257
|
+
end
|
176
258
|
|
177
|
-
|
259
|
+
it "should add UTF8 escaping on the URL string" do
|
260
|
+
@get_query.instance_variable_get(:@url).description.should.equal 'http://initiated-request.dev/to%20convert?name=apple&model=macbook'
|
261
|
+
end
|
178
262
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
'user[name]=marin',
|
184
|
-
'user[surname]=usalj',
|
185
|
-
'twitter=@mneorr',
|
186
|
-
'website=mneorr.com',
|
187
|
-
'values=[1, 2, 3]',
|
188
|
-
'credentials[credit_card]=23423948234'
|
189
|
-
]
|
190
|
-
@query.generate_get_params(@payload).should.equal expected_params
|
191
|
-
end
|
263
|
+
it "should create a new request with HTTP method & header fields" do
|
264
|
+
@query.request.HTTPMethod.should.equal @query.method
|
265
|
+
@get_query.request.allHTTPHeaderFields.should.equal @headers
|
266
|
+
end
|
192
267
|
|
193
|
-
|
268
|
+
it "creates a new NSURLConnection and sets itself as a delegate" do
|
269
|
+
@query.connection.delegate.should.equal @query
|
270
|
+
end
|
194
271
|
|
195
|
-
|
272
|
+
it "should pass the new request in the new connection" do
|
273
|
+
@query.connection.request.URL.description.should.equal @query.request.URL.description
|
274
|
+
end
|
196
275
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
276
|
+
it "should patch the NSURLRequest with done_loading and done_loading!" do
|
277
|
+
@query.request.done_loading.should.equal @query.request.instance_variable_get(:@done_loading)
|
278
|
+
|
279
|
+
@query.request.instance_variable_set(:@done_loading, false)
|
280
|
+
@query.request.done_loading.should.equal false
|
281
|
+
@query.request.done_loading!
|
282
|
+
@query.request.done_loading.should.equal true
|
283
|
+
end
|
201
284
|
|
202
|
-
|
203
|
-
|
285
|
+
it "should pass the right arguments when creating new request" do
|
286
|
+
@query.request.cachePolicy.should.equal @query.instance_variable_get(:@cache_policy)
|
287
|
+
@query.request.timeoutInterval.should.equal @query.instance_variable_get(:@timeout)
|
288
|
+
end
|
204
289
|
|
205
|
-
@query.status_code.should.equal status_code
|
206
|
-
@query.response_headers.should.equal headers
|
207
|
-
@query.response_size.should.equal length
|
208
290
|
end
|
209
291
|
|
210
|
-
|
292
|
+
describe "Generating GET params" do
|
211
293
|
|
212
|
-
|
294
|
+
it "should create params with nested hashes with prefix[key]=value" do
|
295
|
+
expected_params = [
|
296
|
+
'user[name]=marin',
|
297
|
+
'user[surname]=usalj',
|
298
|
+
'twitter=@mneorr',
|
299
|
+
'website=mneorr.com',
|
300
|
+
'values[]=apple',
|
301
|
+
'values[]=orange',
|
302
|
+
'values[]=peach',
|
303
|
+
"credentials[username]=mneorr",
|
304
|
+
"credentials[password]=123456xx!@crazy"
|
305
|
+
]
|
306
|
+
@query.generate_params(@payload).should.equal expected_params
|
307
|
+
end
|
213
308
|
|
214
|
-
def query_received_data
|
215
|
-
@query.instance_variable_get(:@received_data)
|
216
309
|
end
|
217
310
|
|
218
|
-
|
219
|
-
query_received_data.should.equal nil
|
220
|
-
data = NSData.dataWithBytesNoCopy(Pointer.new(:char, 'abc'), length:24)
|
311
|
+
describe "when didReceiveResponse:" do
|
221
312
|
|
222
|
-
|
223
|
-
|
313
|
+
it "should assign status_code, headers and response_size" do
|
314
|
+
headers = { foo: 'bar' }
|
315
|
+
status_code = 234
|
316
|
+
length = 123.53
|
224
317
|
|
225
|
-
|
226
|
-
|
318
|
+
response = FakeURLResponse.new(status_code, headers, length)
|
319
|
+
@query.connection(nil, didReceiveResponse:response)
|
227
320
|
|
228
|
-
|
229
|
-
|
230
|
-
|
321
|
+
@query.status_code.should.equal status_code
|
322
|
+
@query.response_headers.should.equal headers
|
323
|
+
@query.response_size.should.equal length
|
324
|
+
end
|
231
325
|
|
232
|
-
|
326
|
+
end
|
233
327
|
|
328
|
+
describe "when didRecieveData:" do
|
234
329
|
|
330
|
+
def query_received_data
|
331
|
+
@query.instance_variable_get(:@received_data)
|
332
|
+
end
|
235
333
|
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
end
|
334
|
+
it "should initialize @received_data and append the received data" do
|
335
|
+
query_received_data.should.equal nil
|
336
|
+
data = NSData.dataWithBytesNoCopy(Pointer.new(:char, 'abc'), length:24)
|
240
337
|
|
241
|
-
|
242
|
-
|
338
|
+
@query.connection(nil, didReceiveData:nil)
|
339
|
+
query_received_data.should.not.equal nil
|
243
340
|
|
244
|
-
|
245
|
-
|
246
|
-
end
|
341
|
+
@query.connection(nil, didReceiveData:data)
|
342
|
+
query_received_data.length.should.equal 24
|
247
343
|
|
248
|
-
|
249
|
-
|
344
|
+
@query.connection(nil, didReceiveData:data)
|
345
|
+
query_received_data.length.should.equal 48
|
346
|
+
end
|
250
347
|
|
251
|
-
@query.connection(nil, didFailWithError:@fake_error)
|
252
|
-
@query.request.done_loading.should == true
|
253
348
|
end
|
254
349
|
|
255
|
-
it "should set the error message to response object" do
|
256
|
-
@query.response.error_message.should.equal nil
|
257
350
|
|
258
|
-
@query.connection(nil, didFailWithError:@fake_error)
|
259
|
-
@query.response.error_message.should.equal @fake_error.localizedDescription
|
260
|
-
end
|
261
351
|
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
352
|
+
describe "when requestDidFailWithError:" do
|
353
|
+
before do
|
354
|
+
@fake_error = NSError.errorWithDomain('testing', code:7768, userInfo:nil)
|
355
|
+
end
|
266
356
|
|
267
|
-
|
268
|
-
|
357
|
+
it "should turn off network indicator" do
|
358
|
+
UIApplication.sharedApplication.isNetworkActivityIndicatorVisible.should == true
|
359
|
+
@query.connection(nil, didFailWithError:@fake_error)
|
360
|
+
UIApplication.sharedApplication.isNetworkActivityIndicatorVisible.should == false
|
361
|
+
end
|
269
362
|
|
270
|
-
|
271
|
-
|
272
|
-
|
363
|
+
it "should set request_done to true" do
|
364
|
+
@query.request.done_loading.should == false
|
365
|
+
@query.connection(nil, didFailWithError:@fake_error)
|
366
|
+
@query.request.done_loading.should == true
|
367
|
+
end
|
273
368
|
|
274
|
-
|
369
|
+
it "should set the error message to response object" do
|
370
|
+
@query.response.error_message.should.equal nil
|
371
|
+
@query.connection(nil, didFailWithError:@fake_error)
|
372
|
+
@query.response.error_message.should.equal @fake_error.localizedDescription
|
373
|
+
end
|
275
374
|
|
276
|
-
|
375
|
+
it "should check if there's a callback block and pass the response in" do
|
376
|
+
expected_response = BubbleWrap::HTTP::Response.new
|
377
|
+
real_response = nil
|
378
|
+
block = lambda{ |response, query| real_response = response }
|
277
379
|
|
278
|
-
|
279
|
-
|
380
|
+
query = BubbleWrap::HTTP::Query.new(@localhost_url, :get, { :action => block })
|
381
|
+
query.instance_variable_set(:@response, expected_response)
|
382
|
+
|
383
|
+
query.connection(nil, didFailWithError:@fake_error)
|
384
|
+
real_response.should.equal expected_response
|
385
|
+
end
|
280
386
|
|
281
|
-
@query.connectionDidFinishLoading(nil)
|
282
|
-
UIApplication.sharedApplication.isNetworkActivityIndicatorVisible.should == false
|
283
387
|
end
|
284
388
|
|
285
|
-
|
286
|
-
@query.request.done_loading.should == false
|
389
|
+
describe "when connectionDidFinishLoading:" do
|
287
390
|
|
288
|
-
|
289
|
-
|
290
|
-
end
|
391
|
+
it "should turn off the network indicator" do
|
392
|
+
UIApplication.sharedApplication.isNetworkActivityIndicatorVisible.should == true
|
291
393
|
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
status_code = 234
|
296
|
-
response = FakeURLResponse.new(status_code, headers, 65456)
|
394
|
+
@query.connectionDidFinishLoading(nil)
|
395
|
+
UIApplication.sharedApplication.isNetworkActivityIndicatorVisible.should == false
|
396
|
+
end
|
297
397
|
|
298
|
-
|
299
|
-
|
300
|
-
@query.connectionDidFinishLoading(nil)
|
398
|
+
it "should set request_done to true" do
|
399
|
+
@query.request.done_loading.should == false
|
301
400
|
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
@query.response.url.should.equal @query.instance_variable_get(:@url)
|
306
|
-
end
|
401
|
+
@query.connectionDidFinishLoading(nil)
|
402
|
+
@query.request.done_loading.should == true
|
403
|
+
end
|
307
404
|
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
405
|
+
it "should set response_body to @received data if not nil" do
|
406
|
+
data = NSData.dataWithBytesNoCopy(Pointer.new(:char, 'abc'), length:24)
|
407
|
+
headers = { foo: 'bar' }
|
408
|
+
status_code = 234
|
409
|
+
response = FakeURLResponse.new(status_code, headers, 65456)
|
312
410
|
|
313
|
-
|
314
|
-
|
411
|
+
@query.connection(nil, didReceiveResponse:response)
|
412
|
+
@query.connection(nil, didReceiveData:data)
|
413
|
+
@query.connectionDidFinishLoading(nil)
|
315
414
|
|
316
|
-
|
317
|
-
|
318
|
-
|
415
|
+
@query.response.body.should.equal data
|
416
|
+
@query.response.status_code.should.equal status_code
|
417
|
+
@query.response.headers.should.equal headers
|
418
|
+
@query.response.url.should.equal @query.instance_variable_get(:@url)
|
419
|
+
end
|
319
420
|
|
320
|
-
|
421
|
+
it "should check if there's a callback block and pass the response in" do
|
422
|
+
expected_response = BubbleWrap::HTTP::Response.new
|
423
|
+
real_response = nil
|
424
|
+
block = lambda{ |response, query| real_response = response }
|
425
|
+
query = BubbleWrap::HTTP::Query.new(@localhost_url, :get, { :action => block })
|
426
|
+
query.instance_variable_set(:@response, expected_response)
|
427
|
+
|
428
|
+
query.connectionDidFinishLoading(nil)
|
429
|
+
real_response.should.equal expected_response
|
430
|
+
end
|
321
431
|
|
322
|
-
describe "when connection:willSendRequest:redirectResponse:" do
|
323
|
-
before do
|
324
|
-
@request = NSURLRequest.requestWithURL NSURL.URLWithString('http://fakehost.local/')
|
325
432
|
end
|
326
433
|
|
327
|
-
|
328
|
-
|
329
|
-
|
434
|
+
describe "when connection:willSendRequest:redirectResponse:" do
|
435
|
+
before do
|
436
|
+
@request = NSURLRequest.requestWithURL NSURL.URLWithString('http://fakehost.local/')
|
437
|
+
end
|
330
438
|
|
331
|
-
|
439
|
+
it "should make a mutableCopy of passed in request and set headers from @headers" do
|
440
|
+
expected_headers = { new_header: 'should_be_here' }
|
441
|
+
@query.instance_variable_set(:@headers, expected_headers)
|
332
442
|
|
333
|
-
|
334
|
-
new_request.URL.description.should.equal @request.URL.description
|
335
|
-
new_request.allHTTPHeaderFields.should.equal expected_headers
|
336
|
-
end
|
443
|
+
new_request = @query.connection(nil, willSendRequest:@request, redirectResponse:nil)
|
337
444
|
|
338
|
-
|
339
|
-
|
340
|
-
|
445
|
+
@query.request.should.not.be.equal @request
|
446
|
+
new_request.URL.description.should.equal @request.URL.description
|
447
|
+
new_request.allHTTPHeaderFields.should.equal expected_headers
|
448
|
+
end
|
341
449
|
|
342
|
-
|
343
|
-
|
450
|
+
it "should create a new Connection with the request passed in" do
|
451
|
+
old_connection = @query.connection
|
452
|
+
@query.connection(nil, willSendRequest:@request, redirectResponse:nil)
|
453
|
+
old_connection.should.not.equal @query.connection
|
454
|
+
end
|
344
455
|
|
345
|
-
|
346
|
-
|
347
|
-
|
456
|
+
it "should set itself as a delegate of new NSURLConnection" do
|
457
|
+
@query.connection(nil, willSendRequest:@request, redirectResponse:nil)
|
458
|
+
@query.connection.delegate.should.equal @query
|
459
|
+
end
|
460
|
+
|
461
|
+
it "should pass the new request in the new connection" do
|
462
|
+
@query.connection(nil, willSendRequest:@request, redirectResponse:nil)
|
463
|
+
@query.connection.request.URL.description.should.equal @request.URL.description
|
464
|
+
end
|
348
465
|
end
|
349
466
|
|
350
|
-
|
351
|
-
|
352
|
-
|
467
|
+
describe "didReceiveAuthenticationChallenge" do
|
468
|
+
before do
|
469
|
+
@challenge = FakeChallenge.new
|
470
|
+
@challenge.previousFailureCount = 0
|
471
|
+
@query.connection(nil, didReceiveAuthenticationChallenge:@challenge)
|
472
|
+
end
|
473
|
+
|
474
|
+
it "should cancel the authentication if the failure count was not 0" do
|
475
|
+
@challenge.previousFailureCount = 1
|
476
|
+
@query.connection(nil, didReceiveAuthenticationChallenge:@challenge)
|
477
|
+
@challenge.sender.was_cancelled.should.equal true
|
478
|
+
end
|
479
|
+
|
480
|
+
it "should pass in Credentials and the challenge itself to the sender" do
|
481
|
+
@challenge.sender.challenge.should.equal @challenge
|
482
|
+
@challenge.sender.credential.user.should.equal @credentials[:username]
|
483
|
+
@challenge.sender.credential.password.should.equal @credentials[:password]
|
484
|
+
end
|
485
|
+
|
486
|
+
it "always uses NSURLCredentialPersistenceForSession" do
|
487
|
+
@challenge.sender.credential.persistence.should.equal NSURLCredentialPersistenceForSession
|
488
|
+
end
|
489
|
+
|
353
490
|
end
|
354
491
|
|
355
|
-
|
492
|
+
class FakeSender
|
493
|
+
attr_reader :challenge, :credential, :was_cancelled
|
494
|
+
def cancelAuthenticationChallenge(challenge)
|
495
|
+
@was_cancelled = true
|
496
|
+
end
|
497
|
+
def useCredential(credential, forAuthenticationChallenge:challenge)
|
498
|
+
@challenge = challenge
|
499
|
+
@credential = credential
|
500
|
+
end
|
501
|
+
end
|
356
502
|
|
357
|
-
|
358
|
-
|
359
|
-
|
503
|
+
class FakeChallenge
|
504
|
+
attr_accessor :previousFailureCount
|
505
|
+
|
506
|
+
def sender
|
507
|
+
@fake_sender ||= FakeSender.new
|
508
|
+
end
|
509
|
+
end
|
360
510
|
|
361
|
-
|
362
|
-
|
363
|
-
def initialize(request, delegate)
|
364
|
-
@request = request
|
365
|
-
@delegate = delegate
|
366
|
-
self.class.connectionWithRequest(request, delegate:delegate)
|
511
|
+
class BubbleWrap::HTTP::Query
|
512
|
+
def create_connection(request, delegate); FakeURLConnection.new(request, delegate); end
|
367
513
|
end
|
368
|
-
|
369
|
-
|
370
|
-
|
514
|
+
|
515
|
+
class FakeURLConnection < NSURLConnection
|
516
|
+
attr_reader :delegate, :request, :was_started
|
517
|
+
def initialize(request, delegate)
|
518
|
+
@request = request
|
519
|
+
@delegate = delegate
|
520
|
+
self.class.connectionWithRequest(request, delegate:delegate)
|
521
|
+
end
|
522
|
+
def start
|
523
|
+
@was_started = true
|
524
|
+
super
|
525
|
+
end
|
371
526
|
end
|
372
|
-
end
|
373
527
|
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
528
|
+
class FakeURLResponse
|
529
|
+
attr_reader :statusCode, :allHeaderFields, :expectedContentLength
|
530
|
+
def initialize(status_code, headers, length)
|
531
|
+
@statusCode = status_code
|
532
|
+
@allHeaderFields = headers
|
533
|
+
@expectedContentLength = length
|
534
|
+
end
|
380
535
|
end
|
536
|
+
|
381
537
|
end
|
382
538
|
|
383
539
|
end
|
384
|
-
|
385
|
-
end
|