Commit 3dd71e9aa6b44b6360cf97391f3823e9e97449e4
1 parent
f508ec83
Exists in
master
and in
1 other branch
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 |