tf2r 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 53baabcfbcb2844a14bd53e3e37a7d5d82d80894
4
- data.tar.gz: 0085e3ec2ef5d5f51f1b5172cff907f5752a199f
3
+ metadata.gz: 4c5bd71115ed3cebd26737dc98ab7dcc23355253
4
+ data.tar.gz: 1eef157620f392d7f5247cc262eef47a02451fcd
5
5
  SHA512:
6
- metadata.gz: 380c2b12de5cf17a5152f32aca08d0a7fc3962339abcb318a8e6669bcdb370f283c155a3dd6ad916fe888a8910415c1f8838fe76cb41b750b55410b85540987f
7
- data.tar.gz: 0b3e807888dff2cff5501a132418d8bfefb6b19745b0647736ee64d3eaa366317b2ec476c20692908745f90d20bb0f9426b47bb5b60063a75e41d13139e6073b
6
+ metadata.gz: dab7f6734488422f90ca4defcd8af4f071eb6778a36f90551721b5a778bee9bb9e96f3b41d03f7126b42574b09274251efbcc3a7510277ceed2f95c339282d7b
7
+ data.tar.gz: e3755809104357d54bdfec5bc792565914d1e9c6ab230d0f349dcfb3cb54f51da60e4101b6c0820ad8abbebeeabe420bc6c5e2d68e2742660283046df7ad8c95
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tf2r (0.1.1)
4
+ tf2r (0.2.0)
5
5
  mechanize (~> 2.7)
6
6
 
7
7
  GEM
@@ -2,6 +2,7 @@ require 'mechanize'
2
2
  require 'pry'
3
3
 
4
4
  require 'tf2r/api'
5
+ require 'tf2r/raffle'
5
6
  require 'tf2r/scraper'
6
7
  require 'tf2r/version'
7
8
 
@@ -1,13 +1,15 @@
1
1
  module TF2R
2
+ # This class handles interaction with TF2R's "API", which is really just an
3
+ # open endpoint located at http://tf2r.com/job.php, in use all over the site
4
+ # to have dynamically updating pages.
2
5
  class API
3
6
  HOST = 'http://tf2r.com'
4
7
  ENDPOINT = '/job.php'
5
8
 
6
- def self.get_raffle_info(link_snippet)
9
+ def self.raffle_info(link_snippet)
7
10
  params = {checkraffle: true, rid: link_snippet[1..-1],
8
11
  lastentrys: 0, lastchat: 0}
9
- response = request(params).body
10
- JSON.parse(response)['message']
12
+ request(params)['message']
11
13
  end
12
14
 
13
15
  private
@@ -20,7 +22,8 @@ module TF2R
20
22
  request = Net::HTTP::Post.new(ENDPOINT)
21
23
  request.body = URI.encode_www_form(params)
22
24
 
23
- response = http.request(request)
25
+ response = http.request(request).body
26
+ JSON.parse(response)
24
27
  end
25
28
  end
26
29
  end
@@ -0,0 +1,64 @@
1
+ module TF2R
2
+ # This class provides a simple wrapper around grabbing information for a
3
+ # raffle from the Scraper and API.
4
+ # TODO: make this an actuall wrapper instead of accepting pre-made info.
5
+ class Raffle
6
+ attr_reader :link_snippet, :api_info, :scraper_info
7
+
8
+ def initialize(link_snippet, api_info, scraper_info)
9
+ @link_snippet = link_snippet
10
+ @api_info = api_info
11
+ @scraper_info = scraper_info
12
+ end
13
+
14
+ def info
15
+ @info ||= {link_snippet: @link_snippet, title: title,
16
+ description: description, start_time: start_time,
17
+ end_time: end_time, win_chance: win_chance,
18
+ current_entries: current_entries, max_entries: max_entries,
19
+ is_done: is_done}
20
+ end
21
+
22
+ def creator
23
+ @scraper_info[1]
24
+ end
25
+
26
+ def participants
27
+ @api_info['newentry']
28
+ end
29
+
30
+ private
31
+
32
+ def title
33
+ @scraper_info[0][:title]
34
+ end
35
+
36
+ def description
37
+ @scraper_info[0][:description]
38
+ end
39
+
40
+ def start_time
41
+ @scraper_info[0][:start_time]
42
+ end
43
+
44
+ def end_time
45
+ @scraper_info[0][:end_time]
46
+ end
47
+
48
+ def current_entries
49
+ @api_info['cur_entry']
50
+ end
51
+
52
+ def max_entries
53
+ @api_info['max_entry']
54
+ end
55
+
56
+ def win_chance
57
+ (@api_info['wc'] / 100.0).round(5)
58
+ end
59
+
60
+ def is_done
61
+ @api_info['ended']
62
+ end
63
+ end
64
+ end
@@ -1,6 +1,7 @@
1
1
  module TF2R
