OSDN Git Service

67f8aea5b016f3bb6741101c05f0ce0c3e083d7f
[elecoma/elecoma.git] / spec / models / questionnaire_spec.rb
1 require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
3 describe Questionnaire do
4   fixtures :questionnaires, :questions, :questionnaire_answers,:question_choices,:question_answers
5   before(:each) do
6     @questionnaire = Questionnaire.new
7   end
8   describe "validateチェック" do
9     before(:each) do
10       init_test_data      
11     end    
12     it "データが正しい" do
13       @questionnaire.should be_valid
14     end
15     it "タイトル" do
16       #必須チェック
17       @questionnaire.name = nil
18       @questionnaire.should_not be_valid
19       #文字数チェック(300文字以下)
20       @questionnaire.name = "a" * 300
21       @questionnaire.should be_valid
22       @questionnaire.name = "a" * 301
23       @questionnaire.should_not be_valid        
24     end
25     it "アンケート内容" do
26       #必須チェック
27       @questionnaire.content = nil
28       @questionnaire.should_not be_valid
29     end
30     it "質問項目チェック1" do
31       #必須チェック
32       #質問がありません
33       @questionnaire.questions = []
34       @questionnaire.should_not be_valid      
35     end
36     it "質問項目チェック2" do
37       #質問1がありません
38       #選択があるが、質問1が選択されていない
39       @questionnaire.questions[0].position = 2
40       @questionnaire.should_not be_valid
41     end
42     it "質問項目チェック3" do
43       #質問Nの内容がありません
44       @questionnaire.questions[1].content = nil
45       @questionnaire.should_not be_valid
46     end
47     it "質問項目チェック4" do
48       #質問Nの内容が10万文字以上
49       @questionnaire.questions[1].content = "a" * 100000
50       @questionnaire.should be_valid
51       @questionnaire.questions[1].content = "a" * 100001
52       @questionnaire.should_not be_valid
53     end
54
55     it "質問形式が選択されていません" do
56       #質問Nの質問形式が選択されていません
57       @questionnaire.questions[1].question_choices[0] = QuestionChoice.new
58       @questionnaire.should_not be_valid
59     end
60     it "選択肢1がありません" do
61       #質問Nの選択肢1がありません
62       #このチェックはformatがCHECKBO||RADIOBUTTONの場合のみ
63       @questionnaire.questions[1].question_choices[0] = QuestionChoice.new(:format=>QuestionChoice::CHECKBOX)
64     end
65   end
66   describe "その他" do
67     it "初期化" do
68       #初期化前
69       @questionnaire.questions.should be_empty
70       #初期化
71       @questionnaire.init_data
72       #初期化後
73       @questionnaire.questions.size.should == Questionnaire::QUESTION_COUNT
74       @questionnaire.questions.each_with_index do |question,i|
75         question.content.should be_nil
76         question.position.should == i+1
77         question.question_choices.size.should == Questionnaire::QUESTION_CHOICE_COUNT
78         question.question_choices.each_with_index do |choice,i|
79           choice.content.should be_nil
80           choice.format.should be_nil
81           choice.position.should == i+1
82         end
83       end
84     end
85     it "表示用アンケートデータ取得" do
86       #メソッド呼び出し前
87       @questionnaire = questionnaires(:questionnaire_id_9)
88       cnt_questions = Question.find(:all,:conditions=>["questionnaire_id = ?",@questionnaire.id]).size
89       @questionnaire.questions.size.should == cnt_questions
90       question_ids = @questionnaire.questions.map {|question| question.id}
91       @questionnaire.questions.each do |question|
92         question.question_choices.size.should == QuestionChoice.find(:all,:conditions=>["question_id = ?",question.id]).size
93       end
94       #メソッド呼び出し
95       questions = @questionnaire.get_show_questions_data
96       #メソッド呼出し後
97       #期待結果
98       #1.questionsのサイズはQuestionnaire::QUESTION_COUNTである
99       questions.size.should == Questionnaire::QUESTION_COUNT
100       questions.each_with_index do |question,i|
101         #2.DBに登録されていない分は選択肢を新しく追加
102         if question.id.nil?
103           question.content.should be_nil
104           question.position.should == i+1
105         end
106         #3.questionごとにquestion_choices.sizeがQuestionnaire::QUESTION_CHOICE_COUNTである
107         question.question_choices.size.should == Questionnaire::QUESTION_CHOICE_COUNT
108         question.question_choices.each_with_index do |choice,i|
109           #4.DBに登録されていない分は選択肢を新しく追加
110           if choice.id.nil?
111             choice.content.should be_nil
112             choice.format.should be_nil
113             choice.position.should == i+1
114           end
115         end
116       end      
117     end
118   describe "CSVダウンロード" do
119     it "CSVダウンロード" do
120       actual_titles,actual_datas = getCsv(Questionnaire.csv(questionnaires(:questionnaire_id_1).id, Questionnaire::QUESTION_COUNT))
121
122       #タイトル
123       act = actual_titles.sort
124       ext = Questionnaire.get_csv_header(Questionnaire::QUESTION_COUNT).sort
125       act.should == ext
126       #データ内容
127       columns = ["id", "customer_family_name", "customer_first_name", "customer_family_name_kana", "customer_first_name_kana", "customer_id",
128                "zipcode01", "zipcode02", "prefecture_name", "address_city", "address_details", "tel01", "tel02", "tel03",
129                "created_at", "email"]
130       #データ比較
131       actual_datas.should == convert(questionnaires(:questionnaire_id_1).questionnaire_answers,columns)
132     end
133   end
134     
135   end
136   #=============================================
137   private
138   def init_test_data
139     @questionnaire.name = "テストコード"
140     @questionnaire.content = "テストコードです"
141     @questionnaire.operation = false
142     #選択された項目内容設定
143     #ここでは3質問で、一つずづ
144     3.times do |question_idx|
145       question = Question.new(:content=>"アンケートテスト", :position=>question_idx+1)
146       2.times do |choice_idx|
147         question.question_choices << QuestionChoice.new(:content=>"アンケートテストです",:format=>choice_idx+1, :position=>choice_idx+1)        
148       end
149       @questionnaire.questions << question
150     end
151   end
152   #fixturesデータをCSV形式に変換(比較用)
153   def convert(questionnaire_answers, columns)
154     datas = []
155     questionnaire_answers.each do |qa|
156       arr = []
157       columns.each do |c|
158         #更新時間について、
159         #questionnaire_answer.created_atとquestionnaire_answer[created_at]の結果が違うので特別処理
160         if "created_at" == c
161           arr << (qa.created_at.nil? ? "" : qa.created_at.strftime('%Y-%m-%d %H:%M:%S'))
162         else  
163           arr << (qa[c].nil? ? "" : qa[c].to_s)
164         end      
165       end
166       #回答1-6
167       Questionnaire::QUESTION_COUNT.times do |i|
168         arr << (qa.question_answers[i].nil? ? "" :  qa.question_answers[i].answer.to_s)
169       end
170       datas << arr.join(",").split(",")
171     end
172     datas
173   end  
174   #CSVダウンロードデータを比較用データに変換
175   def getCsv(datas)
176     
177     #タイトル
178     actual_titles = []
179     #データ
180     actual_datas = []
181     datas.split("\n").each_with_index do |d,i|
182       if i == 0
183         actual_titles = d.split(/\s*,\s*/)
184       else
185         actual_datas << d.split(/\s*,\s*/)
186       end
187     end
188     return actual_titles ,actual_datas
189   end  
190 end