Commit b18e4649c80f4bcad9fb82ffdfb947de4f0674f0

Authored by Dmitri Garbuzov
1 parent c8450e04

Properly scope finders in Question and Choice

app/controllers/choices_controller.rb
... ... @@ -8,7 +8,7 @@ class ChoicesController < InheritedResources::Base
8 8  
9 9 def index
10 10 if params[:limit]
11   - @question = Question.find(params[:question_id])
  11 + @question = current_user.questions.find(params[:question_id])
12 12  
13 13 find_options = {:conditions => {:question_id => @question.id},
14 14 :limit => params[:limit].to_i,
... ... @@ -21,7 +21,7 @@ class ChoicesController < InheritedResources::Base
21 21 @choices = Choice.find(:all, find_options)
22 22  
23 23 else
24   - @question = Question.find(params[:question_id], :include => :choices) #eagerloads ALL choices
  24 + @question = current_user.questions.find(params[:question_id], :include => :choices) #eagerloads ALL choices
25 25 unless params[:include_inactive]
26 26 @choices = @question.choices(true).active.find(:all)
27 27 else
... ... @@ -88,9 +88,16 @@ class ChoicesController < InheritedResources::Base
88 88 # prevent AttributeNotFound error and only update actual Choice columns, since we add extra information in 'show' method
89 89 choice_attributes = Choice.new.attribute_names
90 90 params[:choice] = params[:choice].delete_if {|key, value| !choice_attributes.include?(key)}
  91 + @question = current_user.questions.find(params[:question_id])
  92 + @choice = @question.choices.find(params[:id])
91 93 update!
92 94 end
93   -
  95 +
  96 + def show
  97 + @question = current_user.questions.find(params[:question_id])
  98 + @choice = @question.choices.find(params[:id])
  99 + show!
  100 + end
94 101  
95 102  
96 103 end
... ...
app/controllers/questions_controller.rb
... ... @@ -55,7 +55,7 @@ class QuestionsController < InheritedResources::Base
55 55  
56 56  
57 57 def show
58   - @question = Question.find(params[:id])
  58 + @question = current_user.questions.find(params[:id])
59 59  
60 60 begin
61 61 @question_optional_information = @question.get_optional_information(params)
... ... @@ -302,9 +302,15 @@ class QuestionsController < InheritedResources::Base
302 302 # prevent AttributeNotFound error and only update actual Question columns, since we add extra information in 'show' method
303 303 question_attributes = Question.new.attribute_names
304 304 params[:question] = params[:question].delete_if {|key, value| !question_attributes.include?(key)}
  305 + @question = current_user.questions.find(params[:id])
305 306 update!
306 307 end
307 308  
  309 + def index
  310 + @questions = current_user.questions.find(:all)
  311 + index!
  312 + end
  313 +
308 314 protected
309 315 end
310 316  
... ...
app/models/choice.rb
... ... @@ -17,6 +17,7 @@ class Choice < ActiveRecord::Base
17 17 after_save :update_questions_counter
18 18  
19 19 attr_protected :prompts_count, :wins, :losses, :score, :prompts_on_the_right_count, :prompts_on_the_left_count
  20 + attr_readonly :question_id
20 21  
21 22 def update_questions_counter
22 23 self.question.update_attribute(:inactive_choices_count, self.question.choices.inactive.length)
... ...
app/models/prompt.rb
... ... @@ -24,6 +24,7 @@ class Prompt < ActiveRecord::Base
24 24 named_scope :ids_only, :select => 'id'
25 25  
26 26 attr_protected :votes_count, :left_choice_id, :right_choice_id
  27 + attr_readonly :question_id
27 28  
28 29 def self.voted_on_by(u)
29 30 select {|z| z.voted_on_by_user?(u)}
... ...
app/models/question.rb
... ... @@ -27,6 +27,8 @@ class Question < ActiveRecord::Base
27 27 attr_protected :votes_count, :inactive_choices_count, :choices_count,
28 28 :active_items_count, :prompts_count
29 29  
  30 + attr_readonly :site_id
  31 +
30 32 def create_choices_from_ideas
31 33 if ideas && ideas.any?
32 34 ideas.each do |idea|
... ...
spec/integration/choices_spec.rb
... ... @@ -120,17 +120,16 @@ describe "Choices" do
120 120  
121 121 context "when trying to access another site's choices" do
122 122 before do
123   - @other_user = Factory(:email_confirmed_user)
124   - @other_question = Factory.create(:aoi_question, :site => @other_user)
125   - 5.times{ Factory.create(:choice, :question => @other_question) }
  123 + @orig_user = @api_user
  124 + @api_user = Factory(:email_confirmed_user)
126 125 end
127 126  
128 127 it "should fail" do
129   - pending("user scope") do
130   - get_auth question_choices_path(@question, :format => 'xml'), :offset => 2, :limit => 4
131   - response.should_not be_success
132   - end
  128 + get_auth question_choices_path(@question, :format => 'xml'), :offset => 2, :limit => 4
  129 + response.should_not be_success
133 130 end
  131 +
  132 + after { @api_user = @orig_user }
134 133 end
135 134  
136 135 end
... ... @@ -156,10 +155,8 @@ describe "Choices" do
156 155 end
157 156  
158 157 it "should fail" do
159   - pending("user scope") do
160   - get_auth question_choice_path(@other_question, @other_choice, :format => 'xml')
161   - response.should_not be_success
162   - end
  158 + get_auth question_choice_path(@other_question, @other_choice, :format => 'xml')
  159 + response.should_not be_success
163 160 end
164 161 end
165 162  
... ... @@ -185,11 +182,9 @@ describe "Choices" do
185 182 end
186 183  
187 184 it "should fail" do
188   - pending("user scope") do
189   - params = { :choice => { :data => "foo" } }
190   - put_auth question_choice_path(@question, @choice, :format => 'xml'), params
191   - response.should_not be_success
192   - end
  185 + params = { :choice => { :data => "foo" } }
  186 + put_auth question_choice_path(@question, @choice, :format => 'xml'), params
  187 + response.should_not be_success
193 188 end
194 189  
195 190 after { @api_user = @orig_user }
... ...
spec/integration/questions_spec.rb
... ... @@ -13,14 +13,18 @@ describe "Questions" do
13 13 response.should be_success
14 14 end
15 15  
16   - it "should not return the questions of other api users" do
17   - pending ("doesn't scope to the level of the user") do
18   - other_user = Factory(:email_confirmed_user)
19   - Factory.create(:aoi_question, :site => other_user)
20   - get_auth questions_path
  16 + context "when calling index as another user" do
  17 + before do
  18 + @orig_user = @api_user
  19 + @api_user = Factory(:email_confirmed_user)
  20 + end
  21 +
  22 + it "should not return the questions of the original user" do
  23 + get_auth questions_path(:format => 'xml')
21 24 response.should be_success
22 25 response.body.should_not have_tag("question")
23 26 end
  27 + after { @api_user = @orig_user }
24 28 end
25 29 end
26 30  
... ... @@ -135,20 +139,18 @@ describe "Questions" do
135 139 end
136 140 end
137 141  
138   - context "GET 'show' trying to view others sites' questions"
  142 + context "GET 'show' trying to view others sites' questions" do
139 143 before do
140 144 @orig_user = @api_user
141 145 @api_user = Factory(:email_confirmed_user)
142 146 end
143 147  
144   - it "should fail" do
145   - pending("user scope") do
  148 + it "should fail" do
146 149 get_auth question_path(@question, :format => 'xml')
147 150 response.should_not be_success
148 151 end
  152 + after { @api_user = @orig_user }
149 153 end
150   -
151   - after { @api_user = @orig_user }
152 154 end
153 155  
154 156 describe "PUT 'update'" do
... ... @@ -166,12 +168,10 @@ describe "Questions" do
166 168 end
167 169  
168 170 it "should not be able to change the site id" do
169   - pending("needs attr_protected") do
170   - original_site_id = @question.site_id
171   - params = { :question => { :site_id => -1 } }
172   - put_auth question_path(@question, :format => 'xml'), params
173   - @question.reload.site_id.should == original_site_id
174   - end
  171 + original_site_id = @question.site_id
  172 + params = { :question => { :site_id => -1 } }
  173 + put_auth question_path(@question, :format => 'xml'), params
  174 + @question.reload.site_id.should == original_site_id
175 175 end
176 176  
177 177 it "should ignore protected attributes" do
... ... @@ -188,11 +188,9 @@ describe "Questions" do
188 188 end
189 189  
190 190 it "should fail" do
191   - pending("user scope") do
192   - params = { :question => { :name => "foo" } }
193   - put_auth question_path(@question, :format => 'xml'), params
194   - response.should_not be_success
195   - end
  191 + params = { :question => { :name => "foo" } }
  192 + put_auth question_path(@question, :format => 'xml'), params
  193 + response.should_not be_success
196 194 end
197 195  
198 196 after { @api_user = @orig_user }
... ...