2
2
  # @author Justin Kim
3
3
  class Scraper
4
+ class InvalidUserPage < StandardError; end
4
5
  # Creates a Scraper. Pass values using the options hash.
5
6
  #
6
7
  # :user_agent a String used for the User-Agent header
@@ -78,8 +79,7 @@ module TF2R
78
79
  # s.scrape_raffle_for_creator(p) #=>
79
80
  # {:steam_id=>76561198061719848,
80
81
  # :username=>"Yulli",
81
- # :avatar_link=>
82
- # "http://media.steampowered.com/steamcommunity/public/images/avatars/bc/bc9dc4302d23f2e2f37f59c59f29c27dbc8cade6_full.jpg",
82
+ # :avatar_link=>"http://media.steampowered.com/steamcommunity/public/images/avatars/bc/bc9dc4302d23f2e2f37f59c59f29c27dbc8cade6_full.jpg",
83
83
  # :posrep=>11458,
84
84
  # :negrep=>0,
85
85
  # :colour=>"70b01b"}
@@ -106,13 +106,16 @@ module TF2R
106
106
  negrep = /(\d+)/.match(infos.css('.downvb').text)[1].to_i
107
107
 
108
108
  # The creator's username colour. Corresponds to rank.
109
- colour = extract_hex_colour(user_anchor.attribute('style').to_s)
109
+ colour = extract_colour(user_anchor.attribute('style').to_s)
110
110
 
111
111
  {steam_id: steam_id, username: username, avatar_link: avatar_link,
112
112
  posrep: posrep, negrep: negrep, colour: colour}
113
113
  end
114
114
 
115
- # Scrapes a raffle page for information about the raffle.
115
+ # Scrapes a raffle page for some information about the raffle.
116
+ #
117
+ # The information is incomplete. This should be used in conjunction with
118
+ # the API as part of TF2R::Raffle.
116
119
  #
117
120
  # @example
118
121
  # p = s.fetch('http://tf2r.com/kstzcbd.html')
@@ -121,23 +124,15 @@ module TF2R
121
124
  # :title=>"Just one refined [1 hour]",
122
125
  # :description=>"Plain and simple.",
123
126
  # :start_time=>2012-10-29 09:51:45 -0400,
124
- # :end_time=>2012-10-29 09:53:01 -0400,
125
- # :win_chance=>0.1,
126
- # :current_entries=>10,
127
- # :max_entries=>10,
128
- # :is_done=>true}
127
+ # :end_time=>2012-10-29 09:53:01 -0400}
129
128
  #
130
129
  # @param page [Mechanize::Page] the raffle page.
131
- # @return [Hash] a representation of the raffle.
130
+ # @return [Hash] a partial representation of the raffle.
132
131
  # * :link_snippet (+String+) — the "raffle id" in the URL.
133
132
  # * :title (+String+) — the raffle's title.
134
133
  # * :description (+String+) — the raffle's "message".
135
134
  # * :start_time (+Time+) — the creation time of the raffle.
136
135
  # * :end_time (+Time+) — the projects/observed end time for the raffle.
