document.write('<link rel="stylesheet" href="http://flowcoder.com/stylesheets/pygment_trac.css" />');
document.write('<link rel="stylesheet" href="http://flowcoder.com/stylesheets/embed.css" />');
document.write('<div class="flowcoder_post flowcoder_clearfix">');
document.write('<div class="flowcoder_posttitle"><a href=\"http://flowcoder.com/161\">Mock Web<\/a></div>');
document.write('<div class="flowcoder_postbody flowcoder_syntax"><div class=\"highlight\"><pre><span class=\"c1\">#!/usr/bin/env ruby<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># unknown source :(<\/span>\n\n<span class=\"nb\">require<\/span> <span class=\"s1\">&#39;rubygems&#39;<\/span>\n<span class=\"nb\">require<\/span> <span class=\"s1\">&#39;rack&#39;<\/span>\n<span class=\"nb\">require<\/span> <span class=\"s1\">&#39;thin&#39;<\/span>\n\n<span class=\"c1\"># Mock server for testing bad or heavyweight server responses; runs on<\/span>\n<span class=\"c1\"># localhost:4000 by default<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># Example of use<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># In setup method:<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># @mock_server = MockServer.new # creating a new instance spawns a<\/span>\n<span class=\"c1\"># thread running the TCP server<\/span>\n<span class=\"c1\"># @mock_server.register( { &#39;REQUEST_METHOD&#39; =&gt; &#39;GET&#39; }, <\/span>\n<span class=\"c1\"># [ 200, { &#39;Content-Type&#39; =&gt; &#39;text/plain&#39;, &#39;Content-Length&#39; =&gt; &#39;11&#39; }, <\/span>\n<span class=\"c1\"># [ &#39;Hello World&#39; ]])<\/span>\n<span class=\"c1\"># @mock_server.register( { `REQUEST_METHOD&#39; =&gt; `GET&#39; }, [<\/span>\n<span class=\"c1\">#  200, { &#39;Content-Type&#39; =&gt; &#39;text/plain&#39;, &#39;Content-Length&#39; =&gt; &#39;11&#39; }, <\/span>\n<span class=\"c1\">#  [ &#39;Hello Again&#39; ]])<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># After each test, to remove all expectations:<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># @mock_server.clear<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># In teardown method:<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># @mock_server.stop<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">MockServer<\/span>\n\n  <span class=\"k\">def<\/span> <span class=\"nf\">initialize<\/span><span class=\"p\">(<\/span><span class=\"n\">options<\/span><span class=\"o\">=<\/span><span class=\"p\">{})<\/span>\n    <span class=\"n\">host<\/span> <span class=\"o\">=<\/span> <span class=\"n\">options<\/span><span class=\"o\">[<\/span><span class=\"ss\">:host<\/span><span class=\"o\">]<\/span> <span class=\"o\">||<\/span> <span class=\"s1\">&#39;127.0.0.1&#39;<\/span>\n    <span class=\"n\">port<\/span> <span class=\"o\">=<\/span> <span class=\"n\">options<\/span><span class=\"o\">[<\/span><span class=\"ss\">:port<\/span><span class=\"o\">]<\/span> <span class=\"o\">||<\/span> <span class=\"mi\">4000<\/span>\n    <span class=\"vi\">@expectations<\/span> <span class=\"o\">=<\/span> <span class=\"o\">[]<\/span>\n    <span class=\"vi\">@server<\/span> <span class=\"o\">=<\/span> <span class=\"no\">Thin<\/span><span class=\"o\">::<\/span><span class=\"no\">Server<\/span><span class=\"o\">.<\/span><span class=\"n\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">host<\/span><span class=\"p\">,<\/span> <span class=\"n\">port<\/span><span class=\"p\">,<\/span> <span class=\"nb\">self<\/span><span class=\"p\">)<\/span>\n    <span class=\"vi\">@thread<\/span> <span class=\"o\">=<\/span> <span class=\"no\">Thread<\/span><span class=\"o\">.<\/span><span class=\"n\">new<\/span> <span class=\"p\">{<\/span> <span class=\"vi\">@server<\/span><span class=\"o\">.<\/span><span class=\"n\">start<\/span> <span class=\"p\">}<\/span>\n  <span class=\"k\">end<\/span>\n\n  <span class=\"k\">def<\/span> <span class=\"nf\">stop<\/span>\n    <span class=\"vi\">@server<\/span><span class=\"o\">.<\/span><span class=\"n\">stop!<\/span>\n    <span class=\"no\">Thread<\/span><span class=\"o\">.<\/span><span class=\"n\">kill<\/span><span class=\"p\">(<\/span><span class=\"vi\">@thread<\/span><span class=\"p\">)<\/span>\n  <span class=\"k\">end<\/span>\n\n<span class=\"c1\"># env should be a hash mapping elements of a Rack env to expected values <\/span>\n<span class=\"c1\"># (see examples above); note that an expected value can be a Proc which <\/span>\n<span class=\"c1\"># will be passed the value from the request<\/span>\n<span class=\"c1\"># and executed - if the Proc returns true on execution, the expectation is met<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># For example, to check that the querystring contains the value `1234&#39;, env could be:<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># { `QUERY_STRING&#39; =&gt; lambda { |qs| !((qs =~ /1234/).nil?) } }<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># response should be a Rack-formatted response; i.e. [response_code,<\/span>\n<span class=\"c1\"># {&#39;header&#39; =&gt; &#39;value&#39;, ...}, response_body]<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># options:<\/span>\n<span class=\"c1\"># :transient =&gt; false to prevent a response being removed after it has <\/span>\n<span class=\"c1\"># been served (default is true)<\/span>\n  <span class=\"k\">def<\/span> <span class=\"nf\">register<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">,<\/span> <span class=\"n\">response<\/span><span class=\"p\">,<\/span> <span class=\"n\">options<\/span><span class=\"o\">=<\/span><span class=\"p\">{})<\/span>\n    <span class=\"n\">transient<\/span> <span class=\"o\">=<\/span> <span class=\"n\">options<\/span><span class=\"o\">[<\/span><span class=\"ss\">:transient<\/span><span class=\"o\">]<\/span>\n    <span class=\"n\">transient<\/span> <span class=\"o\">=<\/span> <span class=\"kp\">true<\/span> <span class=\"k\">if<\/span> <span class=\"n\">transient<\/span><span class=\"o\">.<\/span><span class=\"n\">nil?<\/span>\n\n    <span class=\"vi\">@expectations<\/span> <span class=\"o\">=<\/span> <span class=\"o\">[]<\/span>\n\n    <span class=\"vi\">@expectations<\/span><span class=\"o\">.<\/span><span class=\"n\">each_with_index<\/span> <span class=\"k\">do<\/span> <span class=\"o\">|<\/span><span class=\"n\">expectation<\/span><span class=\"p\">,<\/span> <span class=\"n\">index<\/span><span class=\"o\">|<\/span>\n      <span class=\"n\">expectation_env<\/span><span class=\"p\">,<\/span> <span class=\"n\">matched_response<\/span><span class=\"p\">,<\/span> <span class=\"n\">transient<\/span> <span class=\"o\">=<\/span> <span class=\"n\">expectation<\/span>\n      <span class=\"n\">matched<\/span> <span class=\"o\">=<\/span> <span class=\"kp\">false<\/span>\n\n      <span class=\"n\">expectation_env<\/span><span class=\"o\">.<\/span><span class=\"n\">each<\/span> <span class=\"k\">do<\/span> <span class=\"o\">|<\/span><span class=\"n\">env_key<\/span><span class=\"p\">,<\/span> <span class=\"n\">value<\/span><span class=\"o\">|<\/span>\n        <span class=\"nb\">puts<\/span> <span class=\"s2\">&quot;Trying to match <\/span><span class=\"si\">#{<\/span><span class=\"n\">env_key<\/span><span class=\"si\">}<\/span><span class=\"s2\"> =&gt; <\/span><span class=\"si\">#{<\/span><span class=\"n\">value<\/span><span class=\"si\">}<\/span><span class=\"s2\"> to request&quot;<\/span>\n        <span class=\"n\">matched<\/span> <span class=\"o\">=<\/span> <span class=\"kp\">true<\/span>\n\n        <span class=\"n\">req_value<\/span> <span class=\"o\">=<\/span> <span class=\"n\">env<\/span><span class=\"o\">[<\/span><span class=\"n\">env_key<\/span><span class=\"o\">]<\/span>\n\n        <span class=\"k\">if<\/span> <span class=\"n\">value<\/span><span class=\"o\">.<\/span><span class=\"n\">is_a?<\/span> <span class=\"no\">Proc<\/span>\n          <span class=\"n\">req_element_matches<\/span> <span class=\"o\">=<\/span> <span class=\"n\">value<\/span><span class=\"o\">.<\/span><span class=\"n\">call<\/span><span class=\"p\">(<\/span><span class=\"n\">req_value<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">else<\/span>\n          <span class=\"n\">req_element_matches<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">value<\/span> <span class=\"o\">==<\/span> <span class=\"n\">req_value<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">end<\/span>\n\n        <span class=\"k\">unless<\/span> <span class=\"n\">req_element_matches<\/span>\n          <span class=\"nb\">puts<\/span> <span class=\"s2\">&quot; Value NOT matched: request value was <\/span><span class=\"si\">#{<\/span><span class=\"n\">env<\/span><span class=\"o\">[<\/span><span class=\"n\">env_key<\/span><span class=\"o\">]<\/span><span class=\"si\">}<\/span><span class=\"s2\"> (needed <\/span><span class=\"si\">#{<\/span><span class=\"n\">value<\/span><span class=\"si\">}<\/span><span class=\"s2\"> to match)&quot;<\/span>\n          <span class=\"n\">matched<\/span> <span class=\"o\">=<\/span> <span class=\"kp\">false<\/span>\n          <span class=\"k\">break<\/span>\n        <span class=\"k\">end<\/span>\n      <span class=\"k\">end<\/span>\n\n      <span class=\"k\">if<\/span> <span class=\"n\">matched<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">transient<\/span>\n          <span class=\"vi\">@expectations<\/span><span class=\"o\">.<\/span><span class=\"n\">delete_at<\/span><span class=\"p\">(<\/span><span class=\"n\">index<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">end<\/span>\n        <span class=\"n\">response<\/span> <span class=\"o\">=<\/span> <span class=\"n\">matched_response<\/span>\n        <span class=\"k\">break<\/span>\n      <span class=\"k\">end<\/span>\n    <span class=\"k\">end<\/span>\n    <span class=\"n\">response<\/span>\n  <span class=\"k\">end<\/span>\n\n<span class=\"k\">end<\/span>\n<\/pre><\/div>\n</div>');
document.write('<div class="flowcoder_bottombar flowcoder_clearfix">');
document.write('<div class="flowcoder_postedby">Posted by <a href=\"http://flowcoder.com/zh\">zh<\/a> on <a href=\"http://flowcoder.com/\">Flowcoder<\/a></div>');
document.write('<div class="flowcoder_viewraw"><a href=\"http://flowcoder.com/161.txt\">view raw<\/a></div>');
document.write('</div></div>');
