From: David Lutterkort <lut...@redhat.com> CIMI responses carry enough information for us to figure out what model class should be used to parse the response. That makes it unnecessary to list the expected model class explicitly --- tests/cimi/cep_test.rb | 2 +- tests/cimi/machine_collection_test.rb | 4 +- tests/cimi/machine_test.rb | 2 +- tests/cimi/network_collection_test.rb | 4 +- tests/cimi/test_helper.rb | 46 ++++++++++++++++++++++++-------- 5 files changed, 40 insertions(+), 18 deletions(-)
diff --git a/tests/cimi/cep_test.rb b/tests/cimi/cep_test.rb index 76ee963..364d9e5 100644 --- a/tests/cimi/cep_test.rb +++ b/tests/cimi/cep_test.rb @@ -34,7 +34,7 @@ class CloundEntryPointBehavior < CIMI::Test::Spec RESOURCE_URI = "http://schemas.dmtf.org/cimi/1/CloudEntryPoint" # We'd like to call this :cep, but there's already a method by that name - model :subject, CIMI::Model::CloudEntryPoint, :cache => true do |fmt| + model :subject, :cache => true do |fmt| cep(:accept => fmt) end diff --git a/tests/cimi/machine_collection_test.rb b/tests/cimi/machine_collection_test.rb index c6b5b7b..4e487fe 100644 --- a/tests/cimi/machine_collection_test.rb +++ b/tests/cimi/machine_collection_test.rb @@ -22,12 +22,12 @@ class MachineCollectionBehavior < CIMI::Test::Spec RESOURCE_URI = "http://schemas.dmtf.org/cimi/1/MachineCollection" - model :machines, CIMI::Model::MachineCollection do |fmt| + model :machines do |fmt| mcoll_uri = cep(:accept => :json).json["machines"]["href"] get(mcoll_uri, :accept => fmt) end - check_collection :machines, CIMI::Model::Machine + check_collection :machines it "should have the correct resourceURI", :only => :json do machines.wont_be_nil # Make sure we talk to the server diff --git a/tests/cimi/machine_test.rb b/tests/cimi/machine_test.rb index fd76ee5..ec263a6 100644 --- a/tests/cimi/machine_test.rb +++ b/tests/cimi/machine_test.rb @@ -22,7 +22,7 @@ class MachineBehavior < CIMI::Test::Spec RESOURCE_URI = "http://schemas.dmtf.org/cimi/1/Machine" - model :machine, CIMI::Model::Machine do |fmt| + model :machine do |fmt| mcoll_uri = cep(:accept => :json).json["machines"]["href"] mcoll = get(mcoll_uri, :accept => :json).json m_url = mcoll["machines"][0]["id"] diff --git a/tests/cimi/network_collection_test.rb b/tests/cimi/network_collection_test.rb index cd01583..bd2774a 100644 --- a/tests/cimi/network_collection_test.rb +++ b/tests/cimi/network_collection_test.rb @@ -22,10 +22,10 @@ class NetworkCollectionBehavior < CIMI::Test::Spec need_collection :networks - model :networks, CIMI::Model::NetworkCollection do |fmt| + model :networks do |fmt| coll_uri = cep(:accept => :json).json["networks"]["href"] get(coll_uri, :accept => fmt) end - check_collection :networks, CIMI::Model::Network + check_collection :networks end diff --git a/tests/cimi/test_helper.rb b/tests/cimi/test_helper.rb index 3d35aaa..824a5e5 100644 --- a/tests/cimi/test_helper.rb +++ b/tests/cimi/test_helper.rb @@ -88,6 +88,25 @@ module CIMI::Test::Methods RestClient.get absolute_url(path), headers(params) end + # Find the model class that can process the body of the HTTP response + # +resp+ + def model_class(resp) + resource = nil + ct = resp.headers[:content_type] + if ct == "application/json" + resource = resp.json["resourceURI"].split("/").last + elsif ct == "application/xml" + if resp.xml.root.name == "Collection" + resource = resp.xml.root["resourceURI"].split("/").last + else + resource = resp.xml.root.name + end + else + raise "Unexpected content type #{response.content_type}" + end + CIMI::Model::const_get(resource) + end + private def absolute_url(path) if path.start_with?("http") @@ -124,9 +143,8 @@ module CIMI::Test::Methods end # Perform basic collection checks; +model_name+ is the name of the - # method returning the collection model; +member_class+ is the class - # for the model of individual entries - def check_collection(model_name, member_class) + # method returning the collection model + def check_collection(model_name) it "must have the \"id\" and \"count\" attributes" do coll = self.send(model_name) coll.count.wont_be_nil @@ -137,7 +155,7 @@ module CIMI::Test::Methods it "must have a valid id and name for each member" do self.send(model_name).entries.each do |entry| entry.id.must_be_uri - member = fetch(entry.id, member_class) + member = fetch(entry.id) member.id.must_equal entry.id member.name.must_equal entry.name end @@ -165,9 +183,9 @@ class CIMI::Test::Spec < MiniTest::Spec @content_type = CONTENT_TYPES[fmt] end - def fetch(uri, model_class) - resp = retrieve(uri, model_class) { |fmt| get(uri, :accept => fmt) } - model_class.parse(resp.body, @content_type) + def fetch(uri) + resp = retrieve(uri) { |fmt| get(uri, :accept => fmt) } + parse(resp) end def self.it desc = "anonymous", opts = {}, &block @@ -188,22 +206,22 @@ class CIMI::Test::Spec < MiniTest::Spec end end - def self.model(name, model_class, opts = {}, &block) + def self.model(name, opts = {}, &block) define_method name do @_memoized ||= {} @@_cache ||= {} resp = @_memoized.fetch("#{name}_#{@format}") do |k| if opts[:cache] @_memoized[k] = @@_cache.fetch(k) do |k| - @@_cache[k] = retrieve(k, model_class, &block) + @@_cache[k] = retrieve(k, &block) end else - @_memoized[k] = retrieve(k, model_class, &block) + @_memoized[k] = retrieve(k, &block) end end @@_cache[:last_response] ||= {} @@_cache[:last_response][@format] = resp - model_class.parse(resp.body, @content_type) + parse(resp) end end @@ -215,7 +233,11 @@ class CIMI::Test::Spec < MiniTest::Spec private - def retrieve(k, model_class, &block) + def parse(response) + model_class(response).parse(response.body, @content_type) + end + + def retrieve(k, &block) response = instance_exec(@format, &block) assert_equal @content_type, response.headers[:content_type] # FIXME: for XML check that the correct namespace is set -- 1.7.7.6