Commit f508ec83723e7a602fe26a08e23be54998d38c68
1 parent
bdf659e8
Exists in
master
and in
1 other branch
cleanup choice tasks
create atomic choice tasks add has_many :losing_votes to choice
Showing
2 changed files
with
80 additions
and
58 deletions
Show diff stats
app/models/choice.rb
@@ -9,6 +9,7 @@ class Choice < ActiveRecord::Base | @@ -9,6 +9,7 @@ class Choice < ActiveRecord::Base | ||
9 | #validates_length_of :item, :maximum => 140 | 9 | #validates_length_of :item, :maximum => 140 |
10 | 10 | ||
11 | has_many :votes | 11 | has_many :votes |
12 | + has_many :losing_votes, :class_name => "Vote", :foreign_key => "loser_choice_id" | ||
12 | has_many :flags | 13 | has_many :flags |
13 | has_many :prompts_on_the_left, :class_name => "Prompt", :foreign_key => "left_choice_id" | 14 | has_many :prompts_on_the_left, :class_name => "Prompt", :foreign_key => "left_choice_id" |
14 | has_many :prompts_on_the_right, :class_name => "Prompt", :foreign_key => "right_choice_id" | 15 | has_many :prompts_on_the_right, :class_name => "Prompt", :foreign_key => "right_choice_id" |
lib/tasks/test_api.rake
1 | namespace :test_api do | 1 | namespace :test_api do |
2 | 2 | ||
3 | desc "Run all API tests" | 3 | desc "Run all API tests" |
4 | - task :all => [:question_vote_consistency] | 4 | + task :all => [:question_ids_with_votes_before_2010_02_17, :question_vote_consistency] |
5 | 5 | ||
6 | namespace :choice do | 6 | namespace :choice do |
7 | - desc "Ensure that cached prompt counts are valid for a choice" | ||
8 | - task :verify_cached_prompt_counts, [:choice_id] => :environment do |t, args| | ||
9 | - a = clean_up_args(args) | ||
10 | - choices = Choice.find(a[:choice_id]) | ||
11 | - choices.each do |choice| | ||
12 | - puts verify_cached_prompt_counts(choice).inspect | 7 | + @choice_tasks = { |
8 | + :verify_cached_prompt_counts => "Ensure that cached prompt counts are valid for a choice", | ||
9 | + :verify_choice_appearances_and_votes => "Ensure that an idea: appearances on left + appearances on right >= (wins + losses + skips)", | ||
10 | + :verify_valid_cached_score => "Verify that cached score is valid", | ||
11 | + :verify_cached_score_equals_computed_score => "Verify accurate cached score", | ||
12 | + :verify_wins_equals_vote_wins => "Verify wins equals vote wins", | ||
13 | + :verify_losses_equals_losing_votes => "Verify losses equals losing votes count" | ||
14 | + } | ||
15 | + | ||
16 | + # dynamically create tasks for each choice task | ||
17 | + @choice_tasks.each do |taskname, description| | ||
18 | + desc description | ||
19 | + task taskname, [:choice_id] => [:environment, :question_ids_with_votes_before_2010_02_17] do |t, args| | ||
20 | + a = cleanup_args(args) | ||
21 | + choices = Choice.find(a[:choice_id]) | ||
22 | + choices.each do |choice| | ||
23 | + # call task | ||
24 | + puts send(taskname, choice).inspect | ||
25 | + end | ||
26 | + end | ||
27 | + end | ||
28 | + | ||
29 | + def verify_losses_equals_losing_votes(choice) | ||
30 | + success_message = "Choice losses equals losing votes" | ||
31 | + # votes before 2010-02-17 have null loser_choice_id | ||
32 | + # therefore we want to ignore this test for any question with votes | ||
33 | + # prior to 2010-02-17 | ||
34 | + return [success_message, false] if @question_ids_with_votes_before_2010_02_17.include?(choice.question_id) | ||
35 | + losing_votes_count = choice.losing_votes.count | ||
36 | + if (choice.losses != losing_votes_count) | ||
37 | + error_message = "Error!: Cached choice losses != actual choice losses for choice #{choice.id}, #{choice.losses} != #{losing_votes_count}\n" | ||
13 | end | 38 | end |
39 | + return error_message.blank? ? [success_message, false] : [error_message, true] | ||
40 | + end | ||
41 | + | ||
42 | + def verify_wins_equals_vote_wins(choice) | ||
43 | + success_message = "Choice wins equals vote wins" | ||
44 | + choice_votes_count = choice.votes.count | ||
45 | + if (choice.wins != choice_votes_count) | ||
46 | + error_message = "Error!: Cached choice wins != actual choice wins for choice #{choice.id}, #{choice_wins} != #{choice_votes_count}\n" | ||
47 | + end | ||
48 | + return error_message.blank? ? [success_message, false] : [error_message, true] | ||
49 | + end | ||
50 | + | ||
51 | + def verify_cached_score_equals_computed_score(choice) | ||
52 | + success_message = "Choice has accurate cached score" | ||
53 | + cached_score = choice.score.to_f | ||
54 | + generated_score = choice.compute_score.to_f | ||
55 | + | ||
56 | + delta = 0.001 | ||
57 | + | ||
58 | + if (cached_score - generated_score).abs >= delta | ||
59 | + error_message = "Error! The cached_score is not equal to the calculated score for choice #{choice.id}, cached: #{cached_score}, computed: #{generated_score}\n" | ||
60 | + | ||
61 | + end | ||
62 | + return error_message.blank? ? [success_message, false] : [error_message, true] | ||
63 | + end | ||
64 | + | ||
65 | + def verify_valid_cached_score(choice) | ||
66 | + success_message = "Choice has valid cached score" | ||
67 | + cached_score = choice.score.to_f | ||
68 | + if cached_score == 0.0 || cached_score == 100.0 || cached_score.nil? | ||
69 | + error_message = "Error! The cached_score for choice #{choice.id} is exactly 0 or 100, the value: #{cached_score}" | ||
70 | + end | ||
71 | + return error_message.blank? ? [success_message, false] : [error_message, true] | ||
14 | end | 72 | end |
15 | 73 | ||
16 | def verify_cached_prompt_counts(choice) | 74 | def verify_cached_prompt_counts(choice) |
@@ -21,17 +79,9 @@ namespace :test_api do | @@ -21,17 +79,9 @@ namespace :test_api do | ||
21 | return error_message.blank? ? [success_message, false] : [error_message, true] | 79 | return error_message.blank? ? [success_message, false] : [error_message, true] |
22 | end | 80 | end |
23 | 81 | ||
24 | - desc "Ensure that an idea: appearances on left + appearances on right >= (wins + losses + skips)" | ||
25 | - task :verify_choice_appearances_and_votes, [:choice_id] => :environment do |t, args| | ||
26 | - a = clean_up_args(args) | ||
27 | - choices = Choice.find(a[:choice_id]) | ||
28 | - choices.each do |choice| | ||
29 | - puts verify_choice_appearances_and_votes(choice).inspect | ||
30 | - end | ||
31 | - end | ||
32 | - | ||
33 | def verify_choice_appearances_and_votes(choice) | 82 | def verify_choice_appearances_and_votes(choice) |
34 | success_message = "Choice has more appearances than votes and skips" | 83 | success_message = "Choice has more appearances than votes and skips" |
84 | + return [success_message, false] if @question_ids_with_votes_before_2010_02_17.include?(choice.question_id) | ||
35 | all_appearances = choice.appearances_on_the_left.count + choice.appearances_on_the_right.count | 85 | all_appearances = choice.appearances_on_the_left.count + choice.appearances_on_the_right.count |
36 | skips = choice.skips_on_the_left.count + choice.skips_on_the_right.count | 86 | skips = choice.skips_on_the_left.count + choice.skips_on_the_right.count |
37 | 87 | ||
@@ -134,36 +184,6 @@ namespace :test_api do | @@ -134,36 +184,6 @@ namespace :test_api do | ||
134 | total_generated_prompts_on_right += choice.prompts_on_the_right.size | 184 | total_generated_prompts_on_right += choice.prompts_on_the_right.size |
135 | 185 | ||
136 | cached_score = choice.score.to_f | 186 | cached_score = choice.score.to_f |
137 | - generated_score = choice.compute_score.to_f | ||
138 | - | ||
139 | - delta = 0.001 | ||
140 | - | ||
141 | - if (cached_score - generated_score).abs >= delta | ||
142 | - error_message += "Error! The cached_score is not equal to the calculated score for choice #{choice.id}\n" | ||
143 | - | ||
144 | - print "This score is wrong! #{choice.id} , Question ID: #{question.id}, #{cached_score}, #{generated_score}, updated: #{choice.updated_at}\n" | ||
145 | - | ||
146 | - | ||
147 | - end | ||
148 | - | ||
149 | - if cached_score == 0.0 || cached_score == 100.0 || cached_score.nil? | ||
150 | - error_message += "Error! The cached_score for choice #{choice.id} is exactly 0 or 100, the value: #{cached_score}" | ||
151 | - print "Either 0 or 100 This score is wrong! #{choice.id} , Question ID: #{question.id}, #{cached_score}, #{generated_score}, updated: #{choice.updated_at}\n" | ||
152 | - end | ||
153 | - | ||
154 | - unless question_has_votes_before_2010_02_17 | ||
155 | - message, error_occurred = verify_choice_appearances_and_votes(choice) | ||
156 | - if error_occurred | ||
157 | - error_message += message + "\n" | ||
158 | - end | ||
159 | - end | ||
160 | - | ||
161 | - message, error_occurred = verify_cached_prompt_counts(choice) | ||
162 | - if error_occurred | ||
163 | - error_message += message + "\n" | ||
164 | - end | ||
165 | - | ||
166 | - | ||
167 | if cached_score >= 50 | 187 | if cached_score >= 50 |
168 | total_scores_gte_fifty +=1 | 188 | total_scores_gte_fifty +=1 |
169 | end | 189 | end |
@@ -171,18 +191,10 @@ namespace :test_api do | @@ -171,18 +191,10 @@ namespace :test_api do | ||
171 | total_scores_lte_fifty +=1 | 191 | total_scores_lte_fifty +=1 |
172 | end | 192 | end |
173 | 193 | ||
174 | - if (choice.wins != choice.votes.count) | ||
175 | - error_message += "Error!: Cached choice wins != actual choice wins for choice #{choice.id}\n" | ||
176 | - error_bool= true | ||
177 | - end | ||
178 | - | ||
179 | - # votes before 2010-02-17 have null loser_choice_id | ||
180 | - # therefore we want to ignore this test for any question with votes | ||
181 | - # prior to 2010-02-17 | ||
182 | - unless question_has_votes_before_2010_02_17 | ||
183 | - if (choice.losses != question.votes.count(:conditions => {:loser_choice_id => choice.id})) | ||
184 | - error_message += "Error!: Cached choice losses != actual choice losses for choice #{choice.id}\n" | ||
185 | - error_bool= true | 194 | + @choice_tasks.each do |taskname, description| |
195 | + message, error_occurred = send(taskname, question) | ||
196 | + if error_occurred | ||
197 | + error_message += message + "\n" | ||
186 | end | 198 | end |
187 | end | 199 | end |
188 | 200 | ||
@@ -475,6 +487,15 @@ namespace :test_api do | @@ -475,6 +487,15 @@ namespace :test_api do | ||
475 | end | 487 | end |
476 | # END OF GLOBAL NAMESPACE | 488 | # END OF GLOBAL NAMESPACE |
477 | 489 | ||
490 | + # votes before 2010-02-17 have null loser_choice_id therefore we | ||
491 | + # want to ignore some tests for any question with votes before 2010-02-17 | ||
492 | + desc "Get all question_ids before 2010_02_17" | ||
493 | + task :question_ids_with_votes_before_2010_02_17 => :environment do | ||
494 | + @question_ids_with_votes_before_2010_02_17 = Vote.find(:all, :select => "DISTINCT(question_id)", :conditions => ["created_at < ?", '2010-02-17']).map {|v| v.question_id} | ||
495 | + puts @question_ids_with_votes_before_2010_02_17.inspect | ||
496 | + | ||
497 | + end | ||
498 | + | ||
478 | end | 499 | end |
479 | 500 | ||
480 | def cleanup_args(args) | 501 | def cleanup_args(args) |