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,9 +45,7 @@ namespace :test_api do | ||
45 | #this is not elegant, but should only be run once, so quick and dirty wins | 45 | #this is not elegant, but should only be run once, so quick and dirty wins |
46 | 46 | ||
47 | start_date = Vote.find(:all, :conditions => 'loser_choice_id IS NOT NULL', :order => :created_at, :limit => 1).first.created_at.to_date | 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 | questions = Question.find(:all) | 49 | questions = Question.find(:all) |
52 | 50 | ||
53 | print the_date.to_s | 51 | print the_date.to_s |
@@ -120,7 +118,6 @@ namespace :test_api do | @@ -120,7 +118,6 @@ namespace :test_api do | ||
120 | 118 | ||
121 | desc "Should only need to be run once" | 119 | desc "Should only need to be run once" |
122 | task(:generate_all_possible_prompts => :environment) do | 120 | task(:generate_all_possible_prompts => :environment) do |
123 | - inserts = [] | ||
124 | Question.find(:all).each do |q| | 121 | Question.find(:all).each do |q| |
125 | choices = q.choices | 122 | choices = q.choices |
126 | if q.prompts.size > choices.size**2 - choices.size | 123 | if q.prompts.size > choices.size**2 - choices.size |
@@ -133,8 +130,10 @@ namespace :test_api do | @@ -133,8 +130,10 @@ namespace :test_api do | ||
133 | print "#{q.id} should add #{(choices.size ** 2 - choices.size) - q.prompts.size}\n" | 130 | print "#{q.id} should add #{(choices.size ** 2 - choices.size) - q.prompts.size}\n" |
134 | 131 | ||
135 | end | 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 | promptscount=0 | 135 | promptscount=0 |
136 | + inserts = [] | ||
138 | the_prompts = Prompt.find(:all, :select => 'id, left_choice_id, right_choice_id', :conditions => {:question_id => q.id}) | 137 | the_prompts = Prompt.find(:all, :select => 'id, left_choice_id, right_choice_id', :conditions => {:question_id => q.id}) |
139 | 138 | ||
140 | the_prompts_hash = {} | 139 | the_prompts_hash = {} |
@@ -151,8 +150,7 @@ namespace :test_api do | @@ -151,8 +150,7 @@ namespace :test_api do | ||
151 | keystring = "#{l.id},#{r.id}" | 150 | keystring = "#{l.id},#{r.id}" |
152 | p = the_prompts_hash[keystring] | 151 | p = the_prompts_hash[keystring] |
153 | if p.nil? | 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 | promptscount+=1 | 154 | promptscount+=1 |
157 | end | 155 | end |
158 | 156 | ||
@@ -162,16 +160,17 @@ namespace :test_api do | @@ -162,16 +160,17 @@ namespace :test_api do | ||
162 | end | 160 | end |
163 | 161 | ||
164 | print "Added #{promptscount} to #{q.id}\n" | 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 | end | 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 | end | 175 | end |
177 | 176 | ||
@@ -242,10 +241,12 @@ namespace :test_api do | @@ -242,10 +241,12 @@ namespace :test_api do | ||
242 | total_generated_prompts_on_left += choice.prompts_on_the_left.size | 241 | total_generated_prompts_on_left += choice.prompts_on_the_left.size |
243 | total_generated_prompts_on_right += choice.prompts_on_the_right.size | 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 | error_msg += "Error! The cached_score is not equal to the calculated score for choice #{choice.id}" | 250 | error_msg += "Error! The cached_score is not equal to the calculated score for choice #{choice.id}" |
250 | 251 | ||
251 | print "This score is wrong! #{choice.id} , Question ID: #{question.id}, #{cached_score}, #{generated_score}, updated: #{choice.updated_at}\n" | 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,6 +268,7 @@ namespace :test_api do | ||
267 | total_scores_lte_fifty +=1 | 268 | total_scores_lte_fifty +=1 |
268 | end | 269 | end |
269 | 270 | ||
271 | + | ||
270 | end | 272 | end |
271 | 273 | ||
272 | if (2*total_wins != total_votes) | 274 | if (2*total_wins != total_votes) |
@@ -323,6 +325,31 @@ namespace :test_api do | @@ -323,6 +325,31 @@ namespace :test_api do | ||
323 | end | 325 | end |
324 | end | 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 | if error_bool | 355 | if error_bool |
@@ -383,6 +410,10 @@ namespace :test_api do | @@ -383,6 +410,10 @@ namespace :test_api do | ||
383 | " Each choice has appeared n times, where n falls within 6 stddevs of the mean number of appearances for a question\n" + | 410 | " Each choice has appeared n times, where n falls within 6 stddevs of the mean number of appearances for a question\n" + |
384 | " Note: this applies only to seed choices (not user submitted) and choices currently marked active\n" + | 411 | " Note: this applies only to seed choices (not user submitted) and choices currently marked active\n" + |
385 | " The cached score value matches the calculated score value for each choice\n" + | 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 | " All Vote objects have an associated appearance object\n" + | 417 | " All Vote objects have an associated appearance object\n" + |
387 | " All Vote objects have an client response time < calculated server roundtrip time\n" | 418 | " All Vote objects have an client response time < calculated server roundtrip time\n" |
388 | 419 |