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 | 100 | |
101 | 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 | 103 | @question_tasks.each do |taskname, description| |
113 | 104 | message, error_occurred = send(taskname, question) |
114 | 105 | if error_occurred |
... | ... | @@ -118,6 +109,17 @@ namespace :test_api do |
118 | 109 | end |
119 | 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 | 123 | end |
122 | 124 | |
123 | 125 | @global_tasks.each do |taskname, description| |
... | ... | @@ -150,95 +152,6 @@ namespace :test_api do |
150 | 152 | |
151 | 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 | 155 | namespace :question do |
243 | 156 | # use this to dynamically create rake task for each question test |
244 | 157 | @question_tasks = { |
... | ... | @@ -246,13 +159,18 @@ namespace :test_api do |
246 | 159 | :check_each_choice_appears_within_n_stddevs => "Ensure each choice appears within 6 standard deviations", |
247 | 160 | :check_each_choice_equally_likely_to_appear_left_or_right => "Ensure each choice is equally likely to appear on left or right", |
248 | 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 | 170 | # dynamically create tasks for each question task |
253 | 171 | @question_tasks.each do |taskname, description| |
254 | 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 | 174 | a = cleanup_args(args) |
257 | 175 | questions = Question.find(a[:question_id]) |
258 | 176 | questions.each do |question| |
... | ... | @@ -262,6 +180,80 @@ namespace :test_api do |
262 | 180 | end |
263 | 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 | 257 | def answered_appearances_equals_votes_and_skips(question) |
266 | 258 | error_message = "" |
267 | 259 | success_message = "All vote and skip objects have an associated appearance object" |
... | ... | @@ -370,6 +362,7 @@ namespace :test_api do |
370 | 362 | end |
371 | 363 | |
372 | 364 | def check_object_counter_cache_values_match_actual_values(question) |
365 | + # FIXME: split up into several tests | |
373 | 366 | error_message = "" |
374 | 367 | success_message = "All cached object values match actual values within database" |
375 | 368 | # Checks that counter_cache is working as expected | ... | ... |