OSDN Git Service

f61ef845abc1acec7eafd63e1f699c162c1546ba
[pettanr/pettanr.git] / spec / models / original_picture_spec.rb
1 # -*- encoding: utf-8 -*-
2 require 'spec_helper'
3
4 describe OriginalPicture do
5   before do
6     Factory :admin
7     @user = Factory( :user_yas)
8     @author = @user.author
9     @artist = Factory :artist_yas, :author_id => @author.id
10     @other_user = Factory( :user_yas)
11     @other_author = @other_user.author
12     @other_artist = Factory :artist_yas, :author_id => @other_author.id
13     @license = Factory :license
14   end
15   
16   describe '検証に於いて' do
17     before do
18     end
19     
20     it 'オーソドックスなデータなら通る' do
21       @op = Factory.build :original_picture, :artist_id => @artist.id, :license_id => @license.id
22       @op.should be_valid
23     end
24     
25     context 'extを検証するとき' do
26       before do
27         @op = Factory.build :original_picture, :artist_id => @artist.id, :license_id => @license.id
28       end
29       it 'テストデータの確認' do
30         @op.ext = 'jpeg'
31         @op.should be_valid
32       end
33       it 'nullなら失敗する' do
34         @op.ext = ''
35         @op.should_not be_valid
36       end
37       it '5文字以上なら失敗する' do
38         @op.ext = 'a'*5
39         @op.should_not be_valid
40       end
41       it 'png,gif,jpeg以外なら失敗する' do
42         @op.ext = 'bmp'
43         @op.should_not be_valid
44       end
45     end
46     context 'widthを検証するとき' do
47       before do
48         @op = Factory.build :original_picture, :artist_id => @artist.id, :license_id => @license.id
49       end
50       it 'テストデータの確認' do
51         @op.width = 1
52         @op.should be_valid
53       end
54       it 'nullなら失敗する' do
55         @op.width = nil
56         @op.should_not be_valid
57       end
58       it '数値でなければ失敗する' do
59         @op.width = 'a'
60         @op.should_not be_valid
61       end
62       it '0なら失敗する' do
63         @op.width = '0'
64         @op.should_not be_valid
65       end
66       it '負でも失敗する' do
67         @op.width = -1
68         @op.should_not be_valid
69       end
70     end
71     context 'heightを検証するとき' do
72       before do
73         @op = Factory.build :original_picture, :artist_id => @artist.id, :license_id => @license.id
74       end
75       it 'テストデータの確認' do
76         @op.height = 1
77         @op.should be_valid
78       end
79       it 'nullなら失敗する' do
80         @op.height = nil
81         @op.should_not be_valid
82       end
83       it '数値でなければ失敗する' do
84         @op.height = 'a'
85         @op.should_not be_valid
86       end
87       it '0なら失敗する' do
88         @op.height = '0'
89         @op.should_not be_valid
90       end
91       it '負でも失敗する' do
92         @op.height = -1
93         @op.should_not be_valid
94       end
95     end
96     context 'filesizeを検証するとき' do
97       before do
98         @op = Factory.build :original_picture, :artist_id => @artist.id, :license_id => @license.id
99       end
100       it 'テストデータの確認' do
101         @op.filesize = 1
102         @op.should be_valid
103       end
104       it 'nullなら失敗する' do
105         @op.filesize = nil
106         @op.should_not be_valid
107       end
108       it '数値でなければ失敗する' do
109         @op.filesize = 'a'
110         @op.should_not be_valid
111       end
112       it '負なら失敗する' do
113         @op.filesize = '-1'
114         @op.should_not be_valid
115       end
116       it '2MB以上なら失敗する' do
117         @op.filesize = 2000000+1
118         @op.should_not be_valid
119       end
120     end
121     context 'artist_idを検証するとき' do
122       before do
123         @op = Factory.build :original_picture, :license_id => @license.id
124       end
125       it 'テストデータの確認' do
126         @op.artist_id = @artist.id
127         @op.should be_valid
128       end
129       it 'nullなら失敗する' do
130         @op.artist_id = nil
131         @op.should_not be_valid
132       end
133       it '数値でなければ失敗する' do
134         @op.artist_id = 'a'
135         @op.should_not be_valid
136       end
137       it '存在する絵師でなければ失敗する' do
138         @op.artist_id = 0
139         @op.should_not be_valid
140       end
141     end
142     context 'license_idを検証するとき' do
143       before do
144         @op = Factory.build :original_picture, :artist_id => @artist.id
145       end
146       it 'テストデータの確認' do
147         @op.license_id = @license.id
148         @op.should be_valid
149       end
150       it 'nullなら失敗する' do
151         @op.license_id = nil
152         @op.should_not be_valid
153       end
154       it '数値でなければ失敗する' do
155         @op.license_id = 'a'
156         @op.should_not be_valid
157       end
158       it '存在するlicenseでなければ失敗する' do
159         @op.license_id = 0
160         @op.should_not be_valid
161       end
162     end
163   end
164   
165   describe 'データ補充に於いて' do
166     before do
167     end
168     
169   end
170   
171   describe '作者判定に於いて' do
172     before do
173     end
174     it '自作の原画ならyes' do
175       op = Factory :original_picture, :artist_id => @artist.id
176       op.own?(@author).should == true
177     end
178     it '他人のならno' do
179       op = Factory :original_picture, :artist_id => @other_artist.id
180       op.own?(@author).should == false
181     end
182     it '作家が不明ならno' do
183       op = Factory :original_picture, :artist_id => @artist.id
184       op.own?(nil).should == false
185     end
186     it '作家が絵師でないならno' do
187       other_user = Factory( :user_yas)
188       op = Factory :original_picture, :artist_id => @artist.id
189       op.own?(@other_author).should == false
190     end
191   end
192   describe '単体取得に於いて' do
193     before do
194       @op = Factory :original_picture, :artist_id => @artist.id
195     end
196     it '指定の原画を返す' do
197       pic = OriginalPicture.show @op.id, @artist
198       pic.should eq @op
199     end
200     context '関連テーブルオプションがないとき' do
201       it 'ライセンスと素材を含んでいる' do
202         r = OriginalPicture.show_include_opt
203         r.should eq [:license, :resource_picture]
204       end
205     end
206     context '関連テーブルオプションで絵師を含ませたとき' do
207       it 'ライセンスと素材と作者データを含んでいる' do
208         r = OriginalPicture.show_include_opt(:include => :artist)
209         r.should eq [:license, :resource_picture, :artist]
210       end
211     end
212     context '他人の原画を開こうとしたとき' do
213       it '403Forbidden例外を返す' do
214         lambda{
215           pic = OriginalPicture.show @op.id, @other_artist
216         }.should raise_error(ActiveRecord::Forbidden)
217       end
218     end
219     context '存在しない原画を開こうとしたとき' do
220       it '404RecordNotFound例外を返す' do
221         lambda{
222           pic = OriginalPicture.show 0, @artist
223         }.should raise_error(ActiveRecord::RecordNotFound)
224       end
225     end
226   end
227   describe 'json単体出力オプションに於いて' do
228     it 'includeキーがライセンスと素材を含んでいる' do
229       r = OriginalPicture.show_json_include_opt
230       r[:include].should eq [:license, :resource_picture]
231     end
232   end
233   describe '一覧取得に於いて' do
234     before do
235       @op = Factory :original_picture, :artist_id => @artist.id
236     end
237     context 'page補正について' do
238       it '文字列から数値に変換される' do
239         OriginalPicture.page('8').should eq 8
240       end
241       it 'nilの場合は1になる' do
242         OriginalPicture.page().should eq 1
243       end
244       it '0以下の場合は1になる' do
245         OriginalPicture.page('0').should eq 1
246       end
247     end
248     context 'page_size補正について' do
249       it '文字列から数値に変換される' do
250         OriginalPicture.page_size('7').should eq 7
251       end
252       it 'nilの場合はOriginalPicture.default_page_sizeになる' do
253         OriginalPicture.page_size().should eq OriginalPicture.default_page_size
254       end
255       it '0以下の場合はOriginalPicture.default_page_sizeになる' do
256         OriginalPicture.page_size('0').should eq OriginalPicture.default_page_size
257       end
258       it 'OriginalPicture.max_page_sizeを超えた場合はOriginalPicture.max_page_sizeになる' do
259         OriginalPicture.page_size('1000').should eq OriginalPicture.max_page_size
260       end
261     end
262     it 'リストを返す' do
263       pic = OriginalPicture.list @artist.id
264       pic.should eq [@op]
265     end
266     it '他人の原画は含んでいない' do
267       Factory :original_picture, :artist_id => @other_artist.id
268       pic = OriginalPicture.list @artist.id
269       pic.should eq [@op]
270     end
271     it '時系列で並んでいる' do
272       newpic = Factory :original_picture, :artist_id => @artist.id
273       pic = OriginalPicture.list @artist.id
274       pic.should eq [newpic, @op]
275     end
276     context 'DBに5件あって1ページの件数を2件に変えたとして' do
277       before do
278         @op2 = Factory :original_picture, :artist_id => @artist.id
279         @op3 = Factory :original_picture, :artist_id => @artist.id
280         @op4 = Factory :original_picture, :artist_id => @artist.id
281         @op5 = Factory :original_picture, :artist_id => @artist.id
282         OriginalPicture.stub(:default_page_size).and_return(2)
283       end
284       it '通常は2件を返す' do
285         pic = OriginalPicture.list @artist.id
286         pic.should have(2).items 
287       end
288       it 'page=1なら末尾2件を返す' do
289         #時系列で並んでいる
290         pic = OriginalPicture.list( @artist.id, {}, 1)
291         pic.should eq [@op5, @op4]
292       end
293       it 'page=2なら中間2件を返す' do
294         pic = OriginalPicture.list( @artist.id, {}, 2)
295         pic.should eq [@op3, @op2]
296       end
297       it 'page=3なら先頭1件を返す' do
298         pic = OriginalPicture.list( @artist.id, {}, 3)
299         pic.should eq [@op]
300       end
301     end
302   end
303   describe 'json一覧出力オプションに於いて' do
304     it 'includeキーがライセンスと素材を含んでいる' do
305       r = OriginalPicture.list_json_opt
306       r[:include].should eq [:license, :resource_picture]
307     end
308   end
309   describe 'RMagick変換に於いて' do
310     before do
311       @op = Factory.build :original_picture, :artist_id => @artist.id
312     end
313     context 'つつがなく終わるとき' do
314       it '画像データをオブジェクト化している' do
315         Magick::Image.stub(:from_blob).and_return(['mgkobj'])
316         @op.data_to_mgk('mgkbin').should eq 'mgkobj'
317       end
318     end
319     context '失敗するとき' do
320       it 'Falseを返す' do
321         Magick::Image.should_receive(:from_blob).with(any_args).and_raise('StandardError')
322         @op.data_to_mgk('mgkbin').should be_false
323       end
324       it '全体エラーがセットされている' do
325         Magick::Image.should_receive(:from_blob).with(any_args).and_raise('StandardError')
326         lambda {
327           @op.data_to_mgk('mgkbin')
328         }.should change(@op.errors[:base], :count)
329       end
330     end
331   end
332   describe '作成・更新に於いて' do
333     before do
334       @op = Factory.build :original_picture, :artist_id => @artist.id
335       #RMagickのスタブをおいておく
336       class Mgk ; class Image ; end ; end
337       @filesize = 76543
338       Mgk::Image.stub(:from_blob).with(any_args).and_return([Mgk.new])
339       Mgk.any_instance.stub(:format).with(any_args).and_return('png')
340       Mgk.any_instance.stub(:rows).with(any_args).and_return(200)
341       Mgk.any_instance.stub(:columns).with(any_args).and_return(100)
342       Mgk.any_instance.stub(:filesize).with(any_args).and_return(@filesize)
343       Mgk.any_instance.stub(:to_blob).with(any_args).and_return('data')
344       #原画ファイル削除だけは必ず成功するものとしておく
345       PictureIO::LocalPicture.any_instance.stub(:delete).with(any_args).and_return(true)
346       #素材取得は新規作成ケースでテストしておく
347       ResourcePicture.stub(:update_picture).with(any_args).and_return(
348         Factory.build :resource_picture, :artist_id => @artist.id
349       )
350     end
351     context '事前チェック' do
352       before do
353         #すべての処理が正常パターンで通過すれば、一番深い分岐まで通る。
354         #それで外部のメソッド呼び出しだけに着目してテストする。
355         OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
356         OriginalPicture.any_instance.stub(:save).with(any_args).and_return(true)\r
357         PictureIO::LocalPicture.any_instance.stub(:put).with(any_args).and_return(true)
358         ResourcePicture.any_instance.stub(:store).with(any_args).and_return(true)
359       end
360       it 'RMagick変換を依頼している' do
361         OriginalPicture.any_instance.should_receive(:data_to_mgk).exactly(1)
362         @op.store 'bindata', @artist, @license.id\r
363       end
364       it '自身に属性をセットしている' do
365         OriginalPicture.any_instance.should_receive(:attributes=).exactly(1)
366         @op.store 'bindata', @artist, @license.id\r
367       end
368       it '自身が保存されている' do
369         OriginalPicture.any_instance.should_receive(:save).exactly(1)\r
370         @op.store 'bindata', @artist, @license.id\r
371       end
372       it 'PictureIoに画像データの保存を依頼している' do
373         PictureIO::LocalPicture.any_instance.should_receive(:put).with(any_args).exactly(1)
374         @op.store 'bindata', @artist, @license.id\r
375       end
376       it '素材モデルに対象素材を問い合わせている' do
377         ResourcePicture.should_receive(:update_picture).with(any_args).exactly(1)
378         @op.store 'bindata', @artist, @license.id\r
379       end
380       it '対象素材オブジェクトに保存を依頼している' do
381         ResourcePicture.any_instance.should_receive(:store).with(any_args).exactly(1)
382         @op.store 'bindata', @artist, @license.id\r
383       end
384     end
385     context 'つつがなく終わるとき' do
386       before do
387         #すべての処理を正常パターンで通過させ、保存機能をチェックする。
388         OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
389 #        OriginalPicture.any_instance.stub(:save).with(any_args).and_return(true)\r
390         PictureIO::LocalPicture.any_instance.stub(:put).with(any_args).and_return(true)
391         ResourcePicture.any_instance.stub(:store).with(any_args).and_return(true)
392       end
393       it '自身に属性をセットしている' do
394         lambda {
395           @op.store 'bindata', @artist, @license.id\r
396         }.should change @op, :filesize
397       end
398       it '原画モデルが作成されている' do
399         lambda {
400           @op.store 'bindata', @artist, @license.id
401         }.should change OriginalPicture, :count
402       end
403       it '原画が保存されている' do
404         @op.store 'bindata', @artist, @license.id
405         OriginalPicture.find(@op).should_not be_nil\r
406       end
407       it 'Trueを返す' do
408         @op.store('bindata', @artist, @license.id).should eq true\r
409       end
410     end
411     #以下から例外ケース。処理先頭から失敗させていく
412     context 'RMagick変換が失敗したとき' do
413       before do
414         OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(false)
415       end
416       it 'falseを返す' do
417         @op.store('bindata', @artist, @license.id).should be_false\r
418       end
419       it '自身の保存は呼ばれていない' do
420         OriginalPicture.any_instance.should_not_receive(:save)\r
421       end
422     end
423     context '自身の保存に失敗したとき' do
424       before do
425         OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
426         OriginalPicture.any_instance.stub(:save).with(any_args).and_return(false)\r
427       end
428       it 'falseを返す' do
429         @op.store('bindata', @artist, @license.id).should be_false\r
430       end
431       it '更新されていない' do
432         @op.store('bindata', @artist, @license.id)
433         @op.should be_a_new OriginalPicture\r
434       end
435       it '原画の保存は呼ばれていない' do
436         PictureIO::LocalPicture.any_instance.should_not_receive(:put)\r
437       end
438     end
439     context '原画の保存に失敗したとき' do
440       before do
441         OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
442         OriginalPicture.any_instance.stub(:save).with(any_args).and_return(true)\r
443         PictureIO::LocalPicture.any_instance.stub(:put).with(any_args).and_return(false)
444       end
445       it 'falseを返す' do
446         @op.store('bindata', @artist, @license.id).should be_false\r
447       end
448       it '更新されていない' do
449         @op.store('bindata', @artist, @license.id)\r
450         @op.should be_a_new OriginalPicture\r
451       end
452       it '対象素材オブジェクトの保存は呼ばれていない' do
453         ResourcePicture.any_instance.should_not_receive(:save)\r
454         @op.store('bindata', @artist, @license.id)\r
455       end
456       it '全体エラーメッセージがセットされている' do
457         lambda {
458           @op.store('bindata', @artist, @license.id)\r
459         }.should change(@op.errors[:base], :count)
460       end
461     end
462     context '対象素材オブジェクトの保存に失敗したとき' do
463       before do
464         OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
465         OriginalPicture.any_instance.stub(:save).with(any_args).and_return(true)\r
466         PictureIO::LocalPicture.any_instance.stub(:put).with(any_args).and_return(true)
467         ResourcePicture.any_instance.stub(:store).with(any_args).and_return(false)
468       end
469       it 'falseを返す' do
470         @op.store('bindata', @artist, @license.id).should be_false\r
471       end
472       it '更新されていない' do
473         @op.store('bindata', @artist, @license.id)\r
474         @op.should be_a_new OriginalPicture\r
475       end
476       it '全体エラーメッセージがセットされている' do
477         lambda {
478           @op.store('bindata', @artist, @license.id)\r
479         }.should change(@op.errors[:base], :count)
480       end
481     end
482   end
483 end