aboutsummaryrefslogblamecommitdiffstats
path: root/actionpack/test/controller/webservice_test.rb
blob: 2243397d8703998856f323d51dc5b8a45c306bbc (plain) (tree)




























                                                                               

                                                                       



























                                                                                                        
                                                   

                                                                

     








                                                                                  
                                                                                                                               






                                                                                                                   


















































































                                                                                                                 
require File.dirname(__FILE__) + '/../abstract_unit'
require 'stringio'

class WebServiceTest < Test::Unit::TestCase

  class MockCGI < CGI #:nodoc:
    attr_accessor :stdinput, :stdoutput, :env_table

    def initialize(env, data = '')      
      self.env_table = env
      self.stdinput = StringIO.new(data)
      self.stdoutput = StringIO.new
      super()
    end
  end


  class TestController < ActionController::Base
    session :off

    def assign_parameters
      render :text => (@params.keys - ['controller', 'action']).sort.join(", ")
    end

    def rescue_action(e) raise end
  end
  
  def setup
    @controller = TestController.new
    ActionController::Base.param_parsers.clear
    ActionController::Base.param_parsers['application/xml'] = :xml_node
  end
  
  def test_check_parameters
    process('GET')
    assert_equal '', @controller.response.body
  end

  def test_post_xml
    process('POST', 'application/xml', '<entry attributed="true"><summary>content...</summary></entry>')
    
    assert_equal 'entry', @controller.response.body
    assert @controller.params.has_key?(:entry)
    assert_equal 'content...', @controller.params["entry"].summary.node_value
    assert_equal 'true', @controller.params["entry"]['attributed']
  end
  
  def test_put_xml
    process('PUT', 'application/xml', '<entry attributed="true"><summary>content...</summary></entry>')
    
    assert_equal 'entry', @controller.response.body
    assert @controller.params.has_key?(:entry)
    assert_equal 'content...', @controller.params["entry"].summary.node_value
    assert_equal 'true', @controller.params["entry"]['attributed']
  end

  def test_register_and_use_yaml
    ActionController::Base.param_parsers['application/x-yaml'] = Proc.new { |d| YAML.load(d) }
    process('POST', 'application/x-yaml', {"entry" => "loaded from yaml"}.to_yaml)
    assert_equal 'entry', @controller.response.body
    assert @controller.params.has_key?(:entry)
    assert_equal 'loaded from yaml', @controller.params["entry"]
  end
  
  def test_register_and_use_yaml_as_symbol
    ActionController::Base.param_parsers['application/x-yaml'] = :yaml
    process('POST', 'application/x-yaml', {"entry" => "loaded from yaml"}.to_yaml)
    assert_equal 'entry', @controller.response.body
    assert @controller.params.has_key?(:entry)
    assert_equal 'loaded from yaml', @controller.params["entry"]
  end

  def test_register_and_use_xml_simple
    ActionController::Base.param_parsers['application/xml'] = Proc.new { |data| XmlSimple.xml_in(data, 'ForceArray' => false) }
    process('POST', 'application/xml', '<request><summary>content...</summary><title>SimpleXml</title></request>' )
    assert_equal 'summary, title', @controller.response.body
    assert @controller.params.has_key?(:summary)
    assert @controller.params.has_key?(:title)
    assert_equal 'content...', @controller.params["summary"]
    assert_equal 'SimpleXml', @controller.params["title"]
  end
  
  def test_deprecated_request_methods
    process('POST', 'application/x-yaml')
    assert_equal 'application/x-yaml', @controller.request.content_type
    assert_equal true, @controller.request.post?
    assert_equal :yaml, @controller.request.post_format
    assert_equal true, @controller.request.yaml_post?
    assert_equal false, @controller.request.xml_post?    
  end
  
  
  private  
  
  def process(verb, content_type = 'application/x-www-form-urlencoded', data = '')
    
    cgi = MockCGI.new({
      'REQUEST_METHOD' => verb,
      'CONTENT_TYPE'   => content_type,
      'QUERY_STRING'   => "action=assign_parameters&controller=webservicetest/test",
      "REQUEST_URI"    => "/",
      "HTTP_HOST"      => 'testdomain.com',
      "CONTENT_LENGTH" => data.size,
      "SERVER_PORT"    => "80",
      "HTTPS"          => "off"}, data)
          
    @controller.send(:process, ActionController::CgiRequest.new(cgi, {}), ActionController::CgiResponse.new(cgi))
  end
    
end


class XmlNodeTest < Test::Unit::TestCase
  def test_all
    xn = XmlNode.from_xml(%{<?xml version="1.0" encoding="UTF-8"?>
      <response success='true'>
      <page title='Ajax Summit' id='1133' email_address='ry87ib@backpackit.com'>
        <description>With O'Reilly and Adaptive Path</description>
        <notes>
          <note title='Hotel' id='1020' created_at='2005-05-14 16:41:11'>
            Staying at the Savoy
          </note>
        </notes>
        <tags>
          <tag name='Technology' id='4' />
          <tag name='Travel' id='5' />
        </tags>
      </page>
      </response>
     }
    )     
    assert_equal 'UTF-8', xn.node.document.encoding
    assert_equal '1.0', xn.node.document.version
    assert_equal 'true', xn['success']
    assert_equal 'response', xn.node_name
    assert_equal 'Ajax Summit', xn.page['title']
    assert_equal '1133', xn.page['id']
    assert_equal "With O'Reilly and Adaptive Path", xn.page.description.node_value
    assert_equal nil, xn.nonexistent
    assert_equal "Staying at the Savoy", xn.page.notes.note.node_value.strip
    assert_equal 'Technology', xn.page.tags.tag[0]['name']
    assert_equal 'Travel', xn.page.tags.tag[1][:name]
    matches = xn.xpath('//@id').map{ |id| id.to_i }
    assert_equal [4, 5, 1020, 1133], matches.sort
    matches = xn.xpath('//tag').map{ |tag| tag['name'] }
    assert_equal ['Technology', 'Travel'], matches.sort
    assert_equal "Ajax Summit", xn.page['title']
    xn.page['title'] = 'Ajax Summit V2'
    assert_equal "Ajax Summit V2", xn.page['title']
    assert_equal "Staying at the Savoy", xn.page.notes.note.node_value.strip
    xn.page.notes.note.node_value = "Staying at the Ritz"
    assert_equal "Staying at the Ritz", xn.page.notes.note.node_value.strip
    assert_equal '5', xn.page.tags.tag[1][:id]
    xn.page.tags.tag[1]['id'] = '7'
    assert_equal '7', xn.page.tags.tag[1]['id']
  end
  

  def test_small_entry
    node = XmlNode.from_xml('<entry>hi</entry>')
    assert_equal 'hi', node.node_value
  end

end