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 | 9 | #validates_length_of :item, :maximum => 140 |
10 | 10 | |
11 | 11 | has_many :votes |
12 | + has_many :losing_votes, :class_name => "Vote", :foreign_key => "loser_choice_id" | |
12 | 13 | has_many :flags |
13 | 14 | has_many :prompts_on_the_left, :class_name => "Prompt", :foreign_key => "left_choice_id" |
14 | 15 | has_many :prompts_on_the_right, :class_name => "Prompt", :foreign_key => "right_choice_id" | ... | ... |
lib/tasks/test_api.rake
1 | 1 | namespace :test_api do |
2 | 2 | |
3 | 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 | 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 | 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 | 72 | end |
15 | 73 | |
16 | 74 | def verify_cached_prompt_counts(choice) |
... | ... | @@ -21,17 +79,9 @@ namespace :test_api do |
21 | 79 | return error_message.blank? ? [success_message, false] : [error_message, true] |
22 | 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 | 82 | def verify_choice_appearances_and_votes(choice) |
34 | 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 | 85 | all_appearances = choice.appearances_on_the_left.count + choice.appearances_on_the_right.count |
36 | 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 | 184 | total_generated_prompts_on_right += choice.prompts_on_the_right.size |
135 | 185 | |
136 | 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 | 187 | if cached_score >= 50 |
168 | 188 | total_scores_gte_fifty +=1 |
169 | 189 | end |
... | ... | @@ -171,18 +191,10 @@ namespace :test_api do |
171 | 191 | total_scores_lte_fifty +=1 |
172 | 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 | 198 | end |
187 | 199 | end |
188 | 200 | |
... | ... | @@ -475,6 +487,15 @@ namespace :test_api do |
475 | 487 | end |
476 | 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 | 499 | end |
479 | 500 | |
480 | 501 | def cleanup_args(args) | ... | ... |