rakumarket 0.0.3 → 0.1.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.
data/lib/rakumarket.rb CHANGED
@@ -1,23 +1,24 @@
1
1
  require 'httparty'
2
- require 'hashie'
2
+ require 'nibbler/json'
3
3
 
4
4
  directory = File.expand_path(File.dirname(__FILE__))
5
5
 
6
- Hash.send :include, Hashie::HashExtensions
7
-
8
6
  module Rakumarket
9
7
 
10
- def self.item_search(keyword, options={})
11
- Rakumarket::ItemSearchClient.new.request({:keyword => keyword}.merge(options).hashie_symbolify_keys!)
8
+ def self.item_search(keyword, params={})
9
+ params = {:keyword => keyword}.merge(params).symbolify_keys!
10
+ ItemSearchClient.request(params)
12
11
  end
13
12
 
14
13
  def self.genre_search(genre_id=0, options={})
15
- Rakumarket::GenreSearchClient.new.request({:genre_id => genre_id}.merge(options).hashie_symbolify_keys!)
14
+ params = {:genre_id => genre_id}.merge(options).symbolify_keys!
15
+ GenreSearchClient.request(params)
16
16
  end
17
17
 
18
- #def self.item_code_search(item_code, options={})
19
- # Rakumarket::ItemCodeSearchClient.new.request({:item_code => item_code}.merge(options).hashie_symbolify_keys!)
20
- #end
18
+ def self.item_lookup(item_code, options={})
19
+ params = {:code => item_code}.merge(options).symbolify_keys!
20
+ ItemLookupClient.request(params)
21
+ end
21
22
 
22
23
 
23
24
  class << self
@@ -30,7 +31,7 @@ module Rakumarket
30
31
 
31
32
  def initialize(data)
32
33
  @data = data
33
- super data.status_msg
34
+ super data[:status_msg]
34
35
  end
35
36
  end
36
37
  end
@@ -49,12 +50,8 @@ class Hash
49
50
  keys.map! { |key| convert_key(key) } if respond_to?(:convert_key, true)
50
51
  keys.inject(self.class.new) { |hash, k| hash[k] = self[k] if has_key?(k); hash }
51
52
  end
52
- end
53
53
 
54
- module Hashie::HashExtensions
55
- # Destructively convert all of the keys of a Hash
56
- # to their symbol representations.
57
- def hashie_symbolify_keys!
54
+ def symbolify_keys!
58
55
  self.keys.each do |k|
59
56
  unless Symbol === k
60
57
  self[k.to_sym] = self.delete(k)
@@ -64,6 +61,7 @@ module Hashie::HashExtensions
64
61
  end
65
62
  end
66
63
 
64
+ require File.join(directory, 'rakumarket', 'constants')
65
+ require File.join(directory, 'rakumarket', 'spitter')
66
+ require File.join(directory, 'rakumarket', 'models')
67
67
  require File.join(directory, 'rakumarket', 'client')
68
- require File.join(directory, 'rakumarket', 'item_search_client')
69
- require File.join(directory, 'rakumarket', 'genre_search_client')
data/rakumarket.gemspec CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
13
13
 
14
14
  s.required_rubygems_version = ">= 1.3.6"
15
15
 
16
- s.add_dependency "hashie", ">= 0.1.3"
16
+ s.add_dependency "nibbler", "~> 1.3.0"
17
17
  s.add_dependency "httparty", ">= 0.1.0"
18
18
  s.add_development_dependency "bundler", ">= 1.0.0"
19
19
  s.add_development_dependency "rspec", "~> 2.6"
