https://www.aeolusproject.org/redmine/issues/3542
Updated controller to also render xml. Created specs to convert xml into hash params and then to post the hash params to the controller and verify xml responses. --- src/app/controllers/pools_controller.rb | 15 +++ src/app/views/pools/_detail.xml.haml | 6 + src/app/views/pools/show.xml.haml | 2 + src/config/routes.rb | 1 + src/spec/controllers/pools_controller_spec.rb | 159 +++++++++++++++++++++++++ 5 files changed, 183 insertions(+), 0 deletions(-) create mode 100644 src/app/views/pools/_detail.xml.haml create mode 100644 src/app/views/pools/show.xml.haml
diff --git a/src/app/controllers/pools_controller.rb b/src/app/controllers/pools_controller.rb index 0668217..931d25d 100644 --- a/src/app/controllers/pools_controller.rb +++ b/src/app/controllers/pools_controller.rb @@ -166,6 +166,7 @@ class PoolsController < ApplicationController map{ |deployment| view_context.deployment_for_mustache(deployment) } render :json => @pool.as_json.merge({:deployments => deployments}) end + format.xml { render :show, :locals => { :pool => @pool } } end end
@@ -186,6 +187,11 @@ class PoolsController < ApplicationController
def create @title = t('pools.create_new_pool') + if !params.has_key? :quota and !params[:pool][:quota].nil? + params[:quota] = params[:pool][:quota] + params[:pool].delete(:quota) + end + @pool = Pool.new(params[:pool]) require_privilege(Privilege::CREATE, Pool, @pool.pool_family) @pool.quota = @quota = Quota.new @@ -197,11 +203,14 @@ class PoolsController < ApplicationController flash[:notice] = t "pools.flash.notice.added" format.html { redirect_to pools_path } format.json { render :json => @pool, :status => :created } + format.xml {render :show, :locals => { :pool => @pool } + } else flash.now[:warning] = t "pools.flash.warning.creation_failed" format.html { render :new } format.js { render :partial => 'new' } format.json { render :json => @pool.errors, :status => :unprocessable_entity } + format.xml { render :template => 'api/validation_error', :locals => { :errors => @pool.errors }, :status => :bad_request} end end end @@ -219,6 +228,10 @@ class PoolsController < ApplicationController end
def update + if !params.has_key? :quota and !params[:pool][:quota].nil? + params[:quota] = params[:pool][:quota] + params[:pool].delete(:quota) + end @pool = Pool.find(params[:id]) require_privilege(Privilege::MODIFY, @pool) set_quota @@ -230,11 +243,13 @@ class PoolsController < ApplicationController format.html { redirect_to :action => 'show', :id => @pool.id } format.js { render :partial => 'show', :id => @pool.id } format.json { render :json => @pool } + format.xml {render :show, :locals => { :pool => @pool } } else flash[:error] = t "pools.flash.error.not_updated" format.html { render :action => :edit } format.js { render :partial => 'edit', :id => @pool.id } format.json { render :json => @pool.errors, :status => :unprocessable_entity } + format.xml { render :template => 'api/validation_error', :locals => { :errors => @pool.errors }, :status => :bad_request} end end end diff --git a/src/app/views/pools/_detail.xml.haml b/src/app/views/pools/_detail.xml.haml new file mode 100644 index 0000000..9214ec0 --- /dev/null +++ b/src/app/views/pools/_detail.xml.haml @@ -0,0 +1,6 @@ +!!! XML +%pool{:id => pool.id, :url => api_pool_url(pool)} + %name= pool.name + %pool_family{:id => pool.pool_family.id, :url=> pool_family_url(pool.pool_family)}= pool.pool_family.name + %quota= pool.quota.maximum_running_instances + %enabled= pool.enabled diff --git a/src/app/views/pools/show.xml.haml b/src/app/views/pools/show.xml.haml new file mode 100644 index 0000000..297a082 --- /dev/null +++ b/src/app/views/pools/show.xml.haml @@ -0,0 +1,2 @@ +!!! XML +=render 'detail', :pool => pool \ No newline at end of file diff --git a/src/config/routes.rb b/src/config/routes.rb index 119d740..8373342 100644 --- a/src/config/routes.rb +++ b/src/config/routes.rb @@ -287,6 +287,7 @@ Conductor::Application.routes.draw do resources :provider_accounts, :only => [:index, :show, :destroy] resources :provider_types, :only => [:index, :show] resources :hardware_profiles, :only => [:index, :show, :destroy, :create] + resources :pools, :only => [:index, :show, :create, :update] end
#match 'matching_profiles', :to => '/hardware_profiles/matching_profiles/:hardware_profile_id/provider/:provider_id', :controller => 'hardware_profiles', :action => 'matching_profiles', :conditions => { :method => :get }, :as =>'matching_profiles' diff --git a/src/spec/controllers/pools_controller_spec.rb b/src/spec/controllers/pools_controller_spec.rb index ba68755..5afc66c 100644 --- a/src/spec/controllers/pools_controller_spec.rb +++ b/src/spec/controllers/pools_controller_spec.rb @@ -99,6 +99,165 @@ describe PoolsController do end end
+ context "API" do + render_views + + before do + accept_xml + mock_warden(@admin) + @test_pool_name = "testpool1" + @pool_family = FactoryGirl.create :pool_family + end + + def assert_pool_api_success_response(name, familyName, familyId, quota, enabled) + response.should be_success + response.should have_content_type("application/xml") + response.body.should be_xml + xml = Nokogiri::XML(response.body) + xml.xpath("/pool/name").text.should == name + xml.xpath("/pool/pool_family").text.should == familyName + xml.xpath("/pool/pool_family/@id").text.should == "#{familyId}" + xml.xpath("/pool/quota").text.should == quota + xml.xpath("/pool/enabled").text.should == enabled + end + + describe "#create" do + + it "post with all expected params" do + xmldata = " + <pool> + <name>#{@test_pool_name}</name> + <pool_family_id>#{@pool_family.id}</pool_family_id> + <enabled>true</enabled> + <quota> + <maximum_running_instances>1001</maximum_running_instances> + </quota> + </pool>" + post :create, Hash.from_xml(xmldata) + + assert_pool_api_success_response(@test_pool_name, + @pool_family.name, + @pool_family.id, + "1001", + "true") + end + + it "post missing pool family parameter should result in error message" do + xmldata = " + <pool> + <name>#{@test_pool_name}</name> + <!--<pool_family_id>#{@pool_family.id}</pool_family_id>--> + <enabled>true</enabled> + <quota> + <maximum_running_instances>1001</maximum_running_instances> + </quota> + </pool>" + post :create, Hash.from_xml(xmldata) + + response.status.should be_eql(400) # Bad Request + response.should have_content_type("application/xml") + response.body.should be_xml + xml = Nokogiri::XML(response.body) + xml.xpath("/errors/error/message").text.should == "Pool family can't be blank" + end + + end + + describe "#show" do + + it "show an existing pool" do + @pool = FactoryGirl.create :pool + + get :show, :id => @pool.id + + assert_pool_api_success_response(@pool.name, + @pool.pool_family.name, + @pool.pool_family.id, + "#{@pool.quota.maximum_running_instances}", + "#{@pool.enabled}") + end + + it "show a missing pool" do + get :show, :id => -1 + + response.status.should be_eql(404) + response.should have_content_type("application/xml") + response.body.should be_xml + xml = Nokogiri::XML(response.body) + xml.xpath("/error/message").text.should == "Couldn't find Pool with id=-1" + end + + end + + describe "#update" do + + it "update with all expected params" do + # we will receive unlimited quota if + # maximum_running_instances is not specified + # <quota></quota> denotes unlmited quota + xmldata = " + <pool> + <name>#{@test_pool_name}</name> + <pool_family_id>#{@pool_family.id}</pool_family_id> + <enabled>true</enabled> + </pool>" + post :create, Hash.from_xml(xmldata) + + assert_pool_api_success_response(@test_pool_name, + @pool_family.name, + @pool_family.id, + "", #unlimited + "true") + + xml = Nokogiri::XML(response.body) + pool_id = xml.xpath("/pool/@id").text + + xmldata = " + <pool> + <name>pool-updated</name> + <pool_family_id>#{@pool_family.id}</pool_family_id> + <enabled>false</enabled> + <quota> + <maximum_running_instances>1002</maximum_running_instances> + </quota> + </pool>" + put :update, :id => pool_id, :pool => Hash.from_xml(xmldata)["pool"] + + assert_pool_api_success_response("pool-updated", + @pool_family.name, + @pool_family.id, + "1002", + "false") + end + + it "update missing pool" do + xmldata = "<pool><name>missing-pool</name></pool>" + put :update, :id => -1, :pool => Hash.from_xml(xmldata)["pool"] + + response.status.should be_eql(404) + response.should have_content_type("application/xml") + response.body.should be_xml + xml = Nokogiri::XML(response.body) + xml.xpath("/error/message").text.should == "Couldn't find Pool with id=-1" + end + + it "update with blank name" do + @pool = FactoryGirl.create :pool + xmldata = "<pool><name></name></pool>" + put :update, :id => @pool.id, :pool => Hash.from_xml(xmldata)["pool"] + + response.status.should be_eql(400) + response.should have_content_type("application/xml") + response.body.should be_xml + xml = Nokogiri::XML(response.body) + xml.xpath("/errors/error/message").text.should == "Name can't be blank" + end + + end + + end + + context "JSON format responses for " do before do accept_json