1 require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
4 fixtures :products, :image_resources, :product_statuses,:categories,:product_styles,:statuses,:suppliers
6 include ActionView::Helpers::NumberHelper
9 @product = products(:valid_product)
11 describe "validateチェック" do
13 @product.small_resource = image_resources(:resource_00001)
14 @product.medium_resource = image_resources(:resource_00001)
17 @product.should be_valid
22 @product.should_not be_valid
25 @product.should_not be_valid
26 @product.name = "あ" * 50
27 @product.should be_valid
28 @product.name = "あ" * 51
29 @product.should_not be_valid
34 @product.should be_valid
36 @product.url = "a" * 300
37 @product.should be_valid
38 @product.url = "a" * 301
39 @product.should_not be_valid
43 @product.key_word = nil
44 @product.should be_valid
46 @product.key_word = "あ" * 99999
47 @product.should be_valid
48 @product.key_word = "a" * 100000
49 @product.should_not be_valid
53 @product.category_id = nil
54 @product.should_not be_valid
59 @product.description = nil
60 @product.should_not be_valid
64 @product.introduction = nil
65 @product.should_not be_valid
69 @product.sale_start_at = date
70 @product.sale_end_at = date
71 @product.should_not be_valid
72 @product.sale_end_at = DateTime.new(2008,1,1)
73 @product.should_not be_valid
77 @product.public_start_at = date
78 @product.public_end_at = date
79 @product.should_not be_valid
80 @product.public_end_at = DateTime.new(2008,1,1)
81 @product.should_not be_valid
87 product = Product.new(:delivery_dates =>1)
88 product.delivery_dates_label.should == Product::DELIVERY_DATE.keys.sort{|a, b| Product::DELIVERY_DATE[a] <=> Product::DELIVERY_DATE[b]}[1]
91 product = Product.new(:permit =>false)
92 product.permit_label.should == "非公開"
96 product.first_product_style.should be_nil
97 @product.first_product_style.should == product_styles(:valid_product)
99 it "最安値と最高値および価格表示" do
100 product = products(:multi_styles_product)
101 min = product_styles(:multi_styles_product_2).sell_price
102 max = product_styles(:multi_styles_product_3).sell_price
103 product.price_range.should == [min,max]
104 product.price_label.should == number_with_delimiter(min) + "~" + number_with_delimiter(max)
106 @product.price_label.should == number_with_delimiter(product_styles(:valid_product).sell_price)
109 product = Product.new(:category_id =>categories(:dai_category).id)
110 product.category_name.should == categories(:dai_category).name
113 product = Product.new(:supplier_id =>suppliers(:one).id)
114 product.supplier_name.should == suppliers(:one).name
119 @product.free_delivery?.should be_false
120 product = products(:campaign_product)
121 product.free_delivery?.should be_true
123 it "販売期間内/公開期間内か判断" do
124 product = products(:sell_stop_product)
125 product.in_sale_term?.should be_false
126 product.in_public_term?.should be_false
127 @product.in_sale_term?.should be_true
128 @product.in_public_term?.should be_true
131 product = Product.new
132 product.have_zaiko?.should be_false
133 product = products(:multi_styles_product)
134 product.have_zaiko?.should be_true
137 search_list = [["products.name like ?", "%スカート%"]]
138 actual_titles,actual_product,act_file_name = getCsv(Product.csv(search_list))
141 act = actual_titles.sort
142 ext = Product.set_field_names.values.sort
145 columns = Product.csv_columns_name
146 actual_product.size.should == 3
148 #ファイル名に「現在時間秒まで」を含めるので、プログラム実行により秒の相違があるのでここで分まで取り切り
149 ext_file_name = "product_#{Time.now.strftime('%Y%m%d%H%M%S')}.csv"
150 act_file_name.slice(0,act_file_name.length-8).should == ext_file_name.slice(0,ext_file_name.length-8)
153 it "商品在庫数CSVダウンロード" do
154 search_list = [["products.name like ?", "%スカート%"]]
155 actual_titles,actual_product,act_file_name = getCsv(Product.actual_count_list_csv(search_list))
158 act = actual_titles.sort
159 ext = ["商品名", "商品コード", "登録更新日", "実在個数"].sort
162 columns = [:name,:code,:updated_at,:actual_count]
163 actual_product.should == [
164 convert(products(:campaign_product),product_styles(:campaign_product),columns) ,
165 convert(products(:sell_stop_product),product_styles(:sell_stop_product),columns),
166 convert(products(:multi_styles_product),product_styles(:multi_styles_product_1),columns),
167 convert(products(:multi_styles_product),product_styles(:multi_styles_product_2),columns),
168 convert(products(:multi_styles_product),product_styles(:multi_styles_product_3),columns)
171 #ファイル名に「現在時間秒まで」を含めるので、プログラム実行により秒の相違があるのでここで分まで取り切り
172 ext_file_name = "actual_count_list_#{Time.now.strftime('%Y%m%d%H%M%S')}.csv"
173 act_file_name.slice(0,act_file_name.length-8).should == ext_file_name.slice(0,ext_file_name.length-8)
176 max_id = Product.maximum(:id)
177 Product.add_by_csv(File.read("#{RAILS_ROOT}/spec/product_csv_upload_for_spec.csv"))
178 max_id.should < Product.maximum(:id)
180 #=========================================
181 #CSVアップロードするときの画像処理が複雑なので、単独テスト
182 #仕様としてCSVファイルに画像Pathが存在、かつ、画像が指定のパスに存在するとき、画像をアップロード
183 #画像パスが空白、あるいは画像が存在しない時、画像IDが指定されれば、その画像IDを使う
186 #1件:小画像パスあり、IDあり、中画像パスなし、IDあり、大画像パスなし、IDなし
187 #1件:小画像パスなし、IDあり、中画像パスあり、IDあり、大画像パスありが画像存在しない、IDあり
191 cnt_image_b = ImageResource.count
192 cnt_image_data_b = ResourceData.count
193 cnt_product_b = Product.count
195 Product.add_by_csv(File.read("#{RAILS_ROOT}/spec/product_csv_upload_image_for_spec.csv"))
199 #1件:小画像ID=18、中画像IDが新規作成、大画像ID=18
200 #1件:小画像IDが新規作成、中画像ID=18、大画像ID=nil
201 #image_resourceのデータ数が2件増やす
202 #resource_dataのデータ数が2件増やす
203 cnt_image_a = ImageResource.count
204 cnt_image_data_a = ResourceData.count
205 cnt_product_a = Product.count
207 (cnt_product_a - cnt_product_b).should == 1
209 product = Product.find_by_id(17)
210 product.small_resource_id.should == 18
211 product.large_resource_id.should == 18
213 product2 = Product.find(:last)
214 product.medium_resource_id.should == 18
215 product2.large_resource_id.should be_nil
216 #CSV画像アップテストは環境により結果が異なるので、ここでテストコードをコメントアウトする
217 pending("CSV画像アップテストは環境により結果が異なるので、ここで関連テストコードをコメントアウトする") do
218 # (cnt_image_a - cnt_image_b).should == 2
219 # (cnt_image_data_a - cnt_image_data_b).should == 2
221 # product.small_resource_id.should == max_img_id
223 # product2.medium_resource_id.should == max_img_id
224 true.should be_false # 保留したい評価
230 it "公開かどうか(ハッシュを配列へ)" do
231 arr = Product::PERMIT_LABEL.to_a
232 Product.permit_select.should == arr
234 it "配送日(ハッシュを配列へ)" do
235 arr = Product::DELIVERY_DATE.to_a
236 Product.delivery_dates_select.should == arr
240 #=====================================================
242 #fixturesデータをCSV形式に変換(比較用)
243 def convert(product,p_style, columns)
248 if [:name].include?(c)
249 arr << (product.name.nil? ? "" : product.name.to_s)
252 #p_style.updated_atとp_style[:updated_at]の結果が違うので特別処理
253 if [:updated_at].include?(c)
254 arr << (p_style[c].nil? ? "" : p_style.updated_at.to_s)
256 arr << (p_style[c].nil? ? "" : p_style[c].to_s)
261 if [:permit].include?(c)
262 arr << (product[c] ? "公開" : "非公開")
263 elsif [:category_name].include?(c)
264 arr << (product.category_name.nil? ? "" : product.category_name)
266 arr << (product[c].nil? ? "" : product[c].to_s)
270 arr.join(",").split(",")
272 #CSVダウンロードデータを比較用データに変換
281 data.split("\n").each_with_index do |d,i|
283 actual_titles = d.split(/\s*,\s*/)
285 actual_product << d.split(/\s*,\s*/)
290 return actual_titles ,actual_product, fileName
293 #結果が同じである場合、1を戻る、結果が違う場合、0を戻る
296 keys = act.attributes.keys
298 #値がnil ""の場合、および id,created_at,updated_atが比較の対象から外し
299 unless ((act[key].blank? && ext[key].blank?) or ["id","created_at","updated_at"].include?(key))
300 #時間系カラムは国際時間、日本時間の原因で特殊処理
301 if ["sale_start_at","sale_end_at","public_start_at","public_end_at","arrival_expected_date","deleted_at"].include?(key)
302 if !act[key].blank? && !ext[key].blank?
303 if (act.send(key) != ext.send(key)) && (act.send(key) != ext.send(key)- 9.hour)
312 if act.send(key)!= ext.send(key)