stew 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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