OSDN Git Service

7177bfc084bf037e59332230d4933aec48cc2cf6
[pettanr/pettanr.git] / spec / models / picture_spec.rb
1 # -*- encoding: utf-8 -*-
2 #実素材
3 require 'spec_helper'
4
5 describe Picture do
6   before do
7     FactoryGirl.create :admin
8     @user = FactoryGirl.create( :user_yas)
9     @author = @user.author
10     @artist = FactoryGirl.create :artist_yas, :author_id => @author.id
11     @other_user = FactoryGirl.create( :user_yas)
12     @other_author = @other_user.author
13     @other_artist = FactoryGirl.create :artist_yas, :author_id => @other_author.id
14     @sp = FactoryGirl.create :system_picture
15     @lg = FactoryGirl.create :license_group
16     @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
17     @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
18   end
19   
20   describe '検証に於いて' do
21     before do
22     end
23     
24     it 'オーソドックスなデータなら通る' do
25       @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
26       @p.should be_valid
27     end
28     
29     context 'original_picture_idを検証するとき' do
30       before do
31         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
32       end
33       it 'テストデータの確認' do
34         @p.original_picture_id = @op.id
35         @p.should be_valid
36       end
37       it 'nullなら失敗する' do
38         @p.original_picture_id = nil
39         @p.should_not be_valid
40       end
41       it '数値でなければ失敗する' do
42         @p.original_picture_id = 'a'
43         @p.should_not be_valid
44       end
45       it '存在する原画でなければ失敗する' do
46         @p.original_picture_id = 0
47         @p.should_not be_valid
48       end
49     end
50     context 'revisionを検証するとき' do
51       before do
52         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
53       end
54       it 'テストデータの確認' do
55         @p.revision = 1
56         @p.should be_valid
57       end
58       it 'nullなら失敗する' do
59         @p.revision = nil
60         @p.should_not be_valid
61       end
62       it '数値でなければ失敗する' do
63         @p.revision = 'a'
64         @p.should_not be_valid
65       end
66     end
67     context 'extを検証するとき' do
68       before do
69         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
70       end
71       it 'テストデータの確認' do
72         @p.ext = 'jpeg'
73         @p.should be_valid
74       end
75       it 'nullなら失敗する' do
76         @p.ext = ''
77         @p.should_not be_valid
78       end
79       it '5文字以上なら失敗する' do
80         @p.ext = 'a'*5
81         @p.should_not be_valid
82       end
83       it 'png,gif,jpeg以外なら失敗する' do
84         @p.ext = 'bmp'
85         @p.should_not be_valid
86       end
87     end
88     context 'widthを検証するとき' do
89       before do
90         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
91       end
92       it 'テストデータの確認' do
93         @p.width = 1
94         @p.should be_valid
95       end
96       it 'nullなら失敗する' do
97         @p.width = nil
98         @p.should_not be_valid
99       end
100       it '数値でなければ失敗する' do
101         @p.width = 'a'
102         @p.should_not be_valid
103       end
104       it '0なら失敗する' do
105         @p.width = '0'
106         @p.should_not be_valid
107       end
108       it '負でも失敗する' do
109         @p.width = -1
110         @p.should_not be_valid
111       end
112     end
113     context 'heightを検証するとき' do
114       before do
115         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
116       end
117       it 'テストデータの確認' do
118         @p.height = 1
119         @p.should be_valid
120       end
121       it 'nullなら失敗する' do
122         @p.height = nil
123         @p.should_not be_valid
124       end
125       it '数値でなければ失敗する' do
126         @p.height = 'a'
127         @p.should_not be_valid
128       end
129       it '0なら失敗する' do
130         @p.height = '0'
131         @p.should_not be_valid
132       end
133       it '負でも失敗する' do
134         @p.height = -1
135         @p.should_not be_valid
136       end
137     end
138     context 'filesizeを検証するとき' do
139       before do
140         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
141       end
142       it 'テストデータの確認' do
143         @p.filesize = 1
144         @p.should be_valid
145       end
146       it 'nullなら失敗する' do
147         @p.filesize = nil
148         @p.should_not be_valid
149       end
150       it '数値でなければ失敗する' do
151         @p.filesize = 'a'
152         @p.should_not be_valid
153       end
154       it '負なら失敗する' do
155         @p.filesize = '-1'
156         @p.should_not be_valid
157       end
158       it '2MB以上なら失敗する' do
159         @p.filesize = 2000000+1
160         @p.should_not be_valid
161       end
162     end
163     context 'artist_idを検証するとき' do
164       before do
165         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
166       end
167       it 'テストデータの確認' do
168         @p.artist_id = @artist.id
169         @p.should be_valid
170       end
171       it 'nullなら失敗する' do
172         @p.artist_id = nil
173         @p.should_not be_valid
174       end
175       it '数値でなければ失敗する' do
176         @p.artist_id = 'a'
177         @p.should_not be_valid
178       end
179       it '存在する絵師でなければ失敗する' do
180         @p.artist_id = 0
181         @p.should_not be_valid
182       end
183     end
184     context 'md5を検証するとき' do
185       before do
186         @p = FactoryGirl.build :picture
187       end
188       it 'テストデータの確認' do
189         @p.md5 = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
190         @p.should be_valid
191       end
192       it 'nullなら失敗する' do
193         @p.md5 = ''
194         @p.should_not be_valid
195       end
196       it '32文字以上なら失敗する' do
197         @p.md5 = 'a'*33
198         @p.should_not be_valid
199       end
200     end
201     context 'license_idを検証するとき' do
202       before do
203         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
204       end
205       it 'テストデータの確認' do
206         @p.license_id = @license.id
207         @p.should be_valid
208       end
209       it 'nullなら失敗する' do
210         @p.license_id = nil
211         @p.should_not be_valid
212       end
213       it '数値でなければ失敗する' do
214         @p.license_id = 'a'
215         @p.should_not be_valid
216       end
217       it '存在するライセンスグループでなければ失敗する' do
218         @p.license_id = 0
219         @p.should_not be_valid
220       end
221     end
222     context 'artist_nameを検証するとき' do
223       before do
224         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
225       end
226       it 'テストデータの確認' do
227         @p.artist_name = 'a'
228         @p.should be_valid
229       end
230       it 'nullなら失敗する' do
231         @p.artist_name = nil
232         @p.should_not be_valid
233       end
234     end
235     context 'classnameを検証するとき' do
236       before do
237         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
238       end
239       it 'テストデータの確認' do
240         @p.classname = 'a'*50
241         @p.should be_valid
242       end
243       it 'nullなら失敗する' do
244         @p.classname = ''
245         @p.should_not be_valid
246       end
247       it '51文字以上なら失敗する' do
248         @p.classname = 'a'*51
249         @p.should_not be_valid
250       end
251     end
252     context 'creditを検証するとき' do
253       before do
254         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
255       end
256       it 'テストデータの確認' do
257         @p.credit = 'a'
258         @p.should be_valid
259       end
260     end
261     context 'settingsを検証するとき' do
262       before do
263         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
264       end
265       it 'テストデータの確認' do
266         @p.settings = 'a'
267         @p.should be_valid
268       end
269     end
270   end
271   describe '補充に於いて' do
272   end
273   describe '最新Revision取得に於いて' do
274     context '初めての原画を公開したとき' do
275       before do
276         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
277       end
278       it 'Revisionは1となる' do
279         @p.new_revision.should eq 1
280       end
281     end
282     context 'HEADが1のとき' do
283       before do
284         FactoryGirl.create :picture, :revision => 1, :original_picture_id => @op.id, :license_id => @license.id
285         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
286       end
287       it 'Revisionは2となる' do
288         @p.new_revision.should eq 2
289       end
290     end
291     context 'HEADが5のとき' do
292       before do
293         FactoryGirl.create :picture, :revision => 1, :original_picture_id => @op.id, :license_id => @license.id
294         FactoryGirl.create :picture, :revision => 5, :original_picture_id => @op.id, :license_id => @license.id
295         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
296       end
297       it 'Revisionは6となる' do
298         @p.new_revision.should eq 6
299       end
300     end
301   end
302   describe '素材からのコピーデータセットに於いて' do
303     before do
304       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
305       attr = {:ext => 'jpeg', :width => 264, :height => 265, :filesize => 266, 
306         :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, 
307         :artist_name => 'tester', :classname => 'Tester', :credit => {:title => 'cap'}.to_json.to_s, :settings => {:set => 1}.to_json.to_s}
308       @rp = FactoryGirl.build :resource_picture, attr
309       @p = FactoryGirl.build :picture
310     end
311     it '素材オブジェクトから属性を取り出して対象実素材にセットしている' do
312       res = @p.copy_data(@rp)
313       @p.ext.should eq 'jpeg'
314       @p.width.should eq 264
315       @p.height.should eq 265
316       @p.filesize.should eq 266
317       @p.artist_id.should eq @artist.id
318       @p.md5.should eq @rp.md5
319       @p.license_id.should eq @license.id
320       @p.original_picture_id.should eq @op.id
321       @p.artist_name.should eq 'tester'
322       @p.classname.should eq 'Tester'
323       @p.credit.should match /title/
324       @p.settings.should match /set/
325     end
326   end
327   
328   describe 'md5重複リストに於いて' do
329     before do
330       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
331       @p = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 0,
332         :original_picture_id => @op.id, :md5 => 'a' * 32
333       @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :picture_id => @p.id
334       @op2 = FactoryGirl.create :original_picture, :artist_id => @artist.id
335       @p2 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 0,
336         :original_picture_id => @op2.id, :md5 => 'b' * 32
337       @op3 = FactoryGirl.create :original_picture, :artist_id => @artist.id
338     end
339     it 'リストを返す' do
340       res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
341       res.is_a?(Array).should be_true
342     end
343     it 'md5が違えば含まない' do
344       res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
345       res.include?(@p2).should be_false
346     end
347     it '同一原画は含まない' do
348       res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
349       res.empty?.should be_true
350     end
351     it '同一原画は旧版でも含まない' do
352       @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
353         :original_picture_id => @op.id, :md5 => 'a' * 32
354       res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
355       res.empty?.should be_true
356     end
357     it '他所の原画なら含む' do
358       @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
359         :original_picture_id => @op2.id, :md5 => 'a' * 32
360       res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
361       res.should eq [@p3]
362     end
363     it '他所の原画でもmd5が違えば含まない' do
364       @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
365         :original_picture_id => @op2.id, :md5 => 'c' * 32
366       res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
367       res.empty?.should be_true
368     end
369     it '更新日時順' do
370       @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
371         :original_picture_id => @op2.id, :md5 => 'a' * 32
372       @p4 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
373         :original_picture_id => @op3.id, :md5 => 'a' * 32, :updated_at => Time.now + 100
374       res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
375       res.should eq [@p4, @p3]
376     end
377   end
378   
379   describe 'md5重複判定に於いて' do
380     before do
381       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
382       @op2 = FactoryGirl.create :original_picture, :artist_id => @artist.id
383       @p = FactoryGirl.create :picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :revision => 0
384       @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :picture_id => @p.id
385     end
386     context '同一原画以外に同じ値があるとき' do
387       before do
388         @p2 = FactoryGirl.create :picture, :artist_id => @artist.id, :original_picture_id => @op2.id, :license_id => @license.id
389       end
390       it 'trueを返す' do
391         res = Picture.exist_by_md5(@p.md5, @p.original_picture_id)
392         res.should be_true
393       end
394     end
395     context '同一原画以外に同じ値がないとき' do
396       it 'falseを返す' do
397         res = Picture.exist_by_md5(@p.md5, @p.original_picture_id)
398         res.should be_false
399       end
400     end
401     context '同一原画に同じ値があるとき' do
402       before do
403         @p2 = FactoryGirl.create :picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :revision => 1
404       end
405       it 'falseを返す' do
406         res = Picture.exist_by_md5(@p.md5, @p.original_picture_id)
407         res.should be_false
408       end
409     end
410   end
411   
412   describe 'head判定に於いて' do
413     before do
414     end
415     context '自身とリンクした素材があるとき' do
416       before do
417         @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
418         @p = FactoryGirl.create :picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id 
419         @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :picture_id => @p.id
420       end
421       it 'trueを返す' do
422         res = @p.head?
423         res.should be_true
424       end
425     end
426     context '自身とリンクした素材がないとき' do
427       before do
428         @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
429         @p = FactoryGirl.create :picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :revision => 0
430         @p2 = FactoryGirl.create :picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :revision => 1
431         @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :picture_id => @p2.id
432       end
433       it 'falseを返す' do
434         res = @p.head?
435         res.should be_false
436       end
437     end
438   end
439   
440   describe '作成に於いて' do
441     before do
442       #RMagickのスタブをおいておく
443       class Mgk ; class Image ; end ; end
444       @filesize = 76543
445       Mgk::Image.stub(:from_blob).with(any_args).and_return([Mgk.new])
446       Mgk.any_instance.stub(:format).with(any_args).and_return('png')
447       Mgk.any_instance.stub(:rows).with(any_args).and_return(200)
448       Mgk.any_instance.stub(:columns).with(any_args).and_return(100)
449       Mgk.any_instance.stub(:filesize).with(any_args).and_return(@filesize)
450       Mgk.any_instance.stub(:to_blob).with(any_args).and_return('data')
451       #原画ファイル削除だけは必ず成功するものとしておく
452       PictureIO::LocalPicture.any_instance.stub(:delete).with(any_args).and_return(true)
453     end
454     context '事前チェック' do
455       before do
456         #すべての処理が正常パターンで通過すれば、一番深い分岐まで通る。
457         #それで外部のメソッド呼び出しだけに着目してテストする。
458         Picture.any_instance.stub(:save).with(any_args).and_return(true)
459         Picture.any_instance.stub(:store_picture).with(any_args).and_return(true)
460         Picture.any_instance.stub(:to_gif?).with(any_args).and_return(true)
461         class GifMgk < Mgk ; end  #store_pictureは二回呼び出される。区別をつけるために
462         @gifmgk = GifMgk.new      #パラメータを二種類用意する。
463         Picture.stub(:png_to_gif).with(any_args).and_return(@gifmgk)
464         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
465       end
466       it '最新Revisionを取得している' do
467         Picture.any_instance.should_receive(:new_revision).with(any_args).exactly(1)
468         res = @p.store(Mgk.new)
469       end
470       it '自身を保存している' do
471         Picture.any_instance.should_receive(:save).with(any_args).exactly(1)
472         res = @p.store(Mgk.new)
473       end
474       it '画像ファイルの作成機能で画像を保存している' do
475         mgk = Mgk.new   #一回目の本画像保存は与えたオブジェクトを使って保存する。
476         Picture.any_instance.stub(:filename).with(any_args).and_return('1.png')
477         Picture.any_instance.should_receive(:store_picture).with(mgk, '1.png').exactly(1)
478         res = @p.store(mgk)
479       end
480       it '自身にgifフォーマット変換対象かを問い合わせている' do
481         Picture.any_instance.should_receive(:to_gif?).with(any_args).exactly(1)
482         res = @p.store(Mgk.new)
483       end
484       it '自身にGifフォーマット変換を依頼している' do
485         Picture.should_receive(:png_to_gif).with(any_args).exactly(1)
486         res = @p.store(Mgk.new)
487       end
488       it '画像ファイルの作成機能でgif画像を保存している' do
489         #二回目の保存はgif変換の結果を渡す。
490         Picture.any_instance.stub(:gifname).with(any_args).and_return('1.gif')
491         Picture.any_instance.should_receive(:store_picture).with(@gifmgk, '1.gif').exactly(1)
492         res = @p.store(Mgk.new)
493       end
494     end
495     context 'つつがなく終わるとき' do
496       before do
497         #すべての処理を正常パターンで通過させ、保存機能をチェックする。
498 #        Picture.any_instance.stub(:save).with(any_args).and_return(true)
499         Picture.any_instance.stub(:store_picture).with(any_args).and_return(true)
500         Picture.any_instance.stub(:to_gif?).with(any_args).and_return(true)
501         class GifMgk < Mgk ; end  #store_pictureは二回呼び出される。区別をつけるために
502         @gifmgk = GifMgk.new      #パラメータを二種類用意する。
503         Picture.stub(:png_to_gif).with(any_args).and_return(@gifmgk)
504         @p = FactoryGirl.build :picture, :revision => nil, :original_picture_id => @op.id, :license_id => @license.id
505       end
506       it 'Trueを返す' do
507         res = @p.store(Mgk.new)
508         res.should be_true
509       end
510       it 'Revisionに最新Revisionセット' do
511         res = @p.store(Mgk.new)
512         @p.revision.should eq 1
513       end
514       it '自身が保存されている' do
515         lambda {
516           res = @p.store(Mgk.new)
517         }.should change Picture, :count
518       end
519     end
520     context 'gif変換なしで、つつがなく終わるとき' do
521       before do
522         #すべての処理を正常パターンで通過させ、保存機能をチェックする。
523         Picture.any_instance.stub(:save).with(any_args).and_return(true)
524         Picture.any_instance.stub(:store_picture).with(any_args).and_return(true)
525         Picture.any_instance.stub(:to_gif?).with(any_args).and_return(false)
526         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
527       end
528       it 'Trueを返す' do
529         res = @p.store(Mgk.new)
530         res.should be_true
531       end
532       it 'gif保存は呼ばれていない' do
533         #二回目の画像作成が呼び出されないで1回こっきりならgif保存は呼ばれていないんだろう。
534         Picture.any_instance.should_receive(:store_picture).with(any_args).exactly(1)
535         res = @p.store(Mgk.new)
536       end
537     end
538     #以下から例外ケース。処理先頭から失敗させていく
539     context '自身の保存に失敗したとき' do
540       before do
541         Picture.any_instance.stub(:save).with(any_args).and_return(false)
542         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
543       end
544       it 'Falseを返す' do
545         res = @p.store(Mgk.new)
546         res.should be_false
547       end
548       it '更新されていない' do
549         @p.store(Mgk.new)
550         @p.should be_a_new Picture
551       end
552     end
553     context '画像の保存に失敗したとき' do
554       before do
555         Picture.any_instance.stub(:save).with(any_args).and_return(true)
556         Picture.any_instance.stub(:store_picture).with(any_args).and_return(false)
557         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
558       end
559       it 'Falseを返す' do
560         res = @p.store(Mgk.new)
561         res.should be_false
562       end
563       it 'gif変換判定は呼ばれていない' do
564         Picture.any_instance.should_not_receive(:to_gif?).with(any_args)
565         res = @p.store(Mgk.new)
566       end
567     end
568     context 'gif変換に失敗したとき' do
569       before do
570         Picture.any_instance.stub(:save).with(any_args).and_return(true)
571         Picture.any_instance.stub(:store_picture).with(any_args).and_return(true)
572         Picture.any_instance.stub(:to_gif?).with(any_args).and_return(true)
573         Picture.stub(:png_to_gif).with(any_args).and_return(false)
574         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
575       end
576       it 'Falseを返す' do
577         res = @p.store(Mgk.new)
578         res.should be_false
579       end
580       it 'gif画像の保存は呼ばれていない' do
581         #本画像の保存があるので、一度は呼ばれる
582         Picture.any_instance.should_receive(:store_picture).with(any_args).exactly(1)
583         res = @p.store(Mgk.new)
584       end
585     end
586     context 'gif画像の保存に失敗したとき' do
587       before do
588         @mgk = Mgk.new
589         Picture.any_instance.stub(:filename).with(any_args).and_return('1.png')
590         Picture.any_instance.stub(:gifname).with(any_args).and_return('1.gif')
591         Picture.any_instance.stub(:save).with(any_args).and_return(true)
592         Picture.any_instance.stub(:store_picture).with(@mgk, '1.png').and_return(true)
593         Picture.any_instance.stub(:to_gif?).with(any_args).and_return(true)
594         class GifMgk < Mgk ; end  #store_pictureは二回呼び出される。区別をつけるために
595         @gifmgk = GifMgk.new      #パラメータを二種類用意する。
596         Picture.stub(:png_to_gif).with(any_args).and_return(@gifmgk)
597         Picture.any_instance.stub(:store_picture).with(@gifmgk, '1.gif').and_return(false)
598         @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
599       end
600       it 'Falseを返す' do
601         res = @p.store(@mgk)
602         res.should be_false
603       end
604     end
605   end
606   
607   describe '反転画像の保存先に於いて' do
608     before do
609       @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
610     end
611     context '禁止のとき' do
612       it 'ベースディレクトリだけを返す' do
613         Picture.any_instance.should_receive(:flag_reverse).with(any_args).and_return(-1)
614         r = @p.subdirs
615         r.should have(1).item 
616       end
617       it 'ベースディレクトリだけを返す' do
618         Picture.any_instance.should_receive(:flag_reverse).with(any_args).and_return(-1)
619         r = @p.subdirs
620         r.first.should eq ''
621       end
622     end
623     context '許可のとき' do
624       it 'ベースディレクトリと反転3種を返す' do
625         Picture.any_instance.should_receive(:flag_reverse).with(any_args).and_return(1)
626         r = @p.subdirs
627         r.should have(4).item 
628       end
629       it 'ベースディレクトリと反転3種を返す' do
630         Picture.any_instance.should_receive(:flag_reverse).with(any_args).and_return(1)
631         r = @p.subdirs
632         r.last.should eq 'vh'
633       end
634     end
635   end
636   
637   describe '画像ファイルの作成に於いて' do
638     #PictureIo経由で画像を保存するための機能。ファイル名に自身のidを使うので事前に自身の保存が必要。
639     before do
640       #RMagickのスタブをおいておく
641       class Mgk ; class Image ; end ; end
642       @filesize = 76543
643       Mgk::Image.stub(:from_blob).with(any_args).and_return([Mgk.new])
644       Mgk.any_instance.stub(:format).with(any_args).and_return('png')
645       Mgk.any_instance.stub(:rows).with(any_args).and_return(200)
646       Mgk.any_instance.stub(:columns).with(any_args).and_return(100)
647       Mgk.any_instance.stub(:filesize).with(any_args).and_return(@filesize)
648       Mgk.any_instance.stub(:to_blob).with(any_args).and_return('data')
649       #原画ファイル削除だけは必ず成功するものとしておく
650       PictureIO::LocalPicture.any_instance.stub(:delete).with(any_args).and_return(true)
651       
652       Picture.any_instance.stub(:subdirs).with(any_args).and_return(['', 'v', 'h', 'vh'])
653       Picture.any_instance.stub(:h).with(any_args).and_return('data')
654       Picture.any_instance.stub(:v).with(any_args).and_return('data')
655       Picture.any_instance.stub(:vh).with(any_args).and_return('data')
656       @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
657     end
658     context '事前チェック' do
659       before do
660         #すべての処理を正常パターンで通過させ、保存機能をチェックする。
661         PictureIO.picture_io.stub(:put).with(any_args).and_return(true)
662       end
663       it '画像ファイルの保存が4回呼ばれる' do
664         PictureIO.picture_io.should_receive(:put).with(any_args).exactly(4)
665         res = @p.store_picture(Mgk.new, '1.png')
666       end
667       it '画像ファイルのベースへの保存が1回呼ばれる' do
668         PictureIO.picture_io.should_receive(:put).with('data', '1.png', '').exactly(1)
669         res = @p.store_picture(Mgk.new, '1.png')
670       end
671       it '画像ファイルの垂直反転への保存が1回呼ばれる' do
672         PictureIO.picture_io.should_receive(:put).with('data', '1.png', 'v').exactly(1)
673         res = @p.store_picture(Mgk.new, '1.png')
674       end
675       it '画像ファイルの水平反転への保存が1回呼ばれる' do
676         PictureIO.picture_io.should_receive(:put).with('data', '1.png', 'h').exactly(1)
677         res = @p.store_picture(Mgk.new, '1.png')
678       end
679       it '画像ファイルの垂直水平反転への保存が1回呼ばれる' do
680         PictureIO.picture_io.should_receive(:put).with('data', '1.png', 'vh').exactly(1)
681         res = @p.store_picture(Mgk.new, '1.png')
682       end
683       it '垂直反転が1回呼ばれる' do
684         Picture.any_instance.should_receive(:v).with(any_args).exactly(1)
685         res = @p.store_picture(Mgk.new, '1.png')
686       end
687       it '水平反転が1回呼ばれる' do
688         Picture.any_instance.should_receive(:h).with(any_args).exactly(1)
689         res = @p.store_picture(Mgk.new, '1.png')
690       end
691       it '垂直水平反転が1回呼ばれる' do
692         Picture.any_instance.should_receive(:vh).with(any_args).exactly(1)
693         res = @p.store_picture(Mgk.new, '1.png')
694       end
695     end
696     context 'つつがなく終わるとき' do
697       before do
698         #すべての処理を正常パターンで通過させ、保存機能をチェックする。
699         PictureIO.picture_io.stub(:put).with(any_args).and_return(true)
700       end
701       it 'Trueを返す' do
702         res = @p.store_picture(Mgk.new, '1.png')
703         res.should be_true
704       end
705     end
706     context '例外ケース' do
707       before do
708         PictureIO.picture_io.stub(:put).with(any_args).and_return(false)
709       end
710       it 'Falseを返す' do
711         res = @p.store_picture(Mgk.new, '1.png')
712         res.should be_false
713       end
714     end
715     
716   end
717   
718   describe 'フラグ展開に於いて' do
719     before do
720       @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id,
721         :settings => "{\"open\": 1, \"commercial\": 2, \"official\": 3, \"attribution\": 4, \"derive\": 5, \"thumbnail\": 6, \"gif_convert\": 7, \"reverse\": 8, \"resize\": 9, \"sync_vh\": 10, \"overlap\": 11}"
722     end
723     context 'json展開チェック' do
724       it '展開してなければ展開して@flagsに保管する' do
725         @p.flags.should_not be_nil
726       end
727       it '展開できなければ{}' do
728         @p.settings += '}'
729         @p.flags.is_a?(Hash).should be_true
730         @p.flags.empty?.should be_true
731       end
732     end
733     context 'openについて' do
734       it '@flag_openに保管する' do
735         @p.flag_open.should_not be_nil
736       end
737       it '本当にフラグHashからじゃなく、変数から取得してる?' do
738         @p.flag_open
739         @p.flags = nil
740         @p.flag_open.should_not be_nil
741       end
742       it '1を返す' do
743         @p.flag_open.should eq 1
744       end
745     end
746     context 'commercialについて' do
747       it '@flag_commercialに保管する' do
748         @p.flag_commercial.should_not be_nil
749       end
750       it '本当にフラグHashからじゃなく、変数から取得してる?' do
751         @p.flag_commercial
752         @p.flags = nil
753         @p.flag_commercial.should_not be_nil
754       end
755       it '2を返す' do
756         @p.flag_commercial.should eq 2
757       end
758     end
759     context 'officialについて' do
760       it '@flag_officialに保管する' do
761         @p.flag_official.should_not be_nil
762       end
763       it '本当にフラグHashからじゃなく、変数から取得してる?' do
764         @p.flag_official
765         @p.flags = nil
766         @p.flag_official.should_not be_nil
767       end
768       it 'を返す' do
769         @p.flag_official.should eq 3
770       end
771     end
772     context 'attributionについて' do
773       it '@flag_attributionに保管する' do
774         @p.flag_attribution.should_not be_nil
775       end
776       it '本当にフラグHashからじゃなく、変数から取得してる?' do
777         @p.flag_attribution
778         @p.flags = nil
779         @p.flag_attribution.should_not be_nil
780       end
781       it '4を返す' do
782         @p.flag_attribution.should eq 4
783       end
784     end
785     context 'deriveについて' do
786       it '@flag_deriveに保管する' do
787         @p.flag_derive.should_not be_nil
788       end
789       it '本当にフラグHashからじゃなく、変数から取得してる?' do
790         @p.flag_derive
791         @p.flags = nil
792         @p.flag_derive.should_not be_nil
793       end
794       it '5を返す' do
795         @p.flag_derive.should eq 5
796       end
797     end
798     context 'thumbnailについて' do
799       it '@flag_thumbnailに保管する' do
800         @p.flag_thumbnail.should_not be_nil
801       end
802       it '本当にフラグHashからじゃなく、変数から取得してる?' do
803         @p.flag_thumbnail
804         @p.flags = nil
805         @p.flag_thumbnail.should_not be_nil
806       end
807       it '6を返す' do
808         @p.flag_thumbnail.should eq 6
809       end
810     end
811     context 'gif_convertについて' do
812       it '@flag_gif_convertに保管する' do
813         @p.flag_gif_convert.should_not be_nil
814       end
815       it '本当にフラグHashからじゃなく、変数から取得してる?' do
816         @p.flag_gif_convert
817         @p.flags = nil
818         @p.flag_gif_convert.should_not be_nil
819       end
820       it '7を返す' do
821         @p.flag_gif_convert.should eq 7
822       end
823     end
824     context 'reverseについて' do
825       it '@flag_reverseに保管する' do
826         @p.flag_reverse.should_not be_nil
827       end
828       it '本当にフラグHashからじゃなく、変数から取得してる?' do
829         @p.flag_reverse
830         @p.flags = nil
831         @p.flag_reverse.should_not be_nil
832       end
833       it '8を返す' do
834         @p.flag_reverse.should eq 8
835       end
836     end
837     context 'resizeについて' do
838       it '@flag_resizeに保管する' do
839         @p.flag_resize.should_not be_nil
840       end
841       it '本当にフラグHashからじゃなく、変数から取得してる?' do
842         @p.flag_resize
843         @p.flags = nil
844         @p.flag_resize.should_not be_nil
845       end
846       it '9を返す' do
847         @p.flag_resize.should eq 9
848       end
849     end
850     context 'sync_vhについて' do
851       it '@flag_sync_vhに保管する' do
852         @p.flag_sync_vh.should_not be_nil
853       end
854       it '本当にフラグHashからじゃなく、変数から取得してる?' do
855         @p.flag_sync_vh
856         @p.flags = nil
857         @p.flag_sync_vh.should_not be_nil
858       end
859       it '10を返す' do
860         @p.flag_sync_vh.should eq 10
861       end
862     end
863     context 'overlapについて' do
864       it '@flag_overlapに保管する' do
865         @p.flag_overlap.should_not be_nil
866       end
867       it '本当にフラグHashからじゃなく、変数から取得してる?' do
868         @p.flag_overlap
869         @p.flags = nil
870         @p.flag_overlap.should_not be_nil
871       end
872       it '11を返す' do
873         @p.flag_overlap.should eq 11
874       end
875     end
876   end
877
878   describe 'クレジットデータに於いて' do
879     before do
880       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
881       @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id, :credit => '{"system_picture_id": 2}'
882     end
883     it 'system_picture_idが入っている' do
884       res = @p.credit_data
885       res["system_picture_id"].should eq 2
886     end
887   end
888   
889 end