137
- # * :win_chance (+Float+) — a participant's chance to win the raffle.
138
- # * :current_entries (+Fixnum+) — the current number of participants.
139
- # * :max_entries (+Fixnum+) — the maximum number of particpants allowed.
140
- # * :is_done (+Boolean+) — whether new users can enter the raffle.
141
136
  def scrape_raffle_for_raffle(page)
142
137
  # Reag classed some things "raffle_infomation". That's spelled right.
143
138
  infos = page.parser.css('.raffle_infomation')
@@ -146,37 +141,19 @@ module TF2R
146
141
  raffle_tds = infos[3].css('td')
147
142
 
148
143
  # 'kabc123' for http://tf2r.com/kabc123.html'
149
- link_snippet = /\/(k.+)\.html/.match(page.uri.path)[1]
150
- title = infos[0].text.split('Title: ')[-1]
144
+ link_snippet = extract_link_snippet(page.uri.path)
145
+ title = extract_title(infos[0].text)
151
146
  description = raffle_tds[1].text
152
147
 
153
148
  # This doesn't work right now, because Miz just displays "10%" in the
154
149
  # page HTML and updates it with JS after a call to the API.
155
150
  # win_chance = /(.+)%/.match(infos.css('#winc').text)[1].to_f / 100
156
151
 
157
- # This is actually horrible. Scraper should not know about API.
158
- win_chance = get_win_chance(link_snippet)
159
-
160
- start_time = raffle_tds[9].attribute('data-rstart-unix').to_s
161
- start_time = DateTime.strptime(start_time, '%s').to_time
162
- end_time = raffle_tds[11].attribute('data-rsend-unix').to_s
163
- end_time= DateTime.strptime(end_time, '%s').to_time
164
-
165
- entries = /(\d+)\/(\d+)/.match(infos.css('#entry').text)
166
- current_entries = entries[1].to_i
167
- max_entries = entries[2].to_i
168
-
169
- text = page.parser.css('.welcome_font').css('div')[3..-1].text
170
- is_done = end_time <= Time.now ||
171
- current_entries == max_entries ||
172
- (page.parser.css('.welcome_font').size > 5 &&
173
- page.parser.css('.welcome_font')[5..-1].text.downcase.include?('winner')
174
- )
152
+ start_time = extract_start_time(raffle_tds[9])
153
+ end_time = extract_end_time(raffle_tds[11])
175
154
 
176
155
  {link_snippet: link_snippet, title: title, description: description,
177
- start_time: start_time, end_time: end_time, win_chance: win_chance,
178
- current_entries: current_entries, max_entries: max_entries,
179
- is_done: is_done}
156
+ start_time: start_time, end_time: end_time}
180
157
  end
181
158
 
182
159
  # Scrapes a raffle page for all the participants.
@@ -196,7 +173,7 @@ module TF2R
196
173
  user_anchor = participant.children[1]
197
174
  steam_id = extract_steam_id(user_anchor.to_s)
198
175
  username = participant.text
199
- colour = extract_hex_colour(user_anchor.children[0].attribute('style'))
176
+ colour = extract_colour(user_anchor.children[0].attribute('style'))
200
177
 
201
178
  participants << {steam_id: steam_id, username: username, colour: colour}
202
179
  end
@@ -211,8 +188,7 @@ module TF2R
211
188
  # s.scrape_user(p) #=>
212
189
  # {:steam_id=>76561198061719848,
213
190
  # :username=>"Yulli",
214
- # :avatar_link=>
215
- # "http://media.steampowered.com/steamcommunity/public/images/avatars/bc/bc9dc4302d23f2e2f37f59c59f29c27dbc8cade6_full.jpg",
191
+ # :avatar_link=>"http://media.steampowered.com/steamcommunity/public/images/avatars/bc/bc9dc4302d23f2e2f37f59c59f29c27dbc8cade6_full.jpg",
216
192
  # :posrep=>11459,
217
193
  # :negrep=>0,
218
194
  # :colour=>"70b01b"}
@@ -227,21 +203,20 @@ module TF2R
227
203
  # * :colour (+String+) — hex colour code of the user's username.
