etsy 0.2.0 → 0.2.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.
- data/.gitignore +8 -0
- data/.travis.yml +8 -0
- data/Gemfile +10 -0
- data/README.md +300 -0
- data/Rakefile +2 -30
- data/etsy.gemspec +36 -0
- data/lib/etsy.rb +46 -17
- data/lib/etsy/address.rb +47 -0
- data/lib/etsy/basic_client.rb +1 -1
- data/lib/etsy/category.rb +84 -0
- data/lib/etsy/country.rb +27 -0
- data/lib/etsy/image.rb +7 -3
- data/lib/etsy/listing.rb +107 -8
- data/lib/etsy/model.rb +99 -3
- data/lib/etsy/payment_template.rb +33 -0
- data/lib/etsy/profile.rb +49 -0
- data/lib/etsy/request.rb +85 -17
- data/lib/etsy/response.rb +80 -4
- data/lib/etsy/section.rb +16 -0
- data/lib/etsy/secure_client.rb +49 -4
- data/lib/etsy/shipping_template.rb +32 -0
- data/lib/etsy/shop.rb +21 -12
- data/lib/etsy/transaction.rb +18 -0
- data/lib/etsy/user.rb +45 -13
- data/lib/etsy/verification_request.rb +2 -2
- data/test/fixtures/address/getUserAddresses.json +12 -0
- data/test/fixtures/category/findAllSubCategoryChildren.json +78 -0
- data/test/fixtures/category/findAllTopCategory.json +347 -0
- data/test/fixtures/category/findAllTopCategory.single.json +18 -0
- data/test/fixtures/category/findAllTopCategoryChildren.json +308 -0
- data/test/fixtures/category/getCategory.multiple.json +28 -0
- data/test/fixtures/category/getCategory.single.json +18 -0
- data/test/fixtures/country/getCountry.json +1 -0
- data/test/fixtures/listing/findAllListingActive.category.json +827 -0
- data/test/fixtures/listing/{findAllShopListingsActive.json → findAllShopListings.json} +0 -0
- data/test/fixtures/listing/getListing.multiple.json +1 -0
- data/test/fixtures/listing/getListing.single.json +1 -0
- data/test/fixtures/payment_template/getPaymentTemplate.json +1 -0
- data/test/fixtures/profile/new.json +28 -0
- data/test/fixtures/section/getShopSection.json +18 -0
- data/test/fixtures/shipping_template/getShippingTemplate.json +1 -0
- data/test/fixtures/shop/getShop.single.json +4 -3
- data/test/fixtures/transaction/findAllShopTransactions.json +1 -0
- data/test/fixtures/user/getUser.single.withProfile.json +38 -0
- data/test/fixtures/user/getUser.single.withShops.json +41 -0
- data/test/test_helper.rb +9 -4
- data/test/unit/etsy/address_test.rb +61 -0
- data/test/unit/etsy/category_test.rb +106 -0
- data/test/unit/etsy/country_test.rb +64 -0
- data/test/unit/etsy/listing_test.rb +112 -5
- data/test/unit/etsy/model_test.rb +64 -0
- data/test/unit/etsy/payment_template_test.rb +68 -0
- data/test/unit/etsy/profile_test.rb +111 -0
- data/test/unit/etsy/request_test.rb +89 -53
- data/test/unit/etsy/response_test.rb +118 -4
- data/test/unit/etsy/section_test.rb +28 -0
- data/test/unit/etsy/secure_client_test.rb +27 -5
- data/test/unit/etsy/shipping_template_test.rb +24 -0
- data/test/unit/etsy/shop_test.rb +12 -5
- data/test/unit/etsy/transaction_test.rb +52 -0
- data/test/unit/etsy/user_test.rb +147 -8
- data/test/unit/etsy/verification_request_test.rb +3 -3
- data/test/unit/etsy_test.rb +19 -7
- metadata +133 -77
- data/README.rdoc +0 -208
- data/lib/etsy/version.rb +0 -13
@@ -19,15 +19,33 @@ module Etsy
|
|
19
19
|
2.times { r.to_hash }
|
20
20
|
end
|
21
21
|
|
22
|
-
should "have a record count" do
|
23
|
-
|
24
|
-
|
22
|
+
should "have a record count when the response is not paginated" do
|
23
|
+
raw_response = mock
|
24
|
+
raw_response.stubs(:body => '{ "count": 1 }')
|
25
|
+
r = Response.new(raw_response)
|
25
26
|
|
26
27
|
r.count.should == 1
|
27
28
|
end
|
28
29
|
|
30
|
+
should "have a record count when the response is paginated" do
|
31
|
+
raw_response = mock
|
32
|
+
raw_response.stubs(:body => '{ "count": 100, "results": [{},{}], "pagination": {} }')
|
33
|
+
r = Response.new(raw_response)
|
34
|
+
|
35
|
+
r.count.should == 2
|
36
|
+
end
|
37
|
+
|
38
|
+
should "return a count of 0 when the response is paginated and the results are empty" do
|
39
|
+
raw_response = mock
|
40
|
+
raw_response.stubs(:body => '{ "count": 100, "results": null, "pagination": {} }')
|
41
|
+
r = Response.new(raw_response)
|
42
|
+
|
43
|
+
r.count.should == 0
|
44
|
+
end
|
45
|
+
|
29
46
|
should "return an array if there are multiple results entries" do
|
30
47
|
r = Response.new('')
|
48
|
+
r.expects(:code).with().returns('200')
|
31
49
|
r.expects(:count).with().returns(2)
|
32
50
|
r.expects(:to_hash).with().returns('results' => %w(one two))
|
33
51
|
|
@@ -36,14 +54,110 @@ module Etsy
|
|
36
54
|
|
37
55
|
should "return a single value for results if there is only 1 result" do
|
38
56
|
r = Response.new('')
|
57
|
+
r.expects(:code).with().returns('200')
|
39
58
|
r.expects(:count).with().returns(1)
|
40
59
|
r.expects(:to_hash).with().returns('results' => ['foo'])
|
41
60
|
|
42
61
|
r.result.should == 'foo'
|
43
62
|
end
|
44
63
|
|
64
|
+
should "provide the complete raw body" do
|
65
|
+
raw_response = mock
|
66
|
+
raw_response.stubs(:body => "I am not JSON")
|
67
|
+
r = Response.new(raw_response)
|
68
|
+
|
69
|
+
r.body.should == 'I am not JSON'
|
70
|
+
end
|
71
|
+
|
72
|
+
should "raise an invalid JSON exception if the response is not json" do
|
73
|
+
raw_response = mock
|
74
|
+
raw_response.stubs(:body => "I am not JSON")
|
75
|
+
r = Response.new(raw_response)
|
76
|
+
|
77
|
+
lambda { r.to_hash }.should raise_error(Etsy::EtsyJSONInvalid)
|
78
|
+
end
|
79
|
+
|
80
|
+
should "raise OAuthTokenRevoked" do
|
81
|
+
raw_response = mock
|
82
|
+
raw_response.stubs(:body => "oauth_problem=token_revoked")
|
83
|
+
r = Response.new(raw_response)
|
84
|
+
|
85
|
+
lambda { r.to_hash }.should raise_error(Etsy::OAuthTokenRevoked)
|
86
|
+
end
|
87
|
+
|
88
|
+
should "raise MissingShopID" do
|
89
|
+
raw_response = mock
|
90
|
+
raw_response.stubs(:body => "something Shop with PK shop_id something")
|
91
|
+
r = Response.new(raw_response)
|
92
|
+
|
93
|
+
lambda { r.to_hash }.should raise_error(Etsy::MissingShopID)
|
94
|
+
end
|
95
|
+
|
96
|
+
should "raise InvalidUserID" do
|
97
|
+
raw_response = mock
|
98
|
+
raw_response.stubs(:body => "'someguy' is not a valid user_id")
|
99
|
+
r = Response.new(raw_response)
|
100
|
+
|
101
|
+
lambda { r.to_hash }.should raise_error(Etsy::InvalidUserID)
|
102
|
+
end
|
103
|
+
|
104
|
+
should "raise TemporaryIssue" do
|
105
|
+
raw_response = mock
|
106
|
+
raw_response.stubs(:body => "something Temporary Etsy issue something")
|
107
|
+
r = Response.new(raw_response)
|
108
|
+
|
109
|
+
lambda { r.to_hash }.should raise_error(Etsy::TemporaryIssue)
|
110
|
+
|
111
|
+
raw_response = mock
|
112
|
+
raw_response.stubs(:body => "something Resource temporarily unavailable something")
|
113
|
+
r = Response.new(raw_response)
|
114
|
+
|
115
|
+
lambda { r.to_hash }.should raise_error(Etsy::TemporaryIssue)
|
116
|
+
|
117
|
+
raw_response = mock
|
118
|
+
raw_response.stubs(:body => "something You have exceeded your API limit something")
|
119
|
+
r = Response.new(raw_response)
|
120
|
+
|
121
|
+
lambda { r.to_hash }.should raise_error(Etsy::TemporaryIssue)
|
122
|
+
end
|
123
|
+
|
124
|
+
should "provide the code" do
|
125
|
+
raw_response = mock
|
126
|
+
raw_response.expects(:code => "400")
|
127
|
+
r = Response.new(raw_response)
|
128
|
+
|
129
|
+
r.code.should == '400'
|
130
|
+
end
|
131
|
+
|
132
|
+
should "consider a code of 2xx successful" do
|
133
|
+
raw_response = mock
|
134
|
+
|
135
|
+
raw_response.expects(:code => "200")
|
136
|
+
r = Response.new(raw_response)
|
137
|
+
r.should be_success
|
138
|
+
|
139
|
+
raw_response.expects(:code => "201")
|
140
|
+
r = Response.new(raw_response)
|
141
|
+
r.should be_success
|
142
|
+
end
|
143
|
+
|
144
|
+
should "consider a code of 4xx unsuccessful" do
|
145
|
+
raw_response = mock
|
146
|
+
|
147
|
+
raw_response.expects(:code => "404")
|
148
|
+
r = Response.new(raw_response)
|
149
|
+
r.should_not be_success
|
150
|
+
end
|
151
|
+
|
152
|
+
should "consider a code of 5xx unsuccessful" do
|
153
|
+
raw_response = mock
|
154
|
+
|
155
|
+
raw_response.expects(:code => "500")
|
156
|
+
r = Response.new(raw_response)
|
157
|
+
r.should_not be_success
|
158
|
+
end
|
45
159
|
end
|
46
160
|
|
47
161
|
|
48
162
|
end
|
49
|
-
end
|
163
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path('../../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Etsy
|
4
|
+
class SectionTest < Test::Unit::TestCase
|
5
|
+
context "An instance of the Section class" do
|
6
|
+
setup do
|
7
|
+
data = read_fixture('section/getShopSection.json')
|
8
|
+
@section = Section.new(data.first)
|
9
|
+
end
|
10
|
+
|
11
|
+
should "have an id" do
|
12
|
+
@section.id.should == 11045327
|
13
|
+
end
|
14
|
+
|
15
|
+
should "have an title" do
|
16
|
+
@section.title.should == "Blue Items"
|
17
|
+
end
|
18
|
+
|
19
|
+
should "have an user_id" do
|
20
|
+
@section.user_id.should == 9569349
|
21
|
+
end
|
22
|
+
|
23
|
+
should "have an active_listing_count" do
|
24
|
+
@section.active_listing_count.should == 7
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -5,15 +5,17 @@ module Etsy
|
|
5
5
|
|
6
6
|
context "An instance of the SecureClient class" do
|
7
7
|
|
8
|
-
should "be able to generate an OAuth consumer" do
|
8
|
+
should "be able to generate an OAuth consumer for the sandbox" do
|
9
|
+
Etsy.stubs(:environment).returns :sandbox
|
10
|
+
Etsy.stubs(:host).returns 'sandbox'
|
9
11
|
Etsy.stubs(:api_key).returns('key')
|
10
12
|
Etsy.stubs(:api_secret).returns('secret')
|
13
|
+
Etsy.stubs(:permission_scopes).returns(['scope_one', 'scope_two'])
|
11
14
|
|
12
15
|
OAuth::Consumer.stubs(:new).with('key', 'secret', {
|
13
|
-
:site => 'http://
|
14
|
-
:request_token_path => '/v2/
|
15
|
-
:access_token_path => '/v2/
|
16
|
-
:authorize_url => 'https://www.etsy.com/oauth/signin'
|
16
|
+
:site => 'http://sandbox',
|
17
|
+
:request_token_path => '/v2/oauth/request_token?scope=scope_one+scope_two',
|
18
|
+
:access_token_path => '/v2/oauth/access_token',
|
17
19
|
}).returns('consumer')
|
18
20
|
|
19
21
|
client = SecureClient.new
|
@@ -21,6 +23,26 @@ module Etsy
|
|
21
23
|
client.consumer.should == 'consumer'
|
22
24
|
end
|
23
25
|
|
26
|
+
should "be able to generate an OAuth consumer in production" do
|
27
|
+
Etsy.stubs(:environment).returns :production
|
28
|
+
Etsy.stubs(:host).returns 'production'
|
29
|
+
Etsy.stubs(:api_key).returns('key')
|
30
|
+
Etsy.stubs(:api_secret).returns('secret')
|
31
|
+
Etsy.stubs(:permission_scopes).returns(['scope_one', 'scope_two'])
|
32
|
+
|
33
|
+
OAuth::Consumer.stubs(:new).with('key', 'secret', {
|
34
|
+
:site => 'http://production',
|
35
|
+
:request_token_path => '/v2/oauth/request_token?scope=scope_one+scope_two',
|
36
|
+
:access_token_path => '/v2/oauth/access_token',
|
37
|
+
}).returns('consumer')
|
38
|
+
|
39
|
+
client = SecureClient.new
|
40
|
+
|
41
|
+
client.consumer.should == 'consumer'
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
|
24
46
|
should "be able to generate a request token" do
|
25
47
|
Etsy.stubs(:callback_url).with().returns('callback_url')
|
26
48
|
consumer = stub() {|c| c.stubs(:get_request_token).with(:oauth_callback => 'callback_url').returns('toke') }
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path('../../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Etsy
|
4
|
+
class ShippingTemplateTest < Test::Unit::TestCase
|
5
|
+
context "An instance of the ShippingTemplate class" do
|
6
|
+
setup do
|
7
|
+
data = read_fixture('shipping_template/getShippingTemplate.json')
|
8
|
+
@shipping_template = ShippingTemplate.new(data.first)
|
9
|
+
end
|
10
|
+
|
11
|
+
should "have an id" do
|
12
|
+
@shipping_template.id.should == 212
|
13
|
+
end
|
14
|
+
|
15
|
+
should "have an title" do
|
16
|
+
@shipping_template.title.should == "Small Items"
|
17
|
+
end
|
18
|
+
|
19
|
+
should "have an user_id" do
|
20
|
+
@shipping_template.user_id.should == 14888443
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/test/unit/etsy/shop_test.rb
CHANGED
@@ -26,7 +26,7 @@ module Etsy
|
|
26
26
|
end
|
27
27
|
|
28
28
|
should "allow a configurable limit when finding all shops" do
|
29
|
-
shops = mock_request('/shops', {:limit => 100}, 'Shop', 'findAllShop.json')
|
29
|
+
shops = mock_request('/shops', {:limit => 100, :offset => 0}, 'Shop', 'findAllShop.json')
|
30
30
|
Shop.all(:limit => 100).should == shops
|
31
31
|
end
|
32
32
|
|
@@ -49,7 +49,15 @@ module Etsy
|
|
49
49
|
end
|
50
50
|
|
51
51
|
should "have a value for :image_url" do
|
52
|
-
@shop.image_url.should == "http://ny-
|
52
|
+
@shop.image_url.should == "http://ny-image3.etsy.com/iusb_760x100.8484779.jpg"
|
53
|
+
end
|
54
|
+
|
55
|
+
should "have a value for :url" do
|
56
|
+
@shop.url.should == "http://www.etsy.com/shop/littletjane"
|
57
|
+
end
|
58
|
+
|
59
|
+
should "have a value for :favorers_count" do
|
60
|
+
@shop.favorers_count.should == 684
|
53
61
|
end
|
54
62
|
|
55
63
|
should "have a value for :active_listings_count" do
|
@@ -86,12 +94,11 @@ module Etsy
|
|
86
94
|
shop = Shop.new
|
87
95
|
shop.stubs(:id).with().returns(1)
|
88
96
|
|
89
|
-
Listing.stubs(:find_all_by_shop_id).with(1).returns('listings')
|
97
|
+
Listing.stubs(:find_all_by_shop_id).with(1, {}).returns('listings')
|
90
98
|
|
91
99
|
shop.listings.should == 'listings'
|
92
100
|
end
|
93
|
-
|
94
101
|
end
|
95
102
|
|
96
103
|
end
|
97
|
-
end
|
104
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require File.expand_path('../../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Etsy
|
4
|
+
class TransactionTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "The Transaction class" do
|
7
|
+
|
8
|
+
should "be able to find transactions for a shop" do
|
9
|
+
transactions = mock_request('/shops/1/transactions', {'key' => 'value'}, 'Transaction', 'findAllShopTransactions.json')
|
10
|
+
Transaction.find_all_by_shop_id(1, {'key' => 'value'}).should == transactions
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
context "An instance of the Transaction class" do
|
16
|
+
|
17
|
+
context "with response data" do
|
18
|
+
setup do
|
19
|
+
data = read_fixture('transaction/findAllShopTransactions.json')
|
20
|
+
@transaction = Transaction.new(data.first)
|
21
|
+
end
|
22
|
+
|
23
|
+
should "have a value for :id" do
|
24
|
+
@transaction.id.should == 27230877
|
25
|
+
end
|
26
|
+
|
27
|
+
should "have a value for :quantity" do
|
28
|
+
@transaction.quantity.should == 1
|
29
|
+
end
|
30
|
+
|
31
|
+
should "have a value for :buyer_id" do
|
32
|
+
@transaction.buyer_id.should == 9641557
|
33
|
+
end
|
34
|
+
|
35
|
+
should "have a value for :listing_id" do
|
36
|
+
@transaction.listing_id.should == 41680579
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
should "know the buyer" do
|
41
|
+
User.stubs(:find).with(1).returns('user')
|
42
|
+
|
43
|
+
transaction = Transaction.new
|
44
|
+
transaction.stubs(:buyer_id).with().returns(1)
|
45
|
+
|
46
|
+
transaction.buyer.should == 'user'
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
data/test/unit/etsy/user_test.rb
CHANGED
@@ -15,15 +15,42 @@ module Etsy
|
|
15
15
|
User.find('littletjane', 'reagent').should == users
|
16
16
|
end
|
17
17
|
|
18
|
-
should "be able to
|
19
|
-
|
20
|
-
users = mock_request('/users/
|
21
|
-
User.
|
18
|
+
should "be able to pass options when finding a user" do
|
19
|
+
options = {:limit => 90, :offset => 90}
|
20
|
+
users = mock_request('/users/littletjane', options, 'User', 'getUser.single.json')
|
21
|
+
User.find('littletjane', options).should == users.first
|
22
|
+
end
|
23
|
+
|
24
|
+
should "be able to find the authenticated user" do
|
25
|
+
options = {:access_token => 'token', :access_secret => 'secret'}
|
26
|
+
users = mock_request('/users/__SELF__', options, 'User', 'getUser.single.json')
|
27
|
+
User.myself('token', 'secret', options).should == users.first
|
22
28
|
end
|
23
29
|
end
|
24
30
|
|
25
31
|
context "An instance of the User class" do
|
26
32
|
|
33
|
+
context "requested with oauth access token" do
|
34
|
+
setup do
|
35
|
+
options = {:access_token => 'token', :access_secret => 'secret'}
|
36
|
+
|
37
|
+
data = read_fixture('user/getUser.single.json')
|
38
|
+
response = 'response'
|
39
|
+
response.stubs(:result).with().returns [data]
|
40
|
+
Request.stubs(:get).with('/users/__SELF__', options).returns response
|
41
|
+
|
42
|
+
@user = User.find('__SELF__', options)
|
43
|
+
end
|
44
|
+
|
45
|
+
should "persist the token" do
|
46
|
+
@user.token.should == 'token'
|
47
|
+
end
|
48
|
+
|
49
|
+
should "persist the secret" do
|
50
|
+
@user.secret.should == 'secret'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
27
54
|
context "with public response data" do
|
28
55
|
setup do
|
29
56
|
data = read_fixture('user/getUser.single.json')
|
@@ -50,7 +77,7 @@ module Etsy
|
|
50
77
|
context "with private response data" do
|
51
78
|
setup do
|
52
79
|
data = read_fixture('user/getUser.single.private.json')
|
53
|
-
@user = User.new(data.first)
|
80
|
+
@user = User.new(data.first, 'token', 'secret')
|
54
81
|
end
|
55
82
|
|
56
83
|
should "have an email address" do
|
@@ -58,6 +85,118 @@ module Etsy
|
|
58
85
|
end
|
59
86
|
end
|
60
87
|
|
88
|
+
context "requested with associated shops" do
|
89
|
+
setup do
|
90
|
+
data = read_fixture('user/getUser.single.withShops.json')
|
91
|
+
@user = User.new(data.first)
|
92
|
+
end
|
93
|
+
|
94
|
+
should "have shops" do
|
95
|
+
@user.shops.each do |shop|
|
96
|
+
shop.class.should == Shop
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# This assumes for now that a user can have only one shop belonging to them
|
101
|
+
should "return the first shop belonging to the user" do
|
102
|
+
@user.shop.should == @user.shops.first
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context "requested without associated shops" do
|
107
|
+
setup do
|
108
|
+
@data_without_shops = read_fixture('user/getUser.single.json')
|
109
|
+
@data_with_shops = read_fixture('user/getUser.single.withShops.json')
|
110
|
+
@options = {:fields => 'user_id', :includes => 'Shops'}
|
111
|
+
|
112
|
+
@user_without_shops = User.new(@data_without_shops.first)
|
113
|
+
@user_with_shops = User.new(@data_with_shops.first)
|
114
|
+
end
|
115
|
+
|
116
|
+
should "make a call to the API to retrieve it if requested" do
|
117
|
+
User.expects(:find).with('littletjane', @options).returns @user_with_shops
|
118
|
+
@user_without_shops.shops
|
119
|
+
end
|
120
|
+
|
121
|
+
should "not call the api twice" do
|
122
|
+
User.expects(:find).once.with('littletjane', @options).returns @user_with_shops
|
123
|
+
@user_without_shops.shops
|
124
|
+
@user_without_shops.shops
|
125
|
+
end
|
126
|
+
|
127
|
+
should "return a list of populated shop instances" do
|
128
|
+
User.stubs(:find).with('littletjane', @options).returns @user_with_shops
|
129
|
+
@user_without_shops.shops.first.name.should == 'LittleJane'
|
130
|
+
end
|
131
|
+
|
132
|
+
should "make the call with authentication if oauth is used" do
|
133
|
+
user = User.new(@data_without_shops.first, 'token', 'secret')
|
134
|
+
oauth = {:access_token => 'token', :access_secret => 'secret'}
|
135
|
+
User.expects(:find).with('littletjane', @options.merge(oauth)).returns @user_with_shops
|
136
|
+
user.shops
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context "requested with an associated profile" do
|
141
|
+
setup do
|
142
|
+
data = read_fixture('user/getUser.single.withProfile.json')
|
143
|
+
@user = User.new(data.first)
|
144
|
+
end
|
145
|
+
|
146
|
+
should "have a profile" do
|
147
|
+
@user.profile.class.should == Profile
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context "requested without an associated profile" do
|
152
|
+
setup do
|
153
|
+
@data_without_profile = read_fixture('user/getUser.single.json')
|
154
|
+
@data_with_profile = read_fixture('user/getUser.single.withProfile.json')
|
155
|
+
@options = {:fields => 'user_id', :includes => 'Profile'}
|
156
|
+
|
157
|
+
@user_without_profile = User.new(@data_without_profile.first)
|
158
|
+
@user_with_profile = User.new(@data_with_profile.first)
|
159
|
+
end
|
160
|
+
|
161
|
+
should "make a call to the API to retrieve it if requested" do
|
162
|
+
User.expects(:find).with('littletjane', @options).returns @user_with_profile
|
163
|
+
@user_without_profile.profile
|
164
|
+
end
|
165
|
+
|
166
|
+
should "not call the api twice" do
|
167
|
+
User.expects(:find).once.with('littletjane', @options).returns @user_with_profile
|
168
|
+
@user_without_profile.profile
|
169
|
+
@user_without_profile.profile
|
170
|
+
end
|
171
|
+
|
172
|
+
should "return a populated profile instance" do
|
173
|
+
User.stubs(:find).with('littletjane', @options).returns @user_with_profile
|
174
|
+
@user_without_profile.profile.bio.should == 'I make stuff'
|
175
|
+
end
|
176
|
+
|
177
|
+
should "make the call with authentication if oauth is used" do
|
178
|
+
user = User.new(@data_without_profile.first, 'token', 'secret')
|
179
|
+
oauth = {:access_token => 'token', :access_secret => 'secret'}
|
180
|
+
User.expects(:find).with('littletjane', @options.merge(oauth)).returns @user_with_profile
|
181
|
+
user.profile
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
context "instantiated with oauth token" do
|
186
|
+
setup do
|
187
|
+
@user = User.new(nil, 'token', 'secret')
|
188
|
+
end
|
189
|
+
|
190
|
+
should "have the token" do
|
191
|
+
@user.token.should == 'token'
|
192
|
+
end
|
193
|
+
|
194
|
+
should "have the secret" do
|
195
|
+
@user.secret.should == 'secret'
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
199
|
+
|
61
200
|
should "know when the user was created" do
|
62
201
|
user = User.new
|
63
202
|
user.stubs(:created).returns(1)
|
@@ -66,13 +205,13 @@ module Etsy
|
|
66
205
|
end
|
67
206
|
end
|
68
207
|
|
69
|
-
should "know the
|
208
|
+
should "know the addresses for a user" do
|
70
209
|
user = User.new
|
71
210
|
user.stubs(:username).with().returns('username')
|
72
211
|
|
73
|
-
|
212
|
+
Address.stubs(:find).with('username', {}).returns('addresses')
|
74
213
|
|
75
|
-
user.
|
214
|
+
user.addresses.should == 'addresses'
|
76
215
|
end
|
77
216
|
|
78
217
|
end
|