twingly-search 5.0.1 → 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -2
- data/CHANGELOG.md +16 -0
- data/README.md +33 -34
- data/Rakefile +0 -6
- data/examples/find_all_posts_mentioning_github.rb +3 -3
- data/examples/hello_world.rb +2 -2
- data/examples/livefeed_loop.rb +24 -0
- data/lib/twingly/livefeed/client.rb +121 -0
- data/lib/twingly/livefeed/error.rb +28 -0
- data/lib/twingly/livefeed/parser.rb +96 -0
- data/lib/twingly/livefeed/post.rb +66 -0
- data/lib/twingly/livefeed/result.rb +39 -0
- data/lib/twingly/livefeed/version.rb +5 -0
- data/lib/twingly/livefeed.rb +6 -0
- data/lib/twingly/search/client.rb +3 -2
- data/lib/twingly/search/error.rb +6 -5
- data/lib/twingly/search/parser.rb +39 -13
- data/lib/twingly/search/post.rb +65 -21
- data/lib/twingly/search/query.rb +46 -16
- data/lib/twingly/search/result.rb +11 -0
- data/lib/twingly/search/version.rb +1 -1
- data/spec/client_spec.rb +2 -2
- data/spec/error_spec.rb +27 -7
- data/spec/fixtures/incomplete_result.xml +2 -0
- data/spec/fixtures/livefeed/empty_api_key_result.xml +3 -0
- data/spec/fixtures/livefeed/non_xml_result.xml +1 -0
- data/spec/fixtures/livefeed/not_found_result.xml +3 -0
- data/spec/fixtures/livefeed/service_unavailable_result.xml +3 -0
- data/spec/fixtures/livefeed/unauthorized_api_key_result.xml +3 -0
- data/spec/fixtures/livefeed/valid_empty_result.xml +2 -0
- data/spec/fixtures/livefeed/valid_result.xml +79 -0
- data/spec/fixtures/minimal_valid_result.xml +81 -52
- data/spec/fixtures/nonexistent_api_key_result.xml +3 -3
- data/spec/fixtures/service_unavailable_result.xml +3 -3
- data/spec/fixtures/unauthorized_api_key_result.xml +3 -3
- data/spec/fixtures/undefined_error_result.xml +3 -3
- data/spec/fixtures/valid_empty_result.xml +2 -2
- data/spec/fixtures/valid_links_result.xml +36 -0
- data/spec/fixtures/vcr_cassettes/livefeed_valid_request.yml +169 -0
- data/spec/fixtures/vcr_cassettes/search_for_spotify_on_sv_blogs.yml +578 -447
- data/spec/fixtures/vcr_cassettes/search_without_valid_api_key.yml +15 -14
- data/spec/livefeed/client_spec.rb +135 -0
- data/spec/livefeed/error_spec.rb +51 -0
- data/spec/livefeed/parser_spec.rb +351 -0
- data/spec/livefeed/post_spec.rb +26 -0
- data/spec/livefeed/result_spec.rb +18 -0
- data/spec/parser_spec.rb +191 -94
- data/spec/post_spec.rb +25 -6
- data/spec/query_spec.rb +41 -34
- data/spec/result_spec.rb +1 -0
- data/spec/spec_helper.rb +10 -0
- data/twingly-search-api-ruby.gemspec +2 -3
- metadata +44 -24
- data/spec/fixtures/valid_non_blog_result.xml +0 -26
- data/spec/fixtures/valid_result.xml +0 -22975
data/spec/parser_spec.rb
CHANGED
@@ -14,55 +14,137 @@ describe Parser do
|
|
14
14
|
subject { result }
|
15
15
|
|
16
16
|
context "with a valid result" do
|
17
|
-
let(:fixture) { :
|
17
|
+
let(:fixture) { :minimal_valid }
|
18
18
|
|
19
19
|
it { is_expected.to be_a Result }
|
20
|
-
end
|
21
20
|
|
22
|
-
|
23
|
-
|
21
|
+
describe "#number_of_matches_returned" do
|
22
|
+
subject { result.number_of_matches_returned }
|
23
|
+
it { is_expected.to eq(3) }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#number_of_matches_total" do
|
27
|
+
subject { result.number_of_matches_total }
|
28
|
+
it { is_expected.to eq(3122050) }
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#seconds_elapsed" do
|
32
|
+
subject { result.seconds_elapsed }
|
33
|
+
it { is_expected.to eq(0.369) }
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#posts" do
|
37
|
+
subject { result.posts }
|
38
|
+
|
39
|
+
it { is_expected.to all(be_a(Post)) }
|
40
|
+
|
41
|
+
describe "#count" do
|
42
|
+
subject { result.posts.count }
|
43
|
+
|
44
|
+
it { is_expected.to eq(3) }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#posts.first" do
|
49
|
+
subject(:post) { result.posts.first }
|
24
50
|
|
25
|
-
|
26
|
-
|
51
|
+
describe "#id" do
|
52
|
+
subject { post.id }
|
53
|
+
it { is_expected.to eq("16405819479794412880") }
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#author" do
|
57
|
+
subject { post.author }
|
58
|
+
it { is_expected.to eq("klivinihemligheten") }
|
59
|
+
end
|
27
60
|
|
28
61
|
describe "#url" do
|
29
62
|
subject { post.url }
|
30
|
-
it { is_expected.to eq("http://
|
63
|
+
it { is_expected.to eq("http://nouw.com/klivinihemligheten/planering---men-dalig-30016048") }
|
31
64
|
end
|
32
65
|
|
33
66
|
describe "#title" do
|
34
67
|
subject { post.title }
|
35
|
-
it { is_expected.to eq("
|
68
|
+
it { is_expected.to eq("Planering - men dålig") }
|
36
69
|
end
|
37
70
|
|
38
|
-
describe "#
|
39
|
-
subject { post.
|
40
|
-
it { is_expected.to
|
71
|
+
describe "#text" do
|
72
|
+
subject { post.text }
|
73
|
+
it { is_expected.to start_with("Det vart en förmiddag på boxen med en brud som jag ") }
|
41
74
|
end
|
42
75
|
|
43
76
|
describe "#language_code" do
|
44
77
|
subject { post.language_code }
|
45
|
-
it { is_expected.to eq("
|
78
|
+
it { is_expected.to eq("sv") }
|
46
79
|
end
|
47
80
|
|
48
|
-
describe "#
|
49
|
-
subject { post.
|
50
|
-
it { is_expected.to eq(
|
81
|
+
describe "#location_code" do
|
82
|
+
subject { post.location_code }
|
83
|
+
it { is_expected.to eq("se") }
|
51
84
|
end
|
52
85
|
|
53
|
-
describe "#
|
54
|
-
subject { post.
|
55
|
-
it { is_expected.to eq(
|
86
|
+
describe "#coordinates" do
|
87
|
+
subject { post.coordinates }
|
88
|
+
it { is_expected.to eq({}) }
|
56
89
|
end
|
57
90
|
|
58
|
-
describe "#
|
59
|
-
subject { post.
|
60
|
-
it { is_expected.to
|
91
|
+
describe "#links" do
|
92
|
+
subject { post.links }
|
93
|
+
it { is_expected.to be_empty }
|
61
94
|
end
|
62
95
|
|
63
|
-
describe "#
|
64
|
-
subject { post.
|
65
|
-
|
96
|
+
describe "#tags" do
|
97
|
+
subject { post.tags }
|
98
|
+
let(:expected_tags) do
|
99
|
+
[
|
100
|
+
"Ätas & drickas",
|
101
|
+
"Universitet & studentlivet",
|
102
|
+
"Träning",
|
103
|
+
"To to list",
|
104
|
+
]
|
105
|
+
end
|
106
|
+
|
107
|
+
it { is_expected.to eq(expected_tags) }
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "#images" do
|
111
|
+
subject { post.images }
|
112
|
+
it { is_expected.to be_empty }
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "#indexed_at" do
|
116
|
+
subject { post.indexed_at }
|
117
|
+
it { is_expected.to eq(Time.parse("2017-05-04T06:51:23Z")) }
|
118
|
+
end
|
119
|
+
|
120
|
+
describe "#published_at" do
|
121
|
+
subject { post.published_at }
|
122
|
+
it { is_expected.to eq(Time.parse("2017-05-04T06:50:59Z")) }
|
123
|
+
end
|
124
|
+
|
125
|
+
describe "#reindexed_at" do
|
126
|
+
subject { post.reindexed_at }
|
127
|
+
it { is_expected.to eq(Time.parse("2017-05-04T08:51:23Z")) }
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "#inlinks_count" do
|
131
|
+
subject { post.inlinks_count }
|
132
|
+
it { is_expected.to eq(0) }
|
133
|
+
end
|
134
|
+
|
135
|
+
describe "#blog_id" do
|
136
|
+
subject { post.blog_id }
|
137
|
+
it { is_expected.to eq("5312283800049632348") }
|
138
|
+
end
|
139
|
+
|
140
|
+
describe "#blog_name" do
|
141
|
+
subject { post.blog_name }
|
142
|
+
it { is_expected.to eq("Love life like a student") }
|
143
|
+
end
|
144
|
+
|
145
|
+
describe "#blog_url" do
|
146
|
+
subject { post.blog_url }
|
147
|
+
it { is_expected.to eq("http://nouw.com/klivinihemligheten") }
|
66
148
|
end
|
67
149
|
|
68
150
|
describe "#blog_rank" do
|
@@ -70,33 +152,38 @@ describe Parser do
|
|
70
152
|
it { is_expected.to eq(1) }
|
71
153
|
end
|
72
154
|
|
73
|
-
describe "#
|
74
|
-
subject { post.
|
75
|
-
it { is_expected.to eq(
|
155
|
+
describe "#authority" do
|
156
|
+
subject { post.authority }
|
157
|
+
it { is_expected.to eq(0) }
|
76
158
|
end
|
77
159
|
end
|
78
160
|
|
79
|
-
describe "#posts
|
80
|
-
subject(:post) { result.posts
|
161
|
+
describe "#posts.last" do
|
162
|
+
subject(:post) { result.posts.last }
|
163
|
+
|
164
|
+
describe "#id" do
|
165
|
+
subject { post.id }
|
166
|
+
it { is_expected.to eq("2770252465384762934") }
|
167
|
+
end
|
168
|
+
|
169
|
+
describe "#author" do
|
170
|
+
subject { post.author }
|
171
|
+
it { is_expected.to eq("maartiinasvardag") }
|
172
|
+
end
|
81
173
|
|
82
174
|
describe "#url" do
|
83
175
|
subject { post.url }
|
84
|
-
it { is_expected.to eq("http://
|
176
|
+
it { is_expected.to eq("http://nouw.com/maartiinasvardag/god-formiddag-30016041") }
|
85
177
|
end
|
86
178
|
|
87
179
|
describe "#title" do
|
88
180
|
subject { post.title }
|
89
|
-
it { is_expected.to eq("
|
181
|
+
it { is_expected.to eq("God förmiddag! ☀️") }
|
90
182
|
end
|
91
183
|
|
92
|
-
describe "#
|
93
|
-
subject { post.
|
94
|
-
it { is_expected.to
|
95
|
-
|
96
|
-
Relaterade inlägg:
|
97
|
-
Swedish House Mafia – ny låt!
|
98
|
-
Ny knivattack på Swedish House Mafia-konsert
|
99
|
-
Swedish House Mafia gör succé i USA") }
|
184
|
+
describe "#text" do
|
185
|
+
subject { post.text }
|
186
|
+
it { is_expected.to start_with("Hmm.... Vad ska man börja ?? Jag vet inte riktigt vad min gnista ") }
|
100
187
|
end
|
101
188
|
|
102
189
|
describe "#language_code" do
|
@@ -104,78 +191,64 @@ Swedish House Mafia gör succé i USA") }
|
|
104
191
|
it { is_expected.to eq("sv") }
|
105
192
|
end
|
106
193
|
|
107
|
-
describe "#
|
108
|
-
subject { post.
|
109
|
-
it { is_expected.to eq(
|
110
|
-
end
|
111
|
-
|
112
|
-
describe "#indexed" do
|
113
|
-
subject { post.indexed }
|
114
|
-
it { is_expected.to eq(Time.parse("2013-01-29 15:22:52Z")) }
|
115
|
-
end
|
116
|
-
|
117
|
-
describe "#blog_url" do
|
118
|
-
subject { post.blog_url }
|
119
|
-
it { is_expected.to eq("http://www.skvallernytt.se/") }
|
194
|
+
describe "#location_code" do
|
195
|
+
subject { post.location_code }
|
196
|
+
it { is_expected.to eq("se") }
|
120
197
|
end
|
121
198
|
|
122
|
-
describe "#
|
123
|
-
subject { post.
|
124
|
-
it { is_expected.to eq(
|
199
|
+
describe "#coordinates" do
|
200
|
+
subject { post.coordinates }
|
201
|
+
it { is_expected.to eq({}) }
|
125
202
|
end
|
126
203
|
|
127
|
-
describe "#
|
128
|
-
subject { post.
|
129
|
-
it { is_expected.to
|
204
|
+
describe "#links" do
|
205
|
+
subject { post.links }
|
206
|
+
it { is_expected.to be_empty }
|
130
207
|
end
|
131
208
|
|
132
209
|
describe "#tags" do
|
133
210
|
subject { post.tags }
|
134
|
-
it { is_expected.to
|
211
|
+
it { is_expected.to be_empty }
|
135
212
|
end
|
136
|
-
end
|
137
213
|
|
138
|
-
|
139
|
-
|
214
|
+
describe "#images" do
|
215
|
+
subject { post.images }
|
216
|
+
it { is_expected.to be_empty }
|
217
|
+
end
|
140
218
|
|
141
|
-
describe "#
|
142
|
-
subject { post.
|
143
|
-
it { is_expected.to eq(
|
219
|
+
describe "#indexed_at" do
|
220
|
+
subject { post.indexed_at }
|
221
|
+
it { is_expected.to eq(Time.parse("2017-05-04T06:50:07Z")) }
|
144
222
|
end
|
145
223
|
|
146
|
-
describe "#
|
147
|
-
subject { post.
|
148
|
-
it { is_expected.to eq("
|
224
|
+
describe "#published_at" do
|
225
|
+
subject { post.published_at }
|
226
|
+
it { is_expected.to eq(Time.parse("2017-05-04T06:49:50Z")) }
|
149
227
|
end
|
150
228
|
|
151
|
-
describe "#
|
152
|
-
subject { post.
|
153
|
-
it { is_expected.to eq(
|
229
|
+
describe "#reindexed_at" do
|
230
|
+
subject { post.reindexed_at }
|
231
|
+
it { is_expected.to eq(Time.parse("0001-01-01T00:00:00Z")) }
|
154
232
|
end
|
155
233
|
|
156
|
-
describe "#
|
157
|
-
subject { post.
|
158
|
-
it { is_expected.to eq(
|
234
|
+
describe "#inlinks_count" do
|
235
|
+
subject { post.inlinks_count }
|
236
|
+
it { is_expected.to eq(0) }
|
159
237
|
end
|
160
238
|
|
161
|
-
describe "#
|
162
|
-
subject { post.
|
163
|
-
it { is_expected.to eq(
|
239
|
+
describe "#blog_id" do
|
240
|
+
subject { post.blog_id }
|
241
|
+
it { is_expected.to eq("1578135310841173675") }
|
164
242
|
end
|
165
243
|
|
166
|
-
describe "#
|
167
|
-
subject { post.
|
168
|
-
it { is_expected.to eq(
|
244
|
+
describe "#blog_name" do
|
245
|
+
subject { post.blog_name }
|
246
|
+
it { is_expected.to eq("maartiinasvardag blogg") }
|
169
247
|
end
|
170
248
|
|
171
249
|
describe "#blog_url" do
|
172
250
|
subject { post.blog_url }
|
173
|
-
it { is_expected.to eq("http://
|
174
|
-
end
|
175
|
-
|
176
|
-
describe "#authority" do
|
177
|
-
subject { post.authority }
|
178
|
-
it { is_expected.to eq(0) }
|
251
|
+
it { is_expected.to eq("http://nouw.com/maartiinasvardag") }
|
179
252
|
end
|
180
253
|
|
181
254
|
describe "#blog_rank" do
|
@@ -183,18 +256,30 @@ Swedish House Mafia gör succé i USA") }
|
|
183
256
|
it { is_expected.to eq(1) }
|
184
257
|
end
|
185
258
|
|
186
|
-
describe "#
|
187
|
-
subject { post.
|
188
|
-
it { is_expected.to eq(
|
259
|
+
describe "#authority" do
|
260
|
+
subject { post.authority }
|
261
|
+
it { is_expected.to eq(0) }
|
189
262
|
end
|
190
263
|
end
|
191
264
|
end
|
192
265
|
|
193
|
-
context "with a valid result containing
|
194
|
-
let(:fixture) { :
|
266
|
+
context "with a valid result containing links" do
|
267
|
+
let(:fixture) { :valid_links }
|
268
|
+
|
269
|
+
describe "#posts.first" do
|
270
|
+
subject(:post) { result.posts.first }
|
271
|
+
let(:expected_links) do
|
272
|
+
%w[
|
273
|
+
https://1.bp.blogspot.com/-4uNjjiNQiug/WKguo1sBxwI/AAAAAAAAqKE/_eR7cY8Ft3cd2fYCx-2yXK8AwSHE_A2GgCLcB/s1600/aaea427ee3eaaf8f47d650f48fdf1242.jpg
|
274
|
+
http://www.irsn.fr/EN/newsroom/News/Pages/20170213_Detection-of-radioactive-iodine-at-trace-levels-in-Europe-in-January-2017.aspx
|
275
|
+
https://www.t.co/2P4IDmovzH
|
276
|
+
https://www.twitter.com/Strat2Intel/status/832710701730844672
|
277
|
+
]
|
278
|
+
end
|
195
279
|
|
196
|
-
|
197
|
-
|
280
|
+
describe "#links" do
|
281
|
+
its(:links) { should eq(expected_links) }
|
282
|
+
end
|
198
283
|
end
|
199
284
|
end
|
200
285
|
|
@@ -208,11 +293,23 @@ Swedish House Mafia gör succé i USA") }
|
|
208
293
|
end
|
209
294
|
end
|
210
295
|
|
296
|
+
context "with an complete result" do
|
297
|
+
let(:fixture) { :valid_empty }
|
298
|
+
|
299
|
+
it { is_expected.not_to be_incomplete }
|
300
|
+
end
|
301
|
+
|
302
|
+
context "with an incomplete result" do
|
303
|
+
let(:fixture) { :incomplete }
|
304
|
+
|
305
|
+
it { is_expected.to be_incomplete }
|
306
|
+
end
|
307
|
+
|
211
308
|
context "with a nonexistent api key result" do
|
212
309
|
let(:fixture) { :nonexistent_api_key }
|
213
310
|
|
214
311
|
it "should raise AuthError" do
|
215
|
-
expect { subject }.to raise_error(
|
312
|
+
expect { subject }.to raise_error(QueryError)
|
216
313
|
end
|
217
314
|
end
|
218
315
|
|
data/spec/post_spec.rb
CHANGED
@@ -3,15 +3,34 @@ require 'spec_helper'
|
|
3
3
|
include Twingly::Search
|
4
4
|
|
5
5
|
describe Post do
|
6
|
+
it { should respond_to :id }
|
7
|
+
it { should respond_to :author }
|
6
8
|
it { should respond_to :url }
|
7
9
|
it { should respond_to :title }
|
8
|
-
it { should respond_to :
|
10
|
+
it { should respond_to :text }
|
11
|
+
it { should respond_to :location_code }
|
9
12
|
it { should respond_to :language_code }
|
10
|
-
it { should respond_to :
|
11
|
-
it { should respond_to :
|
12
|
-
it { should respond_to :
|
13
|
+
it { should respond_to :coordinates }
|
14
|
+
it { should respond_to :links }
|
15
|
+
it { should respond_to :tags }
|
16
|
+
it { should respond_to :images }
|
17
|
+
it { should respond_to :indexed_at }
|
18
|
+
it { should respond_to :published_at }
|
19
|
+
it { should respond_to :reindexed_at }
|
20
|
+
it { should respond_to :inlinks_count }
|
21
|
+
it { should respond_to :blog_id }
|
13
22
|
it { should respond_to :blog_name }
|
14
|
-
it { should respond_to :
|
23
|
+
it { should respond_to :blog_url }
|
15
24
|
it { should respond_to :blog_rank }
|
16
|
-
it { should respond_to :
|
25
|
+
it { should respond_to :authority }
|
26
|
+
|
27
|
+
deprecated_methods = %i(summary indexed published outlinks)
|
28
|
+
deprecated_methods.each do |method_name|
|
29
|
+
describe "##{method_name}" do
|
30
|
+
it do
|
31
|
+
expect { subject.public_send(method_name) }
|
32
|
+
.to output(/deprecated/).to_stderr
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
17
36
|
end
|
data/spec/query_spec.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'vcr_setup'
|
3
2
|
|
4
3
|
include Twingly::Search
|
5
4
|
|
@@ -10,15 +9,30 @@ describe Query do
|
|
10
9
|
allow(client_double).to receive(:api_key).and_return("api_key")
|
11
10
|
end
|
12
11
|
|
13
|
-
subject { described_class.new(client_double) }
|
12
|
+
subject(:query) { described_class.new(client_double) }
|
14
13
|
|
15
|
-
it { should respond_to(:
|
14
|
+
it { should respond_to(:search_query) }
|
16
15
|
it { should respond_to(:language) }
|
17
16
|
it { should respond_to(:start_time) }
|
18
17
|
it { should respond_to(:end_time) }
|
19
18
|
it { should respond_to(:execute) }
|
20
19
|
it { should respond_to(:client) }
|
21
20
|
|
21
|
+
describe "#pattern" do
|
22
|
+
it { expect { subject.pattern }.to output(/deprecated/).to_stderr }
|
23
|
+
it { expect { subject.pattern = "test" }.to output(/deprecated/).to_stderr }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#language" do
|
27
|
+
it { expect { subject.language }.to output(/deprecated/).to_stderr }
|
28
|
+
it { expect { subject.language = "en" }.to output(/deprecated/).to_stderr }
|
29
|
+
|
30
|
+
it "should be included in the search query" do
|
31
|
+
subject.language = "no"
|
32
|
+
expect(subject.request_parameters.fetch(:q)).to include("lang:no")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
22
36
|
describe ".new" do
|
23
37
|
context "without client" do
|
24
38
|
subject { described_class.new }
|
@@ -42,49 +56,42 @@ describe Query do
|
|
42
56
|
|
43
57
|
describe "#url" do
|
44
58
|
before do
|
45
|
-
endpoint_url = "https://api.twingly.com/
|
59
|
+
endpoint_url = "https://api.twingly.com/blog/search/api/v3/search"
|
46
60
|
allow(client_double).to receive(:endpoint_url).and_return(endpoint_url)
|
47
61
|
end
|
48
62
|
|
49
63
|
let(:query) { described_class.new(client_double) }
|
50
64
|
|
51
|
-
context "
|
52
|
-
before { query.pattern = "christmas" }
|
53
|
-
subject { query.url }
|
54
|
-
|
55
|
-
it { should include("xmloutputversion=2") }
|
56
|
-
end
|
57
|
-
|
58
|
-
context "without valid pattern" do
|
65
|
+
context "without valid search query" do
|
59
66
|
it "raises an error" do
|
60
|
-
expect { query.url }.to raise_error(QueryError,
|
67
|
+
expect { query.url }.to raise_error(QueryError, /query cannot be empty/)
|
61
68
|
end
|
62
69
|
end
|
63
70
|
|
64
|
-
context "with empty
|
65
|
-
before { query.
|
71
|
+
context "with empty search query" do
|
72
|
+
before { query.search_query = "" }
|
66
73
|
|
67
74
|
it "raises an error" do
|
68
|
-
expect { query.url }.to raise_error(QueryError,
|
75
|
+
expect { query.url }.to raise_error(QueryError, /query cannot be empty/)
|
69
76
|
end
|
70
77
|
end
|
71
78
|
end
|
72
79
|
|
73
80
|
describe "#start_time=" do
|
74
81
|
before do
|
75
|
-
|
82
|
+
query.search_query = "semla"
|
76
83
|
end
|
77
84
|
|
78
85
|
context "when given time in UTC" do
|
79
86
|
before do
|
80
|
-
|
87
|
+
query.start_time = time
|
81
88
|
end
|
82
89
|
|
83
90
|
let(:timestamp) { "2016-02-09 09:01:22 UTC" }
|
84
91
|
let(:time) { Time.parse(timestamp) }
|
85
92
|
|
86
93
|
it "should not change timezone" do
|
87
|
-
expect(subject.request_parameters).to include(
|
94
|
+
expect(subject.request_parameters.fetch(:q)).to include("2016-02-09T09:01:22")
|
88
95
|
end
|
89
96
|
|
90
97
|
it "should not modify the given time object" do
|
@@ -110,7 +117,7 @@ describe Query do
|
|
110
117
|
let(:time) { Time.parse(timestamp) }
|
111
118
|
|
112
119
|
it "should convert to UTC" do
|
113
|
-
expect(subject.request_parameters).to include(
|
120
|
+
expect(subject.request_parameters.fetch(:q)).to include("2016-02-09T04:01:22")
|
114
121
|
end
|
115
122
|
|
116
123
|
it "should not modify the given time object" do
|
@@ -139,7 +146,7 @@ describe Query do
|
|
139
146
|
|
140
147
|
describe "#end_time=" do
|
141
148
|
before do
|
142
|
-
subject.
|
149
|
+
subject.search_query = "semla"
|
143
150
|
end
|
144
151
|
|
145
152
|
context "when given time in UTC" do
|
@@ -151,7 +158,7 @@ describe Query do
|
|
151
158
|
let(:time) { Time.parse(timestamp) }
|
152
159
|
|
153
160
|
it "should not change timezone" do
|
154
|
-
expect(subject.request_parameters).to include(
|
161
|
+
expect(subject.request_parameters.fetch(:q)).to include("end-date:2016-02-09T09:01:22")
|
155
162
|
end
|
156
163
|
|
157
164
|
it "should not modify the given time object" do
|
@@ -177,7 +184,7 @@ describe Query do
|
|
177
184
|
let(:time) { Time.parse(timestamp) }
|
178
185
|
|
179
186
|
it "should convert to UTC" do
|
180
|
-
expect(subject.request_parameters).to include(
|
187
|
+
expect(subject.request_parameters.fetch(:q)).to include("end-date:2016-02-09T04:01:22")
|
181
188
|
end
|
182
189
|
|
183
190
|
it "should not modify the given time object" do
|
@@ -204,25 +211,25 @@ describe Query do
|
|
204
211
|
end
|
205
212
|
end
|
206
213
|
|
207
|
-
context "with valid
|
208
|
-
before { subject.
|
214
|
+
context "with valid search query" do
|
215
|
+
before { subject.search_query = "christmas" }
|
209
216
|
|
210
217
|
it "should add language" do
|
211
218
|
subject.language = "en"
|
212
|
-
expect(subject.request_parameters).to include(
|
219
|
+
expect(subject.request_parameters.fetch(:q)).to include("lang:en")
|
213
220
|
end
|
214
221
|
|
215
222
|
it "should encode url paramters" do
|
216
223
|
subject.end_time = Time.parse("2013-12-28 09:01:22 UTC")
|
217
|
-
expect(subject.url_parameters).to include('
|
224
|
+
expect(subject.url_parameters).to include('end-date%3A2013-12-28T09%3A01%3A22')
|
218
225
|
end
|
219
226
|
end
|
220
227
|
|
221
|
-
describe "#
|
222
|
-
before { subject.
|
228
|
+
describe "#search_query" do
|
229
|
+
before { subject.search_query = "spotify" }
|
223
230
|
|
224
|
-
it "should add
|
225
|
-
expect(subject.url_parameters).to include("
|
231
|
+
it "should add q parameter" do
|
232
|
+
expect(subject.url_parameters).to include("q=spotify")
|
226
233
|
end
|
227
234
|
end
|
228
235
|
|
@@ -230,7 +237,7 @@ describe Query do
|
|
230
237
|
context "when called" do
|
231
238
|
subject do
|
232
239
|
query = described_class.new(client_double)
|
233
|
-
query.
|
240
|
+
query.search_query = 'something'
|
234
241
|
query
|
235
242
|
end
|
236
243
|
|
@@ -243,8 +250,8 @@ describe Query do
|
|
243
250
|
|
244
251
|
context "when searching for spotify" do
|
245
252
|
subject {
|
246
|
-
query = described_class.new(Client.new
|
247
|
-
query.
|
253
|
+
query = described_class.new(Client.new)
|
254
|
+
query.search_query = 'spotify page-size:10'
|
248
255
|
query.language = 'sv'
|
249
256
|
query
|
250
257
|
}
|
data/spec/result_spec.rb
CHANGED
@@ -10,6 +10,7 @@ describe Result do
|
|
10
10
|
it { should respond_to :number_of_matches_total }
|
11
11
|
it { should respond_to :seconds_elapsed }
|
12
12
|
it { should respond_to :all_results_returned? }
|
13
|
+
it { should respond_to :incomplete? }
|
13
14
|
|
14
15
|
context "before query has populated responses" do
|
15
16
|
its(:posts) { should be_empty }
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,18 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../lib/twingly/search'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/twingly/livefeed'
|
3
|
+
|
4
|
+
require 'vcr_setup'
|
5
|
+
require 'rspec/its'
|
6
|
+
|
7
|
+
ENV["TWINGLY_SEARCH_KEY"] ||= "api_key"
|
2
8
|
|
3
9
|
class Fixture
|
4
10
|
def self.get(fixture_name)
|
5
11
|
filename = "spec/fixtures/#{fixture_name}_result.xml"
|
6
12
|
File.read(filename)
|
7
13
|
end
|
14
|
+
|
15
|
+
def self.livefeed_get(fixture_name)
|
16
|
+
get("livefeed/#{fixture_name}")
|
17
|
+
end
|
8
18
|
end
|
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.summary = "Ruby API client for Twingly Search"
|
14
14
|
spec.description = "Twingly Search is a product from Twingly AB"
|
15
15
|
spec.license = 'MIT'
|
16
|
-
spec.required_ruby_version = ">= 1.
|
16
|
+
spec.required_ruby_version = ">= 2.1.0"
|
17
17
|
|
18
18
|
spec.files = `git ls-files`.split($/)
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
@@ -25,7 +25,6 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency "rspec-its", "~> 1"
|
26
26
|
spec.add_development_dependency "vcr", "~> 2.6"
|
27
27
|
spec.add_development_dependency "webmock", "~> 1.0"
|
28
|
-
spec.add_development_dependency "rake", "~>
|
29
|
-
spec.add_development_dependency "github_changelog_generator", "~> 1.8"
|
28
|
+
spec.add_development_dependency "rake", "~> 11"
|
30
29
|
spec.add_development_dependency "yard", "~> 0.8"
|
31
30
|
end
|