Commit 3dd71e9aa6b44b6360cf97391f3823e9e97449e4

Authored by Luke Baker
1 parent f508ec83

convert 5 more tests into question tasks

Showing 1 changed file with 93 additions and 100 deletions   Show diff stats
lib/tasks/test_api.rake
@@ -100,15 +100,6 @@ namespace :test_api do @@ -100,15 +100,6 @@ namespace :test_api do
100 100
101 questions.each do |question| 101 questions.each do |question|
102 102
103 - message, error_occurred = check_basic_balanced_stats(question)  
104 - # hack for now, get around to doing this with block/yield to  
105 - # get rid of duplication  
106 - if error_occurred  
107 - errors << message  
108 - else  
109 - successes << message  
110 - end  
111 -  
112 @question_tasks.each do |taskname, description| 103 @question_tasks.each do |taskname, description|
113 message, error_occurred = send(taskname, question) 104 message, error_occurred = send(taskname, question)
114 if error_occurred 105 if error_occurred
@@ -118,6 +109,17 @@ namespace :test_api do @@ -118,6 +109,17 @@ namespace :test_api do
118 end 109 end
119 end 110 end
120 111
  112 + question.choices.each do |choice|
  113 + @choice_tasks.each do |taskname, description|
  114 + message, error_occurred = send(taskname, question)
  115 + if error_occurred
  116 + errors << message
  117 + else
  118 + successes << message
  119 + end
  120 + end
  121 + end
  122 +
