OSDN Git Service

t#31470:create pager
[pettanr/pettanr.git] / spec / controllers / panels_controller_spec.rb
1 # -*- encoding: utf-8 -*-\r
2 require 'spec_helper'\r
3 #コマ\r
4 describe PanelsController do\r
5   before do\r
6     @admin = FactoryGirl.create :admin\r
7     @sp = FactoryGirl.create :system_picture\r
8     @lg = FactoryGirl.create :license_group\r
9     @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id\r
10     @user = FactoryGirl.create :user_yas\r
11     @author = FactoryGirl.create :author, :user_id => @user.id\r
12   end\r
13   \r
14 if MagicNumber['run_mode'] == 1\r
15   describe '一覧表示に於いて' do\r
16     before do\r
17       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
18       Panel.stub(:list).and_return([@panel, @panel, @panel])\r
19       sign_in @user\r
20     end\r
21     context '事前チェックする' do\r
22       it '与えられたpageがセットされている' do\r
23         get :index, :page => 5\r
24         assigns(:page).should eq 5\r
25       end\r
26       it '省略されると@pageに1値が入る' do\r
27         get :index\r
28         assigns(:page).should eq 1\r
29       end\r
30       it '与えられたpage_sizeがセットされている' do\r
31         get :index, :page_size => 15\r
32         assigns(:page_size).should eq 15\r
33       end\r
34       it '省略されると@page_sizeにデフォルト値が入る' do\r
35         get :index\r
36         assigns(:page_size).should eq Panel.default_page_size\r
37       end\r
38       it '最大を超えると@page_sizeにデフォルト最大値が入る' do\r
39         get :index, :page_size => 1500\r
40         assigns(:page_size).should eq Panel.max_page_size\r
41       end\r
42       it '不正な値が入ると@page_sizeにデフォルト最大値が入る' do\r
43         get :index, :page_size => 0\r
44         assigns(:page_size).should eq Panel.default_page_size\r
45       end\r
46     end\r
47     context 'つつがなく終わるとき' do\r
48       it 'コマモデルに一覧を問い合わせている' do\r
49         Panel.should_receive(:list).exactly(1)\r
50         get :index\r
51       end\r
52       it '@panelsにリストを取得している' do\r
53         get :index\r
54         assigns(:panels).should have_at_least(3).items\r
55       end\r
56       context 'html形式' do\r
57         it '@paginateにページ制御を取得している' do\r
58           get :index\r
59           assigns(:paginate).is_a?(Kaminari::PaginatableArray).should be_true\r
60         end\r
61         it 'ステータスコード200 OKを返す' do\r
62           get :index\r
63           response.should be_success \r
64         end\r
65         it 'indexテンプレートを描画する' do\r
66           get :index\r
67           response.should render_template("index")\r
68         end\r
69       end\r
70       context 'json形式' do\r
71         it 'ステータスコード200 OKを返す' do\r
72           get :index, :format => :json\r
73           response.should be_success \r
74         end\r
75         it 'jsonデータを返す' do\r
76           get :index, :format => :json\r
77           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
78         end\r
79         it 'コマモデルにコマリストのjson出力を問い合わせている' do\r
80           Panel.should_receive(:list_as_json_text).exactly(1)\r
81           get :index, :format => :json\r
82         end\r
83         it 'データがリスト構造になっている' do\r
84           get :index, :format => :json\r
85           json = JSON.parse response.body\r
86           json.should have_at_least(3).items\r
87         end\r
88         it 'リストの先頭くらいはコマっぽいものであって欲しい' do\r
89           get :index, :format => :json\r
90           json = JSON.parse response.body\r
91           json.first.has_key?("border").should be_true\r
92         end\r
93       end\r
94     end\r
95     context 'ユーザ権限がないとき' do\r
96       before do\r
97         sign_out @user\r
98       end\r
99       context 'html形式' do\r
100         it 'ステータスコード302 Foundを返す' do\r
101           get :index\r
102           response.status.should eq 302\r
103         end\r
104         it 'サインインページへ遷移する' do\r
105           get :index\r
106           response.should redirect_to '/users/sign_in'\r
107         end\r
108       end\r
109       context 'json形式' do\r
110         it 'ステータスコード401 Unauthorizedを返す' do\r
111           get :index, :format => :json\r
112           response.status.should eq 401\r
113         end\r
114         it '応答メッセージにUnauthorizedを返す' do\r
115           get :index, :format => :json\r
116           response.message.should match(/Unauthorized/)\r
117         end\r
118       end\r
119     end\r
120     context 'ユーザ権限はないが管理者権限があるとき' do\r
121       before do\r
122         sign_out @user\r
123         sign_in @admin\r
124       end\r
125       it 'ステータスコード200 OKを返す' do\r
126         get :index\r
127         response.should be_success \r
128       end\r
129     end\r
130     context 'ユーザだが作家登録していないとき' do\r
131       before do\r
132         @author.destroy\r
133       end\r
134       it 'ステータスコード200 OKを返す' do\r
135         get :index\r
136         response.should be_success \r
137       end\r
138     end\r
139   end\r
140   \r
141   describe '単体表示に於いて' do\r
142     before do\r
143       @panel = FactoryGirl.create :panel, :author_id => @user.author.id\r
144       Panel.stub(:show).with(@panel.id.to_s, [@user, nil]).and_return(@panel)\r
145       Panel.stub(:show).with(@panel.id.to_s, [nil, @admin]).and_return(@panel)\r
146       sign_in @user\r
147     end\r
148     context 'つつがなく終わるとき' do\r
149       it 'コマモデルに単体取得を問い合わせている' do\r
150         Panel.should_receive(:show).exactly(1)\r
151         get :show\r
152       end\r
153       it '@panelにアレを取得している' do\r
154         get :show, :id => @panel.id\r
155         assigns(:panel).id.should eq(@panel.id)\r
156       end\r
157       context 'html形式' do\r
158         it 'ステータスコード200 OKを返す' do\r
159           get :show, :id => @panel.id\r
160           response.should be_success\r
161         end\r
162         it 'showテンプレートを描画する' do\r
163           get :show, :id => @panel.id\r
164           response.should render_template("show")\r
165         end\r
166       end\r
167       context 'json形式' do\r
168         it 'ステータスコード200 OKを返す' do\r
169           get :show, :id => @panel.id, :format => :json\r
170           response.should be_success\r
171         end\r
172         it 'jsonデータを返す' do\r
173           get :show, :id => @panel.id, :format => :json\r
174           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
175         end\r
176         it 'コマモデルにコマのjson出力を問い合わせている' do\r
177           Panel.any_instance.should_receive(:panel_elements_as_json).exactly(1)\r
178           get :show, :id => @panel.id, :format => :json\r
179         end\r
180         it 'データがアレになっている' do\r
181           get :show, :id => @panel.id, :format => :json\r
182           json = JSON.parse response.body\r
183           json["width"].should eq 100\r
184         end\r
185       end\r
186     end\r
187     context 'ユーザ権限がないとき' do\r
188       before do\r
189         sign_out @user\r
190       end\r
191       context 'html形式' do\r
192         it 'ステータスコード302 Foundを返す' do\r
193           get :show, :id => @panel.id\r
194           response.status.should eq 302\r
195         end\r
196         it 'サインインページへ遷移する' do\r
197           get :show, :id => @panel.id\r
198           response.body.should redirect_to '/users/sign_in'\r
199         end\r
200       end\r
201       context 'json形式' do\r
202         it 'ステータスコード401 Unauthorizedを返す' do\r
203           get :show, :id => @panel.id, :format => :json\r
204           response.status.should eq 401\r
205         end\r
206         it '応答メッセージにUnauthorizedを返す' do\r
207           get :show, :id => @panel.id, :format => :json\r
208           response.message.should match(/Unauthorized/)\r
209         end\r
210       end\r
211     end\r
212     context 'ユーザ権限はないが管理者権限があるとき' do\r
213       before do\r
214         sign_out @user\r
215         sign_in @admin\r
216       end\r
217       it 'ステータスコード200 OKを返す' do\r
218           get :show, :id => @panel.id\r
219         response.should be_success \r
220       end\r
221     end\r
222     context 'ユーザだが作家登録していないとき' do\r
223       before do\r
224         @author.destroy\r
225       end\r
226       it 'ステータスコード200 OKを返す' do\r
227           get :show, :id => @panel.id\r
228         response.should be_success \r
229       end\r
230     end\r
231 =begin\r
232     context '対象コマがないとき' do\r
233       context 'html形式' do\r
234         it '例外404 not_foundを返す' do\r
235           lambda{\r
236             get :show, :id => 0\r
237           }.should raise_error(ActiveRecord::RecordNotFound)\r
238         end\r
239       end\r
240       context 'json形式' do\r
241         it '例外404 not_foundを返す' do\r
242           lambda{ \r
243             get :show, :id => 0, :format => :json\r
244           }.should raise_error(ActiveRecord::RecordNotFound)\r
245         end\r
246       end\r
247     end\r
248     context '非公開コマを見ようとしたとき' do\r
249       context 'html形式' do\r
250         it '例外403 forbiddenを返す' do\r
251           Panel.any_instance.stub(:visible?).with(any_args()).and_return(false)\r
252           hidden = FactoryGirl.create :hidden_panel, :author_id => @author.id\r
253           lambda{\r
254             get :show, :id => hidden\r
255           }.should raise_error(ActiveRecord::Forbidden)\r
256         end\r
257       end\r
258       context 'json形式' do\r
259         it '例外403 forbiddenを返す' do\r
260           Panel.any_instance.stub(:visible?).with(any_args()).and_return(false)\r
261           hidden = FactoryGirl.create :hidden_panel, :author_id => @author.id\r
262           lambda{\r
263             get :show, :id => hidden, :format => :json\r
264           }.should raise_error(ActiveRecord::Forbidden)\r
265         end\r
266       end\r
267     end\r
268 =end\r
269   end\r
270   \r
271   describe 'コマ数取得に於いて' do\r
272     before do\r
273       Panel.should_receive(:visible_count).and_return(3)\r
274 #      sign_in @user\r
275     end\r
276     context 'つつがなく終わるとき' do\r
277       it 'ステータスコード200 OKを返す' do\r
278         get :count, :format => :json\r
279         response.should be_success \r
280       end\r
281       context 'json形式' do\r
282         it 'jsonデータを返す' do\r
283           get :count, :format => :json\r
284           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
285         end\r
286         it 'データがHash構造になっていてコマ数が1である' do\r
287           get :count, :format => :json\r
288           json = JSON.parse response.body\r
289           json["count"].should == 3\r
290         end\r
291       end\r
292     end\r
293   end\r
294   \r
295   describe '新規作成フォーム表示に於いて' do\r
296     before do\r
297       sign_in @user\r
298     end\r
299     context 'つつがなく終わるとき' do\r
300       it '@panelに新規データを用意している' do\r
301         get :new\r
302         assigns(:panel).should be_a_new(Panel)\r
303       end\r
304       it 'コマモデルにデフォルト値補充を依頼している' do\r
305         Panel.any_instance.should_receive(:supply_default).exactly(1)\r
306         get :new\r
307       end\r
308       context 'html形式' do\r
309         it 'ステータスコード200 OKを返す' do\r
310           get :new\r
311           response.should be_success \r
312         end\r
313         it 'newテンプレートを描画する' do\r
314           get :new\r
315           response.should render_template("new")\r
316         end\r
317       end\r
318       context 'js形式' do\r
319         it 'new.jsテンプレートを描画する' do\r
320           get :new, :format => :js\r
321           response.should render_template("new")\r
322         end\r
323       end\r
324       context 'json形式' do\r
325         it 'jsonデータを返す' do\r
326           get :new, :format => :json\r
327           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
328         end\r
329         it 'コマモデルにコマのjson出力を問い合わせている' do\r
330           Panel.any_instance.should_receive(:panel_elements_as_json).exactly(1)\r
331           get :new, :format => :json\r
332         end\r
333       end\r
334     end\r
335     context 'ユーザ権限がないとき' do\r
336       before do\r
337         sign_out @user\r
338       end\r
339       context 'html形式' do\r
340         it 'ステータスコード302 Foundを返す' do\r
341           get :new\r
342           response.status.should eq 302\r
343         end\r
344         it 'サインインページへ遷移する' do\r
345           get :new\r
346           response.body.should redirect_to '/users/sign_in'\r
347         end\r
348       end\r
349       context 'js形式' do\r
350         it 'ステータスコード401 Unauthorizedを返す' do\r
351           get :new, :format => :js\r
352           response.status.should eq 401\r
353         end\r
354         it '応答メッセージにUnauthorizedを返す' do\r
355           get :new, :format => :js\r
356           response.message.should match(/Unauthorized/)\r
357         end\r
358       end\r
359     end\r
360     context 'ユーザ権限はないが管理者権限があるとき' do\r
361       before do\r
362         sign_out @user\r
363         sign_in @admin\r
364       end\r
365       context 'html形式' do\r
366         it 'ステータスコード302 Foundを返す' do\r
367           get :new\r
368           response.status.should eq 302\r
369         end\r
370         it 'サインインページへ遷移する' do\r
371           get :new\r
372           response.body.should redirect_to '/users/sign_in'\r
373         end\r
374       end\r
375     end\r
376     context 'ユーザだが作家登録していないとき' do\r
377       before do\r
378         @author.destroy\r
379       end\r
380       context 'html形式' do\r
381         it 'ステータスコード302 Foundを返す' do\r
382           get :new\r
383           response.status.should eq 302\r
384         end\r
385         it '作家登録ページへ遷移する' do\r
386           get :new\r
387           response.body.should redirect_to new_author_path\r
388         end\r
389       end\r
390     end\r
391   end\r
392   \r
393   describe '新規作成に於いて' do\r
394     before do\r
395       @panel = FactoryGirl.build :panel, :author_id => @author.id\r
396       @attr = FactoryGirl.attributes_for(:panel, :author_id => @author.id)\r
397       sign_in @user\r
398     end\r
399     context '事前チェックする' do\r
400       before do\r
401         Panel.stub(:count).and_return(10)\r
402       end\r
403       it 'panelがパラメータにあれば、展開する' do\r
404         post :create, :panel => @attr\r
405         assigns(:prm)['border'].to_i.should eq @panel.border\r
406       end\r
407       it 'jsonがパラメータにあれば、展開する' do\r
408         post :create, :json => FactoryGirl.attributes_for(:panel, :border => 4).to_json\r
409         assigns(:prm)['border'].to_i.should eq 4\r
410       end\r
411       it 'panel・json両パラメータがあれば、panelを優先して展開する' do\r
412         post :create, {\r
413           :panel => FactoryGirl.attributes_for(:panel), \r
414           :json => FactoryGirl.attributes_for(:panel, :border => 4).to_json\r
415         }\r
416         assigns(:prm)['border'].to_i.should eq @panel.border\r
417       end\r
418       it 'コマモデルにデフォルト値補充を依頼している' do\r
419         Panel.any_instance.should_receive(:supply_default).exactly(1)\r
420         post :create, :panel => @attr\r
421       end\r
422       it 'モデルに保存依頼する' do\r
423         Panel.any_instance.should_receive(:store).exactly(1)\r
424         post :create, :panel => @attr\r
425       end\r
426     end\r
427     context 'つつがなく終わるとき' do\r
428       it "@panelに作成されたコマを保持していて、それがDBにある" do\r
429         post :create, :panel => @attr\r
430         assigns(:panel).should be_a(Panel)\r
431         assigns(:panel).should be_persisted\r
432       end\r
433       context 'html形式' do\r
434         it 'ステータスコード302 Foundを返す' do\r
435           Panel.any_instance.stub(:store).and_return(true)\r
436           post :create, :panel => @attr\r
437           response.status.should eq 302\r
438         end\r
439         it '作成されたコマの表示ページへ遷移する' do\r
440 #          Panel.any_instance.stub(:store).and_return(true)\r
441           post :create, :panel => @attr\r
442           response.should redirect_to(Panel.last)\r
443         end\r
444       end\r
445       context 'json形式' do\r
446         it 'ステータスコード200 OKを返す' do\r
447 #          Panel.any_instance.stub(:store).and_return(true)\r
448           post :create, :panel => @attr, :format => :json\r
449           response.should be_success \r
450         end\r
451         it '作成されたコマをjsonデータで返す' do\r
452           post :create, :panel => @attr, :format => :json\r
453           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
454         end\r
455         it 'コマモデルにコマのjson出力を問い合わせている' do\r
456           Panel.any_instance.should_receive(:panel_elements_as_json).exactly(1)\r
457           post :create, :panel => @attr, :format => :json\r
458         end\r
459         it 'データがアレになっている' do\r
460           post :create, :panel => @attr, :format => :json\r
461           json = JSON.parse response.body\r
462           json["width"].should eq @panel.width\r
463         end\r
464       end\r
465     end\r
466     context 'ユーザ権限がないとき' do\r
467       before do\r
468         sign_out @user\r
469       end\r
470       context 'html形式' do\r
471         it 'ステータスコード302 Foundを返す' do\r
472           post :create, :panel => @attr\r
473           response.status.should eq 302\r
474         end\r
475         it 'サインインページへ遷移する' do\r
476           post :create, :panel => @attr\r
477           response.body.should redirect_to '/users/sign_in'\r
478         end\r
479       end\r
480       context 'json形式' do\r
481         it 'ステータスコード401 Unauthorizedを返す' do\r
482           post :create, :panel => @attr, :format => :json\r
483           response.status.should eq 401\r
484         end\r
485         it '応答メッセージにUnauthorizedを返す' do\r
486           post :create, :panel => @attr, :format => :json\r
487           response.message.should match(/Unauthorized/)\r
488         end\r
489       end\r
490     end\r
491     context 'ユーザ権限はないが管理者権限があるとき' do\r
492       before do\r
493         sign_out @user\r
494         sign_in @admin\r
495       end\r
496       context 'html形式' do\r
497         it 'ステータスコード302 Foundを返す' do\r
498           post :create, :panel => @attr\r
499           response.status.should eq 302\r
500         end\r
501         it 'サインインページへ遷移する' do\r
502           post :create, :panel => @attr\r
503           response.body.should redirect_to '/users/sign_in'\r
504         end\r
505       end\r
506     end\r
507     context 'ユーザだが作家登録していないとき' do\r
508       before do\r
509         @author.destroy\r
510       end\r
511       context 'html形式' do\r
512         it 'ステータスコード302 Foundを返す' do\r
513           post :create, :panel => @attr\r
514           response.status.should eq 302\r
515         end\r
516         it '作家登録ページへ遷移する' do\r
517           post :create, :panel => @attr\r
518           response.body.should redirect_to new_author_path\r
519         end\r
520       end\r
521     end\r
522     context '検証、保存に失敗した' do\r
523       before do\r
524         Panel.any_instance.stub(:store).and_return(false)\r
525       end\r
526       it "未保存のコマを保持している" do\r
527         post :create, :panel => @attr\r
528         assigns(:panel).should be_a_new(Panel)\r
529       end\r
530       context 'html形式' do\r
531         it 'ステータスコード200 OKを返す' do\r
532           post :create, :panel => @attr\r
533           response.status.should eq 200\r
534         end\r
535         it '新規ページを描画する' do\r
536           post :create, :panel => @attr\r
537           response.should render_template("new")\r
538         end\r
539       end\r
540       context 'json形式' do\r
541         it 'ステータスコード422 unprocessable_entity を返す' do\r
542           post :create, :panel => @attr, :format => :json\r
543           response.status.should eq 422\r
544         end\r
545         it '応答メッセージUnprocessable Entityを返す' do\r
546           post :create, :panel => @attr, :format => :json\r
547           response.message.should match(/Unprocessable/)\r
548         end\r
549       end\r
550     end\r
551   end\r
552 \r
553   describe '編集フォーム表示に於いて' do\r
554     before do\r
555       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
556       sign_in @user\r
557       Panel.stub(:show).and_return(@panel)\r
558     end\r
559     context 'つつがなく終わるとき' do\r
560       it 'コマモデルに編集取得を問い合わせている' do\r
561         Panel.should_receive(:edit).exactly(1)\r
562         get :edit, :id => @panel.id\r
563       end\r
564       it '@panelにデータを用意している' do\r
565         get :edit, :id => @panel.id\r
566         assigns(:panel).should eq @panel\r
567       end\r
568       context 'html形式' do\r
569         it 'ステータスコード200 OKを返す' do\r
570           get :edit, :id => @panel.id\r
571           response.should be_success \r
572         end\r
573         it 'editテンプレートを描画する' do\r
574           get :edit, :id => @panel.id\r
575           response.should render_template("edit")\r
576         end\r
577       end\r
578       context 'js形式' do\r
579         it 'ステータスコード200 OKを返す' do\r
580           get :edit, :id => @panel.id, :format => :js\r
581           response.should be_success \r
582         end\r
583         it 'edit.jsテンプレートを描画する' do\r
584           get :edit, :id => @panel.id, :format => :js\r
585           response.should render_template("edit")\r
586         end\r
587       end\r
588     end\r
589     context 'ユーザ権限がないとき' do\r
590       before do\r
591         sign_out @user\r
592       end\r
593       context 'html形式' do\r
594         it 'ステータスコード302 Foundを返す' do\r
595           get :edit, :id => @panel.id\r
596           response.status.should eq 302\r
597         end\r
598         it 'サインインページへ遷移する' do\r
599           get :edit, :id => @panel.id\r
600           response.body.should redirect_to '/users/sign_in'\r
601         end\r
602       end\r
603       context 'js形式' do\r
604         it 'ステータスコード401 Unauthorizedを返す' do\r
605           get :edit, :id => @panel.id, :format => :js\r
606           response.status.should eq 401\r
607         end\r
608         it '応答メッセージにUnauthorizedを返す' do\r
609           get :edit, :id => @panel.id, :format => :js\r
610           response.message.should match(/Unauthorized/)\r
611         end\r
612       end\r
613     end\r
614     context 'ユーザ権限はないが管理者権限があるとき' do\r
615       before do\r
616         sign_out @user\r
617         sign_in @admin\r
618       end\r
619       context 'html形式' do\r
620         it 'ステータスコード302 Foundを返す' do\r
621           get :edit, :id => @panel.id\r
622           response.status.should eq 302\r
623         end\r
624         it 'サインインページへ遷移する' do\r
625           get :edit, :id => @panel.id\r
626           response.body.should redirect_to '/users/sign_in'\r
627         end\r
628       end\r
629     end\r
630     context 'ユーザだが作家登録していないとき' do\r
631       before do\r
632         @author.destroy\r
633       end\r
634       context 'html形式' do\r
635         it 'ステータスコード302 Foundを返す' do\r
636           get :edit, :id => @panel.id\r
637           response.status.should eq 302\r
638         end\r
639         it '作家登録ページへ遷移する' do\r
640           get :edit, :id => @panel.id\r
641           response.body.should redirect_to new_author_path\r
642         end\r
643       end\r
644     end\r
645   end\r
646 \r
647   describe '更新に於いて' do\r
648     before do\r
649       @panel = FactoryGirl.create :panel, :author_id => @user.author.id\r
650       @attr = FactoryGirl.attributes_for(:panel, :author_id => @author.id)\r
651       sign_in @user\r
652     end\r
653     context '事前チェックする' do\r
654       before do\r
655         controller\r
656         Panel.stub(:count).and_return(10)\r
657       end\r
658       it 'panelがパラメータにあれば、展開する' do\r
659         put :update, :id => @panel.id, :panel => @attr\r
660         assigns(:prm)['border'].to_i.should eq @panel.border\r
661       end\r
662       it 'jsonがパラメータにあれば、展開する' do\r
663         put :update, :id => @panel.id, :json => FactoryGirl.attributes_for(:panel, :border => 4).to_json\r
664         assigns(:prm)['border'].to_i.should eq 4\r
665       end\r
666       it 'panel・json両パラメータがあれば、panelを優先して展開する' do\r
667         put :update, {\r
668           :id => @panel.id, \r
669           :panel => FactoryGirl.attributes_for(:panel), \r
670           :json => FactoryGirl.attributes_for(:panel, :border => 4).to_json\r
671         }\r
672         assigns(:prm)['border'].to_i.should eq @panel.border\r
673       end\r
674     end\r
675     context 'つつがなく終わるとき' do\r
676       it 'モデルに編集取得依頼する' do\r
677         Panel.stub(:edit).with(any_args).and_return(@panel)\r
678         Panel.should_receive(:edit).exactly(1)\r
679         put :update, :id => @panel.id, :panel => @attr\r
680       end\r
681       it 'モデルに保存依頼する' do\r
682         Panel.any_instance.should_receive(:store).exactly(1)\r
683         put :update, :id => @panel.id, :panel => @attr\r
684       end\r
685       it "@panelに作成されたコマを保持していて、それがDBにある" do\r
686         put :update, :id => @panel.id, :panel => @attr\r
687         assigns(:panel).should be_a(Panel)\r
688         assigns(:panel).should be_persisted\r
689       end\r
690       context 'html形式' do\r
691         it 'ステータスコード302 Foundを返す' do\r
692           Panel.any_instance.stub(:store).and_return(true)\r
693           put :update, :id => @panel.id, :panel => @attr\r
694           response.status.should eq 302\r
695         end\r
696         it '作成されたコマの表示ページへ遷移する' do\r
697 #          Panel.any_instance.stub(:store).and_return(true)\r
698           put :update, :id => @panel.id, :panel => @attr\r
699           response.should redirect_to(Panel.last)\r
700         end\r
701       end\r
702       context 'json形式' do\r
703         it 'ステータスコード200 OKを返す' do\r
704 #          Panel.any_instance.stub(:store).and_return(true)\r
705           put :update, :id => @panel.id, :panel => @attr, :format => :json\r
706           response.should be_success \r
707         end\r
708         it 'ページ本体は特に返さない' do\r
709           Panel.any_instance.stub(:save).with(any_args()).and_return(true)\r
710           put :update, :id => @panel.id, :panel => @attr, :format => :json\r
711           response.body.should match /./\r
712         end\r
713       end\r
714     end\r
715     context 'ユーザ権限がないとき' do\r
716       before do\r
717         sign_out @user\r
718       end\r
719       context 'html形式' do\r
720         it 'ステータスコード302 Foundを返す' do\r
721           put :update, :id => @panel.id, :panel => @attr\r
722           response.status.should eq 302\r
723         end\r
724         it 'サインインページへ遷移する' do\r
725           put :update, :id => @panel.id, :panel => @attr\r
726           response.body.should redirect_to '/users/sign_in'\r
727         end\r
728       end\r
729       context 'json形式' do\r
730         it 'ステータスコード401 Unauthorizedを返す' do\r
731           put :update, :id => @panel.id, :panel => @attr, :format => :json\r
732           response.status.should eq 401\r
733         end\r
734         it '応答メッセージにUnauthorizedを返す' do\r
735           put :update, :id => @panel.id, :panel => @attr, :format => :json\r
736           response.message.should match(/Unauthorized/)\r
737         end\r
738       end\r
739     end\r
740     context 'ユーザ権限はないが管理者権限があるとき' do\r
741       before do\r
742         sign_out @user\r
743         sign_in @admin\r
744       end\r
745       context 'html形式' do\r
746         it 'ステータスコード302 Foundを返す' do\r
747           put :update, :id => @panel.id, :panel => @attr\r
748           response.status.should eq 302\r
749         end\r
750         it 'サインインページへ遷移する' do\r
751           put :update, :id => @panel.id, :panel => @attr\r
752           response.body.should redirect_to '/users/sign_in'\r
753         end\r
754       end\r
755     end\r
756     context 'ユーザだが作家登録していないとき' do\r
757       before do\r
758         @author.destroy\r
759       end\r
760       context 'html形式' do\r
761         it 'ステータスコード302 Foundを返す' do\r
762           put :update, :id => @panel.id, :panel => @attr\r
763           response.status.should eq 302\r
764         end\r
765         it '作家登録ページへ遷移する' do\r
766           put :update, :id => @panel.id, :panel => @attr\r
767           response.body.should redirect_to new_author_path\r
768         end\r
769       end\r
770     end\r
771     context '検証、保存に失敗した' do\r
772       before do\r
773         Panel.any_instance.stub(:store).and_return(false)\r
774       end\r
775       it "指定のコマを保持している" do\r
776         put :update, :id => @panel.id, :panel => @attr\r
777         assigns(:panel).should eq @panel\r
778       end\r
779       context 'html形式' do\r
780         it 'ステータスコード200 OKを返す' do\r
781           put :update, :id => @panel.id, :panel => @attr\r
782           response.status.should eq 200\r
783         end\r
784         it '編集ページを描画する' do\r
785           put :update, :id => @panel.id, :panel => @attr\r
786           response.should render_template("edit")\r
787         end\r
788       end\r
789       context 'json形式' do\r
790         it 'ステータスコード422 unprocessable_entity を返す' do\r
791           put :update, :id => @panel.id, :panel => @attr, :format => :json\r
792           response.status.should eq 422\r
793         end\r
794         it '応答メッセージUnprocessable Entityを返す' do\r
795           put :update, :id => @panel.id, :panel => @attr, :format => :json\r
796           response.message.should match(/Unprocessable/)\r
797         end\r
798       end\r
799     end\r
800   end\r
801 \r
802   describe '削除に於いて' do\r
803     before do\r
804       @panel = FactoryGirl.create :panel, :author_id => @user.author.id\r
805       Panel.stub(:edit).and_return(@panel)\r
806       sign_in @user\r
807     end\r
808     context 'つつがなく終わるとき' do\r
809       it 'コマモデルに編集取得を問い合わせている' do\r
810         Panel.should_receive(:edit).exactly(1)\r
811         delete :destroy, :id => @panel.id\r
812       end\r
813       it '@panelにアレを取得している' do\r
814         delete :destroy, :id => @panel.id\r
815         assigns(:panel).id.should eq(@panel.id)\r
816       end\r
817       it 'そのコマを削除する' do\r
818         lambda {\r
819           delete :destroy, :id => @panel.id\r
820         }.should change(Panel, :count)\r
821       end\r
822       context 'html形式' do\r
823         it 'ステータスコード302 Foundを返す' do\r
824           delete :destroy, :id => @panel.id\r
825           response.status.should eq 302\r
826         end\r
827         it 'マイコマ一覧ページへ遷移する' do\r
828           delete :destroy, :id => @panel.id\r
829           response.should redirect_to('/home/panel')\r
830         end\r
831       end\r
832       context 'json形式' do\r
833         it 'ステータスコード200 OKを返す' do\r
834           delete :destroy, :id => @panel.id, :format => :json\r
835           response.should be_success\r
836         end\r
837       end\r
838     end\r
839     context 'ユーザ権限がないとき' do\r
840       before do\r
841         sign_out @user\r
842       end\r
843       context 'html形式' do\r
844         it 'ステータスコード302 Foundを返す' do\r
845           delete :destroy, :id => @panel.id\r
846           response.status.should eq 302\r
847         end\r
848         it 'サインインページへ遷移する' do\r
849           delete :destroy, :id => @panel.id\r
850           response.body.should redirect_to '/users/sign_in'\r
851         end\r
852       end\r
853       context 'json形式' do\r
854         it 'ステータスコード401 Unauthorizedを返す' do\r
855           delete :destroy, :id => @panel.id, :format => :json\r
856           response.status.should eq 401\r
857         end\r
858         it '応答メッセージにUnauthorizedを返す' do\r
859           delete :destroy, :id => @panel.id, :format => :json\r
860           response.message.should match(/Unauthorized/)\r
861         end\r
862       end\r
863     end\r
864     context 'ユーザ権限はないが管理者権限があるとき' do\r
865       before do\r
866         sign_out @user\r
867         sign_in @admin\r
868       end\r
869       context 'html形式' do\r
870         it 'ステータスコード302 Foundを返す' do\r
871           delete :destroy, :id => @panel.id\r
872           response.status.should eq 302\r
873         end\r
874         it 'サインインページへ遷移する' do\r
875           delete :destroy, :id => @panel.id\r
876           response.body.should redirect_to '/users/sign_in'\r
877         end\r
878       end\r
879     end\r
880     context 'ユーザだが作家登録していないとき' do\r
881       before do\r
882         @author.destroy\r
883       end\r
884       context 'html形式' do\r
885         it 'ステータスコード302 Foundを返す' do\r
886           delete :destroy, :id => @panel.id\r
887           response.status.should eq 302\r
888         end\r
889         it '作家登録ページへ遷移する' do\r
890           delete :destroy, :id => @panel.id\r
891           response.body.should redirect_to new_author_path\r
892         end\r
893       end\r
894     end\r
895     context '削除に失敗したとき' do\r
896       before do\r
897         Panel.any_instance.stub(:destroy_with_elements).and_return(false)\r
898       end\r
899       context 'html形式' do\r
900         it 'ステータスコード302 Foundを返す' do\r
901           delete :destroy, :id => @panel.id\r
902           response.status.should eq 302\r
903         end\r
904         it 'そのコマの詳細ページへ遷移する' do\r
905           delete :destroy, :id => @panel.id\r
906           response.should redirect_to(panel_path(@panel))\r
907         end\r
908       end\r
909       context 'json形式' do\r
910         it 'ステータスコード422 unprocessable_entity を返す' do\r
911           delete :destroy, :id => @panel.id, :format => :json\r
912           response.status.should eq 422\r
913         end\r
914         it '応答メッセージUnprocessable Entityを返す' do\r
915           delete :destroy, :id => @panel.id, :format => :json\r
916           response.message.should match(/Unprocessable/)\r
917         end\r
918       end\r
919     end\r
920 =begin\r
921     context '対象コマがないとき' do\r
922     end\r
923     context '他人のコマだったとき' do\r
924     end\r
925 =end\r
926   end\r
927   \r
928 else\r
929   describe '一覧表示に於いて' do\r
930     before do\r
931       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
932       Panel.stub(:list).and_return([@panel, @panel, @panel])\r
933       sign_in @user\r
934     end\r
935     context 'つつがなく終わるとき' do\r
936       context 'html形式' do\r
937         it 'ステータスコード200 OKを返す' do\r
938           get :index\r
939           response.should be_success \r
940         end\r
941         it 'indexテンプレートを描画する' do\r
942           get :index\r
943           response.should render_template("index")\r
944         end\r
945       end\r
946       context 'json形式' do\r
947         it 'ステータスコード200 OKを返す' do\r
948           get :index, :format => :json\r
949           response.should be_success \r
950         end\r
951         it 'jsonデータを返す' do\r
952           get :index, :format => :json\r
953           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
954         end\r
955       end\r
956     end\r
957     context 'ユーザ権限がないとき' do\r
958       before do\r
959         sign_out @user\r
960       end\r
961       context 'html形式' do\r
962         it 'ステータスコード200 OKを返す' do\r
963           get :index\r
964           response.should be_success \r
965         end\r
966         it 'indexテンプレートを描画する' do\r
967           get :index\r
968           response.should render_template("index")\r
969         end\r
970       end\r
971       context 'json形式' do\r
972         it 'ステータスコード200 OKを返す' do\r
973           get :index, :format => :json\r
974           response.should be_success \r
975         end\r
976         it 'jsonデータを返す' do\r
977           get :index, :format => :json\r
978           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
979         end\r
980       end\r
981     end\r
982   end\r
983   \r
984   describe '単体表示に於いて' do\r
985     before do\r
986       @panel = FactoryGirl.create :panel, :author_id => @user.author.id\r
987       Panel.stub(:show).with(@panel.id.to_s, [nil, nil]).and_return(@panel)\r
988       Panel.stub(:show).with(@panel.id.to_s, [@user, nil]).and_return(@panel)\r
989       Panel.stub(:show).with(@panel.id.to_s, [nil, @admin]).and_return(@panel)\r
990       sign_in @user\r
991     end\r
992     context 'つつがなく終わるとき' do\r
993       context 'html形式' do\r
994         it 'ステータスコード200 OKを返す' do\r
995           get :show, :id => @panel.id\r
996           response.should be_success\r
997         end\r
998         it 'showテンプレートを描画する' do\r
999           get :show, :id => @panel.id\r
1000           response.should render_template("show")\r
1001         end\r
1002       end\r
1003       context 'json形式' do\r
1004         it 'ステータスコード200 OKを返す' do\r
1005           get :show, :id => @panel.id, :format => :json\r
1006           response.should be_success\r
1007         end\r
1008         it 'jsonデータを返す' do\r
1009           get :show, :id => @panel.id, :format => :json\r
1010           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
1011         end\r
1012       end\r
1013     end\r
1014     context 'ユーザ権限がないとき' do\r
1015       before do\r
1016         sign_out @user\r
1017       end\r
1018       context 'html形式' do\r
1019         it 'ステータスコード200 OKを返す' do\r
1020           get :show, :id => @panel.id\r
1021           response.should be_success\r
1022         end\r
1023         it 'showテンプレートを描画する' do\r
1024           get :show, :id => @panel.id\r
1025           response.should render_template("show")\r
1026         end\r
1027       end\r
1028       context 'json形式' do\r
1029         it 'ステータスコード200 OKを返す' do\r
1030           get :show, :id => @panel.id, :format => :json\r
1031           response.should be_success\r
1032         end\r
1033         it 'jsonデータを返す' do\r
1034           get :show, :id => @panel.id, :format => :json\r
1035           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
1036         end\r
1037       end\r
1038     end\r
1039   end\r
1040   \r
1041   describe 'コマ数取得に於いて' do\r
1042     before do\r
1043       Panel.should_receive(:visible_count).and_return(3)\r
1044 #      sign_in @user\r
1045     end\r
1046     context 'つつがなく終わるとき' do\r
1047       it 'ステータスコード200 OKを返す' do\r
1048         get :count, :format => :json\r
1049         response.should be_success \r
1050       end\r
1051       context 'json形式' do\r
1052         it 'jsonデータを返す' do\r
1053           get :count, :format => :json\r
1054           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
1055         end\r
1056       end\r
1057     end\r
1058   end\r
1059   \r
1060   describe '新規作成フォーム表示に於いて' do\r
1061     before do\r
1062       sign_in @user\r
1063     end\r
1064     context 'つつがなく終わるとき' do\r
1065       context 'html形式' do\r
1066         it 'ステータスコード200 OKを返す' do\r
1067           get :new\r
1068           response.should be_success \r
1069         end\r
1070         it 'newテンプレートを描画する' do\r
1071           get :new\r
1072           response.should render_template("new")\r
1073         end\r
1074       end\r
1075       context 'js形式' do\r
1076         it 'new.jsテンプレートを描画する' do\r
1077           get :new, :format => :js\r
1078           response.should render_template("new")\r
1079         end\r
1080       end\r
1081       context 'json形式' do\r
1082         it 'jsonデータを返す' do\r
1083           get :new, :format => :json\r
1084           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
1085         end\r
1086       end\r
1087     end\r
1088     context 'ユーザ権限がないとき' do\r
1089       before do\r
1090         sign_out @user\r
1091       end\r
1092       context 'html形式' do\r
1093         it 'ステータスコード302 Foundを返す' do\r
1094           get :new\r
1095           response.status.should eq 302\r
1096         end\r
1097         it 'サインインページへ遷移する' do\r
1098           get :new\r
1099           response.body.should redirect_to '/users/sign_in'\r
1100         end\r
1101       end\r
1102       context 'js形式' do\r
1103         it 'ステータスコード401 Unauthorizedを返す' do\r
1104           get :new, :format => :js\r
1105           response.status.should eq 401\r
1106         end\r
1107         it '応答メッセージにUnauthorizedを返す' do\r
1108           get :new, :format => :js\r
1109           response.message.should match(/Unauthorized/)\r
1110         end\r
1111       end\r
1112     end\r
1113   end\r
1114   \r
1115   describe '新規作成に於いて' do\r
1116     before do\r
1117       @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1118       @attr = FactoryGirl.attributes_for(:panel, :author_id => @author.id)\r
1119       sign_in @user\r
1120     end\r
1121     context 'つつがなく終わるとき' do\r
1122       context 'html形式' do\r
1123         it 'ステータスコード302 Foundを返す' do\r
1124           Panel.any_instance.stub(:store).and_return(true)\r
1125           post :create, :panel => @attr\r
1126           response.status.should eq 302\r
1127         end\r
1128         it '作成されたコマの表示ページへ遷移する' do\r
1129 #          Panel.any_instance.stub(:store).and_return(true)\r
1130           post :create, :panel => @attr\r
1131           response.should redirect_to(Panel.last)\r
1132         end\r
1133       end\r
1134       context 'json形式' do\r
1135         it 'ステータスコード200 OKを返す' do\r
1136 #          Panel.any_instance.stub(:store).and_return(true)\r
1137           post :create, :panel => @attr, :format => :json\r
1138           response.should be_success \r
1139         end\r
1140         it '作成されたコマをjsonデータで返す' do\r
1141           post :create, :panel => @attr, :format => :json\r
1142           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
1143         end\r
1144       end\r
1145     end\r
1146     context 'ユーザ権限がないとき' do\r
1147       before do\r
1148         sign_out @user\r
1149       end\r
1150       context 'html形式' do\r
1151         it 'ステータスコード302 Foundを返す' do\r
1152           post :create, :panel => @attr\r
1153           response.status.should eq 302\r
1154         end\r
1155         it 'サインインページへ遷移する' do\r
1156           post :create, :panel => @attr\r
1157           response.body.should redirect_to '/users/sign_in'\r
1158         end\r
1159       end\r
1160       context 'json形式' do\r
1161         it 'ステータスコード401 Unauthorizedを返す' do\r
1162           post :create, :panel => @attr, :format => :json\r
1163           response.status.should eq 401\r
1164         end\r
1165         it '応答メッセージにUnauthorizedを返す' do\r
1166           post :create, :panel => @attr, :format => :json\r
1167           response.message.should match(/Unauthorized/)\r
1168         end\r
1169       end\r
1170     end\r
1171   end\r
1172 \r
1173   describe '編集フォーム表示に於いて' do\r
1174     before do\r
1175       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
1176       sign_in @user\r
1177       Panel.stub(:show).and_return(@panel)\r
1178     end\r
1179     context 'つつがなく終わるとき' do\r
1180       context 'html形式' do\r
1181         it 'ステータスコード200 OKを返す' do\r
1182           get :edit, :id => @panel.id\r
1183           response.should be_success \r
1184         end\r
1185         it 'editテンプレートを描画する' do\r
1186           get :edit, :id => @panel.id\r
1187           response.should render_template("edit")\r
1188         end\r
1189       end\r
1190       context 'js形式' do\r
1191         it 'ステータスコード200 OKを返す' do\r
1192           get :edit, :id => @panel.id, :format => :js\r
1193           response.should be_success \r
1194         end\r
1195         it 'edit.jsテンプレートを描画する' do\r
1196           get :edit, :id => @panel.id, :format => :js\r
1197           response.should render_template("edit")\r
1198         end\r
1199       end\r
1200     end\r
1201     context 'ユーザ権限がないとき' do\r
1202       before do\r
1203         sign_out @user\r
1204       end\r
1205       context 'html形式' do\r
1206         it 'ステータスコード302 Foundを返す' do\r
1207           get :edit, :id => @panel.id\r
1208           response.status.should eq 302\r
1209         end\r
1210         it 'サインインページへ遷移する' do\r
1211           get :edit, :id => @panel.id\r
1212           response.body.should redirect_to '/users/sign_in'\r
1213         end\r
1214       end\r
1215       context 'js形式' do\r
1216         it 'ステータスコード401 Unauthorizedを返す' do\r
1217           get :edit, :id => @panel.id, :format => :js\r
1218           response.status.should eq 401\r
1219         end\r
1220         it '応答メッセージにUnauthorizedを返す' do\r
1221           get :edit, :id => @panel.id, :format => :js\r
1222           response.message.should match(/Unauthorized/)\r
1223         end\r
1224       end\r
1225     end\r
1226   end\r
1227 \r
1228   describe '更新に於いて' do\r
1229     before do\r
1230       @panel = FactoryGirl.create :panel, :author_id => @user.author.id\r
1231       @attr = FactoryGirl.attributes_for(:panel, :author_id => @author.id)\r
1232       sign_in @user\r
1233     end\r
1234     context 'つつがなく終わるとき' do\r
1235       context 'html形式' do\r
1236         it 'ステータスコード302 Foundを返す' do\r
1237           Panel.any_instance.stub(:store).and_return(true)\r
1238           put :update, :id => @panel.id, :panel => @attr\r
1239           response.status.should eq 302\r
1240         end\r
1241         it '作成されたコマの表示ページへ遷移する' do\r
1242 #          Panel.any_instance.stub(:store).and_return(true)\r
1243           put :update, :id => @panel.id, :panel => @attr\r
1244           response.should redirect_to(Panel.last)\r
1245         end\r
1246       end\r
1247       context 'json形式' do\r
1248         it 'ステータスコード200 OKを返す' do\r
1249 #          Panel.any_instance.stub(:store).and_return(true)\r
1250           put :update, :id => @panel.id, :panel => @attr, :format => :json\r
1251           response.should be_success \r
1252         end\r
1253         it 'ページ本体は特に返さない' do\r
1254           Panel.any_instance.stub(:save).with(any_args()).and_return(true)\r
1255           put :update, :id => @panel.id, :panel => @attr, :format => :json\r
1256           response.body.should match /./\r
1257         end\r
1258       end\r
1259     end\r
1260     context 'ユーザ権限がないとき' do\r
1261       before do\r
1262         sign_out @user\r
1263       end\r
1264       context 'html形式' do\r
1265         it 'ステータスコード302 Foundを返す' do\r
1266           put :update, :id => @panel.id, :panel => @attr\r
1267           response.status.should eq 302\r
1268         end\r
1269         it 'サインインページへ遷移する' do\r
1270           put :update, :id => @panel.id, :panel => @attr\r
1271           response.body.should redirect_to '/users/sign_in'\r
1272         end\r
1273       end\r
1274       context 'json形式' do\r
1275         it 'ステータスコード401 Unauthorizedを返す' do\r
1276           put :update, :id => @panel.id, :panel => @attr, :format => :json\r
1277           response.status.should eq 401\r
1278         end\r
1279         it '応答メッセージにUnauthorizedを返す' do\r
1280           put :update, :id => @panel.id, :panel => @attr, :format => :json\r
1281           response.message.should match(/Unauthorized/)\r
1282         end\r
1283       end\r
1284     end\r
1285   end\r
1286 \r
1287   describe '削除に於いて' do\r
1288     before do\r
1289       @panel = FactoryGirl.create :panel, :author_id => @user.author.id\r
1290       Panel.stub(:edit).and_return(@panel)\r
1291       sign_in @user\r
1292     end\r
1293     context 'つつがなく終わるとき' do\r
1294       context 'html形式' do\r
1295         it 'ステータスコード302 Foundを返す' do\r
1296           delete :destroy, :id => @panel.id\r
1297           response.status.should eq 302\r
1298         end\r
1299         it 'マイコマ一覧ページへ遷移する' do\r
1300           delete :destroy, :id => @panel.id\r
1301           response.should redirect_to('/home/panel')\r
1302         end\r
1303       end\r
1304       context 'json形式' do\r
1305         it 'ステータスコード200 OKを返す' do\r
1306           delete :destroy, :id => @panel.id, :format => :json\r
1307           response.should be_success\r
1308         end\r
1309       end\r
1310     end\r
1311     context 'ユーザ権限がないとき' do\r
1312       before do\r
1313         sign_out @user\r
1314       end\r
1315       context 'html形式' do\r
1316         it 'ステータスコード302 Foundを返す' do\r
1317           delete :destroy, :id => @panel.id\r
1318           response.status.should eq 302\r
1319         end\r
1320         it 'サインインページへ遷移する' do\r
1321           delete :destroy, :id => @panel.id\r
1322           response.body.should redirect_to '/users/sign_in'\r
1323         end\r
1324       end\r
1325       context 'json形式' do\r
1326         it 'ステータスコード401 Unauthorizedを返す' do\r
1327           delete :destroy, :id => @panel.id, :format => :json\r
1328           response.status.should eq 401\r
1329         end\r
1330         it '応答メッセージにUnauthorizedを返す' do\r
1331           delete :destroy, :id => @panel.id, :format => :json\r
1332           response.message.should match(/Unauthorized/)\r
1333         end\r
1334       end\r
1335     end\r
1336   end\r
1337   \r
1338 end\r
1339 end\r
1340 \r