OSDN Git Service

t#30339:test
[pettanr/pettanr.git] / spec / models / resource_picture_spec.rb
1 # -*- encoding: utf-8 -*-\r
2 #素材\r
3 require 'spec_helper'\r
4 \r
5 describe ResourcePicture do\r
6   before do\r
7     @admin = FactoryGirl.create :admin\r
8     @user = FactoryGirl.create( :user_yas)\r
9     @author = FactoryGirl.create :author, :user_id => @user.id\r
10     @artist = FactoryGirl.create :artist_yas, :author_id => @author.id\r
11     @other_user = FactoryGirl.create( :user_yas)\r
12     @other_author = FactoryGirl.create :author, :user_id => @other_user.id\r
13     @other_artist = FactoryGirl.create :artist_yas, :author_id => @other_author.id\r
14     @sp = FactoryGirl.create :system_picture\r
15     @lg = FactoryGirl.create :license_group\r
16     @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id\r
17     @original_picture = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
18     \r
19     #原画ファイル削除だけは必ず成功するものとしておく\r
20     PictureIO::LocalPicture.any_instance.stub(:delete).with(any_args).and_return(true)\r
21     Picture.any_instance.stub(:subdirs).with(any_args).and_return(['', 'v', 'h', 'vh'])\r
22     Picture.any_instance.stub(:h).with(any_args).and_return('data')\r
23     Picture.any_instance.stub(:v).with(any_args).and_return('data')\r
24     Picture.any_instance.stub(:vh).with(any_args).and_return('data')\r
25   end\r
26   \r
27   describe '検証に於いて' do\r
28     before do\r
29       @p = FactoryGirl.create :picture, :original_picture_id => @original_picture.id, :license_id => @license.id, :artist_id => @artist.id\r
30       @rp = FactoryGirl.build :resource_picture, :artist_id => @artist.id, :original_picture_id => @original_picture.id, :license_id => @license.id, :picture_id => @p.id\r
31     end\r
32     \r
33     context 'オーソドックスなデータのとき' do\r
34       it '下限データが通る' do\r
35         @rp.ext = 'png' #リストにない拡張子は通らないし\r
36         @rp.width = 1\r
37         @rp.height = 1\r
38         @rp.filesize = 1\r
39         @rp.md5 = 'a'*32\r
40         @rp.classname = 'a'*1\r
41         @rp.should be_valid\r
42       end\r
43       it '上限データが通る' do\r
44         @rp.ext = 'jpeg'\r
45         @rp.width = 99999\r
46         @rp.height = 99999\r
47         @rp.filesize = 2000000\r
48         @rp.md5 = 'a'*32\r
49         @rp.classname = 'a'*50\r
50         @rp.should be_valid\r
51       end\r
52     end\r
53     \r
54     context 'extを検証するとき' do\r
55       it 'nullなら失敗する' do\r
56         @rp.ext = ''\r
57         @rp.should_not be_valid\r
58       end\r
59       it '5文字以上なら失敗する' do\r
60         @rp.ext = 'a'*5\r
61         @rp.should_not be_valid\r
62       end\r
63       it 'png,gif,jpeg以外なら失敗する' do\r
64         @rp.ext = 'bmp'\r
65         @rp.should_not be_valid\r
66       end\r
67     end\r
68     context 'widthを検証するとき' do\r
69       it 'nullなら失敗する' do\r
70         @rp.width = nil\r
71         @rp.should_not be_valid\r
72       end\r
73       it '数値でなければ失敗する' do\r
74         @rp.width = 'a'\r
75         @rp.should_not be_valid\r
76       end\r
77       it '0なら失敗する' do\r
78         @rp.width = '0'\r
79         @rp.should_not be_valid\r
80       end\r
81       it '負でも失敗する' do\r
82         @rp.width = -1\r
83         @rp.should_not be_valid\r
84       end\r
85     end\r
86     context 'heightを検証するとき' do\r
87       it 'nullなら失敗する' do\r
88         @rp.height = nil\r
89         @rp.should_not be_valid\r
90       end\r
91       it '数値でなければ失敗する' do\r
92         @rp.height = 'a'\r
93         @rp.should_not be_valid\r
94       end\r
95       it '0なら失敗する' do\r
96         @rp.height = '0'\r
97         @rp.should_not be_valid\r
98       end\r
99       it '負でも失敗する' do\r
100         @rp.height = -1\r
101         @rp.should_not be_valid\r
102       end\r
103     end\r
104     context 'filesizeを検証するとき' do\r
105       it 'nullなら失敗する' do\r
106         @rp.filesize = nil\r
107         @rp.should_not be_valid\r
108       end\r
109       it '数値でなければ失敗する' do\r
110         @rp.filesize = 'a'\r
111         @rp.should_not be_valid\r
112       end\r
113       it '負なら失敗する' do\r
114         @rp.filesize = '-1'\r
115         @rp.should_not be_valid\r
116       end\r
117       it '2MB以上なら失敗する' do\r
118         @rp.filesize = 2000000+1\r
119         @rp.should_not be_valid\r
120       end\r
121     end\r
122     context 'artist_idを検証するとき' do\r
123       it 'nullなら失敗する' do\r
124         @rp.artist_id = nil\r
125         @rp.should_not be_valid\r
126       end\r
127       it '数値でなければ失敗する' do\r
128         @rp.artist_id = 'a'\r
129         @rp.should_not be_valid\r
130       end\r
131       it '存在する絵師でなければ失敗する' do\r
132         @rp.artist_id = 0\r
133         @rp.should_not be_valid\r
134       end\r
135     end\r
136     context 'md5を検証するとき' do\r
137       it 'nullなら失敗する' do\r
138         @rp.md5 = ''\r
139         @rp.should_not be_valid\r
140       end\r
141       it '31文字なら失敗する' do\r
142         @rp.md5 = 'a'*31\r
143         @rp.should_not be_valid\r
144       end\r
145       it '32文字以上なら失敗する' do\r
146         @rp.md5 = 'a'*33\r
147         @rp.should_not be_valid\r
148       end\r
149     end\r
150     context 'license_idを検証するとき' do\r
151       it 'nullなら失敗する' do\r
152         @rp.license_id = nil\r
153         @rp.should_not be_valid\r
154       end\r
155       it '数値でなければ失敗する' do\r
156         @rp.license_id = 'a'\r
157         @rp.should_not be_valid\r
158       end\r
159       it '存在する絵師でなければ失敗する' do\r
160         @rp.license_id = 0\r
161         @rp.should_not be_valid\r
162       end\r
163     end\r
164     context 'original_picture_idを検証するとき' do\r
165       it 'nullなら失敗する' do\r
166         @rp.original_picture_id = nil\r
167         @rp.should_not be_valid\r
168       end\r
169       it '数値でなければ失敗する' do\r
170         @rp.original_picture_id = 'a'\r
171         @rp.should_not be_valid\r
172       end\r
173       it '存在する原画でなければ失敗する' do\r
174         @rp.original_picture_id = 0\r
175         @rp.should_not be_valid\r
176       end\r
177     end\r
178     context 'artist_nameを検証するとき' do\r
179       it 'nullなら失敗する' do\r
180         @rp.artist_name = nil\r
181         @rp.should_not be_valid\r
182       end\r
183     end\r
184     context 'classnameを検証するとき' do\r
185       it 'nullなら失敗する' do\r
186         @rp.classname = ''\r
187         @rp.should_not be_valid\r
188       end\r
189       it '51文字以上なら失敗する' do\r
190         @rp.classname = 'a'*51\r
191         @rp.should_not be_valid\r
192       end\r
193     end\r
194     context 'creditを検証するとき' do\r
195     end\r
196     context 'settingsを検証するとき' do\r
197     end\r
198     context 'picture_idを検証するとき' do\r
199       it 'nullなら失敗する' do\r
200         @rp.picture_id = nil\r
201         @rp.should_not be_valid\r
202       end\r
203       it '数値でなければ失敗する' do\r
204         @rp.picture_id = 'a'\r
205         @rp.should_not be_valid\r
206       end\r
207       it '存在する実素材でなければ失敗する' do\r
208         @rp.picture_id = 0\r
209         @rp.should_not be_valid\r
210       end\r
211     end\r
212   end\r
213   \r
214   describe 'デフォルト値補充に於いて' do\r
215     it 'defined' do\r
216       @p = FactoryGirl.create :picture, :original_picture_id => @original_picture.id, :license_id => @license.id, :artist_id => @artist.id\r
217       @rp = FactoryGirl.build :resource_picture, :artist_id => @artist.id, :original_picture_id => @original_picture.id, :license_id => @license.id, :picture_id => @p.id\r
218       @rp.supply_default\r
219     end\r
220   end\r
221   \r
222   describe '上書き補充に於いて' do\r
223     before do\r
224       @original_picture.attributes = {:ext => 'gif', :width => 267, :height => 268, :filesize => 269, \r
225         :artist_id => @artist.id }\r
226       @rp = FactoryGirl.build :resource_picture, :original_picture_id => @original_picture.id\r
227     end\r
228     it 'width, height, ext, filesize, md5, original_picture_id, artist_idが設定されている' do\r
229       @rp.overwrite @original_picture\r
230       @rp.width.should eq 267\r
231       @rp.height.should eq 268\r
232       @rp.ext.should eq 'gif'\r
233       @rp.filesize.should eq 269\r
234       @rp.md5.should eq @rp.md5\r
235       @rp.original_picture_id.should eq @original_picture.id\r
236       @rp.artist_id.should eq @artist.id\r
237     end\r
238   end\r
239   \r
240   describe '所持判定に於いて' do\r
241     before do\r
242       @p = FactoryGirl.create :picture, :original_picture_id => @original_picture.id, :license_id => @license.id, :artist_id => @artist.id\r
243       @rp = FactoryGirl.build :resource_picture, :artist_id => @artist.id, :original_picture_id => @original_picture.id, :license_id => @license.id, :picture_id => @p.id\r
244     end\r
245     it '素材を更新することはないので、Falseを返す' do\r
246       @rp.own?(@author).should == false\r
247     end\r
248   end\r
249   \r
250   describe '閲覧許可に於いて' do\r
251     before do\r
252       @p = FactoryGirl.create :picture, :original_picture_id => @original_picture.id, :license_id => @license.id, :artist_id => @artist.id\r
253       @rp = FactoryGirl.build :resource_picture, :artist_id => @artist.id, :original_picture_id => @original_picture.id, :license_id => @license.id, :picture_id => @p.id\r
254     end\r
255     context '検査対象がnil(ゲスト)のとき' do\r
256       context 'クローズドモードのとき' do\r
257         before do\r
258           MagicNumber['run_mode'] = 1\r
259         end\r
260         it '不許可を返す。' do\r
261           r = @rp.visible?(nil)\r
262           r.should be_false\r
263         end\r
264       end\r
265       context 'オープンモードのとき' do\r
266         before do\r
267           MagicNumber['run_mode'] = 0\r
268         end\r
269         it '許可する' do\r
270           r = @rp.visible?(nil)\r
271           r.should be_true\r
272         end\r
273       end\r
274     end\r
275     context '検査対象が作家のとき' do\r
276       it '許可する' do\r
277         r = @rp.visible?(@author)\r
278         r.should == true\r
279       end\r
280     end\r
281     context '検査対象がそれ以外のとき' do\r
282       it '不許可を返す。' do\r
283         r = @rp.visible?(@admin)\r
284         r.should be_false\r
285       end\r
286     end\r
287   end\r
288   \r
289   describe 'ファイル名に於いて' do\r
290     before do\r
291       @p = FactoryGirl.create :picture, :original_picture_id => @original_picture.id, :license_id => @license.id, :artist_id => @artist.id\r
292       @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :original_picture_id => @original_picture.id, :license_id => @license.id, :picture_id => @p.id\r
293     end\r
294     it 'id+拡張子のフォーマットで返す' do\r
295       r = @rp.filename\r
296       r.should eq "#{@rp.id}.png"\r
297     end\r
298   end\r
299   \r
300   describe 'MimeTypeに於いて' do\r
301     before do\r
302       @p = FactoryGirl.create :picture, :original_picture_id => @original_picture.id, :license_id => @license.id, :artist_id => @artist.id\r
303       @rp = FactoryGirl.build :resource_picture, :artist_id => @artist.id, :original_picture_id => @original_picture.id, :license_id => @license.id, :picture_id => @p.id\r
304     end\r
305     it 'image/拡張子のフォーマットで返す' do\r
306       r = @rp.mime_type\r
307       r.should eq "image/png"\r
308     end\r
309   end\r
310   \r
311   describe 'ファイルのurlに於いて' do\r
312     before do\r
313       @p = FactoryGirl.create :picture, :original_picture_id => @original_picture.id, :license_id => @license.id, :artist_id => @artist.id\r
314       @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :original_picture_id => @original_picture.id, :license_id => @license.id, :picture_id => @p.id\r
315       ResourcePicture.any_instance.stub(:filename).and_return('3.gif')\r
316     end\r
317     it 'ファイル名取得を依頼している' do\r
318       ResourcePicture.any_instance.should_receive(:filename).exactly(1)\r
319       @rp.url\r
320     end\r
321     it '/resource_pictures/3.gifのフォーマットで返す' do\r
322       r = @rp.url\r
323       r.should eq "/resource_pictures/3.gif"\r
324     end\r
325   end\r
326   \r
327   describe '一覧取得に於いて' do\r
328     before do\r
329       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
330       @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id\r
331       @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :picture_id => @p.id\r
332     end\r
333     context 'page補正について' do\r
334       it '文字列から数値に変換される' do\r
335         ResourcePicture.page('8').should eq 8\r
336       end\r
337       it 'nilの場合は1になる' do\r
338         ResourcePicture.page().should eq 1\r
339       end\r
340       it '0以下の場合は1になる' do\r
341         ResourcePicture.page('0').should eq 1\r
342       end\r
343     end\r
344     context 'page_size補正について' do\r
345       it '文字列から数値に変換される' do\r
346         ResourcePicture.page_size('7').should eq 7\r
347       end\r
348       it 'nilの場合はResourcePicture.default_page_sizeになる' do\r
349         ResourcePicture.page_size().should eq ResourcePicture.default_page_size\r
350       end\r
351       it '0以下の場合はResourcePicture.default_page_sizeになる' do\r
352         ResourcePicture.page_size('0').should eq ResourcePicture.default_page_size\r
353       end\r
354       it 'ResourcePicture.max_page_sizeを超えた場合はResourcePicture.max_page_sizeになる' do\r
355         ResourcePicture.page_size('1000').should eq ResourcePicture.max_page_size\r
356       end\r
357     end\r
358     it 'リストを返す' do\r
359       r = ResourcePicture.list\r
360       r.should eq [@rp]\r
361     end\r
362     it '時系列で並んでいる' do\r
363       nop = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
364       nrp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => nop.id, :picture_id => @p.id, :updated_at => Time.now + 100\r
365       r = ResourcePicture.list\r
366       r.should eq [nrp, @rp]\r
367     end\r
368     context 'DBに5件あって1ページの件数を2件に変えたとして' do\r
369       before do\r
370         nop2 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
371         @nrp2 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => nop2.id, :picture_id => @p.id, :updated_at => Time.now + 100\r
372         nop3 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
373         @nrp3 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => nop3.id, :picture_id => @p.id, :updated_at => Time.now + 200\r
374         nop4 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
375         @nrp4 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => nop4.id, :picture_id => @p.id, :updated_at => Time.now + 300\r
376         nop5 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
377         @nrp5 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => nop5.id, :picture_id => @p.id, :updated_at => Time.now + 400\r
378         ResourcePicture.stub(:default_page_size).and_return(2)\r
379       end\r
380       it '通常は2件を返す' do\r
381         r = ResourcePicture.list\r
382         r.should have(2).items \r
383       end\r
384       it 'page=1なら末尾2件を返す' do\r
385         #時系列で並んでいる\r
386         r = ResourcePicture.list(1)\r
387         r.should eq [@nrp5, @nrp4]\r
388       end\r
389       it 'page=2なら中間2件を返す' do\r
390         r = ResourcePicture.list(2)\r
391         r.should eq [@nrp3, @nrp2]\r
392       end\r
393       it 'page=3なら先頭1件を返す' do\r
394         r = ResourcePicture.list(3)\r
395         r.should eq [@rp]\r
396       end\r
397     end\r
398     context 'DBに5件あって1ページの件数を2件に変えたとして' do\r
399       before do\r
400         nop2 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
401         @nrp2 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => nop2.id, :picture_id => @p.id, :updated_at => Time.now + 100\r
402         nop3 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
403         @nrp3 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => nop3.id, :picture_id => @p.id, :updated_at => Time.now + 200\r
404         nop4 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
405         @nrp4 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => nop4.id, :picture_id => @p.id, :updated_at => Time.now + 300\r
406         nop5 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
407         @nrp5 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => nop5.id, :picture_id => @p.id, :updated_at => Time.now + 400\r
408         ResourcePicture.stub(:default_page_size).and_return(2)\r
409       end\r
410       it '件数0は全件(5件)を返す' do\r
411         r = ResourcePicture.list 5, 0\r
412         r.should have(5).items \r
413       end\r
414     end\r
415   end\r
416   describe '一覧取得オプションに於いて' do\r
417     it 'includeキーを含んでいる' do\r
418       r = ResourcePicture.list_opt\r
419       r.has_key?(:include).should be_true\r
420     end\r
421     it '3つの項目を含んでいる' do\r
422       r = ResourcePicture.list_opt[:include]\r
423       r.should have(3).items\r
424     end\r
425     it 'ライセンスを含んでいる' do\r
426       r = ResourcePicture.list_opt[:include]\r
427       r.has_key?(:license).should be_true\r
428     end\r
429     it '絵師を含んでいる' do\r
430       r = ResourcePicture.list_opt[:include]\r
431       r.has_key?(:artist).should be_true\r
432     end\r
433     it '実素材を含んでいる' do\r
434       r = ResourcePicture.list_opt[:include]\r
435       r.has_key?(:picture).should be_true\r
436     end\r
437   end\r
438   describe 'json一覧出力オプションに於いて' do\r
439     before do\r
440       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
441       @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id\r
442       @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id\r
443       @sbt = FactoryGirl.create :speech_balloon_template\r
444       @comic = FactoryGirl.create :comic, :author_id => @author.id, :visible => 1\r
445       @panel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 1\r
446       @story = FactoryGirl.create :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id\r
447     end\r
448     it 'ライセンスを含んでいる' do\r
449       r = ResourcePicture.list.to_json ResourcePicture.list_json_opt\r
450       j = JSON.parse r\r
451       i = j.first\r
452       i.has_key?('license').should be_true\r
453     end\r
454     it '絵師を含んでいる' do\r
455       r = ResourcePicture.list.to_json ResourcePicture.list_json_opt\r
456       j = JSON.parse r\r
457       i = j.first\r
458       i.has_key?('artist').should be_true\r
459     end\r
460     it '実素材を含んでいる' do\r
461       r = ResourcePicture.list.to_json ResourcePicture.list_json_opt\r
462       j = JSON.parse r\r
463       i = j.first\r
464       i.has_key?('picture').should be_true\r
465     end\r
466   end\r
467   \r
468   describe '自分の素材一覧取得に於いて' do\r
469     before do\r
470       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
471       @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id\r
472       @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id\r
473     end\r
474     context 'つつがなく終わるとき' do\r
475       it '一覧取得オプションを利用している' do\r
476         ResourcePicture.stub(:list_opt).with(any_args).and_return({})\r
477         ResourcePicture.should_receive(:list_opt).with(any_args).exactly(1)\r
478         r = ResourcePicture.mylist @artist\r
479       end\r
480     end\r
481     it 'リストを返す' do\r
482       c = ResourcePicture.mylist @artist\r
483       c.should eq [@rp]\r
484     end\r
485     it '時系列で並んでいる' do\r
486       nop = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
487       nrp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => nop.id, :picture_id => @p.id, :updated_at => Time.now + 100\r
488       cl = ResourcePicture.mylist @artist\r
489       cl.should eq [nrp, @rp]\r
490     end\r
491     it '他人の素材は含まない' do\r
492       nop = FactoryGirl.create :original_picture, :artist_id => @other_artist.id\r
493       nrp = FactoryGirl.create :resource_picture, :artist_id => @other_artist.id, :license_id => @license.id, :original_picture_id => nop.id, :picture_id => @p.id, :updated_at => Time.now + 100\r
494       cl = ResourcePicture.mylist @artist\r
495       cl.should eq [@rp]\r
496     end\r
497     context 'DBに5件あって1ページの件数を2件に変えたとして' do\r
498       before do\r
499         @op2 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
500         @rp2 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op2.id, :picture_id => @p.id, :updated_at => Time.now + 100\r
501         @op3 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
502         @rp3 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op3.id, :picture_id => @p.id, :updated_at => Time.now + 200\r
503         @op4 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
504         @rp4 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op4.id, :picture_id => @p.id, :updated_at => Time.now + 300\r
505         @op5 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
506         @rp5 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op5.id, :picture_id => @p.id, :updated_at => Time.now + 400\r
507       end\r
508       it '通常は2件を返す' do\r
509         c = ResourcePicture.mylist @artist, 1, 2\r
510         c.should have(2).items \r
511       end\r
512       it 'page=1なら末尾2件を返す' do\r
513         #時系列で並んでいる\r
514         c = ResourcePicture.mylist(@artist, 1, 2)\r
515         c.should eq [@rp5, @rp4]\r
516       end\r
517       it 'page=2なら中間2件を返す' do\r
518         c = ResourcePicture.mylist(@artist, 2, 2)\r
519         c.should eq [@rp3, @rp2]\r
520       end\r
521       it 'page=3なら先頭1件を返す' do\r
522         c = ResourcePicture.mylist(@artist, 3, 2)\r
523         c.should eq [@rp]\r
524       end\r
525     end\r
526     context 'DBに5件あって1ページの件数を0件に変えたとして' do\r
527       before do\r
528         @op2 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
529         @rp2 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op2.id, :picture_id => @p.id, :updated_at => Time.now + 100\r
530         @op3 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
531         @rp3 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op3.id, :picture_id => @p.id, :updated_at => Time.now + 200\r
532         @op4 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
533         @rp4 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op4.id, :picture_id => @p.id, :updated_at => Time.now + 300\r
534         @op5 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
535         @rp5 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op5.id, :picture_id => @p.id, :updated_at => Time.now + 400\r
536         Author.stub(:default_resource_picture_page_size).and_return(2)\r
537       end\r
538       it '通常は全件(5件)を返す' do\r
539         r = ResourcePicture.mylist @artist, 5, 0\r
540         r.should have(5).items \r
541       end\r
542     end\r
543   end\r
544   \r
545   describe '単体取得に於いて' do\r
546     before do\r
547       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
548       @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id\r
549       @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :picture_id => @p.id\r
550     end\r
551     context 'つつがなく終わるとき' do\r
552       it '単体取得オプションを利用している' do\r
553         ResourcePicture.stub(:show_opt).with(any_args).and_return({})\r
554         ResourcePicture.should_receive(:show_opt).with(any_args).exactly(1)\r
555         r = ResourcePicture.show @rp.id, @author\r
556       end\r
557       it '閲覧許可を問い合わせている' do\r
558         ResourcePicture.any_instance.stub(:visible?).with(any_args).and_return(true)\r
559         ResourcePicture.any_instance.should_receive(:visible?).with(any_args).exactly(1)\r
560         r = ResourcePicture.show @rp.id, @author\r
561       end\r
562     end\r
563     it '指定の素材を返す' do\r
564       r = ResourcePicture.show @rp.id, @author\r
565       r.should eq @rp\r
566     end\r
567     context '他人の素材を開こうとしたとき' do\r
568       it '403Forbidden例外を返す' do\r
569         ResourcePicture.any_instance.stub(:visible?).and_return(false)\r
570         lambda{\r
571           r = ResourcePicture.show @rp.id, @other_author\r
572         }.should raise_error(ActiveRecord::Forbidden)\r
573       end\r
574     end\r
575     context '存在しない素材を開こうとしたとき' do\r
576       it '404RecordNotFound例外を返す' do\r
577         lambda{\r
578           r = ResourcePicture.show 0, @author\r
579         }.should raise_error(ActiveRecord::RecordNotFound)\r
580       end\r
581     end\r
582   end\r
583   describe '単体取得オプションに於いて' do\r
584     it 'includeキーを含んでいる' do\r
585       r = ResourcePicture.show_opt\r
586       r.has_key?(:include).should be_true\r
587     end\r
588     it '3つの項目を含んでいる' do\r
589       r = ResourcePicture.show_opt[:include]\r
590       r.should have(3).items\r
591     end\r
592     it 'ライセンスを含んでいる' do\r
593       r = ResourcePicture.show_opt[:include]\r
594       r.has_key?(:license).should be_true\r
595     end\r
596     it '絵師を含んでいる' do\r
597       r = ResourcePicture.show_opt[:include]\r
598       r.has_key?(:artist).should be_true\r
599     end\r
600     it '実素材を含んでいる' do\r
601       r = ResourcePicture.show_opt[:include]\r
602       r.has_key?(:picture).should be_true\r
603     end\r
604   end\r
605   describe 'json単体出力オプションに於いて' do\r
606     before do\r
607       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
608       @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id\r
609       @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id\r
610       @sbt = FactoryGirl.create :speech_balloon_template\r
611       @comic = FactoryGirl.create :comic, :author_id => @author.id, :visible => 1\r
612       @panel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 1\r
613       @story = FactoryGirl.create :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id\r
614     end\r
615     it 'ライセンスを含んでいる' do\r
616       r = ResourcePicture.show(@rp.id, @author).to_json ResourcePicture.show_json_opt\r
617       j = JSON.parse r\r
618       i = j\r
619       i.has_key?('license').should be_true\r
620     end\r
621     it '絵師を含んでいる' do\r
622       r = ResourcePicture.show(@rp.id, @author).to_json ResourcePicture.show_json_opt\r
623       j = JSON.parse r\r
624       i = j\r
625       i.has_key?('artist').should be_true\r
626     end\r
627     it '実素材を含んでいる' do\r
628       r = ResourcePicture.show(@rp.id, @author).to_json ResourcePicture.show_json_opt\r
629       j = JSON.parse r\r
630       i = j\r
631       i.has_key?('picture').should be_true\r
632     end\r
633   end\r
634   \r
635   describe 'フォーマット変換対象判定に於いて' do\r
636     before do\r
637       @rp = FactoryGirl.build :resource_picture, \r
638         :artist_id => @artist.id, :license_id => @license.id\r
639     end\r
640     context '変換するケース' do\r
641       it '画像フォーマットがpngかつライセンスの変換禁止フラグが無効のときTrue' do\r
642         ResourcePicture.any_instance.stub(:flag_gif_convert).with(any_args).and_return(0)\r
643         @rp.ext = 'png'\r
644         @rp.to_gif?.should be_true\r
645       end\r
646     end\r
647     context '変換しないケース' do\r
648       it '画像フォーマットがでない' do\r
649         ResourcePicture.any_instance.stub(:flag_gif_convert).with(any_args).and_return(0)\r
650         @rp.ext = 'gif'\r
651         @rp.to_gif?.should be_false\r
652       end\r
653       it '変換禁止フラグが無効' do\r
654         ResourcePicture.any_instance.stub(:flag_gif_convert).with(any_args).and_return(-1)\r
655         @rp.ext = 'png'\r
656         @rp.to_gif?.should be_false\r
657       end\r
658     end\r
659   end\r
660   \r
661   describe '新規実素材の取得に於いて' do\r
662     before do\r
663       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
664       @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id\r
665       attr = {:original_picture_id => @op.id, :license_id => @license.id, :artist_name => 'tester', \r
666         :credit => '{}', :settings => {:reverse => 1, :gif_convert => 1}.to_json.to_s}\r
667       @rp = FactoryGirl.build :resource_picture, attr\r
668       @imager = ImagerTest.load "abc\ndef\nghi"\r
669     end\r
670     context '事前チェック' do\r
671       before do\r
672         Picture.any_instance.stub(:store).with(any_args).and_return(true)\r
673       end\r
674       it '実素材モデルにデフォルト値補充を依頼している' do\r
675         Picture.any_instance.should_receive(:supply_default).with(any_args).exactly(1)\r
676         r = @rp.new_picture @imager\r
677       end\r
678       it '実素材モデルに上書き補充を依頼している' do\r
679         Picture.any_instance.should_receive(:overwrite).with(any_args).exactly(1)\r
680         r = @rp.new_picture @imager\r
681       end\r
682       it '実素材を保存している' do\r
683         Picture.any_instance.should_receive(:store).with(any_args).exactly(1)\r
684         r = @rp.new_picture @imager\r
685       end\r
686     end\r
687     context 'つつがなく終わるとき' do\r
688       it '保存された実素材を返す' do\r
689         r = @rp.new_picture @imager\r
690         r.is_a?(Picture).should be_true\r
691       end\r
692     end\r
693     #以下から例外ケース。処理先頭から失敗させていく\r
694     context '実素材の保存に失敗したとき' do\r
695       before do\r
696         Picture.any_instance.stub(:store).with(any_args).and_return(false)\r
697       end\r
698       it 'Falseを返す' do\r
699         r = @rp.new_picture @imager\r
700         r.should be_false\r
701       end\r
702       it '自身の全体エラーメッセージにその旨をセットしている' do\r
703         r = @rp.new_picture @imager\r
704         @rp.errors[:base].should_not be_empty\r
705       end\r
706     end\r
707   end\r
708   \r
709   describe '作成・更新に於いて' do\r
710     before do\r
711       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
712       @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id\r
713       attr = {:original_picture_id => @op.id, :picture_id => nil, :license_id => @license.id, :artist_name => 'tester', :classname => 'StandardLicense', :credit => '{}', :settings => {}.to_json.to_s}\r
714       @rp = FactoryGirl.build :resource_picture, attr\r
715       @imager = ImagerTest.load "abc\ndef\nghi"\r
716     end\r
717     context '事前チェック' do\r
718       before do\r
719         #すべての処理が正常パターンで通過すれば、一番深い分岐まで通る。\r
720         #それで外部のメソッド呼び出しだけに着目してテストする。\r
721         OriginalPicture.any_instance.stub(:save).and_return(true)\r
722         ResourcePicture.any_instance.stub(:new_picture).with(any_args).and_return(@p)\r
723         ResourcePicture.any_instance.stub(:store_picture_with_gif).with(any_args).and_return(true)\r
724       end\r
725       it '原画に保存を依頼している' do\r
726         OriginalPicture.any_instance.should_receive(:save).exactly(1)\r
727         r = @rp.store @imager\r
728       end\r
729       it '新規実素材の取得を依頼している' do\r
730         ResourcePicture.any_instance.should_receive(:new_picture).with(any_args).exactly(1)\r
731         r = @rp.store @imager\r
732       end\r
733       it '自身を保存している' do\r
734         ResourcePicture.any_instance.should_receive(:save).with(any_args).exactly(1)\r
735         r = @rp.store @imager\r
736       end\r
737       it 'gif付き画像ファイルの作成・更新機能で画像を保存している' do\r
738         ResourcePicture.any_instance.should_receive(:store_picture_with_gif).with(@imager).exactly(1)\r
739         r = @rp.store @imager\r
740       end\r
741     end\r
742     context 'つつがなく終わるとき' do\r
743       before do\r
744         #すべての処理を正常パターンで通過させ、保存機能をチェックする。\r
745         ResourcePicture.any_instance.stub(:new_picture).with(any_args).and_return(@p)\r
746         ResourcePicture.any_instance.stub(:store_picture_with_gif).with(@imager).and_return(true)\r
747       end\r
748       it 'Trueを返す' do\r
749         r = @rp.store @imager\r
750         r.should be_true\r
751       end\r
752       it '原画の停止日時をクリアする' do\r
753         r = @rp.store @imager\r
754         @rp.original_picture.stopped_at.should be_nil\r
755       end\r
756       it '原画の公開日時に現在時刻をセットする' do\r
757         lambda {\r
758           r = @rp.store @imager\r
759         }.should change(@rp.original_picture, :published_at)\r
760       end\r
761       it '実素材idから最新画像idを取得してセットしている' do\r
762         r = @rp.store @imager\r
763         @rp.picture_id.should eq @p.id\r
764       end\r
765       it '自身が保存されている' do\r
766         lambda {\r
767           r = @rp.store @imager\r
768         }.should change ResourcePicture, :count\r
769       end\r
770     end\r
771     #以下から例外ケース。処理先頭から失敗させていく\r
772     context '原画の保存に失敗したとき' do\r
773       before do\r
774         OriginalPicture.any_instance.stub(:save).and_return(false)\r
775       end\r
776       it 'Falseを返す' do\r
777         r = @rp.unpublish\r
778         r.should be_false\r
779       end\r
780       it 'ロールバックしている' do\r
781         lambda {\r
782           r = @rp.unpublish\r
783         }.should_not change(ResourcePicture, :count)\r
784       end\r
785     end\r
786     context '画像オブジェクトの取得に失敗したとき' do\r
787       before do\r
788         @imager = false\r
789       end\r
790       it 'Falseを返す' do\r
791         r = @rp.store @imager\r
792         r.should be_false\r
793       end\r
794       it '更新されていない' do\r
795         r = @rp.store @imager\r
796         @rp.should be_a_new ResourcePicture\r
797       end\r
798       it '処理を中断してロールバックする' do\r
799         lambda {\r
800           r = @rp.store @imager\r
801         }.should_not change Picture, :count\r
802       end\r
803     end\r
804     context '新規実素材の取得に失敗したとき' do\r
805       before do\r
806         ResourcePicture.any_instance.stub(:new_picture).with(any_args).and_return(false)\r
807       end\r
808       it 'Falseを返す' do\r
809         r = @rp.store @imager\r
810         r.should be_false\r
811       end\r
812       it '更新されていない' do\r
813         r = @rp.store @imager\r
814         @rp.should be_a_new ResourcePicture\r
815       end\r
816       it '処理を中断してロールバックする' do\r
817         lambda {\r
818           r = @rp.store @imager\r
819         }.should_not change Picture, :count\r
820       end\r
821     end\r
822     context '自身の保存に失敗したとき' do\r
823       before do\r
824         ResourcePicture.any_instance.stub(:new_picture).with(any_args).and_return(@p)\r
825         ResourcePicture.any_instance.stub(:save).with(any_args).and_return(false)\r
826       end\r
827       it 'Falseを返す' do\r
828         r = @rp.store @imager\r
829         r.should be_false\r
830       end\r
831       it '更新されていない' do\r
832         r = @rp.store @imager\r
833         @rp.should be_a_new ResourcePicture\r
834       end\r
835       it '処理を中断してロールバックする' do\r
836         lambda {\r
837           r = @rp.store @imager\r
838         }.should_not change Picture, :count\r
839       end\r
840     end\r
841     context 'gif付き画像ファイルの作成・更新機能に失敗したとき' do\r
842       before do\r
843         ResourcePicture.any_instance.stub(:new_picture).with(any_args).and_return(@p)\r
844         ResourcePicture.any_instance.stub(:store_picture_with_gif).with(any_args).and_return(false)\r
845       end\r
846       it 'Falseを返す' do\r
847         r = @rp.store @imager\r
848         r.should be_false\r
849       end\r
850       it '更新されていない' do\r
851         r = @rp.store @imager\r
852         @rp.should be_a_new ResourcePicture\r
853       end\r
854       it '処理を中断してロールバックする' do\r
855         lambda {\r
856           r = @rp.store @imager\r
857         }.should_not change Picture, :count\r
858       end\r
859     end\r
860   end\r
861   \r
862   describe 'gif付き画像ファイルの作成・更新に於いて' do\r
863     before do\r
864       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
865       @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id\r
866       attr = {:original_picture_id => @op.id, :license_id => @license.id, :artist_name => 'tester', :credit => '{}', :settings => {}.to_json.to_s}\r
867       @rp = FactoryGirl.build :resource_picture, attr\r
868       @imager = ImagerTest.load "abc\ndef\nghi"\r
869     end\r
870     context '事前チェック' do\r
871       before do\r
872         #すべての処理が正常パターンで通過すれば、一番深い分岐まで通る。\r
873         #それで外部のメソッド呼び出しだけに着目してテストする。\r
874         ResourcePicture.any_instance.stub(:store_picture).with(any_args).and_return(true)\r
875         ResourcePicture.any_instance.stub(:to_gif?).with(any_args).and_return(true)\r
876         ResourcePicture.any_instance.stub(:filename).with(any_args).and_return('1.png')\r
877         ResourcePicture.any_instance.stub(:gifname).with(any_args).and_return('1.gif')\r
878       end\r
879       it '画像ファイルの作成・更新機能で画像を保存している' do\r
880         #二回目の保存はgif変換の結果を渡す。\r
881         ResourcePicture.any_instance.should_receive(:store_picture).with(any_args).exactly(2)\r
882         r = @rp.store_picture_with_gif @imager\r
883       end\r
884       it '自身にフォーマット変換対象かを問い合わせている' do\r
885         ResourcePicture.any_instance.should_receive(:to_gif?).with(any_args).exactly(1)\r
886         r = @rp.store_picture_with_gif @imager\r
887       end\r
888       it '画像ライブラリにGifフォーマット変換を依頼している' do\r
889         ImagerTest.any_instance.should_receive(:to_gif).with(any_args).exactly(1)\r
890         r = @rp.store_picture_with_gif @imager\r
891       end\r
892     end\r
893     context 'つつがなく終わるとき' do\r
894       before do\r
895         #すべての処理を正常パターンで通過させ、保存機能をチェックする。\r
896         ResourcePicture.any_instance.stub(:store_picture).with(any_args).and_return(true)\r
897         ResourcePicture.any_instance.stub(:to_gif?).with(any_args).and_return(true)\r
898         ResourcePicture.any_instance.stub(:filename).with(any_args).and_return('1.png')\r
899         ResourcePicture.any_instance.stub(:gifname).with(any_args).and_return('1.gif')\r
900       end\r
901       it 'Trueを返す' do\r
902         r = @rp.store_picture_with_gif @imager\r
903         r.should be_true\r
904       end\r
905     end\r
906     context 'gif変換なしで、つつがなく終わるとき' do\r
907       before do\r
908         #すべての処理を正常パターンで通過させ、保存機能をチェックする。\r
909         ResourcePicture.any_instance.stub(:store_picture).with(any_args).and_return(true)\r
910         ResourcePicture.any_instance.stub(:to_gif?).with(any_args).and_return(false)\r
911         ResourcePicture.any_instance.stub(:filename).with(any_args).and_return('1.png')\r
912         ResourcePicture.any_instance.stub(:gifname).with(any_args).and_return('1.gif')\r
913       end\r
914       it 'Trueを返す' do\r
915         r = @rp.store_picture_with_gif @imager\r
916         r.should be_true\r
917       end\r
918       it 'gif保存は呼ばれていない' do\r
919         ResourcePicture.any_instance.should_receive(:store_picture).with(any_args).exactly(1)\r
920         r = @rp.store_picture_with_gif @imager\r
921       end\r
922     end\r
923     #以下から例外ケース。処理先頭から失敗させていく\r
924     context '画像の保存に失敗したとき' do\r
925       before do\r
926         ResourcePicture.any_instance.stub(:store_picture).with(any_args).and_return(false)\r
927       end\r
928       it 'Falseを返す' do\r
929         r = @rp.store_picture_with_gif @imager\r
930         r.should be_false\r
931       end\r
932       it '全体エラーメッセージがセットされている' do\r
933         lambda {\r
934           r = @rp.store_picture_with_gif @imager\r
935         }.should change(@rp.errors[:base], :count)\r
936       end\r
937       it 'gif変換判定は呼ばれていない' do\r
938         ResourcePicture.any_instance.should_not_receive(:to_gif?).with(any_args)\r
939         r = @rp.store_picture_with_gif @imager\r
940       end\r
941     end\r
942     context 'gif変換に失敗したとき' do\r
943       before do\r
944         ResourcePicture.any_instance.stub(:store_picture).with(any_args).and_return(true)\r
945         ResourcePicture.any_instance.stub(:to_gif?).with(any_args).and_return(true)\r
946         ImagerTest.any_instance.stub(:to_gif).with(any_args).and_return(false)\r
947       end\r
948       it 'Falseを返す' do\r
949         r = @rp.store_picture_with_gif @imager\r
950         r.should be_false\r
951       end\r
952       it '全体エラーメッセージがセットされている' do\r
953         lambda {\r
954           r = @rp.store_picture_with_gif @imager\r
955         }.should change(@rp.errors[:base], :count)\r
956       end\r
957       it 'gif画像の保存は呼ばれていない' do\r
958         #本画像の保存があるので、一度は呼ばれる\r
959         ResourcePicture.any_instance.should_receive(:store_picture).with(any_args).exactly(1)\r
960         r = @rp.store_picture_with_gif @imager\r
961       end\r
962     end\r
963     context 'gif画像の保存に失敗したとき' do\r
964       before do\r
965         ResourcePicture.any_instance.stub(:store_picture).with(@imager, '1.png').and_return(true)\r
966         ResourcePicture.any_instance.stub(:to_gif?).with(any_args).and_return(true)\r
967         @gifimager = @imager.to_gif\r
968         ImagerTest.any_instance.stub(:to_gif).with(any_args).and_return(@gifimager)\r
969         ResourcePicture.any_instance.stub(:store_picture).with(@gifimager, '1.gif').and_return(false)\r
970         ResourcePicture.any_instance.stub(:filename).with(any_args).and_return('1.png')\r
971         ResourcePicture.any_instance.stub(:gifname).with(any_args).and_return('1.gif')\r
972       end\r
973       it 'Falseを返す' do\r
974         r = @rp.store_picture_with_gif @imager\r
975         r.should be_false\r
976       end\r
977       it '全体エラーメッセージがセットされている' do\r
978         lambda {\r
979           r = @rp.store_picture_with_gif @imager\r
980         }.should change(@rp.errors[:base], :count)\r
981       end\r
982     end\r
983   end\r
984   \r
985   describe '画像ファイルの作成・更新に於いて' do\r
986     #PictureIo経由で画像を保存するための機能。ファイル名に自身のidを使うので事前に自身の保存が必要。\r
987     before do\r
988       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
989       @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id\r
990       attr = {:original_picture_id => @op.id, :license_id => @license.id, :artist_name => 'tester', :credit => '{}', :settings => {}.to_json.to_s}\r
991       @rp = FactoryGirl.build :resource_picture, attr\r
992       @rp.overwrite @op\r
993       @imager = ImagerTest.load "abc\ndef\nghi"\r
994     end\r
995     context '事前チェック' do\r
996       before do\r
997         #すべての処理を正常パターンで通過させ、保存機能をチェックする。\r
998         PictureIO.resource_picture_io.stub(:put).with(any_args).and_return(true)\r
999         ResourcePicture.any_instance.stub(:flag_thumbnail).with(any_args).and_return(1)\r
1000       end\r
1001       it 'サムネイル化が1回呼ばれる' do\r
1002         ImagerTest.any_instance.should_receive(:to_thumbnail).with(any_args).exactly(1)\r
1003         r = @rp.store_picture(@imager, '1.png')\r
1004       end\r
1005       it '画像ファイルの保存が2回呼ばれる' do\r
1006         PictureIO.resource_picture_io.should_receive(:put).with(any_args).exactly(2)\r
1007         r = @rp.store_picture(@imager, '1.gif')\r
1008       end\r
1009       it '画像ファイルのベースへのサムネイル保存が1回呼ばれる' do\r
1010         PictureIO.resource_picture_io.should_receive(:put).with(@imager.to_thumbnail.binary, '1.gif').exactly(1)\r
1011         r = @rp.store_picture(@imager, '1.gif')\r
1012       end\r
1013       it '画像ファイルのfullへの保存が1回呼ばれる' do\r
1014         PictureIO.resource_picture_io.should_receive(:put).with(@imager.binary, '1.gif', 'full').exactly(1)\r
1015         r = @rp.store_picture(@imager, '1.gif')\r
1016       end\r
1017     end\r
1018     context 'つつがなく終わるとき' do\r
1019       before do\r
1020         #すべての処理を正常パターンで通過させ、保存機能をチェックする。\r
1021         PictureIO.resource_picture_io.stub(:put).with(any_args).and_return(true)\r
1022         ResourcePicture.any_instance.stub(:flag_thumbnail).with(any_args).and_return(1)\r
1023       end\r
1024       it 'Trueを返す' do\r
1025         r = @rp.store_picture(@imager, '1.gif')\r
1026         r.should be_true\r
1027       end\r
1028     end\r
1029     #以下から例外ケース。処理先頭から失敗させていく\r
1030     context 'サムネイル化に失敗したとき' do\r
1031       before do\r
1032         ResourcePicture.any_instance.stub(:flag_thumbnail).with(any_args).and_return(1)\r
1033         ImagerTest.any_instance.stub(:to_thumbnail).with(any_args).and_return(false)\r
1034       end\r
1035       it 'Falseを返す' do\r
1036         r = @rp.store_picture(@imager, '1.gif')\r
1037         r.should be_false\r
1038       end\r
1039       it '画像ファイルの保存は呼ばれていない' do\r
1040         PictureIO.resource_picture_io.should_not_receive(:put).with(any_args)\r
1041         r = @rp.store_picture(@imager, '1.gif')\r
1042       end\r
1043     end\r
1044     context 'サムネイル画像の保存に失敗したとき' do\r
1045       before do\r
1046         ResourcePicture.any_instance.stub(:flag_thumbnail).with(any_args).and_return(1)\r
1047         @tmbimager = @imager.to_thumbnail\r
1048         ImagerTest.any_instance.stub(:to_thumbnail).with(any_args).and_return(@tmbimager)\r
1049         PictureIO.resource_picture_io.stub(:put).with(@tmbimager.binary, '1.gif').and_raise(PictureIO::Error)\r
1050       end\r
1051       it 'Falseを返す' do\r
1052         r = @rp.store_picture(@imager, '1.gif')\r
1053         r.should be_false\r
1054       end\r
1055       it '画像ファイルの保存は呼ばれていない' do\r
1056         PictureIO.resource_picture_io.should_receive(:put).with(any_args).exactly(1)\r
1057         r = @rp.store_picture(@imager, '1.gif')\r
1058       end\r
1059     end\r
1060     context '画像の保存に失敗したとき' do\r
1061       before do\r
1062         ResourcePicture.any_instance.stub(:flag_thumbnail).with(any_args).and_return(1)\r
1063         @tmbimager = @imager.to_thumbnail\r
1064         ImagerTest.any_instance.stub(:to_thumbnail).with(any_args).and_return(@tmbimager)\r
1065         PictureIO.resource_picture_io.stub(:put).with(@tmbimager.binary, '1.gif').and_return(true)\r
1066         PictureIO.resource_picture_io.stub(:put).with(@imager.binary, '1.gif', 'full').and_raise(PictureIO::Error)\r
1067       end\r
1068       it 'Falseを返す' do\r
1069         r = @rp.store_picture(@imager, '1.gif')\r
1070         r.should be_false\r
1071       end\r
1072     end\r
1073     \r
1074   end\r
1075   \r
1076   describe '公開停止に於いて' do\r
1077     before do\r
1078       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
1079       @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id\r
1080       @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id\r
1081       PictureIO.resource_picture_io.stub(:exist?).with(@rp.filename).and_return(true)\r
1082       PictureIO.resource_picture_io.stub(:exist?).with(@rp.filename, 'full').and_return(true)\r
1083     end\r
1084     context '事前チェックしておく' do\r
1085       before do\r
1086         OriginalPicture.any_instance.stub(:save).and_return(true)\r
1087         ResourcePicture.any_instance.stub(:destroy).and_return(true)\r
1088         PictureIO.resource_picture_io.stub(:delete).with(@rp.filename).and_return(true)\r
1089         PictureIO.resource_picture_io.stub(:delete).with(@rp.filename, 'full').and_return(true)\r
1090       end\r
1091       it '原画に保存を依頼している' do\r
1092         OriginalPicture.any_instance.should_receive(:save).exactly(1)\r
1093         r = @rp.unpublish\r
1094       end\r
1095       it '素材モデルに削除を依頼している' do\r
1096         ResourcePicture.any_instance.should_receive(:destroy).exactly(1)\r
1097         r = @rp.unpublish\r
1098       end\r
1099       it '保管庫にサムネイルの画像データ削除を依頼している' do\r
1100         PictureIO.resource_picture_io.should_receive(:delete).with(@rp.filename).exactly(1)\r
1101         r = @rp.unpublish\r
1102       end\r
1103       it '保管庫にフルサイズの画像データ削除を依頼している' do\r
1104         PictureIO.resource_picture_io.should_receive(:delete).with(@rp.filename, 'full').exactly(1)\r
1105         r = @rp.unpublish\r
1106       end\r
1107     end\r
1108     context 'つつがなく終わるとき' do\r
1109       it '自身を削除する' do\r
1110         lambda {\r
1111           r = @rp.unpublish\r
1112         }.should change(ResourcePicture, :count).by(-1)\r
1113         lambda {\r
1114           r = ResourcePicture.find @rp.id\r
1115         }.should raise_error\r
1116       end\r
1117       it '原画の公開日時をクリアする' do\r
1118         r = @rp.store @imager\r
1119         @rp.original_picture.published_at.should be_nil\r
1120       end\r
1121       it '原画の停止日時に現在時刻をセットする' do\r
1122         lambda {\r
1123           r = @rp.unpublish\r
1124         }.should change(@rp.original_picture, :stopped_at)\r
1125       end\r
1126       it 'Trueを返す' do\r
1127         r = @rp.unpublish\r
1128         r.should be_true\r
1129       end\r
1130     end\r
1131     context '原画の保存に失敗したとき' do\r
1132       before do\r
1133         OriginalPicture.any_instance.stub(:save).and_return(false)\r
1134       end\r
1135       it 'Falseを返す' do\r
1136         r = @rp.unpublish\r
1137         r.should be_false\r
1138       end\r
1139       it 'ロールバックしている' do\r
1140         lambda {\r
1141           r = @rp.unpublish\r
1142         }.should_not change(ResourcePicture, :count)\r
1143       end\r
1144     end\r
1145     context '自身の削除に失敗したとき' do\r
1146       before do\r
1147         ResourcePicture.any_instance.stub(:destroy).with(any_args).and_return(false)\r
1148       end\r
1149       it 'Falseを返す' do\r
1150         r = @rp.unpublish\r
1151         r.should be_false\r
1152       end\r
1153       it 'ロールバックしている' do\r
1154         lambda {\r
1155           r = @rp.unpublish\r
1156         }.should_not change(ResourcePicture, :count)\r
1157       end\r
1158     end\r
1159     context 'サムネイル画像の削除に失敗したとき' do\r
1160       before do\r
1161         PictureIO.resource_picture_io.stub(:delete).with(@rp.filename).and_raise(PictureIO::Error)\r
1162         PictureIO.resource_picture_io.stub(:delete).with(@rp.filename, 'full').and_return(true)\r
1163       end\r
1164       it 'Falseを返す' do\r
1165         r = @rp.unpublish\r
1166         r.should be_false\r
1167       end\r
1168       it 'ロールバックしている' do\r
1169         lambda {\r
1170           r = @rp.unpublish\r
1171         }.should_not change(ResourcePicture, :count)\r
1172       end\r
1173     end\r
1174     context 'フルサイズ画像の削除に失敗したとき' do\r
1175       before do\r
1176         PictureIO.resource_picture_io.stub(:delete).with(@rp.filename).and_return(true)\r
1177         PictureIO.resource_picture_io.stub(:delete).with(@rp.filename, 'full').and_raise(PictureIO::Error)\r
1178       end\r
1179       it 'Falseを返す' do\r
1180         r = @rp.unpublish\r
1181         r.should be_false\r
1182       end\r
1183       it 'ロールバックしている' do\r
1184         lambda {\r
1185           r = @rp.unpublish\r
1186         }.should_not change(ResourcePicture, :count)\r
1187       end\r
1188     end\r
1189   end\r
1190   \r
1191   describe 'クレジットデータに於いて' do\r
1192     before do\r
1193       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
1194       @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id\r
1195       attr = {:original_picture_id => @op.id, :license_id => @license.id, :artist_name => 'tester', :credit => '{"system_picture_id": 2}', :settings => {}.to_json.to_s}\r
1196       @rp = FactoryGirl.build :resource_picture, attr\r
1197     end\r
1198     it 'system_picture_idが入っている' do\r
1199       res = @rp.credit_data\r
1200       res["system_picture_id"].should eq 2\r
1201     end\r
1202   end\r
1203   \r
1204 end\r
1205 \r