OSDN Git Service

add url validator
[pettanr/pettanr.git] / spec / models / speech_balloon_template_spec.rb
1 # -*- encoding: utf-8 -*-
2 require 'spec_helper'
3 #フキダシテンプレート
4 describe SpeechBalloonTemplate do
5   before do
6     #テストデータを用意してね
7     @f = Rails.root + 'spec/json/speech_balloon_template.json'
8     @t = File.open(@f, 'r').read
9     @j = JSON.parse @t
10     @fs = Rails.root + 'spec/json/speech_balloon_templates.json'
11     @ts = File.open(@fs, 'r').read
12     @js = JSON.parse @ts
13     @fes = Rails.root + 'spec/json/invalid_speech_balloon_templates.json'
14     @tes = File.open(@fes, 'r').read
15     @jes = JSON.parse @tes
16     
17     @admin = Factory :admin
18     @license = Factory :license
19   end
20   
21   describe '検証に於いて' do
22     before do
23     end
24     
25     it 'オーソドックスなデータなら通る' do
26       @st = Factory.build :speech_balloon_template
27       @st.should be_valid
28     end
29     
30     context 'nameを検証するとき' do
31       before do
32         @st = Factory.build :speech_balloon_template
33       end
34       it 'テストデータの確認' do
35         @st.name = 'abcdefghi0abcdefghi0abcdefghi0abcdefghi0abcdefghi0'
36         @st.should be_valid
37       end
38       it 'nullなら失敗する' do
39         @st.name = ''
40         @st.should_not be_valid
41       end
42       it '51文字以上なら失敗する' do
43         @st.name = 'a'*51
44         @st.should_not be_valid
45       end
46     end
47     context 'classnameを検証するとき' do
48       before do
49         @st = Factory.build :speech_balloon_template
50       end
51       it 'テストデータの確認' do
52         @st.classname = 'abcdefghi0abcdefghi0abcdefghi0abcdefghi0abcdefghi0'
53         @st.should be_valid
54       end
55       it 'nullなら失敗する' do
56         @st.classname = ''
57         @st.should_not be_valid
58       end
59       it '51文字以上なら失敗する' do
60         @st.classname = 'a'*51
61         @st.should_not be_valid
62       end
63     end
64     context 'captionを検証するとき' do
65       before do
66         @st = Factory.build :speech_balloon_template
67       end
68       it 'テストデータの確認' do
69         @st.caption = 'abcdefghi0abcdefghi0abcdefghi0'
70         @st.should be_valid
71       end
72       it 'nullなら失敗する' do
73         @st.caption = ''
74         @st.should_not be_valid
75       end
76       it '31文字以上なら失敗する' do
77         @st.caption = 'a'*31
78         @st.should_not be_valid
79       end
80     end
81     context 'tを検証するとき' do
82       before do
83         @st = Factory.build :speech_balloon_template
84       end
85       it 'テストデータの確認' do
86         @st.t = 0
87         @st.should be_valid
88       end
89       it 'nullなら失敗する' do
90         @st.t = nil
91         @st.should_not be_valid
92       end
93       it '数値でなければ失敗する' do
94         @st.t = 'a'
95         @st.should_not be_valid
96       end
97       it '負なら失敗する' do
98         @st.t = -1
99         @st.should_not be_valid
100       end
101     end
102     context 'settingsを検証するとき' do
103       before do
104         @st = Factory.build :speech_balloon_template
105       end
106       it 'テストデータの確認' do
107         @st.settings = '{}'
108         @st.should be_valid
109       end
110       it 'nullなら失敗する' do
111         @st.settings = nil
112         @st.should_not be_valid
113       end
114     end
115   end
116   
117   describe 'データ補充に於いて' do
118     before do
119     end
120     
121   end
122   
123   describe 'Json解析に於いて' do
124     before do
125     end
126     context 'テキストを渡されたとき' do
127       it 'Json解析している' do
128         JSON.should_receive(:parse).with(@t).exactly(1)
129         r = SpeechBalloonTemplate.parse @t
130       end
131       it 'Hashで返す' do
132         r = SpeechBalloonTemplate.parse @t
133         r.is_a?(Hash).should be_true
134       end
135     end
136     context 'パース失敗したとき' do
137       it 'Falseを返す' do
138         JSON.should_receive(:parse).with(any_args).and_raise('StandardError')
139         r = SpeechBalloonTemplate.parse @t
140         r.should be_false
141       end
142     end
143   end
144   
145   describe '対象フキダシテンプレートの取得に於いて' do
146     before do
147       @st = Factory :speech_balloon_template
148     end
149     context 'nameが一致するフキダシテンプレートがないとき' do
150       it '新規フキダシテンプレートを準備して返す' do
151         r = SpeechBalloonTemplate.update_speech_balloon_template 'newtemplate', {:classname => 'New'}
152         r.should be_a_new SpeechBalloonTemplate
153         r[:classname].should eq 'New'
154       end
155     end
156     context 'nameが一致するフキダシテンプレートがあるとき' do
157       it '該当フキダシテンプレートを値設定して返す' do
158         r = SpeechBalloonTemplate.update_speech_balloon_template @st.name, {:classname => 'Update'}
159         r.is_a?(SpeechBalloonTemplate).should be_true
160         r.should_not be_a_new SpeechBalloonTemplate
161         r[:classname].should eq 'Update'
162       end
163     end
164   end
165   
166   describe 'フキダシテンプレート保存に於いて' do
167     before do
168       @st = Factory.build :speech_balloon_template
169     end
170     context 'つつがなく終わるとき' do
171       it '保存を問い合わせている' do
172         SpeechBalloonTemplate.any_instance.should_receive(:save).exactly(1)
173         @st.store
174       end
175       it 'フキダシテンプレートが作成されている' do
176         lambda {
177           @st.store
178         }.should change SpeechBalloonTemplate, :count
179       end
180     end
181   end
182   
183   describe 'フキダシテンプレート更新に於いて' do
184     before do
185       @st = Factory :speech_balloon_template
186       @attr = {:name => @st.name, :classname => 'Update', :t => 0, :caption => 'yp', :settings => '{}'}
187       @newattr = {:name => @st.name, :classname => 'New', :t => 1, :caption => 'nw', :settings => '{}'}
188     end
189     context 'つつがなく終わるとき' do
190       it '対象フキダシテンプレートを問い合わせている' do
191         SpeechBalloonTemplate.stub(:update_speech_balloon_template).with(any_args).and_return(SpeechBalloonTemplate.new(@attr))
192         SpeechBalloonTemplate.should_receive(:update_speech_balloon_template).exactly(1)
193         SpeechBalloonTemplate.store @st.name, @attr
194       end
195       context '新規のとき' do
196         it 'フキダシテンプレートを保存しようとしている' do
197           SpeechBalloonTemplate.any_instance.should_receive(:save).exactly(1)
198           SpeechBalloonTemplate.store 'newtemplate', @newattr
199         end
200         it 'フキダシテンプレートが作成されている' do
201           lambda {
202             SpeechBalloonTemplate.store 'newtemplate', @newattr
203           }.should change SpeechBalloonTemplate, :count
204         end
205       end
206       context '更新のとき' do
207         it 'フキダシテンプレートを保存しようとしている' do
208           SpeechBalloonTemplate.any_instance.should_receive(:save).exactly(1)
209           SpeechBalloonTemplate.store @st.name, @attr
210         end
211         it 'フキダシテンプレートの数に変化がない' do
212           lambda {
213             SpeechBalloonTemplate.store @st.name, @attr
214           }.should_not change SpeechBalloonTemplate, :count
215         end
216       end
217       it '属性が一致している' do
218         r = SpeechBalloonTemplate.store 'newtemplate', @newattr
219         r.classname.should eq 'New'
220       end
221       it '保存されたSpeechBalloonTemplateオブジェクトを返す' do
222         r = SpeechBalloonTemplate.store 'newtemplate', @newattr
223 p r.errors.full_messages
224         r.should_not be_a_new SpeechBalloonTemplate
225       end
226     end
227     context 'フキダシテンプレートの作成に失敗するとき' do
228       before do
229         SpeechBalloonTemplate.any_instance.stub(:save).with(any_args).and_return(false)
230       end
231       context '新規のとき' do
232         it 'フキダシテンプレートに変化がない' do
233           lambda {
234             r = SpeechBalloonTemplate.store 'newtemplate', @newattr
235           }.should_not change License, :count
236         end
237       end
238       context '更新のとき' do
239         it 'フキダシテンプレート属性に変化がない' do
240           lambda {
241             r = SpeechBalloonTemplate.store @st.name, @attr
242           }.should_not change License.find(@st.id), :classname
243         end
244       end
245     end
246   end
247   
248   describe 'テキスト取り込みに於いて' do
249     #成功でTrue、パース失敗でFalse、失敗は保存エラーのモデルを配列で返す
250     before do
251     end
252     context 'つつがなく終わるとき' do
253       it 'Json解析を依頼する' do
254         SpeechBalloonTemplate.should_receive(:parse).with(any_args).exactly(1)
255         SpeechBalloonTemplate.stub(:parse).with(any_args).and_return(@j)
256         SpeechBalloonTemplate.import(@t)
257       end
258       it 'フキダシテンプレート更新を一回依頼する' do
259         SpeechBalloonTemplate.stub(:store).with(any_args).and_return(SpeechBalloonTemplate.new)
260         SpeechBalloonTemplate.any_instance.stub(:valid?).with(any_args).and_return(true)
261         SpeechBalloonTemplate.should_receive(:store).with(any_args).exactly(1)
262         SpeechBalloonTemplate.import(@t)
263       end
264       it 'フキダシテンプレートが追加される' do
265         lambda {
266           SpeechBalloonTemplate.import(@t)
267         }.should change SpeechBalloonTemplate, :count
268       end
269       it '[]を返す' do
270         SpeechBalloonTemplate.import(@t).should eq []
271       end
272     end
273     context '複数データがつつがなく終わるとき' do
274       it 'フキダシテンプレート更新を二回依頼する' do
275         SpeechBalloonTemplate.stub(:store).with(any_args).and_return(SpeechBalloonTemplate.new)
276         SpeechBalloonTemplate.any_instance.stub(:valid?).with(any_args).and_return(true)
277         SpeechBalloonTemplate.should_receive(:store).with(any_args).exactly(2)
278         SpeechBalloonTemplate.import(@ts)
279       end
280       it 'フキダシテンプレートが二個追加される' do
281         lambda {
282           SpeechBalloonTemplate.import(@ts)
283         }.should change(SpeechBalloonTemplate, :count).by 2
284       end
285       it '[]を返す' do
286         SpeechBalloonTemplate.import(@ts).should eq []
287       end
288     end
289     #例外ケース
290     context 'Json解析に失敗したとき' do
291       before do
292         SpeechBalloonTemplate.stub(:parse).with(any_args).and_return(false)
293       end
294       it 'フキダシテンプレートの数に変化がない' do
295         lambda {
296           SpeechBalloonTemplate.import(@t)
297         }.should_not change SpeechBalloonTemplate, :count
298       end
299       it 'Falseを返す' do
300         SpeechBalloonTemplate.import(@t).should be_false
301       end
302     end
303     context 'フキダシテンプレート作成に失敗したとき' do
304       before do
305         SpeechBalloonTemplate.any_instance.stub(:save).with(any_args).and_return(false)
306         SpeechBalloonTemplate.any_instance.stub(:valid?).with(any_args).and_return(false)
307       end
308       it 'フキダシテンプレートの数に変化がない' do
309         lambda {
310           SpeechBalloonTemplate.import(@t)
311         }.should_not change SpeechBalloonTemplate, :count
312       end
313       it '配列を返す' do
314         r = SpeechBalloonTemplate.import(@t)
315         r.is_a?(Array).should be_true
316       end
317       it '配列の中身は一件' do
318         r = SpeechBalloonTemplate.import(@t)
319         r.should have(1).items
320       end
321       it 'フキダシテンプレートオブジェクトが入っている' do
322         r = SpeechBalloonTemplate.import(@t)
323         r.first.is_a?(SpeechBalloonTemplate).should be_true
324       end
325     end
326     context '複数のフキダシテンプレート作成に失敗したとき' do
327       #三件中、二件の失敗、一件を成功させ、成功データは戻り値に含まないことを確認する
328       it 'フキダシテンプレートの数に変化がない' do
329         lambda {
330           SpeechBalloonTemplate.import(@tes)
331         }.should_not change SpeechBalloonTemplate, :count
332       end
333       it '途中で保存に失敗しても全件更新依頼する' do
334         SpeechBalloonTemplate.stub(:store).with(any_args).and_return(SpeechBalloonTemplate.new)
335         SpeechBalloonTemplate.should_receive(:store).with(any_args).exactly(3)
336         SpeechBalloonTemplate.import(@tes)
337       end
338       it '配列を返す' do
339         r = SpeechBalloonTemplate.import(@tes)
340         r.is_a?(Array).should be_true
341       end
342       it '配列の中身は2件' do
343         r = SpeechBalloonTemplate.import(@tes)
344         r.should have(2).items
345       end
346       it '配列の中身は失敗したフキダシテンプレートオブジェクトが入っている' do
347         r = SpeechBalloonTemplate.import(@tes)
348         r[0].is_a?(SpeechBalloonTemplate).should be_true
349         r[0]["name"].should eq 'fail1'
350         r[1].is_a?(SpeechBalloonTemplate).should be_true
351         r[1]["name"].should eq 'fail2'
352       end
353     end
354   end
355   
356   describe 'インポートエラーの表示に於いて' do
357   end
358   
359   describe 'ファイル取り込みに於いて' do
360     before do
361       SpeechBalloonTemplate.stub(:import).with(any_args).and_return(true)
362     end
363     context 'つつがなく終わるとき' do
364       before do
365         SpeechBalloonTemplate.stub(:import).with(any_args).and_return(true)
366       end
367       it 'ファイルを開いてテキストを読む' do
368         File.should_receive(:open).with(@f, 'r').exactly(1)
369         SpeechBalloonTemplate.import_file(@f)
370       end
371       it 'テキスト取り込みを依頼する' do
372         SpeechBalloonTemplate.should_receive(:import).with(any_args).exactly(1)
373         SpeechBalloonTemplate.import_file(@f)
374       end
375       #テキスト取り込み成功でTrueが返る
376       it 'Trueを返す' do
377         SpeechBalloonTemplate.import_file(@f).should be_true
378       end
379     end
380     context 'ファイルが開けないとき' do
381       before do
382         File.stub(:open).with(any_args).and_raise('StandardError')
383       end
384       it 'ファイルエラーのメッセージを出力する' do
385         pending
386       end
387       it 'Falseを返す' do
388         SpeechBalloonTemplate.import_file(@f).should be_false
389       end
390     end
391     #失敗したときは、失敗したフキダシテンプレートが配列で返る
392     context 'テキスト取り込みが失敗したとき' do
393       before do
394         SpeechBalloonTemplate.stub(:import).with(any_args).and_return(false)
395       end
396       it '各フキダシテンプレートのエラーメッセージを出力する' do
397         pending
398       end
399       it 'Falseを返す' do
400         SpeechBalloonTemplate.import_file(@f).should be_false
401       end
402     end
403   end
404   
405 end