// Path: functional-test/src/main/java/au/com/sensis/stubby/test/client/GenericClientResponse.java
// public class GenericClientResponse {
// 
//     private HttpResponse response;
//     private String body;
// 
//     public GenericClientResponse(HttpResponse response) {
//         this.response = response;
//         this.body = consumeBody(response); // always read body in to memory
//     }
// 
//     private static String consumeBody(HttpResponse response) {
//         try {
//             if (response.getEntity() != null && response.getEntity().getContent() != null) {
//                 return EntityUtils.toString(response.getEntity(), "UTF-8"); // releases connection
//             } else {
//                 return null; // no body
//             }
//         } catch (IOException e) {
//             throw new RuntimeException("Error reading response body", e);
//         }
//     }
// 
//     public boolean hasBody() {
//         return body != null;
//     }
// 
//     public int getStatus() {
//         return response.getStatusLine().getStatusCode();
//     }
//     
//     public String getHeader(String name) {
//         if (response.getFirstHeader(name) != null) {
//             return response.getFirstHeader(name).getValue();
//         } else {
//             return null;
//         }
//     }
//     
//     public List<String> getHeaders(String name) {
//         List<String> result = new ArrayList<String>();
//         for (Header header : response.getHeaders(name)) {
//             result.add(header.getValue());
//         }
//         return result;
//     }
// 
//     public GenericClientResponse assertOk() {
//         if (!isOk()) {
//             throw new RuntimeException("Server returned " + getStatus());
//         }
//         return this;
//     }
//     
//     public GenericClientResponse assertBody() {
//         if (!hasBody()) {
//             throw new RuntimeException("Response body expected");
//         }
//         return this;
//     }
// 
//     public boolean isOk() {
//         return getStatus() == HttpStatus.SC_OK;
//     }
// 
//     public <T> T getJson(Class<T> type) {
//         assertBody();
//         return JsonUtils.deserialize(body, type);
//     }
// 
//     public String getText() {
//         assertBody();
//         return body;
//     }
// 
// }
// 
// Path: functional-test/src/main/java/au/com/sensis/stubby/test/support/TestBase.java
// public abstract class TestBase {
// 
//     private static final String P_TEST_SERVER = "test.server"; // server to test against
// 
//     protected Client client;
// 
//     @Before
//     public void before() {
//         String testServer = System.getProperty(P_TEST_SERVER);
// 
//         client = new Client(testServer);
//         client.reset();
//     }
// 
//     @After
//     public void after() {
//         client.close();
//     }
// 
//     protected void postFile(String filename) {
//         String path = "/tests/" + filename;
//         InputStream resource = getClass().getResourceAsStream(path);
//         if (resource != null) {
//             try {
//                 client.postMessage(IOUtils.toString(resource));
//             } catch (IOException e) {
//                 throw new RuntimeException("Error posting file", e);
//             }
//         } else {
//             throw new RuntimeException("Resource not found: " + path);
//         }
//     }
// 
//     protected String makeUri(String path) {
//         return client.makeUri(path);
//     }
// 
//     protected void close(HttpResponse response) {
//         HttpClientUtils.closeQuietly(response);
//     }
// 
//     protected GenericClientResponse execute(HttpUriRequest request) {
//         return client.execute(request);
//     }
// 
//     protected Client client() {
//         return client;
//     }
// 
//     protected JsonStubbedExchangeList responses() {
//         return client.getResponses();
//     }
// 
//     protected void assertOk(GenericClientResponse response) {
//         assertStatus(HttpStatus.SC_OK, response);
//     }
//     
//     protected void assertNotFound(GenericClientResponse response) {
//         assertStatus(HttpStatus.SC_NOT_FOUND, response);
//     }
// 
//     protected void assertStatus(int status, GenericClientResponse response) {
//         Assert.assertEquals(status, response.getStatus());
//     }
// 
//     protected MessageBuilder builder() {
//         return new MessageBuilder(client);
//     }
//         
//     protected void assertHasHeader(JsonMessage request, String name, String value) {
//         for (JsonPair header : request.headers) {
//             if (header.name.equalsIgnoreCase(name)
//                     && header.value.equals(value)) {
//                 return;
//             }
//         }
//         fail();
//     }
//     
//     protected void assumeNotTravisCi() {
//         assumeFalse("Running as Travis CI", isTravisCi());
//     }
//     
//     protected boolean isTravisCi() { // set when running under Travis CI (travis-ci.org)
//         return "true".equals(System.getenv("TRAVIS"));
//     }
// 
//     protected void assertTimeTaken(long started, long ended, long expected) {
//         double tolerance = 500; // 1/2 second tolerance
// 
//         if (!isTravisCi()) { // don't assert timing if running on Travis-CI (it's quite slow...)
//             assertEquals(expected, Math.abs(ended - started), tolerance); // assert delay within tolerance
//         }
//     }
// 
//     protected long now() {
//         return System.currentTimeMillis();
//     }
// 
// }