@@ -0,0 +1,242 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
3
+
4
+ describe Rakumarket::Client do
5
+
6
+ describe "parameters" do
7
+ it "should transform developer_id" do
8
+ params = {:developer_id => "abcd"}
9
+ Rakumarket::Client.new(params).parse.should eq({'developerId' => "abcd"})
10
+ end
11
+ end
12
+
13
+ end
14
+
15
+
16
+ describe Rakumarket::ItemSearchClient do
17
+
18
+ describe "parameters" do
19
+ it "should have an operation by default" do
20
+ params = {}
21
+ Rakumarket::ItemSearchClient.new(params).parse['operation'].should eq("ItemSearch")
22
+ end
23
+
24
+ it "should have a version by default" do
25
+ params = {}
26
+ Rakumarket::ItemSearchClient.new(params).parse['version'].should eq("2010-09-15")
27
+ end
28
+
29
+ it "should have a developer_id by default" do
30
+ params = {}
31
+ Rakumarket::ItemSearchClient.new(params).parse['developerId'].should eq(ENV['DEVELOPER_ID'])
32
+ end
33
+
34
+ it "should transform a keyword" do
35
+ params = {:keyword => "roomba"}
36
+ Rakumarket::ItemSearchClient.new(params).parse['keyword'].should eq("roomba")
37
+ end
38
+
39
+ it "should transform a page" do
40
+ params = {:page => "thepage"}
41
+ Rakumarket::ItemSearchClient.new(params).parse['page'].should eq("thepage")
42
+ end
43
+
44
+ describe "price" do
45
+ before do
46
+ @params = {:price => {:minimum => 20, :maximum => 30}}
47
+ end
48
+
49
+ it "should transform a price minimum" do
50
+ Rakumarket::ItemSearchClient.new(@params).parse['minPrice'].should eq(20)
51
+ end
52
+
53
+ it "should transform a price maximum" do
54
+ Rakumarket::ItemSearchClient.new(@params).parse['maxPrice'].should eq(30)
55
+ end
56
+ end
57
+
58
+ it "should transform a mobile" do
59
+ params = {:mobile => true}
60
+ Rakumarket::ItemSearchClient.new(params).parse['carrier'].should eq("1")
61
+ end
62
+
63
+ describe "shipping" do
64
+ before do
65
+ @params = {:shipping => {:must_ship_international => true, :country => 'france', :must_ship_next_day => true, :next_day_area => "kanagawa", :must_include_cost => true}}
66
+ end
67
+
68
+ it "should transform must_ship_international" do
69
+ Rakumarket::ItemSearchClient.new(@params).parse['shipOverseasFlag'].should eq("1")
70
+ end
71
+
72
+ it "should transform country" do
73
+ Rakumarket::ItemSearchClient.new(@params).parse['shipOverseasArea'].should eq("FR")
74
+ end
75
+
76
+ it "should transform must_ship_next_day" do
77
+ Rakumarket::ItemSearchClient.new(@params).parse['asurakuFlag'].should eq("1")
78
+ end
79
+
80
+ it "should transform next_day_area" do
81
+ Rakumarket::ItemSearchClient.new(@params).parse['asurakuArea'].should eq("14")
82
+ end
83
+
84
+ it "should transform must_include_cost" do
85
+ Rakumarket::ItemSearchClient.new(@params).parse['postageFlag'].should eq("1")
86
+ end
87
+ end
88
+
89
+ it "should transform affiliate_id" do
90
+ params = {:affiliate_id => 123}
91
+ Rakumarket::ItemSearchClient.new(params).parse['affiliateId'].should eq(123)
92
+ end
93
+
94
+ it "should transform call_back" do
95
+ params = {:call_back => "thecallback"}
96
+ Rakumarket::ItemSearchClient.new(params).parse['callBack'].should eq("thecallback")
97
+ end
98
+
99
+ it "should transform items_per_page" do
100
+ params = {:items_per_page => "theitems_per_page"}
101
+ Rakumarket::ItemSearchClient.new(params).parse['hits'].should eq("theitems_per_page")
102
+ end
103
+
104
+ it "should transform shop_code" do
105
+ params = {:shop_code => "theshop_code"}
106
+ Rakumarket::ItemSearchClient.new(params).parse['shopCode'].should eq("theshop_code")
107
+ end
108
+
109
+ it "should transform genre_id" do
110
+ params = {:genre_id => "thegenre_id"}
111
+ Rakumarket::ItemSearchClient.new(params).parse['genreId'].should eq("thegenre_id")
112
+ end
113
+
114
+ it "should transform order" do
115
+ params = {:order => "price asc"}
116
+ Rakumarket::ItemSearchClient.new(params).parse['sort'].should eq("+itemPrice")
117
+ end
118
+
119
+ it "should transform must_be_available" do
120
+ params = {:must_be_available => true}
121
+ Rakumarket::ItemSearchClient.new(params).parse['availability'].should eq("1")
122
+ end
123
+
124
+ it "should transform deep_search" do
125
+ params = {:deep_search => true}
126
+ Rakumarket::ItemSearchClient.new(params).parse['field'].should eq("0")
127
+ end
128
+
129
+ it "should transform must_have_image" do
130
+ params = {:must_have_image => true}
131
+ Rakumarket::ItemSearchClient.new(params).parse['imageFlag'].should eq("1")
132
+ end
133
+
134
+ it "should transform or_search" do
135
+ params = {:or_search => true}
136
+ Rakumarket::ItemSearchClient.new(params).parse['orFlag'].should eq("1")
137
+ end
138
+
139
+ it "should transform exclude_keyword" do
140
+ params = {:exclude_keyword => "dog"}
141
+ Rakumarket::ItemSearchClient.new(params).parse['NGKeyword'].should eq("dog")
142
+ end
143
+
144
+ it "should transform include_genre_info" do
145
+ params = {:include_genre_info => true}
146
+ Rakumarket::ItemSearchClient.new(params).parse['genreInformationFlag'].should eq("1")
147
+ end
148
+
149
+ it "should transform purchase_type" do
150
+ params = {:purchase_type => "normal"}
151
+ Rakumarket::ItemSearchClient.new(params).parse['purchaseType'].should eq(0)
152
+ end
153
+
154
+ it "should transform must_have_point_multiplication" do
155
+ params = {:must_have_point_multiplication => true}
156
+ Rakumarket::ItemSearchClient.new(params).parse['pointRateFlag'].should eq("1")
157
+ end
158
+
159
+ it "should transform point_multiplication_factor" do
160
+ params = {:point_multiplication_factor => 2}
161
+ Rakumarket::ItemSearchClient.new(params).parse['pointRate'].should eq(2)
162
+ end
163
+
164
+ it "should transform must_accept_credit_cards" do
165
+ params = {:must_accept_credit_cards => true}
166
+ Rakumarket::ItemSearchClient.new(params).parse['creditCardFlag'].should eq("1")
167
+ end
168
+ end
169
+
170
+ describe Rakumarket::GenreSearchClient do
171
+
172
+ describe "parameters" do
173
+ it "should have an operation by default" do
174
+ params = {}
175
+ Rakumarket::GenreSearchClient.new(params).parse['operation'].should eq("GenreSearch")
176
+ end
177
+
178
+ it "should have a version by default" do
179
+ params = {}
180
+ Rakumarket::GenreSearchClient.new(params).parse['version'].should eq("2007-04-11")
181
+ end
182
+
183
+ it "should have a developer_id by default" do
184
+ params = {}
185
+ Rakumarket::GenreSearchClient.new(params).parse['developerId'].should eq(ENV['DEVELOPER_ID'])
186
+ end
187
+ end
188
+
189
+ it "should transform genre_id" do
190
+ params = {:genre_id => "abc"}
191
+ Rakumarket::GenreSearchClient.new(params).parse['genreId'].should eq("abc")
192
+ end
193
+
194
+ it "should transform return_immediate_parent" do
195
+ params = {:return_immediate_parent => true}
196
+ Rakumarket::GenreSearchClient.new(params).parse['genrePath'].should eq("0")
197
+ end
198
+ end
199
+
200
+ describe Rakumarket::ItemLookupClient do
201
+
202
+ it "should transform code to itemCode" do
203
+ params = {:code => "abc"}
204
+ Rakumarket::ItemLookupClient.new(params).parse['itemCode'].should eq("abc")
205
+ end
206
+
207
+ context "with mobile" do
208
+ it "should transform mobile to carrier" do
209
+ params = {:mobile => true}
210
+ Rakumarket::ItemLookupClient.new(params).parse.should have_key('carrier')
211
+ end
212
+ it "should transform true to 1" do
213
+ params = {:mobile => true}
214
+ Rakumarket::ItemLookupClient.new(params).parse['carrier'].should eq("1")
215
+ end
216
+ it "should transform false to 0" do
217
+ params = {:mobile => false}
218
+ Rakumarket::ItemLookupClient.new(params).parse['carrier'].should eq("0")
219
+ end
220
+ end
221
+
222
+ describe "parameters" do
223
+ before do
224
+ params = {}
225
+ @request = Rakumarket::ItemLookupClient.new(params)
226
+ end
227
+
228
+ it "should have an operation by default" do
229
+ @request.parse['operation'].should eq("ItemCodeSearch")
230
+ end
231
+
232
+ it "should have a version by default" do
233
+ @request.parse['version'].should eq("2010-08-05")
234
+ end
235
+
236
+ it "should have a developer_id by default" do
237
+ @request.parse['developerId'].should eq(ENV['DEVELOPER_ID'])
238
+ end
239
+ end
240
+
241
+ end
242
+ end
@@ -0,0 +1,257 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
3
+
4
+ describe Rakumarket::ItemList do
5
+ describe "#parse" do
6
+ before do
7
+ @response = {"Body" => {"ItemSearch" => {"Items" => {"Item" => [{"shopOfTheYearFlag" => "0", "pointRate" => "2", "affiliateRate" => "435", "shipOverseasFlag" => "1", "asurakuFlag" => "1", "endTime" => "2012-02-05 14:23", "taxFlag" => "1", "startTime" => "2000-01-01 12:00", "itemCaption" => "thecaption", "catchcopy" => "great item", "mediumImageUrl" => "themediumimage", "imageFlag" => "0", "availability" => "0", "itemCode" => "abc123", "postageFlag" => "0", "itemName" => "Roomba", "smallImageUrl" => "thesmallimage", "itemPrice" => "2000", "pointRateEndTime" => "1999-12-30 09:01", "shopCode" => "theshopcode", "affiliateUrl" => "theaffiliateurl", "shopName" => "theshopname", "asurakuArea" => "神奈川県/滋賀県", "reviewCount" => "3", "shopUrl" => "theshopurl", "creditCardFlag" => "0", "reviewAverage" => "4", "shipOverseasArea" => "フランス/イタリア", "genreId" => "23", "pointRateStartTime" => "2007-03-03 03:33", "itemUrl" => "theurl"}]}, "pageCount" => 100, "hits" => 30, "last" => 30, "count" => 3507, "page" => 1, "carrier" => 0, "first" => 1}}, "Header" => {"Status" => "Success", "Args" => {"Arg" => {"apiVersion" => {"content" => true, "value" => "30"}, "operation" => {"content" => true, "value" => "ItemSearch"}, "developerId" => {"content" => true, "value" => "dffe027ae45a5b59b47ec3514f9cc17b"}, "keyword" => {"content" => true, "value" => "roomba"}, "version" => {"content" => true, "value" => "2010-09-15"}}}, "StatusMsg" => ""}}
8
+ @item_list = Rakumarket::ItemList.parse(@response)
9
+ end
10
+
11
+ it "should parse item_count" do
12
+ @item_list.total_item_count.should eq(3507)
13
+ end
14
+
15
+ it "should parse page_count" do
16
+ @item_list.page_count.should eq(100)
17
+ end
18
+
19
+ it "should parse page" do
20
+ @item_list.page.should eq(1)
21
+ end
22
+
23
+ it "should parse items" do
24
+ @item_list.items.should be_a(Array)
25
+ end
26
+
27
+ describe "items" do
28
+ it "should contain a list of items" do
29
+ items = @item_list.items
30
+ items.first.should be_a(Rakumarket::Item)
31
+ end
32
+
33
+ describe "item" do
34
+ before do
35
+ @item = @item_list.items.first
36
+ end
37
+
38
+ it "should parse name" do
39
+ @item.name.should eq("Roomba")
40
+ end
41
+
42
+ it "should parse catchphrase" do
43
+ @item.catchphrase.should eq("great item")
44
+ end
45
+
46
+ it "should parse code" do
47
+ @item.code.should eq("abc123")
48
+ end
49
+
50
+ it "should parse price" do
51
+ @item.price.should eq('2000')
52
+ end
53
+
54
+ it "should parse caption" do
55
+ @item.caption.should eq("thecaption")
56
+ end
57
+
58
+ it "should parse url" do
59
+ @item.url.should eq("theurl")
60
+ end
61
+
62
+ it "should parse genre_id" do
63
+ @item.genre_id.should eq('23')
64
+ end
65
+
66
+ describe "shop" do
67
+ it "should parse shop name" do
68
+ @item.shop.name.should eq("theshopname")
69
+ end
70
+
71
+ it "should parse shop code" do
72
+ @item.shop.code.should eq("theshopcode")
73
+ end
74
+
75
+ it "should parse shop url" do
76
+ @item.shop.url.should eq("theshopurl")
77
+ end
78
+ end
79
+
80
+ describe "shipping" do
81
+ it "should parse cost_included?" do
82
+ @item.shipping.cost_included?.should be_true
83
+ end
84
+
85
+ it "should parse cost_included? false" do
86
+ @response = {"Body" => {"ItemSearch" => {"Items" => {"Item" => [{"postageFlag" => "1"}]}}}}
87
+ @item = Rakumarket::ItemList.parse(@response).items.first
88
+ @item.shipping.cost_included?.should be_false
89
+ end
90
+
91
+ it "should parse international?" do
92
+ @item.shipping.international?.should be_true
93
+ end
94
+
95
+ it "should parse international? false" do
96
+ @response = {"Body" => {"ItemSearch" => {"Items" => {"Item" => [{"shipOverseasFlag" => "0"}]}}}}
97
+ @item = Rakumarket::ItemList.parse(@response).items.first
98
+ @item.shipping.international?.should be_false
99
+ end
100
+
101
+ it "should parse international? numeric true" do
102
+ @response = {"Body" => {"ItemSearch" => {"Items" => {"Item" => [{"shipOverseasFlag" => 1}]}}}}
103
+ @item = Rakumarket::ItemList.parse(@response).items.first
104
+ @item.shipping.international?.should be_true
105
+ end
106
+
107
+ it "should parse countries" do
108
+ @item.shipping.countries.should eq(["france","italy"])
109
+ end
110
+
111
+ it "should parse next_day?" do
112
+ @item.shipping.next_day?.should be_true
113
+ end
114
+
115
+ it "should parse next_day? false" do
116
+ @response = {"Body" => {"ItemSearch" => {"Items" => {"Item" => [{"asurakuFlag" => "0"}]}}}}
117
+ @item = Rakumarket::ItemList.parse(@response).items.first
118
+ @item.shipping.next_day?.should be_false
119
+ end
120
+
121
+ it "should parse next_day_areas" do
122
+ @item.shipping.next_day_areas.should eq(["kanagawa","shiga"])
123
+ end
124
+ end
125
+
126
+ it "should parse affiliate_url" do
127
+ @item.affiliate_url.should eq("theaffiliateurl")
128
+ end
129
+
130
+ it "should parse has_image?" do
131
+ @item.has_image?.should be_false
132
+ end
133
+
134
+ it "should parse small_image_url" do
135
+ @item.small_image_url.should eq("thesmallimage")
136
+ end
137
+
138
+ it "should parse medium_image_url" do
139
+ @item.medium_image_url.should eq("themediumimage")
140
+ end
141
+
142
+ it "should parse available?" do
143
+ @item.available?.should be_false
144
+ end
145
+
146
+ it "should parse tax_included?" do
147
+ @item.tax_included?.should be_false
148
+ end
149
+
150
+ it "should parse credit_cards_accepted?" do
151
+ @item.credit_cards_accepted?.should be_false
152
+ end
153
+
154
+ it "should parse shop_of_the_year?" do
155
+ @item.shop_of_the_year?.should be_false
156
+ end
157
+
158
+ it "should parse shop_of_the_year? true" do
159
+ @response = {"Body" => {"ItemSearch" => {"Items" => {"Item" => [{"shopOfTheYearFlag" => "1"}]}}}}
160
+ @item = Rakumarket::ItemList.parse(@response).items.first
161
+ @item.shop_of_the_year?.should be_true
162
+ end
163
+
164
+ it "should parse affiliate_rate" do
165
+ @item.affiliate_rate.should eq('435')
166
+ end
167
+
168
+ it "should parse start_time" do
169
+ @item.start_time.should be_a(Time)
170
+ end
171
+
172
+ it "should parse start_time as nil if blank" do
173
+ @response = {"Body" => {"ItemSearch" => {"Items" => {"Item" => [{"startTime" => ""}]}}}}
174
+ @item = Rakumarket::ItemList.parse(@response).items.first
175
+ @item.start_time.should be_nil
176
+ end
177
+
178
+ it "should parse end_time" do
179
+ @item.end_time.should be_a(Time)
180
+ end
181
+
182
+ it "should parse end_time as nil if blank" do
183
+ @response = {"Body" => {"ItemSearch" => {"Items" => {"Item" => [{"endTime" => ""}]}}}}
184
+ @item = Rakumarket::ItemList.parse(@response).items.first
185
+ @item.end_time.should be_nil
186
+ end
187
+
188
+ it "should parse review_count" do
189
+ @item.review_count.should eq("3")
190
+ end
191
+
192
+ it "should parse review_average" do
193
+ @item.review_average.should eq("4")
194
+ end
195
+
196
+ it "should parse point_multiplication_factor" do
197
+ @item.point_multiplication_factor.should eq("2")
198
+ end
199
+
200
+ it "should parse point_multiplication_start_time" do
201
+ @item.point_multiplication_start_time.should be_a(Time)
202
+ end
203
+
204
+ it "should parse point_multiplication_end_time" do
205
+ @item.point_multiplication_end_time.should be_a(Time)
206
+ end
207
+ end
208
+ end
209
+
210
+ end
211
+ end
212
+
213
+ describe Rakumarket::ItemList do
214
+ describe "#parse" do
215
+ context "root" do
216
+ before do
217
+ @response = {"Body" => {"GenreSearch" => {"child" => [{"genreLevel" => 1,"genreName" => "CD・DVD・楽器","genreId" => 101240},{"genreLevel" => 1,"genreName" => "インテリア・寝具・収納","genreId" => 100804},{"genreLevel" => 1,"genreName" => "おもちゃ・ホビー・ゲーム","genreId" => 101164},{"genreLevel" => 1,"genreName" => "キッズ・ベビー・マタニティ","genreId" => 100533},{"genreLevel" => 1,"genreName" => " 日用品雑貨・文房具・手芸","genreId" => 215783},{"genreLevel" => 1,"genreName" => "ジュエリー・アクセサリー","genreId" => 216129},{"genreLevel" => 1,"genreName" => "スポーツ・アウトドア","genreId" => 101070},{"genreLevel" => 1,"genreName" => "ダイエット・健康","genreId" => 100938},{"genreLevel" => 1,"genreName" => "水・ソフトドリンク","genreId" => 100316},{"genreLevel" => 1,"genreName" => "パソコン・周辺機器","genreId" => 100026},{"genreLevel" => 1,"genreName" => "バッグ・小物・ブランド雑貨","genreId" => 216131},{"genreLevel" => 1,"genreName" => "レディースファッション","genreId" => 100371},{"genreLevel" => 1,"genreName" => "花・ガーデン・DIY","genreId" => 100005},{"genreLevel" => 1,"genreName" => "ペット・ペットグッズ","genreId" => 101213},{"genreLevel" => 1,"genreName" => "TV・オーディオ・カメラ","genreId" => 211742},{"genreLevel" => 1,"genreName" => "車・バイク","genreId" => 101114},{"genreLevel" => 1,"genreName" => "食品","genreId" => 100227},{"genreLevel" => 1,"genreName" => "美容・コスメ・香水","genreId" => 100939},{"genreLevel" => 1,"genreName" => "本・雑誌・コミック","genreId" => 200162},{"genreLevel" => 1,"genreName" => "旅行・出張・チケット","genreId" => 101381},{"genreLevel" => 1,"genreName" => "不動産・住まい","genreId" => 200163},{"genreLevel" => 1,"genreName" => "学び・サービス・保険","genreId" => 101438},{"genreLevel" => 1,"genreName" => "百貨店・総合通販・ギフト","genreId" => 100000},{"genreLevel" => 1,"genreName" => "デジタルコンテンツ","genreId" => 402853},{"genreLevel" => 1,"genreName" => "車用品・バイク用品","genreId" => 503190},{"genreLevel" => 1,"genreName" => "インナー・下着・ナイトウエア","genreId" => 100433},{"genreLevel" => 1,"genreName" => "日本酒・焼酎","genreId" => 510901},{"genreLevel" => 1,"genreName" => "ビール・洋酒","genreId" => 510915},{"genreLevel" => 1,"genreName" => "スイーツ・お菓子","genreId" => 551167},{"genreLevel" => 1,"genreName" => "医薬品・コンタクト・介護","genreId" => 551169},{"genreLevel" => 1,"genreName" => "メンズファッション","genreId" => 551177},{"genreLevel" => 1,"genreName" => "靴","genreId" => 558885},{"genreLevel" => 1,"genreName" => "腕時計","genreId" => 558929},{"genreLevel" => 1,"genreName" => "キッチン用品・食器・調理器具","genreId" => 558944},{"genreLevel" => 1,"genreName" => "家電","genreId" => 562637}],"current" => [],"parent" => []}},"Header" => {"Status" => "Success","Args" => {"Arg" => {"apiVersion" => {"content" => true,"value" => "30"},"operation" => {"content" => true,"value" => "GenreSearch"},"developerId" => {"content" => true,"value" => "dffe027ae45a5b59b47ec3514f9cc17b"},"genreId" => {"content" => true,"value" => "0"},"version" => {"content" => true,"value" => "2007-04-11"}}},"StatusMsg" => ""}}
218
+ @genre = Rakumarket::Genre.parse(@response)
219
+ end
220
+
221
+ it 'should parse children' do
222
+ @genre.children.should be_a(Array)
223
+ end
224
+
225
+ it 'should parse child genres' do
226
+ @genre.children.first.should be_a(Rakumarket::Genre)
227
+ end
228
+ end
229
+
230
+ context "child" do
231
+ before do
232
+ @response = {"Body" => {"GenreSearch" => {"child" => [{"genreLevel" => 4,"genreName" => "ドラム式","genreId" => 550648},{"genreLevel" => 4,"genreName" => "全自動(乾燥機能あり)","genreId" => 211835},{"genreLevel" => 4,"genreName" => "全自動(乾燥機能なし)","genreId" => 211851},{"genreLevel" => 4,"genreName" => "2槽式","genreId" => 211859},{"genreLevel" => 4,"genreName" => "洗濯機関連用品","genreId" => 211874},{"genreLevel" => 4,"genreName" => "その他","genreId" => 100180}],"current" => [{"genreLevel" => 3,"genreName" => "洗濯機","genreId" => 204491}],"parent" => [{"genreLevel" => 2,"genreName" => "生活 家電","genreId" => 204200}]}},"Header" => {"Status" => "Success","Args" => {"Arg" => {"apiVersion" => {"content" => true,"value" => "30"},"operation" => {"content" => true,"value" => "GenreSearch"},"developerId" => {"content" => true,"value" => "dffe027ae45a5b59b47ec3514f9cc17b"},"genrePath" => {"content" => true,"value" => "0"},"genreId" => {"content" => true,"value" => "204491"},"version" => {"content" => true,"value" => "2007-04-11"}}},"StatusMsg" => ""}}
233
+ @genre = Rakumarket::Genre.parse(@response)
234
+ end
235
+
236
+ it "should parse id" do
237
+ @genre.id.should eq(204491)
238
+ end
239
+
240
+ it "should parse name" do
241
+ @genre.name.should eq("洗濯機")
242
+ end
243
+
244
+ it "should parse parent" do
245
+ @genre.parent.should be_a(Rakumarket::Genre)
246
+ end
247
+
248
+ it 'should parse children' do
249
+ @genre.children.should be_a(Array)
250
+ end
251
+
252
+ it 'should parse child genres' do
253
+ @genre.children.first.should be_a(Rakumarket::Genre)
254
+ end
255
+ end
256
+ end
257
+ end