steam_web_api 0.0.1

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.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +15 -0
  5. data/Gemfile +6 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.html +1134 -0
  8. data/README.md +356 -0
  9. data/Rakefile +11 -0
  10. data/lib/steam_web_api/base.rb +39 -0
  11. data/lib/steam_web_api/configuration.rb +9 -0
  12. data/lib/steam_web_api/game.rb +37 -0
  13. data/lib/steam_web_api/player.rb +108 -0
  14. data/lib/steam_web_api/version.rb +3 -0
  15. data/lib/steam_web_api.rb +29 -0
  16. data/spec/fixtures/vcr/game_achievement_percentages.yml +624 -0
  17. data/spec/fixtures/vcr/game_achievement_percentages_error.yml +37 -0
  18. data/spec/fixtures/vcr/game_news_error.yml +37 -0
  19. data/spec/fixtures/vcr/game_news_success.yml +96 -0
  20. data/spec/fixtures/vcr/game_schema.yml +3538 -0
  21. data/spec/fixtures/vcr/player_achievements.yml +91 -0
  22. data/spec/fixtures/vcr/player_achievements_empty.yml +35 -0
  23. data/spec/fixtures/vcr/player_bans.yml +38 -0
  24. data/spec/fixtures/vcr/player_bans_error.yml +37 -0
  25. data/spec/fixtures/vcr/player_friends.yml +51 -0
  26. data/spec/fixtures/vcr/player_friends_error.yml +44 -0
  27. data/spec/fixtures/vcr/player_owned_games.yml +82 -0
  28. data/spec/fixtures/vcr/player_owned_games_appinfo.yml +291 -0
  29. data/spec/fixtures/vcr/player_playing_shared_game.yml +36 -0
  30. data/spec/fixtures/vcr/player_playing_shared_game_error.yml +44 -0
  31. data/spec/fixtures/vcr/player_recently_played_games.yml +48 -0
  32. data/spec/fixtures/vcr/player_recently_played_games_error.yml +44 -0
  33. data/spec/fixtures/vcr/player_recently_played_games_with_count.yml +42 -0
  34. data/spec/fixtures/vcr/player_single_bans.yml +36 -0
  35. data/spec/fixtures/vcr/player_single_bans_error.yml +37 -0
  36. data/spec/fixtures/vcr/player_single_summary.yml +43 -0
  37. data/spec/fixtures/vcr/player_single_summary_error.yml +37 -0
  38. data/spec/fixtures/vcr/player_summary.yml +51 -0
  39. data/spec/fixtures/vcr/player_summary_error.yml +37 -0
  40. data/spec/fixtures/vcr/stats_for_game.yml +321 -0
  41. data/spec/fixtures/vcr/stats_for_game_empty.yml +37 -0
  42. data/spec/spec_helper.rb +45 -0
  43. data/spec/steam_web_api/base_spec.rb +94 -0
  44. data/spec/steam_web_api/configuration_spec.rb +16 -0
  45. data/spec/steam_web_api/game_spec.rb +137 -0
  46. data/spec/steam_web_api/player_spec.rb +362 -0
  47. data/spec/steam_web_api_spec.rb +18 -0
  48. data/steam_web_api.gemspec +30 -0
  49. metadata +235 -0
