Commit c8450e044f3455fb548c495096ddd3f6884aa032

Authored by Dmitri Garbuzov
1 parent c5eecbcc

Added rspec integration tests

app/controllers/questions_controller.rb
... ... @@ -117,7 +117,7 @@ class QuestionsController < InheritedResources::Base
117 117  
118 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 122 @question.send_later :export_and_delete, type,
123 123 :response_type => response_type, :redis_key => redis_key, :delete_at => 3.days.from_now
... ...
spec/integration/choices_spec.rb
1 1 require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2 2  
3 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 199 end
... ...
spec/integration/densities_spec.rb 0 → 100644
... ... @@ -0,0 +1,8 @@
  1 +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
  2 +
  3 +describe "Densities" do
  4 + include IntegrationSupport
  5 +
  6 + describe "index"
  7 +
  8 +end
... ...
spec/integration/prompts_spec.rb
1 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 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 170 end
... ...
spec/integration/questions_spec.rb
1 1 require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2 2  
3 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 208 end
... ...
spec/integration/visitors_spec.rb
1 1 require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2 2  
3 3 describe "Visitors" do
  4 + include IntegrationSupport
  5 +
  6 + describe "index"
  7 +
4 8 end
... ...
spec/models/question_spec.rb
1 1 require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2 2  
3 3 describe Question do
4   -
  4 + include DBSupport
  5 +
5 6 it {should belong_to :creator}
6 7 it {should belong_to :site}
7 8 it {should have_many :choices}
... ... @@ -292,6 +293,7 @@ describe Question do
292 293 prompt.left_choice.deactivate!
293 294 @catchup_q.choose_prompt.should_not == prompt1
294 295 end
  296 + after(:all) { truncate_all }
295 297 end
296 298  
297 299 context "exporting data" do
... ... @@ -416,6 +418,7 @@ describe Question do
416 418  
417 419 end
418 420  
  421 + after(:all) { truncate_all }
419 422 end
420 423  
421 424 end
... ...
spec/support/db_support.rb 0 → 100644
... ... @@ -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
... ...
spec/support/integration_support.rb 0 → 100644
... ... @@ -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 +
... ...