stew 0.5.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.
Files changed (56) hide show
  1. data/.gitignore +18 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +4 -0
  4. data/Guardfile +6 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +97 -0
  7. data/Rakefile +9 -0
  8. data/lib/stew.rb +58 -0
  9. data/lib/stew/community/profile.rb +23 -0
  10. data/lib/stew/community/profile_friends.rb +18 -0
  11. data/lib/stew/community/profile_game.rb +28 -0
  12. data/lib/stew/community/profile_games.rb +17 -0
  13. data/lib/stew/community/steam_id.rb +52 -0
  14. data/lib/stew/community_client.rb +42 -0
  15. data/lib/stew/store/app.rb +76 -0
  16. data/lib/stew/store/app_offer.rb +38 -0
  17. data/lib/stew/store/app_offer_sale.rb +23 -0
  18. data/lib/stew/store/app_offers.rb +25 -0
  19. data/lib/stew/store_client.rb +39 -0
  20. data/lib/stew/version.rb +3 -0
  21. data/lib/stew/web_client.rb +30 -0
  22. data/lib/stew/xml_client.rb +49 -0
  23. data/spec/fixtures/profiles/4d.txt +16 -0
  24. data/spec/fixtures/profiles/76561197992917668.txt +122 -0
  25. data/spec/fixtures/profiles/76561197992917668.yml +94 -0
  26. data/spec/fixtures/profiles/friends/76561197992917668.yml +36 -0
  27. data/spec/fixtures/profiles/games/76561197992917668.yml +616 -0
  28. data/spec/fixtures/store/apps/16870.txt +1078 -0
  29. data/spec/fixtures/store/apps/211400_offers_sale.txt +46 -0
  30. data/spec/fixtures/store/apps/211400_sale.txt +1327 -0
  31. data/spec/fixtures/store/apps/211420.txt +1320 -0
  32. data/spec/fixtures/store/apps/211420_us.txt +1306 -0
  33. data/spec/fixtures/store/apps/219150.txt +1134 -0
  34. data/spec/fixtures/store/apps/2290.txt +1059 -0
  35. data/spec/fixtures/store/apps/49520.txt +1471 -0
  36. data/spec/fixtures/store/apps/49520_offers.txt +111 -0
  37. data/spec/fixtures/store/apps/no_app.txt +5 -0
  38. data/spec/integration/community_integration_spec.rb +50 -0
  39. data/spec/integration/store_integration_spec.rb +129 -0
  40. data/spec/lib/stew/community/profile_friends_spec.rb +38 -0
  41. data/spec/lib/stew/community/profile_game_spec.rb +37 -0
  42. data/spec/lib/stew/community/profile_games_spec.rb +36 -0
  43. data/spec/lib/stew/community/profile_spec.rb +18 -0
  44. data/spec/lib/stew/community/steam_id_spec.rb +116 -0
  45. data/spec/lib/stew/community_client_spec.rb +88 -0
  46. data/spec/lib/stew/store/app_offer_sale_spec.rb +36 -0
  47. data/spec/lib/stew/store/app_offer_spec.rb +47 -0
  48. data/spec/lib/stew/store/app_offers_spec.rb +64 -0
  49. data/spec/lib/stew/store/app_spec.rb +142 -0
  50. data/spec/lib/stew/store_client_spec.rb +58 -0
  51. data/spec/lib/stew/web_client_spec.rb +25 -0
  52. data/spec/lib/stew/xml_client_spec.rb +36 -0
  53. data/spec/lib/stew_spec.rb +4 -0
  54. data/spec/spec_helper.rb +23 -0
  55. data/stew.gemspec +38 -0
  56. metadata +412 -0
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Stew::CommunityClient" do
4
+ let(:client){double('xml_client')}
5
+ subject{Stew::CommunityClient.new({:client => client})}
6
+ let(:id){76561197992917668}
7
+
8
+ describe "#steam_id_from_vanity_name" do
9
+ let(:response){YAML.load_file("spec/fixtures/profiles/#{id}.yml")}
10
+ let(:name){"Somename"}
11
+
12
+ before :each do
13
+ Stew::XmlClient.any_instance.should_receive(:get).with("/id/#{name}").and_return(response)
14
+ end
15
+
16
+ context "when the vanity name exists" do
17
+ it "returns the 64-bit id" do
18
+ Stew::CommunityClient.steam_id_from_vanity_name(name).should eq id
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "setting the base path" do
24
+ context "when the base path is not set" do
25
+ let(:response){YAML.load_file("spec/fixtures/profiles/#{id}.yml")}
26
+
27
+ it "should perform requests to the 'profile'" do
28
+ client.should_receive(:get).with("/profiles/#{id}/").and_return(response)
29
+ subject.profile(id)
30
+ end
31
+ end
32
+
33
+ context "when the base path is set to 'id'" do
34
+ let(:response){YAML.load_file("spec/fixtures/profiles/#{id}.yml")}
35
+ subject{Stew::CommunityClient.new({:client => client, :base_path => 'id'})}
36
+
37
+ it "should perform profile-requests to the 'id'" do
38
+ client.should_receive(:get).with("/id/#{id}/").and_return(response)
39
+ subject.profile(id)
40
+ end
41
+ end
42
+ end
43
+
44
+ describe ".profile" do
45
+ let(:response){YAML.load_file("spec/fixtures/profiles/#{id}.yml")}
46
+
47
+ it "sends the correct message to its client" do
48
+ client.should_receive(:get).with("/profiles/#{id}/").and_return(response)
49
+ subject.profile(id)
50
+ end
51
+
52
+ it "creates a profile object" do
53
+ client.stub(:get).with("/profiles/#{id}/").and_return(response)
54
+ Stew::Community::Profile.should_receive(:new).with(response['profile'])
55
+ subject.profile(id)
56
+ end
57
+ end
58
+
59
+ describe ".profile_games" do
60
+ let(:response){YAML.load_file("spec/fixtures/profiles/games/#{id}.yml")}
61
+
62
+ it "sends the correct message to its client" do
63
+ client.should_receive(:get).with("/profiles/#{id}/games").and_return(response)
64
+ subject.profile_games(id)
65
+ end
66
+
67
+ it "creates a ProfileGames object" do
68
+ client.stub(:get).with("/profiles/#{id}/games").and_return(response)
69
+ Stew::Community::ProfileGames.should_receive(:new).with(response['gamesList']['games']['game'])
70
+ subject.profile_games(id)
71
+ end
72
+ end
73
+
74
+ describe ".profile_friends" do
75
+ let(:response){YAML.load_file("spec/fixtures/profiles/friends/#{id}.yml")}
76
+
77
+ it "sends the correct message to its client" do
78
+ client.should_receive(:get).with("/profiles/#{id}/friends").and_return(response)
79
+ subject.profile_friends(id)
80
+ end
81
+
82
+ it "returns the value of the ['friendsList']['friends']['friend'] key from the response hash" do
83
+ client.stub(:get).with("/profiles/#{id}/friends").and_return(response)
84
+ Stew::Community::ProfileFriends.should_receive(:new).with(response['friendsList']['friends']['friend'])
85
+ subject.profile_friends(id)
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Stew::Store::AppOfferSale" do
4
+ let(:price){Money.new(599,'EUR')}
5
+ let(:regular_price){Money.new(1199,'EUR')}
6
+ let(:name){"Deadlight"}
7
+
8
+ let(:node){Nokogiri.HTML(open("spec/fixtures/store/apps/211400_offers_sale.txt"))}
9
+
10
+ subject{Stew::Store::AppOfferSale.new(node)}
11
+
12
+ describe "attributes" do
13
+ it "sets the name" do
14
+ subject.name.should eq name
15
+ end
16
+
17
+ it "sets the description to nil" do
18
+ subject.description.should be_nil
19
+ end
20
+
21
+ it "sets the price" do
22
+ subject.price.should eq price
23
+ end
24
+
25
+ it "sets the regular_price" do
26
+ subject.regular_price.should eq regular_price
27
+ end
28
+ end
29
+
30
+ describe ".sale?" do
31
+ it "is true" do
32
+ subject.sale?.should be_true
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Stew::Store::AppOffer" do
4
+ let(:name){'Borderlands 2'}
5
+ let(:description){'Includes four copies of Borderlands 2 - Send the extra copies to your friends'}
6
+ let(:price){Money.new(4999,'EUR')}
7
+
8
+ let(:node){Nokogiri.HTML(open("spec/fixtures/store/apps/49520_offers.txt"))}
9
+
10
+ subject{Stew::Store::AppOffer.new(node)}
11
+
12
+ describe ".create" do
13
+ context "when the app is not on sale" do
14
+ it "returns an AppOffer instance" do
15
+ Stew::Store::AppOffer.create(node).should be_a(Stew::Store::AppOffer)
16
+ end
17
+ end
18
+
19
+ context "when the app is on sale" do
20
+ let(:node){Nokogiri.HTML(open("spec/fixtures/store/apps/211400_offers_sale.txt"))}
21
+
22
+ it "returns an AppOfferSale instance" do
23
+ Stew::Store::AppOffer.create(node).should be_a(Stew::Store::AppOfferSale)
24
+ end
25
+ end
26
+ end
27
+
28
+ describe "attributes" do
29
+ it "sets the name" do
30
+ subject.name.should eq name
31
+ end
32
+
33
+ it "sets the description" do
34
+ subject.description.should eq description
35
+ end
36
+
37
+ it "sets the price" do
38
+ subject.price.should eq price
39
+ end
40
+ end
41
+
42
+ describe ".sale?" do
43
+ it "is false" do
44
+ subject.sale?.should be_false
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Stew::Store::AppOffers" do
4
+ let(:file_name){"49520_offers"}
5
+ let(:node){Nokogiri.HTML(open("spec/fixtures/store/apps/#{file_name}.txt"))}
6
+
7
+ subject{Stew::Store::AppOffers.new(node)}
8
+
9
+ describe ".entries" do
10
+ it "sets the app offers" do
11
+ node.css("div.game_area_purchase_game").each do |item|
12
+ Stew::Store::AppOffer.should_receive(:create).with(item)
13
+ end
14
+ Stew::Store::AppOffers.new(node)
15
+ end
16
+
17
+ it "has the correct amount of offers" do
18
+ subject.count.should eq 4
19
+ end
20
+
21
+ it "has offers" do
22
+ subject.each do |offer|
23
+ offer.should be_a(Stew::Store::AppOffer)
24
+ end
25
+ end
26
+ end
27
+
28
+ describe ".sale?" do
29
+ context "when the app has no sale" do
30
+ it "returns false" do
31
+ subject.sale?.should be_false
32
+ end
33
+ end
34
+
35
+ context "when the app has a sale" do
36
+ let(:file_name){"211400_offers_sale"}
37
+ it "returns true" do
38
+ subject.sale?.should be_true
39
+ end
40
+ end
41
+ end
42
+
43
+ describe ".sales" do
44
+ context "when the app has no sale" do
45
+ it "returns an empty array" do
46
+ subject.sales.should eq []
47
+ end
48
+ end
49
+
50
+ context "when the app is on sale" do
51
+ let(:file_name){"211400_offers_sale"}
52
+
53
+ it "returns an array of the AppOffers on sale" do
54
+ subject.sales.count.should eq 2
55
+ end
56
+
57
+ it "returns an array of AppOfferSale objects" do
58
+ subject.sales.each do |app_offer|
59
+ app_offer.should be_a(Stew::Store::AppOfferSale)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,142 @@
1
+ #encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Stew::Store::App do
6
+ let(:response){open("spec/fixtures/store/apps/#{id}.txt")}
7
+ #let(:document){Nokogiri.HTML(response)}
8
+
9
+ subject{Stew::Store::App.new(response)}
10
+
11
+ describe "attributes" do
12
+ context "when the parse is successful" do
13
+ let(:id){211420}
14
+
15
+ describe ".name" do
16
+ it "sets the name" do
17
+ subject.name.should eq "Dark Souls™: Prepare To Die™ Edition"
18
+ end
19
+ end
20
+
21
+ describe ".score" do
22
+ context "when the app has a score" do
23
+ it "sets the store" do
24
+ subject.score.should eq 85
25
+ end
26
+ end
27
+
28
+ context "when the app has no score" do
29
+ let(:id){2290}
30
+
31
+ it "sets the store to nil" do
32
+ subject.score.should be_nil
33
+ end
34
+ end
35
+ end
36
+
37
+ describe ".release_date" do
38
+ it "sets the release date" do
39
+ subject.release_date.should eq Date.parse("Aug 23, 2012")
40
+ end
41
+ end
42
+
43
+ describe ".dlc?" do
44
+ context "when the app is not DLC" do
45
+ it "returns false" do
46
+ subject.dlc?.should be_false
47
+ end
48
+ end
49
+
50
+ context "when the app is DLC" do
51
+ let(:id){16870}
52
+
53
+ it "returns true" do
54
+ subject.dlc?.should be_true
55
+ end
56
+ end
57
+ end
58
+
59
+ describe ".developer" do
60
+ it "returns the developer" do
61
+ subject.developer.should eq 'FromSoftware'
62
+ end
63
+ end
64
+
65
+ describe ".publisher" do
66
+ it "returns the publisher" do
67
+ subject.publisher.should eq 'Namco Bandai Games'
68
+ end
69
+ end
70
+
71
+ describe ".indie?" do
72
+ context "when the game is indie" do
73
+ let(:id){219150}
74
+
75
+ it "returns true" do
76
+ subject.indie?.should be_true
77
+ end
78
+ end
79
+
80
+ context "when the game is not indie" do
81
+ it "returns false" do
82
+ subject.indie?.should be_false
83
+ end
84
+ end
85
+ end
86
+
87
+ describe ".price" do
88
+ it "returns the price of the first offer" do
89
+ subject.price.should eq Money.new(3999,'EUR')
90
+ end
91
+ end
92
+
93
+ describe ".free?" do
94
+ it "returns true if the the app is free" do
95
+ subject.free?.should be_false
96
+ end
97
+ end
98
+
99
+ describe "offers" do
100
+ it "creates an AppOffers instance with the offer node" do
101
+ subject.offers.count.should eq 1
102
+ end
103
+ end
104
+ end
105
+
106
+ context "when the parse is unsuccessful" do
107
+ let(:id){"no_app"}
108
+
109
+ %w(name score release_date developer publisher).each do |attribute|
110
+ describe ".#{attribute}" do
111
+ it "should be nil" do
112
+ subject.send(attribute).should be_nil
113
+ end
114
+ end
115
+ end
116
+
117
+ describe ".genres" do
118
+ it "should return an empty array" do
119
+ subject.genres.should eq []
120
+ end
121
+ end
122
+
123
+ describe ".dlc?" do
124
+ it "should be nil" do
125
+ subject.dlc?.should be_nil
126
+ end
127
+ end
128
+
129
+ describe ".indie" do
130
+ it "should be false" do
131
+ subject.indie?.should be_false
132
+ end
133
+ end
134
+
135
+ describe ".price" do
136
+ it "should be nil" do
137
+ subject.price.should be_nil
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Stew::StoreClient" do
4
+ let(:client){double('web_client')}
5
+ let(:response){open("spec/fixtures/store/apps/#{id}.txt")}
6
+ let(:region){:us}
7
+ subject{Stew::StoreClient.new({:client => client})}
8
+
9
+ describe ".app" do
10
+ let(:id) {211420}
11
+ it "sends the correct message to its client" do
12
+ client.should_receive(:get).with("/app/#{id}", {:cc => region}).and_return(response)
13
+ Stew::Store::App.should_receive(:new).with(response)
14
+ subject.app(id)
15
+ end
16
+ end
17
+
18
+ describe "#create_app" do
19
+ let(:id){211420}
20
+
21
+ context "when given an integer" do
22
+ it "creates an app with the given integer as id" do
23
+ client.stub(:get).with("/app/#{id}", {:cc => :us}).and_return(response)
24
+ Stew::Store::App.should_receive(:new).with(response)
25
+ subject.create_app(id)
26
+ end
27
+ end
28
+
29
+ context "when given a url with a region" do
30
+ let(:region){:uk}
31
+ let(:url){"http://store.steampowered.com/app/#{id}/?cc=#{region}"}
32
+
33
+ it "creates an app" do
34
+ client.stub(:get).with("/app/#{id}", {:cc => region}).and_return(response)
35
+ Stew::Store::App.should_receive(:new).with(response)
36
+ subject.create_app(url)
37
+ end
38
+ end
39
+
40
+ context "when given a url without a region" do
41
+ let(:url){"http://store.steampowered.com/app/#{id}"}
42
+
43
+ it "creates an app" do
44
+ client.stub(:get).with("/app/#{id}", {:cc => :us}).and_return(response)
45
+ Stew::Store::App.should_receive(:new).with(response)
46
+ subject.create_app(url)
47
+ end
48
+ end
49
+
50
+ context "when the given parameter cannot be matched" do
51
+ let(:url){"sodijfsdf"}
52
+
53
+ it "raises a Stew::Store::AppIdNotFoundError" do
54
+ expect{subject.create_app(url)}.to raise_error(Stew::AppIdNotFoundError)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Stew::WebClient", :vcr do
4
+ let(:uri){'http://store.steampowered.com/'}
5
+
6
+ subject{Stew::WebClient.new(uri)}
7
+
8
+ describe ".get" do
9
+ let(:id){216390}
10
+
11
+ context "without optional parameters" do
12
+ it "performs a request to the given URL" do
13
+ response = subject.get("app/#{id}")
14
+ response.should include("http://store.steampowered.com/app/#{id}")
15
+ end
16
+ end
17
+
18
+ context "with optional parameters" do
19
+ it "performs a request to the given URL" do
20
+ response = subject.get("app/#{id}", {:foo => :bar})
21
+ response.should include("http://store.steampowered.com/app/#{id}")
22
+ end
23
+ end
24
+ end
25
+ end