cardmagic-etsy 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.travis.yml +13 -0
  4. data/Gemfile +11 -0
  5. data/LICENSE +9 -0
  6. data/README.md +348 -0
  7. data/Rakefile +12 -0
  8. data/etsy.gemspec +34 -0
  9. data/lib/etsy.rb +223 -0
  10. data/lib/etsy/about.rb +15 -0
  11. data/lib/etsy/address.rb +47 -0
  12. data/lib/etsy/attribute_value.rb +46 -0
  13. data/lib/etsy/basic_client.rb +32 -0
  14. data/lib/etsy/category.rb +84 -0
  15. data/lib/etsy/country.rb +27 -0
  16. data/lib/etsy/favorite_listing.rb +26 -0
  17. data/lib/etsy/image.rb +44 -0
  18. data/lib/etsy/listing.rb +296 -0
  19. data/lib/etsy/model.rb +127 -0
  20. data/lib/etsy/payment_template.rb +33 -0
  21. data/lib/etsy/profile.rb +49 -0
  22. data/lib/etsy/receipt.rb +37 -0
  23. data/lib/etsy/request.rb +150 -0
  24. data/lib/etsy/response.rb +128 -0
  25. data/lib/etsy/section.rb +16 -0
  26. data/lib/etsy/secure_client.rb +131 -0
  27. data/lib/etsy/shipping_info.rb +27 -0
  28. data/lib/etsy/shipping_template.rb +41 -0
  29. data/lib/etsy/shop.rb +88 -0
  30. data/lib/etsy/transaction.rb +29 -0
  31. data/lib/etsy/user.rb +109 -0
  32. data/lib/etsy/variation/property_set.rb +71 -0
  33. data/lib/etsy/verification_request.rb +17 -0
  34. data/lib/etsy/version.rb +3 -0
  35. data/test/fixtures/about/getAbout.json +16 -0
  36. data/test/fixtures/address/getUserAddresses.json +12 -0
  37. data/test/fixtures/attribute_value/findAllListingPropertyValues.json +44 -0
  38. data/test/fixtures/category/findAllSubCategoryChildren.json +78 -0
  39. data/test/fixtures/category/findAllTopCategory.json +347 -0
  40. data/test/fixtures/category/findAllTopCategory.single.json +18 -0
  41. data/test/fixtures/category/findAllTopCategoryChildren.json +308 -0
  42. data/test/fixtures/category/getCategory.multiple.json +28 -0
  43. data/test/fixtures/category/getCategory.single.json +18 -0
  44. data/test/fixtures/country/getCountry.json +1 -0
  45. data/test/fixtures/favorite_listing/findAllFavoriteListings.json +1 -0
  46. data/test/fixtures/image/findAllListingImages.json +102 -0
  47. data/test/fixtures/listing/findAllListingActive.category.json +827 -0
  48. data/test/fixtures/listing/findAllShopListings.json +69 -0
  49. data/test/fixtures/listing/getListing.multiple.json +1 -0
  50. data/test/fixtures/listing/getListing.single.includeImages.json +1 -0
  51. data/test/fixtures/listing/getListing.single.json +1 -0
  52. data/test/fixtures/payment_template/getPaymentTemplate.json +1 -0
  53. data/test/fixtures/profile/new.json +28 -0
  54. data/test/fixtures/receipt/findAllShopReceipts.json +28 -0
  55. data/test/fixtures/section/getShopSection.json +18 -0
  56. data/test/fixtures/shipping_info/getShippingInfo.json +1 -0
  57. data/test/fixtures/shipping_template/getShippingTemplate.json +1 -0
  58. data/test/fixtures/shop/findAllShop.json +1 -0
  59. data/test/fixtures/shop/findAllShop.single.json +1 -0
  60. data/test/fixtures/shop/getShop.multiple.json +1 -0
  61. data/test/fixtures/shop/getShop.single.json +34 -0
  62. data/test/fixtures/transaction/findAllShopTransactions.json +1 -0
  63. data/test/fixtures/user/getUser.multiple.json +29 -0
  64. data/test/fixtures/user/getUser.single.json +13 -0
  65. data/test/fixtures/user/getUser.single.private.json +18 -0
  66. data/test/fixtures/user/getUser.single.withProfile.json +38 -0
  67. data/test/fixtures/user/getUser.single.withShops.json +41 -0
  68. data/test/test_helper.rb +45 -0
  69. data/test/unit/etsy/address_test.rb +61 -0
  70. data/test/unit/etsy/attribute_value_test.rb +67 -0
  71. data/test/unit/etsy/basic_client_test.rb +30 -0
  72. data/test/unit/etsy/category_test.rb +106 -0
  73. data/test/unit/etsy/country_test.rb +64 -0
  74. data/test/unit/etsy/favorite_listing_test.rb +44 -0
  75. data/test/unit/etsy/image_test.rb +51 -0
  76. data/test/unit/etsy/listing_test.rb +268 -0
  77. data/test/unit/etsy/model_test.rb +64 -0
  78. data/test/unit/etsy/payment_template_test.rb +68 -0
  79. data/test/unit/etsy/profile_test.rb +111 -0
  80. data/test/unit/etsy/receipt_test.rb +107 -0
  81. data/test/unit/etsy/request_test.rb +190 -0
  82. data/test/unit/etsy/response_test.rb +175 -0
  83. data/test/unit/etsy/section_test.rb +28 -0
  84. data/test/unit/etsy/secure_client_test.rb +132 -0
  85. data/test/unit/etsy/shipping_info_test.rb +24 -0
  86. data/test/unit/etsy/shipping_template_test.rb +24 -0
  87. data/test/unit/etsy/shop_about_test.rb +43 -0
  88. data/test/unit/etsy/shop_test.rb +116 -0
  89. data/test/unit/etsy/transaction_test.rb +61 -0
  90. data/test/unit/etsy/user_test.rb +250 -0
  91. data/test/unit/etsy/verification_request_test.rb +26 -0
  92. data/test/unit/etsy_test.rb +173 -0
  93. metadata +293 -0