@@ -0,0 +1,137 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe SteamWebApi::Game do
4
+
5
+ let(:game) { SteamWebApi::Game.new(8930) }
6
+ let(:non_existing_game) { SteamWebApi::Game.new('non-existing') }
7
+
8
+ before do
9
+ SteamWebApi.configure do |config|
10
+ config.api_key = ENV['STEAM_WEB_API_KEY']
11
+ end
12
+ end
13
+
14
+ describe '.all' do
15
+
16
+ before do
17
+ # this is a huge list, so just stub and not use vcr
18
+ stub_request(:get, 'http://api.steampowered.com/ISteamApps/GetAppList/v0002/')
19
+ .to_return(body: '
20
+ {
21
+ "applist": {
22
+ "apps": [
23
+ {
24
+ "appid": 5,
25
+ "name": "Dedicated Server"
26
+ },
27
+ {
28
+ "appid": 7,
29
+ "name": "Steam Client"
30
+ },
31
+ {
32
+ "appid": 8,
33
+ "name": "winui2"
34
+ }
35
+ ]
36
+ }
37
+ }
38
+ ')
39
+ end
40
+
41
+ it 'return lists of all games on Steam' do
42
+ data = SteamWebApi::Game.all
43
+ expect(data.success).to be true
44
+ expect(data.games.size).to eq 3
45
+ end
46
+
47
+ end
48
+
49
+ describe '#schema' do
50
+
51
+ it 'returns game schema' do
52
+ VCR.use_cassette('game_schema') do
53
+ schema = game.schema
54
+ expect(schema.name).to eq 'ValveTestApp8930'
55
+ expect(schema.version).to eq '108'
56
+ expect(schema.achievements.first).to eq(
57
+ {
58
+ "name" => "ACHIEVEMENT_WIN_WASHINGTON",
59
+ "defaultvalue" => 0,
60
+ "displayName" => "First in the Hearts of Your Countrymen",
61
+ "hidden" => 0,
62
+ "description" => "Beat the game on any difficulty setting as Washington.",
63
+ "icon" => "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/8930/4cf17a59d70b2decfd4369de8a7429e7b00f5ab8.jpg",
64
+ "icongray" => "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/8930/2ce109f9be6cb3193a385444b9b0b0ffcc7b2219.jpg"
65
+ }
66
+ )
67
+ expect(schema.stats.first).to eq(
68
+ {
69
+ "name" => "ESTEAMSTAT_TOTAL_WINS",
70
+ "defaultvalue" => 0,
71
+ "displayName" => "Total Games Won."
72
+ }
73
+ )
74
+ expect(schema.success).to be true
75
+ end
76
+ end
77
+
78
+ end
79
+
80
+ describe '#achievement_percentages' do
81
+
82
+ context 'when the response is successful' do
83
+
84
+ it 'returns list of achievements with global percentage stats' do
85
+ VCR.use_cassette('game_achievement_percentages') do
86
+ data = game.achievement_percentages
87
+ expect(data.achievements.first['name']).to eq 'ACHIEVEMENT_ANCIENT_RUIN'
88
+ expect(data.achievements.first['percent']).to eq 76.74992370605469
89
+ expect(data.success).to be true
90
+ end
91
+ end
92
+
93
+ end
94
+
95
+ context 'when the response is not successful' do
96
+
97
+ it 'returns object with attribute success equals false and empty list' do
98
+ VCR.use_cassette('game_achievement_percentages_error') do
99
+ data = non_existing_game.achievement_percentages
100
+ expect(data.success).to be false
101
+ end
102
+ end
103
+
104
+ end
105
+
106
+
107
+ end
108
+
109
+ describe '#news' do
110
+
111
+ context 'when response is successful' do
112
+
113
+ it 'returns list of news' do
114
+ VCR.use_cassette('game_news_success') do
115
+ data = game.news(count: 4)
116
+ expect(data.news_items.size).to eq 4
117
+ expect(data.app_id).to eq 8930
118
+ expect(data.success).to be true
119
+ end
120
+ end
121
+
122
+ end
123
+
124
+ context 'when response is not successful' do
125
+
126
+ it 'returns object with attribute success equals false and empty list' do
127
+ VCR.use_cassette('game_news_error') do
128
+ data = non_existing_game.news
129
+ expect(data.success).to be false
130
+ end
131
+ end
132
+
133
+ end
134
+
135
+ end
136
+
137
+ end
@@ -0,0 +1,362 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe SteamWebApi::Player do
4
+
5
+ let(:player) { SteamWebApi::Player.new('76561198046174695') }
6
+ let(:player_2) { SteamWebApi::Player.new('76561197960435530') }
7
+ let(:player_non_existing) { SteamWebApi::Player.new('aaa') }
8
+
9
+ before do
10
+ SteamWebApi.configure do |config|
11
+ config.api_key = ENV['STEAM_WEB_API_KEY']
12
+ end
13
+ end
14
+
15
+ describe '#owned_games' do
16
+
17
+ it 'returns list of games for player' do
18
+ VCR.use_cassette('player_owned_games') do
19
+ player_data = player.owned_games
20
+ expect(player_data.count).to eq 45
21
+ expect(player_data.games.first['appid']).to eq 4760
22
+ expect(player_data.games.last['playtime_forever']).to eq 0
23
+ end
24
+ end
25
+
26
+ context 'when include_appinfo config attribute was set to true' do
27
+
28
+ it 'returns additional info about game' do
29
+ VCR.use_cassette('player_owned_games_appinfo') do
30
+ player_data = player.owned_games(include_appinfo: true)
31
+ game = player_data.games[3]
32
+ expect(game['name']).to eq 'Napoleon: Total War'
33
+ expect(game['img_icon_url']).to eq 'e6263fa77b39b3b83db00d089aed8dc0aac11b20'
34
+ expect(game['img_logo_url']).to eq 'eca670df2bb35587996bfb4da6a45a8985ace139'
35
+ expect(game['has_community_visible_stats']).to be true
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ describe '#stats_for_game' do
44
+
45
+ context 'when game has stats' do
46
+
47
+ it 'returns player stats for a game' do
48
+ VCR.use_cassette('stats_for_game') do
49
+ data = player.stats_for_game(8930)
50
+ expect(data.steam_id).to eq '76561198046174695'
51
+ expect(data.game_name).to eq 'ValveTestApp8930'
52
+ expect(data.achievements.length).to eq 151
53
+ expect(data.stats.length).to eq 134
54
+ expect(data.success).to be true
55
+ end
56
+ end
57
+
58
+ end
59
+
60
+ context 'when game does not have stats' do
61
+
62
+ it 'returns object with success attribute set to false' do
63
+ VCR.use_cassette('stats_for_game_empty') do
64
+ data = player.stats_for_game(4760)
65
+ expect(data.success).to be false
66
+ end
67
+ end
68
+
69
+ end
70
+
71
+
72
+ end
73
+
74
+ describe '#achievements' do
75
+
76
+ context 'when game has stats' do
77
+
78
+ it 'returns list of player achievements for game' do
79
+ VCR.use_cassette('player_achievements') do
80
+ data = player.achievements(232050)
81
+ expect(data.steam_id).to eq '76561198046174695'
82
+ expect(data.game_name).to eq 'Eador. Masters of the Broken World'
83
+ expect(data.achievements.size).to eq 55
84
+ expect(data.success).to be true
85
+ end
86
+ end
87
+
88
+ end
89
+
90
+ context 'when game does not have stats' do
91
+
92
+ it 'returns object with success attribute set to false' do
93
+ VCR.use_cassette('player_achievements_empty') do
94
+ data = player.achievements(4760)
95
+ expect(data.success).to eq false
96
+ end
97
+ end
98
+
99
+ end
100
+
101
+
102
+ end
103
+
104
+ describe '.summary' do
105
+
106
+ context 'when response is successful' do
107
+
108
+ it 'returns profile information for players' do
109
+ VCR.use_cassette('player_summary') do
110
+ data = SteamWebApi::Player.summary(player.steam_id, player_2.steam_id)
111
+ first_player = data.players.first
112
+ second_player = data.players[1]
113
+ expect(first_player['steamid']).to eq '76561198046174695'
114
+ expect(first_player['personaname']).to eq 'gravin79'
115
+ expect(first_player['realname']).to eq 'GTomasz'
116
+ expect(second_player['steamid']).to eq '76561197960435530'
117
+ expect(second_player['realname']).to eq 'Robin Walker'
118
+ expect(second_player['personaname']).to eq 'Robin'
119
+ end
120
+ end
121
+
122
+ end
123
+
124
+ context 'when response is not successful' do
125
+
126
+ before do
127
+ SteamWebApi.configure do |config|
128
+ config.api_key = 'invalid'
129
+ end
130
+ end
131
+
132
+ it 'returns object with attribute success equals false and empty list' do
133
+ VCR.use_cassette('player_summary_error') do
134
+ data = SteamWebApi::Player.summary(player.steam_id, player_2.steam_id)
135
+ expect(data.success).to be false
136
+ end
137
+ end
138
+
139
+ end
140
+
141
+ end
142
+
143
+ describe '#summary' do
144
+
145
+ context 'when response is successful' do
146
+
147
+ it 'returns profile information for single player' do
148
+ VCR.use_cassette('player_single_summary') do
149
+ data = player.summary
150
+ expect(data.profile['steamid']).to eq '76561198046174695'
151
+ expect(data.profile['personaname']).to eq 'gravin79'
152
+ expect(data.profile['realname']).to eq 'GTomasz'
153
+ end
154
+ end
155
+
156
+ end
157
+
158
+ context 'when response is not successful' do
159
+
160
+ before do
161
+ SteamWebApi.configure do |config|
162
+ config.api_key = 'invalid'
163
+ end
164
+ end
165
+
166
+ it 'returns object with empty profile hash and attribute success equals false' do
167
+ VCR.use_cassette('player_single_summary_error') do
168
+ data = player.summary
169
+ expect(data.success).to be false
170
+ end
171
+ end
172
+
173
+ end
174
+
175
+ end
176
+
177
+ describe '#friends' do
178
+
179
+ context 'when response is successful' do
180
+
181
+ it 'returns list of friends' do
182
+ VCR.use_cassette('player_friends') do
183
+ data = player.friends
184
+ expect(data.success).to be true
185
+ expect(data.friends).not_to be_empty
186
+
187
+ friend = data.friends.first
188
+ expect(friend['steamid']).to eq '76561197968589933'
189
+ expect(friend['relationship']).to eq 'friend'
190
+ expect(friend['friend_since']).to eq 1397319937
191
+ end
192
+ end
193
+
194
+ end
195
+
196
+ context 'when response is not successful' do
197
+
198
+ it 'returns empty list of friends and attribute success equals false' do
199
+ VCR.use_cassette('player_friends_error') do
200
+ data = player_non_existing.friends
201
+ expect(data.success).to be false
202
+ end
203
+ end
204
+
205
+ end
206
+
207
+ end
208
+
209
+ describe '#recently_played_games' do
210
+
211
+ context 'when response is successful' do
212
+
213
+ it 'returns list of recently played games' do
214
+ VCR.use_cassette('player_recently_played_games') do
215
+ data = player.recently_played_games
216
+ expect(data.games).not_to be_empty
217
+ expect(data.success).to be true
218
+ expect(data.total_count).to eq 4
219
+
220
+ game = data.games.first
221
+ expect(game['appid']).to eq 208400
222
+ expect(game['name']).to eq 'Avernum: Escape From the Pit'
223
+ expect(game['playtime_2weeks']).to eq 2485
224
+ expect(game['playtime_forever']).to eq 3617
225
+ expect(game['img_icon_url']).to eq '6b931adb3c4af3fc2498dacafc3a104f03682d1a'
226
+ expect(game['img_logo_url']).to eq '63992c2df9af7a83c8a4a173675af6e7554164ec'
227
+ end
228
+ end
229
+
230
+ context 'when count option is given' do
231
+
232
+ it 'returns limited list of games' do
233
+ VCR.use_cassette('player_recently_played_games_with_count') do
234
+ data = player.recently_played_games(2)
235
+ expect(data.games.size).to eq 2
236
+ end
237
+ end
238
+
239
+ end
240
+
241
+ end
242
+
243
+ context 'when response is not successful' do
244
+
245
+ it 'returns empty list of games and attribute success equals false' do
246
+ VCR.use_cassette('player_recently_played_games_error') do
247
+ data = player_non_existing.recently_played_games
248
+ expect(data.success).to be false
249
+ end
250
+ end
251
+
252
+ end
253
+
254
+ end
255
+
256
+ describe '#playing_shared_game' do
257
+
258
+ context 'when response is successful' do
259
+
260
+ it 'returns the original owner\'s SteamID' do
261
+ VCR.use_cassette('player_playing_shared_game') do
262
+ data = player.playing_shared_game(240)
263
+ expect(data.lender_steamid).to eq '0'
264
+ expect(data.success).to be true
265
+ end
266
+ end
267
+
268
+ end
269
+
270
+ context 'when response is not successful' do
271
+
272
+ it 'returns object with success attribute equals false' do
273
+ VCR.use_cassette('player_playing_shared_game_error') do
274
+ data = player_non_existing.playing_shared_game(240)
275
+ expect(data.success).to be false
276
+ end
277
+ end
278
+
279
+ end
280
+
281
+ end
282
+
283
+ describe '.bans' do
284
+
285
+ context 'when response is successful' do
286
+
287
+ it 'returns info about users bans' do
288
+ VCR.use_cassette('player_bans') do
289
+ data = SteamWebApi::Player.bans(player.steam_id, player_2.steam_id)
290
+ expect(data.players.size).to eq 2
291
+ expect(data.success).to be true
292
+
293
+ first_player = data.players.first
294
+ expect(first_player['SteamId']).to eq '76561198046174695'
295
+ expect(first_player['CommunityBanned']).to be false
296
+ expect(first_player['VACBanned']).to be false
297
+ expect(first_player['NumberOfVACBans']).to eq 0
298
+ expect(first_player['DaysSinceLastBan']).to eq 0
299
+ expect(first_player['EconomyBan']).to eq "none"
300
+ end
301
+ end
302
+
303
+ end
304
+
305
+ context 'when response is not successful' do
306
+
307
+ before do
308
+ SteamWebApi.configure do |config|
309
+ config.api_key = 'invalid'
310
+ end
311
+ end
312
+
313
+ it 'returns object with empty players list and attribute success equals false' do
314
+ VCR.use_cassette('player_bans_error') do
315
+ data = SteamWebApi::Player.bans(player.steam_id, player_2.steam_id)
316
+ expect(data.success).to be false
317
+ end
318
+ end
319
+
320
+ end
321
+
322
+ end
323
+
324
+ describe '#bans' do
325
+
326
+ context 'when response is successful' do
327
+
328
+ it 'returns info ablout single user bans' do
329
+ VCR.use_cassette('player_single_bans') do
330
+ data = player.bans
331
+ expect(data.success).to be true
332
+ expect(data.bans['SteamId']).to eq '76561198046174695'
333
+ expect(data.bans['CommunityBanned']).to be false
334
+ expect(data.bans['VACBanned']).to be false
335
+ expect(data.bans['NumberOfVACBans']).to eq 0
336
+ expect(data.bans['DaysSinceLastBan']).to eq 0
337
+ expect(data.bans['EconomyBan']).to eq 'none'
338
+ end
339
+ end
340
+
341
+ end
342
+
343
+ context 'when response is not successful' do
344
+
345
+ before do
346
+ SteamWebApi.configure do |config|
347
+ config.api_key = 'invalid'
348
+ end
349
+ end
350
+
351
+ it 'returns object with empty bans and attribute success equals false' do
352
+ VCR.use_cassette('player_single_bans_error') do
353
+ data = player.bans
354
+ expect(data.success).to be false
355
+ end
356
+ end
357
+
358
+ end
359
+
360
+ end
361
+
362
+ end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe SteamWebApi do
4
+
5
+ describe '.configure' do
6
+
7
+ it 'sets api key for application' do
8
+ SteamWebApi.configure do |config|
9
+ config.api_key = 'some key'
10
+ end
11
+
12
+ expect(SteamWebApi.config.api_key).to eq 'some key'
13
+ end
14
+
15
+ end
16
+
17
+
18
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'steam_web_api/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "steam_web_api"
8
+ spec.version = SteamWebApi::VERSION
9
+ spec.authors = ["Olga Grabek"]
10
+ spec.email = ["olga.grabek@gmail.com"]
11
+ spec.summary = %q{This is a gem that makes trivial interacting with the Steam Web API}
12
+ spec.description = %q{This is a gem that makes trivial interacting with the Steam Web API}
13
+ spec.homepage = "https://github.com/Olgagr/steam-web-api"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec", "~> 3.1"
24
+ spec.add_development_dependency "byebug", "~> 3.5"
25
+ spec.add_development_dependency "webmock", "~> 1.20"
26
+ spec.add_development_dependency "vcr", "~> 2.9"
27
+ spec.add_development_dependency "dotenv", "~> 1.0"
28
+
29
+ spec.add_dependency "faraday", "~> 0.9"
30
+ end