em-campfire 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +8 -0
- data/CONTRIBUTING.md +24 -0
- data/Gemfile +1 -1
- data/README.md +103 -2
- data/em-campfire.gemspec +8 -7
- data/examples/simple.rb +30 -7
- data/lib/em-campfire/cache.rb +25 -0
- data/lib/em-campfire/connection.rb +12 -11
- data/lib/em-campfire/messages.rb +7 -8
- data/lib/em-campfire/rooms.rb +88 -92
- data/lib/em-campfire/users.rb +60 -39
- data/lib/em-campfire/version.rb +1 -1
- data/lib/em-campfire.rb +15 -12
- data/spec/lib/cache_spec.rb +25 -0
- data/spec/lib/connection_spec.rb +51 -8
- data/spec/lib/em-campfire_spec.rb +31 -197
- data/spec/lib/messages_spec.rb +49 -38
- data/spec/lib/rooms_spec.rb +205 -31
- data/spec/lib/users_spec.rb +192 -0
- data/spec/messages_helper.rb +9 -0
- data/spec/rooms_helper.rb +98 -0
- data/spec/spec_helper.rb +17 -49
- data/spec/users_helper.rb +35 -0
- metadata +95 -26
- data/Gemfile.lock +0 -51
data/spec/lib/messages_spec.rb
CHANGED
@@ -1,47 +1,58 @@
|
|
1
|
-
require "
|
1
|
+
require "messages_helper"
|
2
|
+
|
3
|
+
class MessageTester < ModuleHarness
|
4
|
+
include EventMachine::Campfire::Messages
|
5
|
+
include EventMachine::Campfire::Rooms
|
6
|
+
end
|
2
7
|
|
3
8
|
describe EventMachine::Campfire::Messages do
|
4
|
-
|
5
|
-
|
6
|
-
stub_rooms_data_request
|
7
|
-
stub_join_room_request(123)
|
8
|
-
stub_stream_room_request(123)
|
9
|
-
EM.run_block { @adaptor = a(EM::Campfire) }
|
9
|
+
before :each do
|
10
|
+
@adaptor = MessageTester.new
|
10
11
|
end
|
12
|
+
|
13
|
+
describe "posting messages" do
|
14
|
+
it "should say" do
|
15
|
+
@adaptor.expects(:send_message).with(123, "foo", "TextMessage")
|
16
|
+
@adaptor.say("foo", 123)
|
17
|
+
end
|
11
18
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
@adaptor.
|
19
|
-
|
20
|
-
|
21
|
-
logger_output.should =~ /DEBUG.*Posted Textmessage "Hi" to room 123/
|
19
|
+
it "should paste" do
|
20
|
+
@adaptor.expects(:send_message).with(123, "foo", "PasteMessage")
|
21
|
+
@adaptor.paste("foo", 123)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should play" do
|
25
|
+
@adaptor.expects(:send_message).with(123, "foo", "SoundMessage")
|
26
|
+
@adaptor.play("foo", 123)
|
27
|
+
end
|
22
28
|
end
|
23
29
|
|
24
|
-
it "should
|
25
|
-
mock_logger
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
@adaptor.join 123
|
30
|
-
@adaptor.paste "Hi", 123
|
31
|
-
}
|
32
|
-
stub.should have_been_requested
|
33
|
-
logger_output.should =~ /DEBUG.*Posted PasteMessage "Hi" to room 123/
|
30
|
+
it "should not try to post a message to a room it hasn't joined" do
|
31
|
+
mock_logger(MessageTester)
|
32
|
+
EM.run_block { @adaptor.say "Hi", 123 }
|
33
|
+
|
34
|
+
logger_output.should =~ %r{Couldn't post message "Hi" to room 123 as no rooms have been joined}
|
34
35
|
end
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
36
|
+
|
37
|
+
context "having successfully joined a room" do
|
38
|
+
before :each do
|
39
|
+
mock_logger(MessageTester)
|
40
|
+
stub_join_room_request(123)
|
41
|
+
EM.run_block { @adaptor.join(123) }
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should say a message" do
|
45
|
+
stub = stub_message_post_request
|
46
|
+
EM.run_block { @adaptor.say("Hi", 123) }
|
47
|
+
stub.should have_been_requested
|
48
|
+
logger_output.should =~ /DEBUG.*Posted TextMessage "Hi" to room 123/
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should handle message posting failure" do
|
52
|
+
stub = stub_message_post_request(500)
|
53
|
+
EM.run_block { @adaptor.say("Hi", 123) }
|
54
|
+
stub.should have_been_requested
|
55
|
+
logger_output.should =~ %r{ERROR.*Couldn't post message "Hi" to room 123 using url https://oxygen.campfirenow.com/room/123/speak.json, http response from the API was 500}
|
56
|
+
end
|
46
57
|
end
|
47
58
|
end
|
data/spec/lib/rooms_spec.rb
CHANGED
@@ -1,47 +1,221 @@
|
|
1
|
-
require "
|
1
|
+
require "rooms_helper"
|
2
|
+
|
3
|
+
class RoomsTestContainer < ModuleHarness
|
4
|
+
include EventMachine::Campfire::Rooms
|
5
|
+
|
6
|
+
def cache; @cache ||= EventMachine::Campfire::Cache.new; end
|
7
|
+
def process_message; end
|
8
|
+
end
|
2
9
|
|
3
10
|
describe EventMachine::Campfire::Rooms do
|
4
|
-
|
5
11
|
before :each do
|
6
|
-
|
7
|
-
|
8
|
-
EM.run_block { @adaptor = a(EM::Campfire) }
|
12
|
+
mock_logger(RoomsTestContainer)
|
13
|
+
@adaptor = RoomsTestContainer.new
|
9
14
|
end
|
10
15
|
|
11
|
-
|
12
|
-
before :each do
|
13
|
-
EM.run_block { @adaptor = a EM::Campfire }
|
14
|
-
end
|
15
|
-
|
16
|
+
describe "#join" do
|
16
17
|
it "should allow joining by id" do
|
17
|
-
mock_logger
|
18
|
-
|
19
18
|
join_stub = stub_join_room_request(123)
|
20
|
-
stream_stub = stub_stream_room_request(123)
|
21
19
|
EM.run_block { @adaptor.join(123) }
|
22
20
|
logger_output.should =~ /INFO.*Joined room 123 successfully/
|
23
21
|
join_stub.should have_been_requested
|
24
22
|
end
|
25
|
-
|
26
|
-
it "should
|
23
|
+
|
24
|
+
it "should not be able to join an invalid room" do
|
25
|
+
join_stub = stub_join_room_request(9999999, 302)
|
26
|
+
EM.run_block { @adaptor.join(9999999) }
|
27
|
+
logger_output.should =~ /Error joining room: 9999999/
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should call a passed block on success" do
|
27
31
|
join_stub = stub_join_room_request(123)
|
28
|
-
|
29
|
-
|
30
|
-
|
32
|
+
object = mock()
|
33
|
+
object.expects(:ping).with("foo")
|
34
|
+
|
35
|
+
EM.run_block {
|
36
|
+
@adaptor.join(123) {|room_id| object.ping("foo") }
|
37
|
+
}
|
31
38
|
end
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "streaming" do
|
42
|
+
it "should stream a room" do
|
43
|
+
stream_stub = stub_stream_room_request(123, stream_message_json)
|
44
|
+
@adaptor.expects(:process_message).with(stream_message)
|
45
|
+
EM.run_block { @adaptor.stream(123)}
|
46
|
+
stream_stub.should have_been_requested
|
47
|
+
logger_output.should =~ /INFO.*Disconnected from #{stream_url_for_room(123)}/
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should handle invalid json" do
|
51
|
+
invalid_json = "{:one => two}\n"
|
52
|
+
stream_stub = stub_stream_room_request(123, invalid_json)
|
53
|
+
@adaptor.expects(:process_message).never
|
54
|
+
EM.run_block { @adaptor.stream(123)}
|
55
|
+
stream_stub.should have_been_requested
|
56
|
+
logger_output.should =~ /Couldn't parse json data for room 123, data was #{invalid_json}, error was: parse error: invalid object key \(must be a string\)/
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should handle server timeouts" do
|
60
|
+
request = stub_timeout_stream_room_request(123)
|
61
|
+
|
62
|
+
EM.run_block {@adaptor.stream(123)}
|
63
|
+
logger_output.should =~ /ERROR.*Couldn't stream room 123 at url #{stream_url_for_room(123)}, error was WebMock timeout error/
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should re-connect to a streaming URL when timed out" do
|
67
|
+
request = stub_timeout_stream_room_request(123)
|
68
|
+
|
69
|
+
EM.run_block {@adaptor.stream(123)}
|
70
|
+
request.should have_been_requested.twice
|
71
|
+
logger_output.should =~ /ERROR.*Couldn't stream room 123 at url #{stream_url_for_room(123)}, error was WebMock timeout error/
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should handle server errors streaming data" do
|
75
|
+
request = stub_stream_room_request(123, "", 500)
|
76
|
+
|
77
|
+
EM.run_block {@adaptor.stream(123)}
|
78
|
+
request.should have_been_requested
|
79
|
+
logger_output.should =~ /ERROR.*Couldn't stream room with url #{stream_url_for_room(123)}, http response from API was 500/
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should re-connect to a streaming URL when disconnected" do
|
83
|
+
stream_stub = stub_stream_room_request(123, "")
|
84
|
+
EM.run {
|
85
|
+
@adaptor.stream(123)
|
86
|
+
# Re-connecting takes two ticks
|
87
|
+
EM.next_tick { EM.next_tick {EM.stop} }
|
88
|
+
}
|
89
|
+
logger_output.should =~ /INFO.*Disconnected from #{stream_url_for_room(123)}/
|
90
|
+
stream_stub.should have_been_requested.twice
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "fetching metadata" do
|
95
|
+
describe "for individual rooms" do
|
96
|
+
it "should fetch room data" do
|
97
|
+
request = stub_room_data_request(123)
|
98
|
+
yielded_data = nil
|
99
|
+
|
100
|
+
EM.run_block {
|
101
|
+
@adaptor.room_data_from_room_id(123) {|data| yielded_data = data}
|
102
|
+
}
|
103
|
+
|
104
|
+
yielded_data.should eql(valid_room_cache_data[123])
|
105
|
+
request.should have_been_requested
|
106
|
+
logger_output.should =~ /DEBUG.*Fetched room data for 123 \(#{valid_room_cache_data[123]['name']}\)/
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should handle server errors fetching data" do
|
110
|
+
request = stub_room_data_request(123, 500)
|
111
|
+
|
112
|
+
EM.run_block {@adaptor.room_data_from_room_id(123)}
|
113
|
+
request.should have_been_requested
|
114
|
+
logger_output.should =~ /ERROR.*Couldn't fetch room data with url #{room_data_url(123)}, http response from API was 500/
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
it "should handle server timeouts" do
|
119
|
+
request = stub_timeout_room_data_request(123)
|
120
|
+
|
121
|
+
EM.run_block {@adaptor.room_data_from_room_id(123)}
|
122
|
+
request.should have_been_requested
|
123
|
+
logger_output.should =~ /ERROR.*Couldn't connect to url #{room_data_url(123)} to fetch room data/
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should not update the room data cache when room data is fresh" do
|
127
|
+
request = stub_room_data_request(123, 304)
|
128
|
+
room_data = valid_room_cache_data[123]
|
129
|
+
room_data_with_etag = room_data.merge({'etag' => etag_for_data(room_data)})
|
130
|
+
@adaptor.cache.expects(:get).with("room-data-123").returns(room_data_with_etag)
|
131
|
+
@adaptor.cache.expects(:set).never
|
132
|
+
|
133
|
+
EM.run_block { @adaptor.room_data_from_room_id(123) }
|
134
|
+
logger_output.should =~ /DEBUG.*HTTP response was 304, serving room data for room 123 \(#{room_data['name']}\) from cache/
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should update the room data cache when room data is stale" do
|
138
|
+
request = stub_room_data_request(123)
|
139
|
+
room_data = valid_room_cache_data[123]
|
140
|
+
room_data_with_etag = room_data.merge({'etag' => etag_for_data(valid_room_cache_data[123])})
|
141
|
+
@adaptor.cache.expects(:get).with("room-data-123").returns(valid_room_cache_data[123].merge({'etag' => etag_for_data("no such etag")}))
|
142
|
+
@adaptor.cache.expects(:set).with("room-data-123", valid_room_cache_data[123].merge({'etag' => etag_for_data(room_data)}))
|
143
|
+
|
144
|
+
EM.run_block { @adaptor.room_data_from_room_id(123) }
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "for all rooms" do
|
149
|
+
before :each do
|
150
|
+
@cache_response = {'etag' => etag_for_room_list_data, 'data' => room_list_data_api_response['rooms']}
|
151
|
+
@adaptor.cache.expects(:get).with("room-list-data").returns(@cache_response)
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should fetch a room list" do
|
155
|
+
request = stub_room_list_data_request
|
156
|
+
rooms_data = room_list_data_api_response
|
157
|
+
rooms_data_with_etag = rooms_data.merge({'etag' => etag_for_data(rooms_data)})
|
158
|
+
|
159
|
+
yielded_data = nil
|
160
|
+
|
161
|
+
EM.run_block {
|
162
|
+
@adaptor.room_data_for_all_rooms {|data| yielded_data = data}
|
163
|
+
}
|
164
|
+
|
165
|
+
yielded_data.should eql(room_list_data_api_response['rooms'])
|
166
|
+
|
167
|
+
request.should have_been_requested
|
168
|
+
logger_output.should =~ /DEBUG.*Fetched room data for all rooms/
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should handle server errors fetching data" do
|
172
|
+
request = stub_room_list_data_request(500)
|
173
|
+
|
174
|
+
EM.run_block {@adaptor.room_data_for_all_rooms}
|
175
|
+
|
176
|
+
request.should have_been_requested
|
177
|
+
logger_output.should =~ /ERROR.*Couldn't fetch room list with url #{rooms_data_url}, http response from API was 500/
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should handle server timeouts" do
|
181
|
+
request = stub_timeout_room_list_data_request
|
182
|
+
|
183
|
+
EM.run_block {@adaptor.room_data_for_all_rooms}
|
184
|
+
request.should have_been_requested
|
185
|
+
|
186
|
+
logger_output.should =~ /ERROR.*Error processing url #{rooms_data_url} to fetch room data: WebMock timeout error/
|
187
|
+
end
|
188
|
+
|
189
|
+
describe "when the cached data is fresh" do
|
190
|
+
before :each do
|
191
|
+
stub_room_list_data_request(304)
|
192
|
+
rooms_data = room_list_data_api_response
|
193
|
+
@rooms_data_with_etag = rooms_data.merge({'etag' => etag_for_room_list_data})
|
194
|
+
end
|
195
|
+
|
196
|
+
it "should not update the cached room list" do
|
197
|
+
@adaptor.cache.expects(:set).never
|
198
|
+
|
199
|
+
EM.run_block { @adaptor.room_data_for_all_rooms }
|
200
|
+
end
|
201
|
+
|
202
|
+
it "should serve cached data" do
|
203
|
+
yielded_data = nil
|
204
|
+
|
205
|
+
EM.run_block {
|
206
|
+
@adaptor.room_data_for_all_rooms { |data| yielded_data = data }
|
207
|
+
}
|
208
|
+
|
209
|
+
logger_output.should =~ /DEBUG.*HTTP response was 304, serving room list data from cache/
|
210
|
+
yielded_data.should eql(@cache_response)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should update the room list data cache when room data is stale" do
|
215
|
+
stub_room_list_data_request
|
216
|
+
@adaptor.cache.expects(:set).with("room-list-data", {'data' => room_list_data_api_response['rooms'], 'etag' => 'new etag'})
|
217
|
+
EM.run_block { @adaptor.room_data_for_all_rooms }
|
218
|
+
end
|
45
219
|
end
|
46
220
|
end
|
47
221
|
end
|
@@ -0,0 +1,192 @@
|
|
1
|
+
require "users_helper"
|
2
|
+
|
3
|
+
class UsersTestContainer < ModuleHarness
|
4
|
+
include EventMachine::Campfire::Users
|
5
|
+
|
6
|
+
def cache; @cache ||= EventMachine::Campfire::Cache.new; end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe EventMachine::Campfire::Users do
|
10
|
+
before :each do
|
11
|
+
@adaptor = UsersTestContainer.new
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#is_me?" do
|
15
|
+
it "should return true if the passed user_id belongs to me" do
|
16
|
+
@adaptor.cache.stubs(:get).with('user-data-me').returns(valid_user_cache_data['me'])
|
17
|
+
|
18
|
+
EM.run_block {
|
19
|
+
@adaptor.is_me?(789).should eql(true)
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should return false if the passed user_id doesn't belong to me" do
|
24
|
+
@adaptor.cache.stubs(:get).with('user-data-me').returns(valid_user_cache_data['me'])
|
25
|
+
|
26
|
+
EM.run_block {
|
27
|
+
@adaptor.is_me?(123).should eql(false)
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should use cached data if available" do
|
32
|
+
@adaptor.cache.expects(:get).with('user-data-me').returns(valid_user_cache_data['me'])
|
33
|
+
@adaptor.expects(:fetch_user_data_for_self).never
|
34
|
+
EM.run_block { @adaptor.is_me?(789) }
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should fetch data if no cached data is available" do
|
38
|
+
mock_logger(UsersTestContainer)
|
39
|
+
@adaptor.cache.expects(:get).with('user-data-me').returns(nil)
|
40
|
+
@adaptor.expects(:fetch_user_data_for_self).once.yields(valid_user_cache_data['me'])
|
41
|
+
|
42
|
+
EM.run_block {
|
43
|
+
@adaptor.is_me?(789)
|
44
|
+
}
|
45
|
+
logger_output.should =~ /DEBUG.*No user data cache exists for me, fetching it now/
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "fetching user data" do
|
50
|
+
before :each do
|
51
|
+
mock_logger(UsersTestContainer)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should get correct data for a user_id" do
|
55
|
+
stub_user_data_request(123)
|
56
|
+
yielded_data = nil
|
57
|
+
EM.run_block {
|
58
|
+
@adaptor.fetch_user_data_for_user_id(123) do |user_data|
|
59
|
+
yielded_data = user_data
|
60
|
+
end
|
61
|
+
}
|
62
|
+
|
63
|
+
yielded_data["name"].should eql(valid_user_cache_data[123]["name"])
|
64
|
+
|
65
|
+
logger_output.should =~ %r{DEBUG.+Got the user data for 123}
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should handle server errors" do
|
69
|
+
stub_user_data_request(123, 502)
|
70
|
+
EM.run_block {
|
71
|
+
@adaptor.fetch_user_data_for_user_id(123)
|
72
|
+
}
|
73
|
+
|
74
|
+
logger_output.should =~ %r{ERROR.+Couldn't fetch user data for user 123 with url .+, http response from API was 502}
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should handle server timeouts" do
|
78
|
+
stub_timeout_user_data_request(123)
|
79
|
+
EM.run_block {
|
80
|
+
@adaptor.fetch_user_data_for_user_id(123)
|
81
|
+
}
|
82
|
+
|
83
|
+
logger_output.should =~ %r{ERROR.+Couldn't connect to .+ to fetch user data for user 123}
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "when the cache is fresh" do
|
87
|
+
before :each do
|
88
|
+
@user_data = valid_user_cache_data[456]
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should not update the user cache data" do
|
92
|
+
stub_user_data_request(123, 304)
|
93
|
+
@adaptor.cache.expects(:get).with("user-data-123").returns(@user_data)
|
94
|
+
@adaptor.cache.expects(:set).never
|
95
|
+
|
96
|
+
EM.run_block {
|
97
|
+
@adaptor.fetch_user_data_for_user_id(123)
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should serve cached data" do
|
102
|
+
@adaptor.cache.expects(:get).with("user-data-456").returns(@user_data)
|
103
|
+
stub_user_data_request(456, 304)
|
104
|
+
yielded_data = nil
|
105
|
+
|
106
|
+
EM.run_block {
|
107
|
+
@adaptor.fetch_user_data_for_user_id(456) { |data| yielded_data = data }
|
108
|
+
}
|
109
|
+
|
110
|
+
logger_output.should =~ %r{DEBUG.+HTTP response was 304, serving user data for user 456 \(#{@user_data['name']}\) from cache}
|
111
|
+
yielded_data.should eql(@user_data)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should update the user data cache when user data is stale" do
|
116
|
+
user_data = valid_user_cache_data[123]
|
117
|
+
user_data_with_etag = user_data.merge({"etag" => etag_for_data(user_data)})
|
118
|
+
stub_user_data_request(123)
|
119
|
+
@adaptor.cache.expects(:get).with("user-data-123").returns(user_data)
|
120
|
+
@adaptor.cache.expects(:set).with("user-data-123", user_data_with_etag)
|
121
|
+
|
122
|
+
EM.run_block {
|
123
|
+
@adaptor.fetch_user_data_for_user_id(123)
|
124
|
+
}
|
125
|
+
end
|
126
|
+
|
127
|
+
describe "about self" do
|
128
|
+
it "should get correct data for self" do
|
129
|
+
stub = stub_self_data_request
|
130
|
+
yielded_data = nil
|
131
|
+
EM.run_block {
|
132
|
+
@adaptor.fetch_user_data_for_self {|data| yielded_data = data }
|
133
|
+
}
|
134
|
+
stub.should have_been_requested
|
135
|
+
yielded_data.should eql(valid_user_cache_data['me'])
|
136
|
+
# FIXME: Can't work out why these debug messages get dumped to the terminal when others don't
|
137
|
+
logger_output.should =~ /DEBUG.+Got the user data for self/
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should handle server errors" do
|
141
|
+
stub_self_data_request(502)
|
142
|
+
EM.run_block { @adaptor.fetch_user_data_for_self }
|
143
|
+
|
144
|
+
logger_output.should =~ %r{ERROR.+Couldn't fetch user data for self with url .+, http response from API was 502}
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should handle server timeouts" do
|
148
|
+
stub_timeout_self_data_request
|
149
|
+
EM.run_block { @adaptor.fetch_user_data_for_self }
|
150
|
+
|
151
|
+
logger_output.should =~ %r{ERROR.+Couldn't connect to .+ to fetch user data for self}
|
152
|
+
end
|
153
|
+
|
154
|
+
describe "when the cache is fresh" do
|
155
|
+
before :each do
|
156
|
+
@user_data = valid_user_cache_data['me']
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should not update the user cache data" do
|
160
|
+
stub_self_data_request(304)
|
161
|
+
@adaptor.cache.expects(:get).with("user-data-me").returns(@user_data)
|
162
|
+
@adaptor.cache.expects(:set).never
|
163
|
+
|
164
|
+
EM.run_block { @adaptor.fetch_user_data_for_self }
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should serve cached data" do
|
168
|
+
@adaptor.cache.expects(:get).with("user-data-me").returns(@user_data)
|
169
|
+
stub_self_data_request(304)
|
170
|
+
yielded_data = nil
|
171
|
+
|
172
|
+
EM.run_block {
|
173
|
+
@adaptor.fetch_user_data_for_self { |data| yielded_data = data }
|
174
|
+
}
|
175
|
+
|
176
|
+
logger_output.should =~ %r{DEBUG.+HTTP response was 304, serving user data for self from cache}
|
177
|
+
yielded_data.should eql(@user_data)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
it "should update the user data cache when user data is stale" do
|
182
|
+
user_data = valid_user_cache_data['me']
|
183
|
+
user_data_with_etag = user_data.merge({"etag" => etag_for_data(user_data)})
|
184
|
+
stub_self_data_request
|
185
|
+
@adaptor.cache.expects(:get).with("user-data-me").returns(user_data)
|
186
|
+
@adaptor.cache.expects(:set).with("user-data-me", user_data_with_etag)
|
187
|
+
|
188
|
+
EM.run_block { @adaptor.fetch_user_data_for_self }
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|