228
204
  def scrape_user(user_page)
229
205
  if user_page.parser.css('.profile_info').empty?
230
- # TODO: Should raise an exception here
231
- steam_id = extract_steam_id(user_page.uri.to_s)
232
- username, avatar_link, posrep, negrep, colour = nil, nil, nil, nil, nil
206
+ raise InvalidUserPage, 'The given page does not correspond to any user.'
233
207
  else
234
208
  infos = user_page.parser.css('.raffle_infomation') #sic
235
- user_anchor = infos[2].css('a')[0]
209
+ avatar_anchor = infos[0].css('img')[0]
210
+ user_anchor = infos[1].css('a')[0]
236
211
 
237
212
  steam_id = extract_steam_id(user_page.uri.to_s)
238
213
  username = /TF2R Item Raffles - (.+)/.match(user_page.title)[1]
239
- avatar_link = infos[0].css('img')[0].attribute('src').to_s
214
+ avatar_link = avatar_anchor.attribute('src').to_s
240
215
 
241
216
  posrep = infos.css('.upvb').text.to_i
242
217
  negrep = infos.css('.downvb').text.to_i
243
218
 
244
- colour = extract_hex_colour(infos[1].css('a')[0].attribute('style').to_s)
219
+ colour = extract_colour(user_anchor.attribute('style').to_s)
245
220
  end
246
221
 