@@ -0,0 +1,67 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ module Etsy
4
+ class AttributeValueTest < Test::Unit::TestCase
5
+ context 'The AttributeValue class' do
6
+ context 'without oauth' do
7
+ should 'be able to find all images for a listing' do
8
+ property_values = mock_request(
9
+ '/listings/1/attributes',
10
+ {},
11
+ 'AttributeValue',
12
+ 'findAllListingPropertyValues.json'
13
+ )
14
+ AttributeValue.find_all_by_listing_id(1, {}).should == property_values
15
+ end
16
+ end
17
+
18
+ context 'with options' do
19
+ should 'be able to find all property_values for a listing with options in request' do
20
+ property_values = mock_request(
21
+ '/listings/1/attributes',
22
+ { foo: 'bar' },
23
+ 'AttributeValue',
24
+ 'findAllListingPropertyValues.json'
25
+ )
26
+ AttributeValue.find_all_by_listing_id(1, foo: 'bar').should == property_values
27
+ end
28
+ end
29
+ end
30
+
31
+ context 'An instance of the AttributeValue class' do
32
+ context 'with response data' do
33
+ setup do
34
+ data = read_fixture('attribute_value/findAllListingPropertyValues.json')
35
+ @primary_color = AttributeValue.new(data[0])
36
+ @secondary_color = AttributeValue.new(data[1])
37
+ @height = AttributeValue.new(data[2])
38
+ @width = AttributeValue.new(data[3])
39
+ end
40
+
41
+ should 'have a value for :scale_name for width' do
42
+ @width.scale_name.should == 'Inches'
43
+ end
44
+
45
+ should 'have a value for :scale_id for width' do
46
+ @width.scale_id.should == 5
47
+ end
48
+
49
+ should 'have a value for :scale_name for height' do
50
+ @height.scale_name.should == 'Inches'
51
+ end
52
+
53
+ should 'have a value for :scale_id for height' do
54
+ @height.scale_id.should == 5
55
+ end
56
+
57
+ should 'have an array of :values with color name for primary_color' do
58
+ @primary_color.values.should == ['Beige']
59
+ end
60
+
61
+ should 'have an array of :values with color name for secondary_color' do
62
+ @secondary_color.values.should == ['Black']
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ module Etsy
4
+ class BasicClientTest < Test::Unit::TestCase
5
+
6
+ context "An instance of the BasicClient class" do
7
+
8
+ should "be able to construct a client" do
9
+ Etsy.stubs(:host).returns 'example.com'
10
+ Etsy.stubs(:protocol).returns 'http'
11
+ client = BasicClient.new
12
+ Net::HTTP.stubs(:new).with('example.com', 80).returns('client')
13
+
14
+ client.client.should == 'client'
15
+ end
16
+
17
+ should "be able to perform a GET request" do
18
+ http_client = stub()
19
+ http_client.stubs(:get).with('endpoint').returns('response')
20
+
21
+ client = BasicClient.new
22
+ client.stubs(:client).returns(http_client)
23
+
24
+ client.get('endpoint').should == 'response'
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,106 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ module Etsy
4
+ class CategoryTest < Test::Unit::TestCase
5
+
6
+ context "The Category class" do
7
+
8
+ should "be able to find a single top-level category" do
9
+ categories = mock_request('/categories/accessories', {}, 'Category', 'getCategory.single.json')
10
+ Category.find_top('accessories').should == categories.first
11
+ end
12
+
13
+ should "be able to find multiple categories" do
14
+ categories = mock_request('/categories/accessories,art', {}, 'Category', 'getCategory.multiple.json')
15
+ Category.find_top('accessories', 'art').should == categories
16
+ end
17
+
18
+ should "be able to find all top-level categories" do
19
+ categories = mock_request('/taxonomy/categories', {}, 'Category', 'findAllTopCategory.json')
20
+ Category.all_top.should == categories
21
+ end
22
+
23
+ should "return an array of categories if there is only 1 result returned" do
24
+ categories = mock_request('/taxonomy/categories', {}, 'Category', 'findAllTopCategory.single.json')
25
+ Category.all_top.should == categories
26
+ end
27
+
28
+ context "within the scope of a top-level category" do
29
+
30
+ should "be able to find all subcategories" do
31
+ categories = mock_request('/taxonomy/categories/accessories', {}, 'Category', 'findAllTopCategoryChildren.json')
32
+ Category.find_all_subcategories('accessories').should == categories
33
+ end
34
+
35
+ should "be able to find the subcategories of a subcategory" do
36
+ categories = mock_request('/taxonomy/categories/accessories/apron', {}, 'Category', 'findAllSubCategoryChildren.json')
37
+ Category.find_all_subcategories('accessories/apron').should == categories
38
+ end
39
+
40
+ should "return nil when trying to find the subcategories of a subcategory of a subcategory" do
41
+ Category.find_all_subcategories('accessories/apron/women').should be_nil
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+
48
+ context "An instance of the Category class" do
49
+
50
+ context "with response data" do
51
+ setup do
52
+ data = read_fixture('category/getCategory.single.json')
53
+ @category = Category.new(data.first)
54
+ end
55
+
56
+ should "have a value for :id" do
57
+ @category.id.should == 69150467
58
+ end
59
+
60
+ should "have a value for :page_description" do
61
+ @category.page_description.should == "Shop for unique, handmade accessories from our artisan community"
62
+ end
63
+
64
+ should "have a value for :page_title" do
65
+ @category.page_title.should == "Handmade accessories"
66
+ end
67
+
68
+ should "have a value for :category_name" do
69
+ @category.category_name.should == "accessories"
70
+ end
71
+
72
+ should "have a value for :short_name" do
73
+ @category.short_name.should == "Accessories"
74
+ end
75
+
76
+ should "have a value for :long_name" do
77
+ @category.long_name.should == "Accessories"
78
+ end
79
+
80
+ should "have a value for :children_count" do
81
+ @category.children_count.should == 27
82
+ end
83
+ end
84
+
85
+ should "have a collection of active listings" do
86
+ category = Category.new
87
+ category.stubs(:category_name).with().returns('accessories')
88
+
89
+ Listing.stubs(:find_all_active_by_category).with('accessories').returns('listings')
90
+
91
+ category.active_listings.should == 'listings'
92
+ end
93
+
94
+ should "have a collection of subcategories" do
95
+ category = Category.new
96
+ category.stubs(:category_name).with().returns('accessories')
97
+
98
+ Category.stubs(:find_all_subcategories).with('accessories').returns('categories')
99
+
100
+ category.subcategories.should == 'categories'
101
+ end
102
+
103
+ end
104
+
105
+ end
106
+ end
@@ -0,0 +1,64 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ module Etsy
4
+ class CountryTest < Test::Unit::TestCase
5
+ context "The Country class" do
6
+ should "be findable by ISO3166-1 Alpha-2 codes" do
7
+ united_states = mock
8
+ united_states.stubs(:iso_country_code => "US")
9
+
10
+ great_britain = mock
11
+ great_britain.stubs(:iso_country_code => "GB")
12
+
13
+ Country.stubs(:find_all).returns([great_britain, united_states])
14
+ Country.find_by_alpha2("us").should == united_states
15
+ end
16
+
17
+ should "be findable by world bank country codes" do
18
+ united_states = mock
19
+ united_states.stubs(:world_bank_country_code => "USA")
20
+
21
+ great_britain = mock
22
+ great_britain.stubs(:world_bank_country_code => "GBR")
23
+
24
+ Country.stubs(:find_all).returns([great_britain, united_states])
25
+ Country.find_by_world_bank_country_code("gbr").should == great_britain
26
+ end
27
+ end
28
+
29
+ context "An instance of the Country class" do
30
+ setup do
31
+ data = read_fixture('country/getCountry.json')
32
+ @listing = Country.new(data.first)
33
+ end
34
+
35
+ should "have an id" do
36
+ @listing.id.should == 55
37
+ end
38
+
39
+ should "have an iso_country_code" do
40
+ @listing.iso_country_code.should == "AF"
41
+ end
42
+
43
+ should "have an world_bank_country_code" do
44
+ @listing.world_bank_country_code.should == "AFG"
45
+ end
46
+
47
+ should "have an name" do
48
+ @listing.name.should == "Afghanistan"
49
+ end
50
+
51
+ should "have an slug" do
52
+ @listing.slug.should == "afghanistan"
53
+ end
54
+
55
+ should "have an lat" do
56
+ @listing.lat.should == 33.78
57
+ end
58
+
59
+ should "have an lon" do
60
+ @listing.lon.should == 66.17
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,44 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ module Etsy
4
+ class FavoriteListingTest < Test::Unit::TestCase
5
+
6
+ context "The FavoriteListing class" do
7
+
8
+ should "be able to find favorite listings for a user" do
9
+ favorite_listings = mock_request('/users/1/favorites/listings', {'key' => 'value'}, 'FavoriteListing', 'findAllFavoriteListings.json')
10
+ FavoriteListing.find_all_user_favorite_listings(1, {'key' => 'value'}).should == favorite_listings
11
+ end
12
+
13
+ should "be able to find favorite listings associated to a listing" do
14
+ favorite_listings = mock_request('/listings/1/favored-by', {'key' => 'value'}, 'FavoriteListing', 'findAllFavoriteListings.json')
15
+ FavoriteListing.find_all_listings_favored_by(1, {'key' => 'value'}).should == favorite_listings
16
+ end
17
+
18
+ end
19
+
20
+ context "An instance of the FavoriteListing class" do
21
+
22
+ context "with response data" do
23
+ setup do
24
+ data = read_fixture('favorite_listing/findAllFavoriteListings.json')
25
+ @favorite_listing = FavoriteListing.new(data.first)
26
+ end
27
+
28
+ should "have a value for :listing_id" do
29
+ @favorite_listing.listing_id.should == 27230877
30
+ end
31
+
32
+ should "have a value for :user_id" do
33
+ @favorite_listing.user_id.should == 1
34
+ end
35
+
36
+ should "have a value for :listing_state" do
37
+ @favorite_listing.listing_state.should == "active"
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,51 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ module Etsy
4
+ class ImageTest < Test::Unit::TestCase
5
+
6
+ context "The Image class" do
7
+
8
+ context "without oauth" do
9
+ should "be able to find all images for a listing" do
10
+ images = mock_request('/listings/1/images', {}, 'Image', 'findAllListingImages.json')
11
+ Image.find_all_by_listing_id(1, {}).should == images
12
+ end
13
+ end
14
+
15
+ context "with options" do
16
+ should "be able to find all images for a listing with options in request" do
17
+ images = mock_request('/listings/1/images', {foo: "bar"}, 'Image', 'findAllListingImages.json')
18
+ Image.find_all_by_listing_id(1, {foo: "bar"}).should == images
19
+ end
20
+ end
21
+ end
22
+
23
+ context "An instance of the Image class" do
24
+
25
+ context "with response data" do
26
+ setup do
27
+ data = read_fixture('image/findAllListingImages.json')
28
+ @image = Image.new(data.first)
29
+ end
30
+
31
+ should "have a value for :square" do
32
+ @image.square.should == "http://ny-image0.etsy.com/il_75x75.185073072.jpg"
33
+ end
34
+
35
+ should "have a value for :small" do
36
+ @image.small.should == "http://ny-image0.etsy.com/il_170x135.185073072.jpg"
37
+ end
38
+
39
+ should "have a value for :thumbnail" do
40
+ @image.thumbnail.should == "http://ny-image0.etsy.com/il_570xN.185073072.jpg"
41
+ end
42
+
43
+ should "have a value for :full" do
44
+ @image.full.should == "http://ny-image0.etsy.com/il_fullxfull.185073072.jpg"
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,268 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ module Etsy
4
+ class ListingTest < Test::Unit::TestCase
5
+
6
+ context "The Listing class" do
7
+
8
+ should "be able to find a single listing" do
9
+ listings = mock_request('/listings/123', {}, 'Listing', 'getListing.single.json')
10
+ Listing.find(123).should == listings.first
11
+ end
12
+
13
+ should "be able to find multiple listings" do
14
+ listings = mock_request('/listings/123,456', {}, 'Listing', 'getListing.multiple.json')
15
+ Listing.find('123', '456').should == listings
16
+ end
17
+
18
+ context "within the scope of a shop" do
19
+
20
+ should "be able to find the first 25 active listings" do
21
+ listings = mock_request('/shops/1/listings/active', {}, 'Listing', 'findAllShopListings.json')
22
+ Listing.find_all_by_shop_id(1).should == listings
23
+ end
24
+
25
+ should "be able to find expired listings" do
26
+ listings = mock_request('/shops/1/listings/expired', {}, 'Listing', 'findAllShopListings.json')
27
+ Listing.find_all_by_shop_id(1, :state => :expired).should == listings
28
+ end
29
+
30
+ should "be able to find inactive listings" do
31
+ listings = mock_request('/shops/1/listings/inactive', {}, 'Listing', 'findAllShopListings.json')
32
+ Listing.find_all_by_shop_id(1, :state => :inactive).should == listings
33
+ end
34
+
35
+ should "be able to find draft listings" do
36
+ listings = mock_request('/shops/1/listings/draft', {}, 'Listing', 'findAllShopListings.json')
37
+ Listing.find_all_by_shop_id(1, :state => :draft).should == listings
38
+ end
39
+
40
+ should "be able to find sold_out listings" do
41
+ listings = mock_request('/shops/1/listings/sold_out', {}, 'Listing', 'findAllShopListings.json')
42
+ Listing.find_all_by_shop_id(1, :state => :sold_out).should == listings
43
+ end
44
+
45
+ should "be able to find featured listings" do
46
+ listings = mock_request('/shops/1/listings/featured', {}, 'Listing', 'findAllShopListings.json')
47
+ Listing.find_all_by_shop_id(1, :state => :featured).should == listings
48
+ end
49
+
50
+ should "be able to find sold listings" do
51
+ transaction_1 = stub(:listing_id => 1)
52
+ transaction_2 = stub(:listing_id => 2)
53
+ transaction_3 = stub(:listing_id => 1)
54
+
55
+ transactions = [transaction_1, transaction_2, transaction_3]
56
+
57
+ Transaction.stubs(:find_all_by_shop_id).with(1, {}).returns(transactions)
58
+ Listing.stubs(:find).with([1, 2], {}).returns(['listings'])
59
+
60
+ Listing.find_all_by_shop_id(1, :state => :sold).should == ['listings']
61
+ end
62
+
63
+ should "defer associations to listings from transaction (sold listings)" do
64
+ transaction_1 = stub(:listing_id => 1)
65
+ transaction_2 = stub(:listing_id => 2)
66
+
67
+ Transaction.stubs(:find_all_by_shop_id).with(1, {}).returns [transaction_1, transaction_2]
68
+ Listing.stubs(:find).with([1, 2], {:includes => :an_association}).returns(['listings'])
69
+
70
+ Listing.find_all_by_shop_id(1, :state => :sold, :includes => :an_association).should == ['listings']
71
+ end
72
+
73
+ should "pass options through to the listing call" do
74
+ transaction_1 = stub(:listing_id => 1)
75
+ transaction_2 = stub(:listing_id => 2)
76
+
77
+ Transaction.stubs(:find_all_by_shop_id).with(1, {:other => :params}).returns [transaction_1, transaction_2]
78
+ Listing.stubs(:find).with([1, 2], {:other => :params}).returns(['listings'])
79
+
80
+ Listing.find_all_by_shop_id(1, :state => :sold, :other => :params).should == ['listings']
81
+
82
+ end
83
+
84
+ should "not ask the API for listings if there are no transactions" do
85
+ Transaction.stubs(:find_all_by_shop_id).with(1, {}).returns([])
86
+ Listing.expects(:find).never
87
+ Listing.sold_listings(1, {})
88
+ end
89
+
90
+ should "be able to override limit and offset" do
91
+ options = {:limit => 100, :offset => 100}
92
+ listings = mock_request('/shops/1/listings/active', options, 'Listing', 'findAllShopListings.json')
93
+ Listing.find_all_by_shop_id(1, options).should == listings
94
+ end
95
+
96
+ should "raise an exception when calling with an invalid state" do
97
+ options = {:state => :awesome}
98
+ lambda { Listing.find_all_by_shop_id(1, options) }.should raise_error(ArgumentError)
99
+ end
100
+
101
+ end
102
+
103
+ context "within the scope of a category" do
104
+ should "be able to find active listings" do
105
+ active_listings = mock_request('/listings/active', {:category => 'accessories'}, 'Listing', 'findAllListingActive.category.json')
106
+ Listing.find_all_active_by_category('accessories').should == active_listings
107
+ end
108
+ end
109
+
110
+ end
111
+
112
+ context "An instance of the Listing class" do
113
+
114
+ context "with response data" do
115
+ setup do
116
+ data = read_fixture('listing/findAllShopListings.json')
117
+ @listing = Listing.new(data.first)
118
+ end
119
+
120
+ should "have a value for :id" do
121
+ @listing.id.should == 59495892
122
+ end
123
+
124
+ should "have a value for :state" do
125
+ @listing.state.should == 'active'
126
+ end
127
+
128
+ should "have a value for :title" do
129
+ @listing.title.should == "initials carved into tree love stamp"
130
+ end
131
+
132
+ should "have a value for :description" do
133
+ @listing.description.should == "there! our initials are now carved deeply into this rough tree bark of memory"
134
+ end
135
+
136
+ should "have a value for :url" do
137
+ @listing.url.should == "http://www.etsy.com/listing/59495892/initials-carved-into-tree-love-stamp"
138
+ end
139
+
140
+ should "have a value for :view_count" do
141
+ @listing.view_count.should == 37
142
+ end
143
+
144
+ should "have a value for :created_at" do
145
+ @listing.created_at.should == Time.at(1287602289)
146
+ end
147
+
148
+ should "have a value for :modified_at" do
149
+ @listing.modified_at.should == Time.at(1287602289)
150
+ end
151
+
152
+ should "have a value for :price" do
153
+ @listing.price.should == "15.00"
154
+ end
155
+
156
+ should "have a value for :quantity" do
157
+ @listing.quantity.should == 1
158
+ end
159
+
160
+ should "have a value for :currency" do
161
+ @listing.currency.should == "USD"
162
+ end
163
+
164
+ should "have a value for :ending_at" do
165
+ @listing.ending_at.should == Time.at(1298178000)
166
+ end
167
+
168
+ should "have a value for :tags" do
169
+ @listing.tags.should == %w(tag_1 tag_2)
170
+ end
171
+
172
+ should "have a value for :materials" do
173
+ @listing.materials.should == %w(material_1 material_2)
174
+ end
175
+
176
+ should "have a value for :hue" do
177
+ @listing.hue.should == 0
178
+ end
179
+
180
+ should "have a value for :saturation" do
181
+ @listing.saturation.should == 0
182
+ end
183
+
184
+ should "have a value for :brightness" do
185
+ @listing.brightness.should == 100
186
+ end
187
+
188
+ should "have a value for :black_and_white?" do
189
+ @listing.black_and_white?.should == false
190
+ end
191
+ end
192
+
193
+ %w(active removed sold_out expired alchemy).each do |state|
194
+ should "know that the listing is #{state}" do
195
+ listing = Listing.new
196
+ listing.expects(:state).with().returns(state.sub('_', ''))
197
+
198
+ listing.send("#{state}?".to_sym).should be(true)
199
+ end
200
+
201
+ should "know that the listing is not #{state}" do
202
+ listing = Listing.new
203
+ listing.expects(:state).with().returns(state.reverse)
204
+
205
+ listing.send("#{state}?".to_sym).should be(false)
206
+ end
207
+ end
208
+
209
+ context "with oauth" do
210
+ should "have a collection of images" do
211
+ listing = Listing.new
212
+ listing.stubs(:id).with().returns(1)
213
+ listing.stubs(:token).with().returns("token")
214
+ listing.stubs(:secret).with().returns("secret")
215
+
216
+ Image.stubs(:find_all_by_listing_id).with(1, {access_token: "token", access_secret: "secret"}).returns('images')
217
+
218
+ listing.images.should == 'images'
219
+ end
220
+ end
221
+
222
+ context "without oauth" do
223
+ should "have a collection of images" do
224
+ listing = Listing.new
225
+ listing.stubs(:id).with().returns(1)
226
+
227
+ Image.stubs(:find_all_by_listing_id).with(1, {}).returns('images')
228
+
229
+ listing.images.should == 'images'
230
+ end
231
+ end
232
+
233
+ context "with included images" do
234
+ should "not hit the API to get images" do
235
+ data = read_fixture('listing/getListing.single.includeImages.json')
236
+ listing = Listing.new(data.first)
237
+ Request.expects(:get).never
238
+
239
+ listing.images
240
+ end
241
+ end
242
+
243
+ should "have a default image" do
244
+ listing = Listing.new
245
+ listing.stubs(:images).with().returns(%w(image_1 image_2))
246
+
247
+ listing.image.should == 'image_1'
248
+ end
249
+
250
+ end
251
+
252
+ context "with favorite listings data" do
253
+ setup do
254
+ data = read_fixture('listing/findAllShopListings.json')
255
+ @listing = Listing.new(data.first)
256
+ listing_1 = stub(:listing_id => @listing.id, :user_id => 1)
257
+ listing_2 = stub(:listing_id => @listing.id, :user_id => 2)
258
+ @favorite_listings = [listing_1, listing_2]
259
+ end
260
+
261
+ should "have all listings" do
262
+ FavoriteListing.stubs(:find_all_listings_favored_by).with(@listing.id, {:access_token => nil, :access_secret => nil}).returns(@favorite_listings)
263
+ User.stubs(:find).with([1, 2], {:access_token => nil, :access_secret => nil}).returns(['users'])
264
+ @listing.admirers({:access_token => nil, :access_secret => nil}).should == ['users']
265
+ end
266
+ end
267
+ end
268
+ end