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 | + |