mockservermountebank

Mountebank - How do I assert message body is JSON format in a POST request in mountebank


I want to stub and check the message body in POST request in mountebank,

{
  "port": "22001",
  "protocol": "http",
  "name": "login_user",
  "stubs": [
    {
      "responses": [
        {
          "is": {
            "statusCode": 201,
            "headers": {
              "Content-Type": "application/json"
            },
            "body": {}
          },
          "_behaviors": {
            "wait": 100
          }
        }
      ],
      "predicates": [
        {
          "equals": {
            "path": "/login_user",
            "method": "POST",
            "headers": {
              "Content-Type": "application/json"
            },
            "body": {
              "name": "Tony",
              "age": "20"
            }
          }
        }
      ]
    }
  ]
}

if a message body in JSON format. expected response status Code 200.

for Example

{ 
  "body": {
    "name": "Tony",
    "age": "20"
  }
}

if a message body in JSON format but JSON string. expected response status Code 400.

for Example

{ 
  "body": "{\"name\": \"Tony\", \"age\": \"20\"}"
}

Solution

  • You could achieve this with a 'matches' predicate containing a (pretty crude in this example) regex to capture any string input and return a 400:

      "stubs": [
        {
          "responses": [
            {
              "is": {
                "statusCode": 400,
                "headers": {
                  "Content-Type": "application/json"
                },
                "body": {}
              },
              "_behaviors": {
                "wait": 100
              }
            }
          ],
          "predicates": [
            {
              "matches": {
                "path": "/login_user",
                "method": "POST",
                "body": ".*\\\\\\\"name.*"
              }
            }
          ]
        },
        {
          "responses": [
            {
              "is": {
                "statusCode": 201,
                "headers": {
                  "Content-Type": "application/json"
                },
                "body": {}
              },
              "_behaviors": {
                "wait": 100
              }
            }
          ],
          "predicates": [
            {
              "equals": {
                "path": "/login_user",
                "method": "POST",
                "headers": {
                  "Content-Type": "application/json"
                },
                "body": {
                  "name": "Tony",
                  "age": "20"
                }
              }
            }
          ]
        }
      ]
    

    Alternatively, you can also specify a default response code of 400 in the imposter declaration, so that anything that doesn't match a specific predicate will return a 400 response by default:

    {
      "port": "22001",
      "protocol": "http",
      "name": "login_user",
      "defaultResponse": {
          "statusCode": 400
      },
      "stubs": [
        {
    .... snip ....