NAME

Test::Mountebank - Perl client library for mountebank

SYNOPSIS

use Test::Mountebank;

# Create mountebank client with default port 2525
my $mb = Test::Mountebank::Client->new(
    base_url => 'http://127.0.0.1'
);

# Create an imposter that answers on port 4546
my $imposter = $mb->create_imposter( port => 4546 );

# Adds a stub to the imposter with a predicate and a response
# (Responds to URL /foobar.json, returns JSON content '{"foo":"bar"}')
$imposter->stub->predicate(
    path   => "/foobar.json",
    method => "GET",
)->response(
    status_code  => 200,
    content_type => "application/json",
    # Equivalent:
    # headers    => { Content_Type => "application/json" },
    body         => { foo => "bar" },
    # Equivalent:
    # body       => '{ "foo":"bar" }',
);

# Adds a stub for a non-existent resource
$imposter->stub->predicate(
    path   => "/qux/999/json",
    method => "GET",
)->response(
    status_code  => 404,
    content_type => "application/json",
    body         => '{ "error": "No such qux: 999" }',
);

# Add a stub to return HTML content read from a file
$imposter->stub->predicate(
    path   => "/foobar.html",
    method => "GET",
)->response(
    status_code    => 200,
    content_type   => "text/html",
    body_from_file => './foobar.html',
);

# Clear existing imposter on port 4546
$mb->delete_imposters(4546); # Takes more than one port number, if desired

# Send the new imposter to mountebank
$mb->save_imposter($imposter);

DESCRIPTION

The example in the synopsis builds an object structure that generates JSON code like the following, which can be sent to the running mountebank instance in a POST request.

{
    "port": 4546,
    "protocol": "http",
    "stubs": [
        {
            "predicates": [
                {
                    "equals": {
                        "method": "GET",
                        "path": "/foobar.json"
                    }
                }
            ],
            "responses": [
                {
                    "is": {
                        "body": {
                            "foo": "bar"
                        },
                        "headers": {
                            "Content-Type": "application/json"
                        },
                        "statusCode": 200
                    }
                }
            ]
        },
        {
            "predicates": [
                {
                    "equals": {
                        "method": "GET",
                        "path": "/qux/999/json"
                    }
                }
            ],
            "responses": [
                {
                    "is": {
                        "body": "{ \"error\": \"No such qux: 999\" }",
                        "headers": {
                            "Content-Type": "application/json"
                        },
                        "statusCode": 404
                    }
                }
            ]
        },
        {
            "predicates": [
                {
                    "equals": {
                        "method": "GET",
                        "path": "/foobar.html"
                    }
                }
            ],
            "responses": [
                {
                    "is": {
                        "body": "<html>\n  <head>\n    <title>foobar</title>\n  </head>\n  <body>\n    foobar\n  </body>\n</html>\n\n",
                        "headers": {
                            "Content-Type": "text/html"
                        },
                        "statusCode": 200
                    }
                }
            ]
        }
    ]
}

Compare the mountebank documentation at http://www.mbtest.org/docs/api/stubs and http://www.mbtest.org/docs/api/predicates. Currently at least, Test::Mountebank implements only the features of mountebank stubs that are most useful for simulating a REST API. There is only one type of predicate (equals) and only one type of response (is).

AUTHOR

Dagfinn Reiersøl dagfinn@reiersol.com

COPYRIGHT

Copyright (C) 2016, Dagfinn Reiersøl.