247
222
  {steam_id: steam_id, username: username, avatar_link: avatar_link,
@@ -255,9 +230,8 @@ module TF2R
255
230
  # @example
256
231
  # p = s.fetch('http://tf2r.com/info.html')
257
232
  # s.scrape_user(p) #=>
258
- # [{:colour=>"ebe2ca", :name=>"User", :description=>"Every new or existing user has this rank."},
259
- # {:colour=>"ffd700", :name=>"Trusted", :description=>"This rank can only be assigned on staff approval. Granted for 1,000~ Rep."},
260
- # ...]
233
+ # [{:colour=>"ebe2ca", :name=>"User",
234
+ # :description=>"Every new or existing user has this rank."}, ...]
261
235
  #
262
236
  # @param info_page [Mechanize::Page] the info page.
263
237
  # @return [Array] contains Hashes representing each of the ranks.
@@ -280,7 +254,7 @@ module TF2R
280
254
  def extract_rank(div)
281
255
  name = div.children[0].text
282
256
  description = div.children[2].text
283
- colour = extract_hex_colour(div.children[0].attribute('style').to_s)
257
+ colour = extract_colour(div.children[0].attribute('style').to_s)
284
258
 
285
259
  {name: name, description: description, colour: colour}
286
260
  end
@@ -297,26 +271,47 @@ module TF2R
297
271
  /http:\/\/tf2r.com\/user\/(\d+)\.html/.match(href)[1].to_i
298
272
  end
299
273
 
300
- # Extracts a lowercase hex colour code.
274
+ # Extracts a hex colour code.
301
275
  #
302
276
  # @example
303
- # extract_hex_colour('color:#70B01B;') #=> '70b01b'
277
+ # extract_colour('color:#70B01B;') #=> '70b01b'
304
278
  #
305
279
  # @param href [String] Any string containing a hex colour code.
306
- # @return [String] The lowercase hex colour code.
307
- def extract_hex_colour(str)
280
+ # @return [String] The hex colour code, downcased.
281
+ def extract_colour(str)
308
282
  /#(\w+)\s*;/.match(str)[1].downcase
309
283
  end
310
284
 
311
- # Gets the win_chance for a raffle as reported by job.php.
285
+ # Extracts the Time from any String.
312
286
  #
313
- # @example
314
- # get_win_chance('kabc123') => 0.05
287
+ # @param [String] a String containing a unix timestamp value.
288
+ # @return [Time] the time represented by the unix timestamp.
289
+ def extract_time(str)
290
+ DateTime.strptime(str, '%s').to_time
291
+ end
292
+
293
+ def extract_start_time(td)
294
+ extract_time(td.attribute('data-rstart-unix').to_s)
295
+ end
296
+
297
+ def extract_end_time(td)
298
+ extract_time(td.attribute('data-rsend-unix').to_s)
299
+ end
300
+
301
+ # Extract the link_snippet from a path or link.
302
+ #
303
+ # @param [String] any raffle link or path.
304
+ # @return [String] the raffle's link snippet.
305
+ def extract_link_snippet(text)
306
+ /\/(k.+)\.html/.match(text)[1]
307
+ end
308
+
309
+ # Extract the title from a raffle title string.
315
310
  #
316
- # @param link_snippet [String] the link snippet of the raffle.
317
- # @return [Float] the win chance.
318
- def get_win_chance(link_snippet)
319
- TF2R::API.get_raffle_info(link_snippet)['wc'] / 100.0
311
+ # @param [String] the raffle title string.
312
+ # @return [String] the actual raffle title.
313
+ def extract_title(text)
314
+ text.split('Title: ')[-1]
320
315
  end
321
316
  end
322
317
  end
@@ -1,3 +1,3 @@
1
1
  module TF2R
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe TF2R::Raffle do
4
+ let(:scraper) { TF2R::Scraper.new({}) }
5
+ let(:scraper_info) {
6
+ VCR.use_cassette('kstzcbd') do
7
+ scraper.scrape_raffle(scraper.fetch('http://tf2r.com/kstzcbd.html'))
8
+ end
9
+ }
10
+ let(:raffle) {
11
+ TF2R::Raffle.new('kstzcbd', TF2R::API.raffle_info('kstzcbd'), scraper_info)
12
+ }
13
+
14
+ describe '#info' do
15
+ let(:result) { raffle.info }
16
+
17
+ it 'returns correct values' do
18
+ expect(result[:link_snippet]).to eql('kstzcbd')
19
+ expect(result[:title]).to eql('Just one refined [1 hour]')
20
+ expect(result[:description]).to eql('Plain and simple.')
21
+ expect(result[:start_time]).to eql(
22
+ Time.new(2012, 10, 29, 14, 51, 45, '+01:00')
23
+ )
24
+ expect(result[:end_time]).to eql(
25
+ Time.new(2012, 10, 29, 14, 53, 01, '+01:00')
26
+ )
27
+ expect(result[:win_chance]).to eql(0.1)
28
+ # TODO: use a raffle where current_entries != max_entries
29
+ expect(result[:current_entries]).to eql(10)
30
+ expect(result[:max_entries]).to eql(10)
31
+ expect(result[:is_done]).to eql(true)
32
+ end
33
+ end
34
+ end
@@ -2,6 +2,11 @@ require 'spec_helper'
2
2
 
3
3
  describe TF2R::Scraper do
4
4
  let(:scraper) { TF2R::Scraper.new({}) }
5
+ let(:raffle_page) {
6
+ VCR.use_cassette('raffle_kstzcbd') do
7
+ scraper.fetch('http://tf2r.com/kstzcbd.html')
8
+ end
9
+ }
5
10
 
6
11
  it 'is instantiable' do
7
12
  expect{
@@ -60,26 +65,25 @@ describe TF2R::Scraper do
60
65
  end
61
66
 
62
67
  describe '#scrape_raffle' do
63
- let(:page) {
64
- VCR.use_cassette('scrape_raffle_for_raffle') do
65
- scraper.fetch('http://tf2r.com/kstzcbd.html')
66
- end
67
- }
68
- let(:result) { scraper.scrape_raffle(page) }
68
+ let(:result) { scraper.scrape_raffle(raffle_page) }
69
69
 
70
70
  it 'returns an Array' do
71
71
  expect(result).to be_an(Array)
72
72
  end
73
73
 
74
74
  it 'returns the same as its child methods' do
75
- expect(result[0]).to eql(scraper.scrape_raffle_for_raffle(page))
76
- expect(result[1]).to eql(scraper.scrape_raffle_for_creator(page))
77
- expect(result[2]).to eql(scraper.scrape_raffle_for_participants(page))
75
+ expect(result[0]).to eql(scraper.scrape_raffle_for_raffle(raffle_page))
76
+ expect(result[1]).to eql(scraper.scrape_raffle_for_creator(raffle_page))
77
+ expect(result[2]).to eql(scraper.scrape_raffle_for_participants(raffle_page))
78
78
  end
79
79
  end
80
80
 
81
81
  describe '#scrape_main_page' do
82
- let(:result) { scraper.scrape_main_page }
82
+ let(:result) {
83
+ VCR.use_cassette('raffle_kstzcbd') do
84
+ scraper.scrape_main_page
85
+ end
86
+ }
83
87
 
84
88
  before(:each) do
85
89
  raffles_file = File.new(File.join(File.dirname(__FILE__), 'raffles.html'))
@@ -90,11 +94,9 @@ describe TF2R::Scraper do
90
94
  end
91
95
 
92
96
  it 'returns an Array of Strings' do
93
- VCR.use_cassette('raffles') do
94
- expect(result).to be_an(Array)
95
- expect(result[0]).to be_a(String)
96
- expect(result[-1]).to be_a(String)
97
- end
97
+ expect(result).to be_an(Array)
98
+ expect(result[0]).to be_a(String)
99
+ expect(result[-1]).to be_a(String)
98
100
  end
99
101
 
100
102
  it 'returns raffle links in reverse chronological order' do
@@ -105,12 +107,7 @@ describe TF2R::Scraper do
105
107
  end
106
108
 
107
109
  describe '#scrape_raffle_for_creator' do
108
- let(:page) {
109
- VCR.use_cassette('scrape_raffle_for_creator') do
110
- scraper.fetch('http://tf2r.com/kstzcbd.html')
111
- end
112
- }
113
- let(:result) { scraper.scrape_raffle_for_creator(page) }
110
+ let(:result) { scraper.scrape_raffle_for_creator(raffle_page) }
114
111
 
115
112
  it 'returns a Hash representation of a user' do
116
113
  expect(result).to be_a(Hash)
@@ -138,12 +135,7 @@ describe TF2R::Scraper do
138
135
 
139
136
 
140
137
  describe '#scrape_raffle_for_raffle' do
141
- let(:page) {
142
- VCR.use_cassette('scrape_raffle_for_raffle') do
143
- scraper.fetch('http://tf2r.com/kstzcbd.html')
144
- end
145
- }
146
- let(:result) { scraper.scrape_raffle_for_raffle(page) }
138
+ let(:result) { scraper.scrape_raffle_for_raffle(raffle_page) }
147
139
 
148
140
  it 'returns a Hash representation of a raffle' do
149
141
  expect(result).to be_a(Hash)
@@ -153,19 +145,18 @@ describe TF2R::Scraper do
153
145
  expect(result[:link_snippet]).to eql('kstzcbd')
154
146
  expect(result[:title]).to eql('Just one refined [1 hour]')
155
147
  expect(result[:description]).to eql('Plain and simple.')
156
- expect(result[:start_time]).to eql(DateTime.strptime('Mon, 29 Oct 2012 14:51:45 +0100', '%a, %d %b %Y %H:%M:%S %z').to_time)
157
- expect(result[:end_time]).to eql(DateTime.strptime('Mon, 29 Oct 2012 14:53:01 +0100', '%a, %d %b %Y %H:%M:%S %z').to_time)
158
- expect(result[:win_chance]).to eql(0.1)
159
- # TODO: use a raffle where current_entries != max_entries
160
- expect(result[:current_entries]).to eql(10)
161
- expect(result[:max_entries]).to eql(10)
162
- expect(result[:is_done]).to eql(true)
148
+ expect(result[:start_time]).to eql(
149
+ Time.new(2012, 10, 29, 14, 51, 45, '+01:00')
150
+ )
151
+ expect(result[:end_time]).to eql(
152
+ Time.new(2012, 10, 29, 14, 53, 01, '+01:00')
153
+ )
163
154
  end
164
155
  end
165
156
 
166
157
  describe '#scrape_raffle_for_participants' do
167
158
  let(:page) {
168
- VCR.use_cassette('scrape_raffle_for_participants') do
159
+ VCR.use_cassette('raffle_kstzcbd_full') do
169
160
  scraper.fetch('http://tf2r.com/kstzcbd.html?full')
170
161
  end
171
162
  }
@@ -190,19 +181,19 @@ describe TF2R::Scraper do
190
181
 
191
182
  describe '#scrape_user' do
192
183
  context 'a real user page is given' do
193
- let(:page) {
194
- VCR.use_cassette('scrape_user_real') do
184
+ let(:user_page) {
185
+ VCR.use_cassette('user_76561198061719848') do
195
186
  scraper.fetch('http://tf2r.com/user/76561198061719848.html')
196
187
  end
197
188
  }
198
- let(:result) { scraper.scrape_user(page) }
189
+ let(:result) { scraper.scrape_user(user_page) }
199
190
 
200
191
  it 'returns a Hash' do
201
192
  expect(result).to be_a(Hash)
202
193
  end
203
194
 
204
- # This spec is also brittle. It relies on my user account, which is updated
205
- # constantly.
195
+ # This spec is also brittle. It relies on my TF2R user account, which is
196
+ # updated constantly.
206
197
  # TODO: use a stagnant alt account
207
198
  it 'returns correct values' do
208
199
  expect(result[:steam_id]).to eql(76561198061719848)
@@ -215,38 +206,28 @@ describe TF2R::Scraper do
215
206
  end
216
207
 
217
208
  context 'a user page for a non-existent user is given' do
218
- let(:page) {
219
- VCR.use_cassette('scrape_user_not_found') do
209
+ let(:user_page) {
210
+ VCR.use_cassette('user_fake') do
220
211
  scraper.fetch('http://tf2r.com/user/123456.html')
221
212
  end
222
213
  }
223
- let(:result) { scraper.scrape_user(page) }
224
- it 'returns a Hash' do
225
- expect(result).to be_a(Hash)
226
- end
227
214
 
228
- it 'returns the attempted Steam ID' do
229
- expect(result[:steam_id]).to eql(123456)
230
- end
231
-
232
- it 'returns mostly nil values' do
233
- expect(result[:username]).to be_nil
234
- expect(result[:avatar_link]).to be_nil
235
- expect(result[:posrep]).to be_nil
236
- expect(result[:negrep]).to be_nil
237
- expect(result[:colour]).to be_nil
215
+ it 'raises InvalidUserPage' do
216
+ expect {
217
+ scraper.scrape_user(user_page)
218
+ }.to raise_error(TF2R::Scraper::InvalidUserPage)
238
219
  end
239
220
  end
240
221
  end
241
222
 
242
223
 
243
224
  describe '#scrape_ranks' do
244
- let(:page) {
245
- VCR.use_cassette('scrape_ranks') do
225
+ let(:info_page) {
226
+ VCR.use_cassette('info_page') do
246
227
  scraper.fetch('http://tf2r.com/info.html')
247
228
  end
248
229
  }
249
- let(:result) { scraper.scrape_ranks(page) }
230
+ let(:result) { scraper.scrape_ranks(info_page) }
250
231
 
251
232
  it 'returns an Array of Hashes' do
252
233
  expect(result).to be_an(Array)
@@ -256,7 +237,9 @@ describe TF2R::Scraper do
256
237
 
257
238
  it 'returns correct values' do
258
239
  expect(result[0][:name]).to eql('User')
259
- expect(result[0][:description]).to eql('Every new or existing user has this rank.')
240
+ expect(result[0][:description]).to eql(
241
+ 'Every new or existing user has this rank.'
242
+ )
260
243
  expect(result[0][:colour]).to eql('ebe2ca')
261
244
 
262
245
  # This is brittle. Every time a new rank is added, this fails.