121 end 123 end
122 124
123 @global_tasks.each do |taskname, description| 125 @global_tasks.each do |taskname, description|
@@ -150,95 +152,6 @@ namespace :test_api do @@ -150,95 +152,6 @@ namespace :test_api do
150 152
151 end 153 end
152 154
153 - def check_basic_balanced_stats(question)  
154 - error_message = ""  
155 - success_message = "2 x Total Wins = Total Votes\n" +  
156 - "Total Votes (wins + losses) is Even\n" +  
157 - "Total Votes (wins + losses) = 2 x the number of vote objects that belong to the question\n" +  
158 - "Total generated prompts on left = Total generated prompts on right"  
159 - total_wins =0  
160 - total_votes =0  
161 - total_generated_prompts_on_left = 0  
162 - total_generated_prompts_on_right = 0  
163 - total_scores_gte_fifty= 0  
164 - total_scores_lte_fifty= 0  
165 - error_bool = false  
166 - # votes before 2010-02-17 have null loser_choice_id therefore we  
167 - # want to ignore some tests for any question with votes before 2010-02-17  
168 - question_has_votes_before_2010_02_17 = question.votes.count(:conditions => ["created_at < ?", '2010-02-17']) > 0  
169 -  
170 - # reload question to make sure we have most recent data  
171 - question.reload  
172 - question.choices.each do |choice|  
173 -  
174 - if choice.wins  
175 - total_wins += choice.wins  
176 - total_votes += choice.wins  
177 - end  
178 -  
179 - if choice.losses  
180 - total_votes += choice.losses  
181 - end  
182 -  
183 - total_generated_prompts_on_left += choice.prompts_on_the_left.size  
184 - total_generated_prompts_on_right += choice.prompts_on_the_right.size  
185 -  
186 - cached_score = choice.score.to_f  
187 - if cached_score >= 50  
188 - total_scores_gte_fifty +=1  
189 - end  
190 - if cached_score <= 50  
191 - total_scores_lte_fifty +=1  
192 - end  
193 -  
194 - @choice_tasks.each do |taskname, description|  
195 - message, error_occurred = send(taskname, question)  
196 - if error_occurred  
197 - error_message += message + "\n"  
198 - end  
199 - end  
200 -  
201 - end  
202 -  
203 -  
204 - unless question_has_votes_before_2010_02_17  
205 - if (2*total_wins != total_votes)  
206 - error_message += "Error 1: 2 x Total Wins != Total votes\n"  
207 - error_bool= true  
208 - end  
209 -  
210 - if(total_votes % 2 != 0)  
211 - error_message += "Error 2: Total votes is not Even!\n"  
212 - error_bool= true  
213 - end  
214 -  
215 - if(total_votes != 2* question.votes_count)  
216 - error_message += "Error 3: Total votes != 2 x # vote objects\n"  
217 - error_bool = true  
218 - end  
219 - end  
220 -  
221 - if(total_generated_prompts_on_right != total_generated_prompts_on_right)  
222 - error_message += "Error 4: Total generated prompts on left != Total generated prompts on right\n"  
223 - error_bool = true  
224 - end  
225 -  
226 - unless question_has_votes_before_2010_02_17  
227 - if(total_scores_lte_fifty == question.choices.size || total_scores_gte_fifty == question.choices.size) && (total_scores_lte_fifty != total_scores_gte_fifty)  
228 - error_message += "Error: The scores of all choices are either all above 50, or all below 50. This is probably wrong\n"  
229 - error_bool = true  
230 - puts "Error score fifty: #{question.id}"  
231 - end  
232 - end  
233 -  
234 - if error_bool  
235 - error_message += "Question #{question.id}: 2*wins = #{2*total_wins}, total votes = #{total_votes}, vote_count = #{question.votes_count}\n"  
236 - end  
237 - return error_message.blank? ? [success_message, false] : [error_message, true]  
238 - end  
239 -  
240 -  
241 -  
242 namespace :question do 155 namespace :question do
243 # use this to dynamically create rake task for each question test 156 # use this to dynamically create rake task for each question test
244 @question_tasks = { 157 @question_tasks = {
@@ -246,13 +159,18 @@ namespace :test_api do @@ -246,13 +159,18 @@ namespace :test_api do
246 :check_each_choice_appears_within_n_stddevs => "Ensure each choice appears within 6 standard deviations", 159 :check_each_choice_appears_within_n_stddevs => "Ensure each choice appears within 6 standard deviations",
247 :check_each_choice_equally_likely_to_appear_left_or_right => "Ensure each choice is equally likely to appear on left or right", 160 :check_each_choice_equally_likely_to_appear_left_or_right => "Ensure each choice is equally likely to appear on left or right",
248 :check_prompt_cache_hit_rate => "Check prompt cache hit rate", 161 :check_prompt_cache_hit_rate => "Check prompt cache hit rate",
249 - :check_object_counter_cache_values_match_actual_values => "Check that object counter cache values match actual values" 162 + :check_object_counter_cache_values_match_actual_values => "Check that object counter cache values match actual values",
  163 + :wins_and_losses_equals_two_times_wins => "Verifies that wins and losses are equal to 2 times the total number of wins",
  164 + :wins_and_losses_is_even => "Verify that sum of wins and losses is even",
  165 + :wins_and_losses_equals_two_times_vote_count => "Verify that sum of wins and losses equals two times the vote count",
  166 + :check_scores_over_above_fifty => "Check that there are some scores above fifty and some below",
  167 + :generated_prompts_on_each_side_are_equal => "Verify that count of generated prompts on each side is equal"
250 } 168 }
251 169
252 # dynamically create tasks for each question task 170 # dynamically create tasks for each question task
253 @question_tasks.each do |taskname, description| 171 @question_tasks.each do |taskname, description|
254 desc description 172 desc description
255 - task taskname, [:question_id] => :environment do |t, args| 173 + task taskname, [:question_id] => [:environment, :question_ids_with_votes_before_2010_02_17] do |t, args|
256 a = cleanup_args(args) 174 a = cleanup_args(args)
257 questions = Question.find(a[:question_id]) 175 questions = Question.find(a[:question_id])
258 questions.each do |question| 176 questions.each do |question|
@@ -262,6 +180,80 @@ namespace :test_api do @@ -262,6 +180,80 @@ namespace :test_api do
262 end 180 end
263 end 181 end
264 182
  183 + def generated_prompts_on_each_side_are_equal(question)
  184 + success_message = "Number of generated prompts on left are equal to number generated on right"
  185 + generated_on_left = Choice.connection.select_one("
  186 + SELECT COUNT(*) AS total FROM prompts
  187 + WHERE question_id = #{question.id} AND left_choice_id IN (SELECT id from choices where question_id = #{question.id})")
  188 + generated_on_right = Choice.connection.select_one("
  189 + SELECT COUNT(*) AS total FROM prompts
  190 + WHERE question_id = #{question.id} AND right_choice_id IN (SELECT id from choices where question_id = #{question.id})")
  191 + if (generated_on_left["total"] != generated_on_right["total"])
  192 + error_message = "Error 4: Total generated prompts on left != Total generated prompts on right"
  193 + end
  194 + return error_message.blank? ? [success_message, false] : [error_message, true]
  195 + end
  196 +
  197 + def check_scores_over_above_fifty(question)
  198 + success_message = "Scores are distributed above and below 50"
  199 + return [success_message, false] if @question_ids_with_votes_before_2010_02_17.include?(question.id)
  200 + totals_lte_fifty = Choice.connection.select_one("
  201 + SELECT COUNT(*) AS total FROM choices
  202 + WHERE question_id = #{question.id} AND score <= 50")
  203 + totals_gte_fifty = Choice.connection.select_one("
  204 + SELECT COUNT(*) AS total FROM choices
  205 + WHERE question_id = #{question.id} AND score >= 50")
  206 + total_scores_lte_fifty = totals_lte_fifty["total"]
  207 + total_scores_gte_fifty = totals_gte_fifty["total"]
  208 + question_choices_count = question.choices.count
  209 + if (total_scores_lte_fifty == question_choices_count || total_scores_gte_fifty == question_choices_count) && (total_scores_lte_fifty != total_scores_gte_fifty)
  210 + error_message = "Error! Question #{question.id}: The scores of all choices are either all above 50, or all below 50. This is probably wrong"
  211 + end
  212 + return error_message.blank? ? [success_message, false] : [error_message, true]
  213 + end
  214 +
  215 + def wins_and_losses_equals_two_times_vote_count(question)
  216 + success_message = "Wins and losses equals 2 times vote count"
  217 + return [success_message, false] if @question_ids_with_votes_before_2010_02_17.include?(question.id)
  218 + totals = Question.connection.select_one("
  219 + SELECT SUM(wins + losses) AS total,
  220 + SUM(wins) AS total_wins,
  221 + SUM(losses) AS total_losses FROM choices
  222 + WHERE question_id = #{question.id}")
  223 + if(totals["total"] != 2* question.votes_count)
  224 + error_message = "Error: Total votes != 2 x # vote objects"
  225 + end
  226 + return error_message.blank? ? [success_message, false] : [error_message, true]
  227 + end
  228 +
  229 + def wins_and_losses_is_even(question)
  230 + success_message = "Total Votes is even"
  231 + return [success_message, false] if @question_ids_with_votes_before_2010_02_17.include?(question.id)
  232 + totals = Question.connection.select_one("
  233 + SELECT SUM(wins + losses) AS total,
  234 + SUM(wins) AS total_wins,
  235 + SUM(losses) AS total_losses FROM choices
  236 + WHERE question_id = #{question.id}")
  237 + if (totals["total"] % 2 != 0)
  238 + error_message = "Error: Total votes is not Even!"
  239 + end
  240 + return error_message.blank? ? [success_message, false] : [error_message, true]
  241 + end
  242 +
  243 + def wins_and_losses_equals_two_times_wins(question)
  244 + success_message = "2 x Total Wins == Total Votes"
  245 + return [success_message, false] if @question_ids_with_votes_before_2010_02_17.include?(question.id)
  246 + totals = Question.connection.select_one("
  247 + SELECT SUM(wins + losses) AS total,
  248 + SUM(wins) AS total_wins,
  249 + SUM(losses) AS total_losses FROM choices
  250 + WHERE question_id = #{question.id}")
  251 + if (2*totals["total_wins"] != totals["total"])
  252 + error_message = "Error: 2 x Total Wins != Total votes"
  253 + end
  254 + return error_message.blank? ? [success_message, false] : [error_message, true]
  255 + end
  256 +
265 def answered_appearances_equals_votes_and_skips(question) 257 def answered_appearances_equals_votes_and_skips(question)
266 error_message = "" 258 error_message = ""
267 success_message = "All vote and skip objects have an associated appearance object" 259 success_message = "All vote and skip objects have an associated appearance object"
@@ -370,6 +362,7 @@ namespace :test_api do @@ -370,6 +362,7 @@ namespace :test_api do
370 end 362 end
371 363
372 def check_object_counter_cache_values_match_actual_values(question) 364 def check_object_counter_cache_values_match_actual_values(question)
  365 + # FIXME: split up into several tests
373 error_message = "" 366 error_message = ""
374 success_message = "All cached object values match actual values within database" 367 success_message = "All cached object values match actual values within database"
375 # Checks that counter_cache is working as expected 368 # Checks that counter_cache is working as expected