Commit c8450e044f3455fb548c495096ddd3f6884aa032
1 parent
c5eecbcc
Exists in
master
and in
1 other branch
Added rspec integration tests
Showing
9 changed files
with
634 additions
and
2 deletions
Show diff stats
app/controllers/questions_controller.rb
@@ -117,7 +117,7 @@ class QuestionsController < InheritedResources::Base | @@ -117,7 +117,7 @@ class QuestionsController < InheritedResources::Base | ||
117 | 117 | ||
118 | @question = current_user.questions.find(params[:id]) | 118 | @question = current_user.questions.find(params[:id]) |
119 | 119 | ||
120 | - puts "redis key is::::: #{redis_key}" | 120 | + # puts "redis key is::::: #{redis_key}" |
121 | 121 | ||
122 | @question.send_later :export_and_delete, type, | 122 | @question.send_later :export_and_delete, type, |
123 | :response_type => response_type, :redis_key => redis_key, :delete_at => 3.days.from_now | 123 | :response_type => response_type, :redis_key => redis_key, :delete_at => 3.days.from_now |
spec/integration/choices_spec.rb
1 | require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') | 1 | require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') |
2 | 2 | ||
3 | describe "Choices" do | 3 | describe "Choices" do |
4 | + include IntegrationSupport | ||
5 | + | ||
6 | + describe "POST 'create'" do | ||
7 | + before(:each) do | ||
8 | + @question = Factory.create(:aoi_question, :site => @api_user) | ||
9 | + @visitor = Factory.create(:visitor, :site => @api_user) | ||
10 | + end | ||
11 | + | ||
12 | + describe "succeeds and returns a new choice" do | ||
13 | + | ||
14 | + specify "given no optional arguments"# do @params = nil end | ||
15 | + | ||
16 | + specify "given only data" do | ||
17 | + @params = { :choice => { :data => "hey"} } | ||
18 | + end | ||
19 | + | ||
20 | + specify "given only the visitor identifier" do | ||
21 | + @params = { :choice => { :visitor_identifier => @visitor.identifier } } | ||
22 | + end | ||
23 | + | ||
24 | + after do | ||
25 | + post_auth question_choices_path(@question, :format => 'xml'), @params | ||
26 | + response.should be_success | ||
27 | + response.should have_tag "choice" | ||
28 | + end | ||
29 | + end | ||
30 | + | ||
31 | + it "correctly sets the supplied attributes" do | ||
32 | + @params = { | ||
33 | + :choice => { | ||
34 | + :visitor_identifier => @visitor.identifier, | ||
35 | + :data => "foo", | ||
36 | + :local_identifier => "bar" } } | ||
37 | + | ||
38 | + post_auth question_choices_path(@question, :format => 'xml'), @params | ||
39 | + | ||
40 | + response.should be_success | ||
41 | + response.should have_tag "choice creator-id", @visitor.id.to_s | ||
42 | + response.should have_tag "choice data", "foo" | ||
43 | + response.should have_tag "choice local-identifier", "bar" | ||
44 | + end | ||
45 | + end | ||
46 | + | ||
47 | + describe "PUT 'flag'" do | ||
48 | + before do | ||
49 | + @question = Factory.create(:aoi_question, :site => @api_user) | ||
50 | + @choice = Factory.create(:choice, :question => @question) | ||
51 | + @choice.activate! | ||
52 | + end | ||
53 | + | ||
54 | + it "should return the deactivated choice given no arguments" do | ||
55 | + put_auth flag_question_choice_path(@question, @choice, :format => 'xml') | ||
56 | + | ||
57 | + response.should be_success | ||
58 | + response.should have_tag "choice active", "false" | ||
59 | + end | ||
60 | + | ||
61 | + it "should return the deactivated choice given an explanation" do | ||
62 | + put_auth flag_question_choice_path(@question, @choice, :format => 'xml'), :explanation => "foo" | ||
63 | + | ||
64 | + response.should be_success | ||
65 | + response.should have_tag "choice active", "false" | ||
66 | + end | ||
67 | + | ||
68 | + context "when trying to flag another site's choices" do | ||
69 | + before do | ||
70 | + # this is ugly | ||
71 | + @orig_user = @api_user | ||
72 | + @api_user = Factory(:email_confirmed_user) | ||
73 | + end | ||
74 | + | ||
75 | + it "should fail" do | ||
76 | + put_auth flag_question_choice_path(@question, @choice, :format => 'xml'), :explanation => "foo" | ||
77 | + response.should_not be_success | ||
78 | + end | ||
79 | + | ||
80 | + after { @api_user = @orig_user } | ||
81 | + end | ||
82 | + end | ||
83 | + | ||
84 | + describe "GET 'index'" do | ||
85 | + before(:each) do | ||
86 | + @question = Factory.create(:aoi_question, :site => @api_user, :choices => [], :prompts => []) | ||
87 | + 5.times{ Factory.create(:choice, :question => @question).deactivate! } | ||
88 | + 5.times{ Factory.create(:choice, :question => @question).activate! } | ||
89 | + end | ||
90 | + | ||
91 | + it "should return all active choices given no optional parameters" do | ||
92 | + get_auth question_choices_path(@question, :format => 'xml') | ||
93 | + | ||
94 | + response.should be_success | ||
95 | + response.should have_tag "choices choice", 5 | ||
96 | + end | ||
97 | + | ||
98 | + it "should return all choices if include_inactive is set" do | ||
99 | + get_auth question_choices_path(@question, :format => 'xml'), :include_inactive => true | ||
100 | + | ||
101 | + response.should be_success | ||
102 | + response.should have_tag "choices choice", 10 | ||
103 | + response.should have_tag "choices choice active", "false" | ||
104 | + end | ||
105 | + | ||
106 | + | ||
107 | + it "should return 3 choices when limt is set to 3" do | ||
108 | + get_auth question_choices_path(@question, :format => 'xml'), :limit => 3 | ||
109 | + | ||
110 | + response.should be_success | ||
111 | + response.should have_tag "choices choice", 3 | ||
112 | + end | ||
113 | + | ||
114 | + it "should return the remaining choices when offset is provided" do | ||
115 | + get_auth question_choices_path(@question, :format => 'xml'), :offset => 2, :limit => 4 | ||
116 | + | ||
117 | + response.should be_success | ||
118 | + response.should have_tag "choices choice", 3 | ||
119 | + end | ||
120 | + | ||
121 | + context "when trying to access another site's choices" do | ||
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) } | ||
126 | + end | ||
127 | + | ||
128 | + 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 | ||
133 | + end | ||
134 | + end | ||
135 | + | ||
136 | + end | ||
137 | + | ||
138 | + describe "GET 'show'" do | ||
139 | + before do | ||
140 | + @question = Factory.create(:aoi_question, :site => @api_user) | ||
141 | + @choice = Factory.create(:choice, :question => @question) | ||
142 | + end | ||
143 | + | ||
144 | + it "should return a choice" do | ||
145 | + get_auth question_choice_path(@question, @choice, :format => 'xml') | ||
146 | + | ||
147 | + response.should be_success | ||
148 | + response.should have_tag "choice", 1 | ||
149 | + end | ||
150 | + | ||
151 | + context "when requesting a choice from another site" do | ||
152 | + before do | ||
153 | + @other_user = Factory(:email_confirmed_user) | ||
154 | + @other_question = Factory.create(:aoi_question, :site => @other_user) | ||
155 | + @other_choice = Factory.create(:choice, :question => @other_question) | ||
156 | + end | ||
157 | + | ||
158 | + 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 | ||
163 | + end | ||
164 | + end | ||
165 | + | ||
166 | + end | ||
167 | + | ||
168 | + describe "PUT 'update'" do | ||
169 | + before do | ||
170 | + @question = Factory.create(:aoi_question, :site => @api_user) | ||
171 | + @choice = Factory.create(:choice, :question => @question) | ||
172 | + @choice.activate! | ||
173 | + end | ||
174 | + | ||
175 | + it "should succeed given valid attributes" do | ||
176 | + params = { :choice => { :data => "foo" } } | ||
177 | + put_auth question_choice_path(@question, @choice, :format => 'xml'), params | ||
178 | + response.should be_success | ||
179 | + end | ||
180 | + | ||
181 | + context "when updatng another site's choice" do | ||
182 | + before do | ||
183 | + @orig_user = @api_user | ||
184 | + @api_user = Factory(:email_confirmed_user) | ||
185 | + end | ||
186 | + | ||
187 | + 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 | ||
193 | + end | ||
194 | + | ||
195 | + after { @api_user = @orig_user } | ||
196 | + end | ||
197 | + end | ||
198 | + | ||
4 | end | 199 | end |
spec/integration/prompts_spec.rb
1 | require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') | 1 | require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') |
2 | 2 | ||
3 | +# to do: figure out future-prompts | ||
4 | +# clean up repeated code | ||
5 | + | ||
3 | describe "Prompts" do | 6 | describe "Prompts" do |
7 | + include IntegrationSupport | ||
8 | + | ||
9 | + describe "GET 'show'" do | ||
10 | + before do | ||
11 | + @question = Factory.create(:aoi_question, :site => @api_user) | ||
12 | + @prompt = @question.prompts.first | ||
13 | + end | ||
14 | + | ||
15 | + it "returns a prompt object" do | ||
16 | + get_auth question_prompt_path(@question, @prompt, :format => 'xml') | ||
17 | + response.should be_success | ||
18 | + response.should have_tag "prompt", 1 | ||
19 | + end | ||
20 | + end | ||
21 | + | ||
22 | + describe "POST 'skip'" do | ||
23 | + before do | ||
24 | + @visitor = Factory.create(:visitor, :site => @api_user, :identifier => "foo") | ||
25 | + @question = Factory.create(:aoi_question, | ||
26 | + :site => @api_user, | ||
27 | + :choices => [], | ||
28 | + :prompts => []) | ||
29 | + 3.times{ Factory.create(:choice, :question => @question).activate! } | ||
30 | + info = @question.reload.get_optional_information(:with_appearance => true, | ||
31 | + :with_prompt => true, | ||
32 | + :visitor_identifier => @visitor.identifier ) | ||
33 | + @appearance_id = info[:appearance_id] | ||
34 | + @prompt_id = info[:picked_prompt_id] | ||
35 | + end | ||
36 | + | ||
37 | + it "should return a new skip object given no optional parameters" do | ||
38 | + post_auth skip_question_prompt_path(@question.id, @prompt_id, :format => 'xml') | ||
39 | + response.should be_success | ||
40 | + response.should have_tag "skip", 1 | ||
41 | + end | ||
42 | + | ||
43 | + it "should correctly set the optional attributes of the skip object" do | ||
44 | + pending("shouldn\'t this set appearance_id?") do | ||
45 | + params = { | ||
46 | + :skip => { | ||
47 | + :visitor_identifier => @visitor.identifier, | ||
48 | + :skip_reason => "bar", | ||
49 | + :appearance_lookup => @appearance_id, | ||
50 | + :time_viewed => 47 } } | ||
51 | + post_auth skip_question_prompt_path(@question, @prompt_id, :format => 'xml'), params | ||
52 | + response.should be_success | ||
53 | + response.should have_tag "skip", 1 | ||
54 | + response.should have_tag "skip appearance-id", @appearance_id.to_s | ||
55 | + response.should have_tag "skip skip-reason", "bar" | ||
56 | + response.should have_tag "skip time-viewed", "47" | ||
57 | + response.should have_tag "skip skipper-id", @visitor.id.to_s | ||
58 | + end | ||
59 | + end | ||
60 | + | ||
61 | + it "should return a prompt object if next_prompt is set" do | ||
62 | + params = { | ||
63 | + :next_prompt => { | ||
64 | + :visitor_identifier => @visitor.identifier, | ||
65 | + :with_appearance => true, | ||
66 | + :algorithm => "catchup", | ||
67 | + :with_visitor_stats => true } } | ||
68 | + post_auth skip_question_prompt_path(@question, @prompt_id, :format => 'xml'), params | ||
69 | + response.should be_success | ||
70 | + response.should have_tag "prompt", 1 | ||
71 | + response.should have_tag "prompt appearance_id", /.+/ | ||
72 | + response.should have_tag "prompt visitor_votes", /\d+/ | ||
73 | + response.should have_tag "prompt visitor_ideas", /\d+/ | ||
74 | + end | ||
75 | + | ||
76 | + context "when trying to skip another site's questions" do | ||
77 | + before do | ||
78 | + @orig_user = @api_user | ||
79 | + @api_user = Factory(:email_confirmed_user) | ||
80 | + end | ||
81 | + | ||
82 | + it "should fail" do | ||
83 | + post_auth skip_question_prompt_path(@question.id, @prompt_id, :format => 'xml') | ||
84 | + response.should_not be_success | ||
85 | + end | ||
86 | + | ||
87 | + after { @api_user = @orig_user } | ||
88 | + end | ||
89 | + end | ||
90 | + | ||
91 | + describe "POST 'vote'" do | ||
92 | + before do | ||
93 | + # dry this up | ||
94 | + @visitor = Factory.create(:visitor, :site => @api_user, :identifier => "foo") | ||
95 | + @question = Factory.create(:aoi_question, | ||
96 | + :site => @api_user, | ||
97 | + :choices => [], | ||
98 | + :prompts => []) | ||
99 | + 3.times{ Factory.create(:choice, :question => @question).activate! } | ||
100 | + info = @question.reload.get_optional_information(:with_appearance => true, | ||
101 | + :with_prompt => true, | ||
102 | + :visitor_identifier => @visitor.identifier ) | ||
103 | + @appearance_id = info[:appearance_id] | ||
104 | + @prompt_id = info[:picked_prompt_id] | ||
105 | + end | ||
106 | + | ||
107 | + it "should fail without the required 'direction' parameter" do | ||
108 | + post_auth vote_question_prompt_path(@question.id, @prompt_id, :format => 'xml') | ||
109 | + response.should_not be_success | ||
110 | + end | ||
111 | + | ||
112 | + it "should return a new vote object given no optional parameters" do | ||
113 | + params = { :vote => { :direction => "left" } } | ||
114 | + post_auth vote_question_prompt_path(@question.id, @prompt_id, :format => 'xml'), params | ||
115 | + response.should be_success | ||
116 | + response.should have_tag "vote", 1 | ||
117 | + end | ||
118 | + | ||
119 | + it "should correctly set the optional attributes of the vote object" do | ||
120 | + pending("also has nil appearance id") do | ||
121 | + params = { | ||
122 | + :vote => { | ||
123 | + :visitor_identifier => @visitor.identifier, | ||
124 | + :direction => "right", | ||
125 | + :appearance_lookup => @appearance_id, | ||
126 | + :time_viewed => 47 } } | ||
127 | + post_auth vote_question_prompt_path(@question, @prompt_id, :format => 'xml'), params | ||
128 | + response.should be_success | ||
129 | + response.should have_tag "vote", 1 | ||
130 | + response.should have_tag "vote appearance-id", @appearance_id.to_s | ||
131 | + response.should have_tag "vote time-viewed", "47" | ||
132 | + response.should have_tag "vote voter-id", @visitor.id.to_s | ||
133 | + end | ||
134 | + end | ||
135 | + | ||
136 | + # copy-paste from vote --> shared behavior? | ||
137 | + it "should return a prompt object if next_prompt is set" do | ||
138 | + params = { | ||
139 | + :vote => { | ||
140 | + :direction => "left" }, | ||
141 | + :next_prompt => { | ||
142 | + :visitor_identifier => @visitor.identifier, | ||
143 | + :with_appearance => true, | ||
144 | + :algorithm => "catchup", | ||
145 | + :with_visitor_stats => true } } | ||
146 | + post_auth vote_question_prompt_path(@question, @prompt_id, :format => 'xml'), params | ||
147 | + response.should be_success | ||
148 | + response.should have_tag "prompt", 1 | ||
149 | + response.should have_tag "prompt appearance_id", /.+/ | ||
150 | + response.should have_tag "prompt visitor_votes", /\d+/ | ||
151 | + response.should have_tag "prompt visitor_ideas", /\d+/ | ||
152 | + end | ||
153 | + | ||
154 | + context "when trying to vote on another site's questions" do | ||
155 | + before do | ||
156 | + @orig_user = @api_user | ||
157 | + @api_user = Factory(:email_confirmed_user) | ||
158 | + end | ||
159 | + | ||
160 | + it "should fail" do | ||
161 | + params = { :vote => { :direction => "left" } } | ||
162 | + post_auth vote_question_prompt_path(@question.id, @prompt_id, :format => 'xml'), params | ||
163 | + response.should_not be_success | ||
164 | + end | ||
165 | + | ||
166 | + after { @api_user = @orig_user } | ||
167 | + end | ||
168 | + | ||
169 | + end | ||
4 | end | 170 | end |
spec/integration/questions_spec.rb
1 | require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') | 1 | require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') |
2 | 2 | ||
3 | describe "Questions" do | 3 | describe "Questions" do |
4 | + include IntegrationSupport | ||
5 | + before do | ||
6 | + 3.times{ Factory.create(:aoi_question, :site => @api_user) } | ||
7 | + end | ||
8 | + | ||
9 | + describe "GET 'index'" do | ||
10 | + it "should return an array of questions" do | ||
11 | + get_auth questions_path(:format => 'xml') | ||
12 | + response.body.should have_tag("questions question", 3) | ||
13 | + response.should be_success | ||
14 | + end | ||
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 | ||
21 | + response.should be_success | ||
22 | + response.body.should_not have_tag("question") | ||
23 | + end | ||
24 | + end | ||
25 | + end | ||
26 | + | ||
27 | + describe "GET 'new'" do | ||
28 | + it "should return an empty question object" do | ||
29 | + get_auth new_question_path(:format => 'xml') | ||
30 | + response.should be_success | ||
31 | + response.body.should have_tag "question", 1 | ||
32 | + response.body.should have_tag "question name", "" | ||
33 | + response.body.should have_tag "question creator-id", "" | ||
34 | + response.body.should have_tag "question created-at", "" | ||
35 | + end | ||
36 | + end | ||
37 | + | ||
38 | + describe "POST 'create'" do | ||
39 | + before { @visitor = Factory.create(:visitor, :site => @api_user) } | ||
40 | + | ||
41 | + it "should fail when required parameters are omitted" do | ||
42 | + post_auth questions_path(:format => 'xml') | ||
43 | + response.should_not be_success | ||
44 | + end | ||
45 | + | ||
46 | + it "should return a question object given no optional parameters" do | ||
47 | + pending("choice count doesn't reflect # seed ideas") do | ||
48 | + params = { :question => { :visitor_identifier => @visitor.identifier, :ideas => "foo\r\nbar\r\nbaz" } } | ||
49 | + | ||
50 | + post_auth questions_path(:format => 'xml'), params | ||
51 | + | ||
52 | + response.should be_success | ||
53 | + response.should have_tag "question", 1 | ||
54 | + response.should have_tag "question creator-id", @visitor.id.to_s | ||
55 | + response.should have_tag "question choices-count", 3 | ||
56 | + end | ||
57 | + end | ||
58 | + | ||
59 | + it "should correctly set optional attributes" do | ||
60 | + params = { | ||
61 | + :question => { | ||
62 | + :visitor_identifier => @visitor.identifier, | ||
63 | + :ideas => "foo\r\nbar\r\nbaz", | ||
64 | + :name => "foo", | ||
65 | + :local_identifier => "bar", | ||
66 | + :information => "baz" } } | ||
67 | + | ||
68 | + post_auth questions_path(:format => 'xml'), params | ||
69 | + response.should be_success | ||
70 | + response.should have_tag "question", 1 | ||
71 | + response.should have_tag "question creator-id", @visitor.id.to_s | ||
72 | + # response.should have_tag "question choices-count", 3 | ||
73 | + response.should have_tag "question name", "foo" | ||
74 | + response.should have_tag "question local-identifier", "bar" | ||
75 | + response.should have_tag "question information", "baz" | ||
76 | + end | ||
77 | + end | ||
78 | + | ||
79 | + describe "POST 'export'" do | ||
80 | + before { @question = Factory.create(:aoi_question, :site => @api_user) } | ||
81 | + | ||
82 | + it "should fail without any of the required parameters" do | ||
83 | + post_auth export_question_path(@question, :format => 'xml') | ||
84 | + response.should be_success | ||
85 | + response.body.should =~ /Error/ | ||
86 | + end | ||
87 | + | ||
88 | + it "should fail given invalid parameters" do | ||
89 | + params = { :type => "ideas", :response_type => "foo", :redisk_key => "bar" } | ||
90 | + post_auth export_question_path(@question, :format => 'xml') | ||
91 | + response.should be_success | ||
92 | + response.body.should =~ /Error/ | ||
93 | + end | ||
94 | + | ||
95 | + it "should succeed given valid parameters" do | ||
96 | + params = { :type => "ideas", :response_type => "redis", :redis_key => "foo" } | ||
97 | + post_auth export_question_path(@question, :format => 'xml'), params | ||
98 | + response.should be_success | ||
99 | + response.body.should =~ /Ok!/ | ||
100 | + end | ||
101 | + end | ||
102 | + | ||
103 | + describe "GET 'show'" do | ||
104 | + before { @question = Factory.create(:aoi_question, :site => @api_user) } | ||
105 | + | ||
106 | + it "should succeed given no optional parameters" do | ||
107 | + get_auth question_path(@question, :format => 'xml') | ||
108 | + response.should be_success | ||
109 | + response.should have_tag "question", 1 | ||
110 | + response.should have_tag "question id", @question.id.to_s | ||
111 | + end | ||
112 | + | ||
113 | + it "should correctly set optional parameters" do | ||
114 | + @visitor = Factory.create(:visitor, :site => @api_user) | ||
115 | + params = { | ||
116 | + :visitor_identifier => @visitor.identifier, | ||
117 | + :with_prompt => true, | ||
118 | + :with_appearance => true, | ||
119 | + :with_visitor_stats => true } | ||
120 | + get_auth question_path(@question, :format => 'xml'), params | ||
121 | + response.should be_success | ||
122 | + response.should have_tag "question", 1 | ||
123 | + response.should have_tag "question id", @question.id.to_s | ||
124 | + response.should have_tag "question picked_prompt_id" | ||
125 | + response.should have_tag "question appearance_id" | ||
126 | + response.should have_tag "question visitor_votes" | ||
127 | + response.should have_tag "question visitor_ideas" | ||
128 | + end | ||
129 | + | ||
130 | + it "should fail if 'with_prompt' is set but 'visitor_identifier' not provided" do | ||
131 | + pending("figure out argument dependencies") do | ||
132 | + params = { :with_prompt => true } | ||
133 | + get_auth question_path(@question, :format => 'xml'), params | ||
134 | + response.should_not be_success | ||
135 | + end | ||
136 | + end | ||
137 | + | ||
138 | + context "GET 'show' trying to view others sites' questions" | ||
139 | + before do | ||
140 | + @orig_user = @api_user | ||
141 | + @api_user = Factory(:email_confirmed_user) | ||
142 | + end | ||
143 | + | ||
144 | + it "should fail" do | ||
145 | + pending("user scope") do | ||
146 | + get_auth question_path(@question, :format => 'xml') | ||
147 | + response.should_not be_success | ||
148 | + end | ||
149 | + end | ||
150 | + | ||
151 | + after { @api_user = @orig_user } | ||
152 | + end | ||
153 | + | ||
154 | + describe "PUT 'update'" do | ||
155 | + before { @question = Factory.create(:aoi_question, :site => @api_user) } | ||
156 | + | ||
157 | + it "should succeed give valid attributes" do | ||
158 | + params = { | ||
159 | + :question => { | ||
160 | + :active => false, | ||
161 | + :information => "foo", | ||
162 | + :name => "bar", | ||
163 | + :local_identifier => "baz" } } | ||
164 | + put_auth question_path(@question, :format => 'xml'), params | ||
165 | + response.should be_success | ||
166 | + end | ||
167 | + | ||
168 | + 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 | ||
175 | + end | ||
176 | + | ||
177 | + it "should ignore protected attributes" do | ||
178 | + params = { :question => { :votes_count => 999 } } | ||
179 | + put_auth question_path(@question, :format => 'xml'), params | ||
180 | + response.should be_success | ||
181 | + @question.reload.site_id.should_not == 999 | ||
182 | + end | ||
183 | + | ||
184 | + context "when updatng another site's question" do | ||
185 | + before do | ||
186 | + @orig_user = @api_user | ||
187 | + @api_user = Factory(:email_confirmed_user) | ||
188 | + end | ||
189 | + | ||
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 | ||
196 | + end | ||
197 | + | ||
198 | + after { @api_user = @orig_user } | ||
199 | + end | ||
200 | + end | ||
201 | + | ||
202 | + describe "GET 'all_object_info_totals_by_date'" do | ||
203 | + end | ||
204 | + | ||
205 | + describe "GET 'object_info_totals_by_date'" do | ||
206 | + end | ||
207 | + | ||
4 | end | 208 | end |
spec/integration/visitors_spec.rb
spec/models/question_spec.rb
1 | require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') | 1 | require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') |
2 | 2 | ||
3 | describe Question do | 3 | describe Question do |
4 | - | 4 | + include DBSupport |
5 | + | ||
5 | it {should belong_to :creator} | 6 | it {should belong_to :creator} |
6 | it {should belong_to :site} | 7 | it {should belong_to :site} |
7 | it {should have_many :choices} | 8 | it {should have_many :choices} |
@@ -292,6 +293,7 @@ describe Question do | @@ -292,6 +293,7 @@ describe Question do | ||
292 | prompt.left_choice.deactivate! | 293 | prompt.left_choice.deactivate! |
293 | @catchup_q.choose_prompt.should_not == prompt1 | 294 | @catchup_q.choose_prompt.should_not == prompt1 |
294 | end | 295 | end |
296 | + after(:all) { truncate_all } | ||
295 | end | 297 | end |
296 | 298 | ||
297 | context "exporting data" do | 299 | context "exporting data" do |
@@ -416,6 +418,7 @@ describe Question do | @@ -416,6 +418,7 @@ describe Question do | ||
416 | 418 | ||
417 | end | 419 | end |
418 | 420 | ||
421 | + after(:all) { truncate_all } | ||
419 | end | 422 | end |
420 | 423 | ||
421 | end | 424 | end |
@@ -0,0 +1,10 @@ | @@ -0,0 +1,10 @@ | ||
1 | +module DBSupport | ||
2 | + | ||
3 | + # this is useful after a before :all block fills the db with stuff | ||
4 | + def truncate_all | ||
5 | + (ActiveRecord::Base.connection.tables - ["schema_migrations"]).each do |table| | ||
6 | + ActiveRecord::Base.connection.execute("TRUNCATE TABLE #{table};") | ||
7 | + end | ||
8 | + end | ||
9 | + | ||
10 | +end |
@@ -0,0 +1,42 @@ | @@ -0,0 +1,42 @@ | ||
1 | +module IntegrationSupport | ||
2 | + | ||
3 | + # todo: make automatically included in integration tests | ||
4 | + Spec::Runner.configure do |config| | ||
5 | + config.before(:each, :type => :integration) do | ||
6 | + @api_user = Factory(:email_confirmed_user) | ||
7 | + end | ||
8 | + end | ||
9 | + | ||
10 | + def get_auth(path, parameters = {}, headers = {}) | ||
11 | + auth_wrap(:get, path, parameters, headers) | ||
12 | + end | ||
13 | + | ||
14 | + def put_auth(path, parameters = {}, headers = {}) | ||
15 | + auth_wrap(:put, path, parameters, headers) | ||
16 | + end | ||
17 | + | ||
18 | + def post_auth(path, parameters = {}, headers = {} ) | ||
19 | + auth_wrap(:post, path, parameters, headers) | ||
20 | + end | ||
21 | + | ||
22 | + def delete_auth(path, parameters = {}, headers = {}) | ||
23 | + auth_wrap(:delete, path, parameters, headers) | ||
24 | + end | ||
25 | + | ||
26 | + def head_auth(path, parameters = {}, headers = {}) | ||
27 | + auth_wrap(:head, path, parameters, headers) | ||
28 | + end | ||
29 | + | ||
30 | + private | ||
31 | + def auth_wrap(method, path, parameters, headers) | ||
32 | + return nil unless [:get, :put, :post, :delete, :head].include? method | ||
33 | + | ||
34 | + auth = ActionController::HttpAuthentication::Basic.encode_credentials(@api_user.email, @api_user.password) | ||
35 | + headers.merge!(:authorization => auth) | ||
36 | + # headers.merge!(:content_type => "application/xml", :authorization => auth) | ||
37 | + # parameters.merge!(:format => 'xml') | ||
38 | + | ||
39 | + send(method, path, parameters, headers) | ||
40 | + end | ||
41 | +end | ||
42 | + |