ACK. pushed. I tested manually with examples at https://www.aeolusproject.org/redmine/projects/aeolus/wiki/Pools and the checked in rspec tests passed.

On 08/14/2012 09:08 AM, Richard Su wrote:
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

Reply via email to