import static org.junit.Assert.assertEquals;
import org.junit.Test;
import au.com.sensis.stubby.test.client.GenericClientResponse;
import au.com.sensis.stubby.test.support.TestBase;
package au.com.sensis.stubby.test;




public class ScriptTest extends TestBase {

    private static final String TEST_SCRIPT = 
            "if (request.getParam('run') == 'true') { exchange.response.status = 202; exchange.response.body = exchange.request.getParam('run'); }";
            
    private void givenTestScript() {
        builder().setRequestPath("/script/bar").setResponseStatus(201).setResponseBody("original").setScript(TEST_SCRIPT).stub();
    }
    
    @Test
    public void testRunFalse() {
        givenTestScript();
        
        GenericClientResponse result = client.executeGet("/script/bar?run=false");
        assertEquals(201, result.getStatus());
// Path: functional-test/src/main/java/au/com/sensis/stubby/test/client/GenericClientResponse.java
// public class GenericClientResponse {
// 
//     private HttpResponse response;
//     private String body;
// 
//     public GenericClientResponse(HttpResponse response) {
//         this.response = response;
//         this.body = consumeBody(response); // always read body in to memory
//     }
// 
//     private static String consumeBody(HttpResponse response) {
//         try {
//             if (response.getEntity() != null && response.getEntity().getContent() != null) {
//                 return EntityUtils.toString(response.getEntity(), "UTF-8"); // releases connection
//             } else {
//                 return null; // no body
//             }
//         } catch (IOException e) {
//             throw new RuntimeException("Error reading response body", e);
//         }
//     }
// 
//     public boolean hasBody() {
//         return body != null;
//     }
// 
//     public int getStatus() {
//         return response.getStatusLine().getStatusCode();
//     }
//     
//     public String getHeader(String name) {
//         if (response.getFirstHeader(name) != null) {
//             return response.getFirstHeader(name).getValue();
//         } else {
//             return null;
//         }
//     }
//     
//     public List<String> getHeaders(String name) {
//         List<String> result = new ArrayList<String>();
//         for (Header header : response.getHeaders(name)) {
//             result.add(header.getValue());
//         }
//         return result;
//     }
// 
//     public GenericClientResponse assertOk() {
//         if (!isOk()) {
//             throw new RuntimeException("Server returned " + getStatus());
//         }
//         return this;
//     }
//     
//     public GenericClientResponse assertBody() {
//         if (!hasBody()) {
//             throw new RuntimeException("Response body expected");
//         }
//         return this;
//     }
// 
//     public boolean isOk() {
//         return getStatus() == HttpStatus.SC_OK;
//     }
// 
//     public <T> T getJson(Class<T> type) {
//         assertBody();
//         return JsonUtils.deserialize(body, type);
//     }
// 
//     public String getText() {
//         assertBody();
//         return body;
//     }
// 
// }
// 
// Path: functional-test/src/main/java/au/com/sensis/stubby/test/support/TestBase.java
// public abstract class TestBase {
// 
//     private static final String P_TEST_SERVER = "test.server"; // server to test against
// 
//     protected Client client;
// 
//     @Before
//     public void before() {
//         String testServer = System.getProperty(P_TEST_SERVER);
// 
//         client = new Client(testServer);
//         client.reset();
//     }
// 
//     @After
//     public void after() {
//         client.close();
//     }
// 
//     protected void postFile(String filename) {
//         String path = "/tests/" + filename;
//         InputStream resource = getClass().getResourceAsStream(path);
//         if (resource != null) {
//             try {
//                 client.postMessage(IOUtils.toString(resource));
//             } catch (IOException e) {
//                 throw new RuntimeException("Error posting file", e);
//             }
//         } else {
//             throw new RuntimeException("Resource not found: " + path);
//         }
//     }
// 
//     protected String makeUri(String path) {
//         return client.makeUri(path);
//     }
// 
//     protected void close(HttpResponse response) {
//         HttpClientUtils.closeQuietly(response);
//     }
// 
//     protected GenericClientResponse execute(HttpUriRequest request) {
//         return client.execute(request);
//     }
// 
//     protected Client client() {
//         return client;
//     }
// 
//     protected JsonStubbedExchangeList responses() {
//         return client.getResponses();
//     }
// 
//     protected void assertOk(GenericClientResponse response) {
//         assertStatus(HttpStatus.SC_OK, response);
//     }
//     
//     protected void assertNotFound(GenericClientResponse response) {
//         assertStatus(HttpStatus.SC_NOT_FOUND, response);
//     }
// 
//     protected void assertStatus(int status, GenericClientResponse response) {
//         Assert.assertEquals(status, response.getStatus());
//     }
// 
//     protected MessageBuilder builder() {
//         return new MessageBuilder(client);
//     }
//         
//     protected void assertHasHeader(JsonMessage request, String name, String value) {
//         for (JsonPair header : request.headers) {
//             if (header.name.equalsIgnoreCase(name)
//                     && header.value.equals(value)) {
//                 return;
//             }
//         }
//         fail();
//     }
//     
//     protected void assumeNotTravisCi() {
//         assumeFalse("Running as Travis CI", isTravisCi());
//     }
//     
//     protected boolean isTravisCi() { // set when running under Travis CI (travis-ci.org)
//         return "true".equals(System.getenv("TRAVIS"));
//     }
// 
//     protected void assertTimeTaken(long started, long ended, long expected) {
//         double tolerance = 500; // 1/2 second tolerance
// 
//         if (!isTravisCi()) { // don't assert timing if running on Travis-CI (it's quite slow...)
//             assertEquals(expected, Math.abs(ended - started), tolerance); // assert delay within tolerance
//         }
//     }
// 
//     protected long now() {
//         return System.currentTimeMillis();
//     }
// 
// }


// Path: functional-test/src/main/java/au/com/sensis/stubby/test/ScriptTest.java
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import au.com.sensis.stubby.test.client.GenericClientResponse;
import au.com.sensis.stubby.test.support.TestBase;

package au.com.sensis.stubby.test;




public class ScriptTest extends TestBase {

    private static final String TEST_SCRIPT = 
            "if (request.getParam('run') == 'true') { exchange.response.status = 202; exchange.response.body = exchange.request.getParam('run'); }";
            
    private void givenTestScript() {
        builder().setRequestPath("/script/bar").setResponseStatus(201).setResponseBody("original").setScript(TEST_SCRIPT).stub();
    }
    
    @Test
    public void testRunFalse() {
        givenTestScript();
        
        GenericClientResponse result = client.executeGet("/script/bar?run=false");
        assertEquals(201, result.getStatus());
        assertEquals("original", result.getText());