Commit 00c7d88ca44175c80fc5f70adbe17912ca84f726
1 parent
4efdb207
Exists in
master
and in
1 other branch
More api consistency checks
Showing
1 changed file
with
46 additions
and
15 deletions
Show diff stats
lib/tasks/test_api.rake
... | ... | @@ -45,9 +45,7 @@ namespace :test_api do |
45 | 45 | #this is not elegant, but should only be run once, so quick and dirty wins |
46 | 46 | |
47 | 47 | start_date = Vote.find(:all, :conditions => 'loser_choice_id IS NOT NULL', :order => :created_at, :limit => 1).first.created_at.to_date |
48 | - end_date = Appearance.first.created_at.to_date | |
49 | - | |
50 | - start_date.upto(end_date-1) do |the_date| | |
48 | + start_date.upto(Date.today) do |the_date| | |
51 | 49 | questions = Question.find(:all) |
52 | 50 | |
53 | 51 | print the_date.to_s |
... | ... | @@ -120,7 +118,6 @@ namespace :test_api do |
120 | 118 | |
121 | 119 | desc "Should only need to be run once" |
122 | 120 | task(:generate_all_possible_prompts => :environment) do |
123 | - inserts = [] | |
124 | 121 | Question.find(:all).each do |q| |
125 | 122 | choices = q.choices |
126 | 123 | if q.prompts.size > choices.size**2 - choices.size |
... | ... | @@ -133,8 +130,10 @@ namespace :test_api do |
133 | 130 | print "#{q.id} should add #{(choices.size ** 2 - choices.size) - q.prompts.size}\n" |
134 | 131 | |
135 | 132 | end |
136 | - timestring = Time.now.to_s(:db) #isn't rails awesome? | |
133 | + created_timestring = q.created_at.to_s(:db) | |
134 | + updated_timestring = Time.now.to_s(:db) #isn't rails awesome? | |
137 | 135 | promptscount=0 |
136 | + inserts = [] | |
138 | 137 | the_prompts = Prompt.find(:all, :select => 'id, left_choice_id, right_choice_id', :conditions => {:question_id => q.id}) |
139 | 138 | |
140 | 139 | the_prompts_hash = {} |
... | ... | @@ -151,8 +150,7 @@ namespace :test_api do |
151 | 150 | keystring = "#{l.id},#{r.id}" |
152 | 151 | p = the_prompts_hash[keystring] |
153 | 152 | if p.nil? |
154 | - print "." | |
155 | - inserts.push("(NULL, #{q.id}, NULL, #{l.id}, '#{timestring}', '#{timestring}', NULL, 0, #{r.id}, NULL, NULL)") | |
153 | + inserts.push("(NULL, #{q.id}, NULL, #{l.id}, '#{created_timestring}', '#{updated_timestring}', NULL, 0, #{r.id}, NULL, NULL)") | |
156 | 154 | promptscount+=1 |
157 | 155 | end |
158 | 156 | |
... | ... | @@ -162,16 +160,17 @@ namespace :test_api do |
162 | 160 | end |
163 | 161 | |
164 | 162 | print "Added #{promptscount} to #{q.id}\n" |
163 | + sql = "INSERT INTO `prompts` (`algorithm_id`, `question_id`, `voter_id`, `left_choice_id`, `created_at`, `updated_at`, `tracking`, `votes_count`, `right_choice_id`, `active`, `randomkey`) VALUES #{inserts.join(', ')}" | |
164 | + unless inserts.empty? | |
165 | + ActiveRecord::Base.connection.execute(sql) | |
166 | + end | |
167 | + | |
168 | + Question.update_counters(q.id, :prompts_count => promptscount) | |
165 | 169 | |
166 | - Question.update_counters(q.id, :prompts_count => promptscount) | |
167 | 170 | |
168 | 171 | end |
169 | 172 | |
170 | - sql = "INSERT INTO `prompts` (`algorithm_id`, `question_id`, `voter_id`, `left_choice_id`, `created_at`, `updated_at`, `tracking`, `votes_count`, `right_choice_id`, `active`, `randomkey`) VALUES #{inserts.join(', ')}" | |
171 | 173 | |
172 | - unless inserts.empty? | |
173 | - ActiveRecord::Base.connection.execute(sql) | |
174 | - end | |
175 | 174 | |
176 | 175 | end |
177 | 176 | |
... | ... | @@ -242,10 +241,12 @@ namespace :test_api do |
242 | 241 | total_generated_prompts_on_left += choice.prompts_on_the_left.size |
243 | 242 | total_generated_prompts_on_right += choice.prompts_on_the_right.size |
244 | 243 | |
245 | - cached_score = choice.score | |
246 | - generated_score = choice.compute_score | |
244 | + cached_score = choice.score.to_f | |
245 | + generated_score = choice.compute_score.to_f | |
246 | + | |
247 | + delta = 0.001 | |
247 | 248 | |
248 | - if cached_score.round != generated_score.round | |
249 | + if (cached_score - generated_score).abs >= delta | |
249 | 250 | error_msg += "Error! The cached_score is not equal to the calculated score for choice #{choice.id}" |
250 | 251 | |
251 | 252 | print "This score is wrong! #{choice.id} , Question ID: #{question.id}, #{cached_score}, #{generated_score}, updated: #{choice.updated_at}\n" |
... | ... | @@ -267,6 +268,7 @@ namespace :test_api do |
267 | 268 | total_scores_lte_fifty +=1 |
268 | 269 | end |
269 | 270 | |
271 | + | |
270 | 272 | end |
271 | 273 | |
272 | 274 | if (2*total_wins != total_votes) |
... | ... | @@ -323,6 +325,31 @@ namespace :test_api do |
323 | 325 | end |
324 | 326 | end |
325 | 327 | |
328 | + # Checks that counter_cache is working as expected | |
329 | + cached_prompts_size = question.prompts.size | |
330 | + actual_prompts_size = question.prompts.count | |
331 | + | |
332 | + if cached_prompts_size != actual_prompts_size | |
333 | + error_msg += "Error! Question #{question.id} has an inconsistent # of prompts! cached#: #{cached_prompts_size}, actual#: #{actual_prompts_size}\n" | |
334 | + end | |
335 | + | |
336 | + cached_votes_size = question.votes.size | |
337 | + actual_votes_size = question.votes.count | |
338 | + | |
339 | + if cached_votes_size != actual_votes_size | |
340 | + error_msg += "Error! Question #{question.id} has an inconsistent # of votes! cached#: #{cached_votes_size}, actual#: #{actual_votes_size}\n" | |
341 | + end | |
342 | + | |
343 | + cached_choices_size = question.choices.size | |
344 | + actual_choices_size = question.choices.count | |
345 | + | |
346 | + if cached_choices_size != actual_choices_size | |
347 | + error_msg += "Error! Question #{question.id} has an inconsistent # of choices! cached#: #{cached_choices_size}, actual#: #{actual_choices_size}\n" | |
348 | + end | |
349 | + | |
350 | + if cached_prompts_size != question.choices.size **2 - question.choices.size | |
351 | + error_msg += "Error! Question #{question.id} has an incorrect number of prompts! Expected #{question.choices.size **2 - question.choices.size}, Actual: #{cached_prompts_size}\n" | |
352 | + end | |
326 | 353 | |
327 | 354 | |
328 | 355 | if error_bool |
... | ... | @@ -383,6 +410,10 @@ namespace :test_api do |
383 | 410 | " Each choice has appeared n times, where n falls within 6 stddevs of the mean number of appearances for a question\n" + |
384 | 411 | " Note: this applies only to seed choices (not user submitted) and choices currently marked active\n" + |
385 | 412 | " The cached score value matches the calculated score value for each choice\n" + |
413 | + " The cached vote count matches the actual number of votes for each question\n" + | |
414 | + " The cached choices count matches the actual number of choices for each question\n" + | |
415 | + " The cached prompt count matches the actual number of prompts for each question\n" + | |
416 | + " The prompt count matches the expected number of prompts ( num_choices ^2 - num choices) for each question\n" + | |
386 | 417 | " All Vote objects have an associated appearance object\n" + |
387 | 418 | " All Vote objects have an client response time < calculated server roundtrip time\n" |
388 | 419 | ... | ... |