Authentication

Most APIs will not run unless provided a valid authentication token. When running contract tests, Specmatic needs to obtain a valid auth token to call authenticated APIs.

You can see how this in action in the sample petstore project.

Here’s a quick walk through of how it works.

1. Write the auth contract

First off, write the contract of the auth API, and in it, declare tokens such as cookies, json value in the response, etc as exports.

In step 3, Specmatic will run this as as a test against the auth service to get the auth tokens. So we must provide the base url of the actual auth service in environment configuration.

Here’s a the petstore’s auth contract.

Setup the auth credentials

Look at the Examples table, in which we use the variables $username and $password. We do not hardcode them, because each environment (local, staging, etc) will need different auth credentials. These values come from environment configuration, where we can specify the auth credentials needed by each environment. See how this is done in specmatic.json in the sample petstore application.

Note how we have declared two variables, username and password, in the staging environment:

  "environments": {
    "staging": {
      "baseurls": {
        "auth.spec": "http://localhost:8080"
      },
      "variables": {
        "username": "jackie",
        "password": "PaSsWoRd"
      }
    }
  }

Setup base urls

In step 3, Specmatic runs this auth.spec as a test against the auth service in the environment, and stores the exports declared by auth.spec for later.

To run as test, Specmatic needs the base url of the auth service. We put this in the same environment config in specmatic.json.

In the snippet above, baseurls contains configuration for auth.spec, the name of the auth contract file.

Exporting auth tokens in the contract

In the auth.spec file, we have exported the entire response body.

And export token = response-body

This exports a variable named token, the contents of which are the entire reponse body.

If the reponse is JSON, such as {"token": "abc123"}, you can export a specific value:

And export token = response-body.token

If you wish to export a header, such as the Cookie header:

And export cookie = response-header.Cookie

2. Wire up auth in the application contract

Next we must connect auth contract with the actual contract that needs it.

Have a look at the sample petstore contract api_petstore_v1.spec.

You’ll see in the background:

And value auth from auth.spec

We declare that the value named auth comes from auth.spec. auth.spec in this line is the relative path to the auth spec file. In this example, auth.spec is in the same directory as api_1.spec.

Using the auth variables

In the petstore contract, look at the Examples table for any of the POST APIs, to see how we are using the auth token.

Take for example:

 Scenario Outline: Update pet details
    When POST /pets
    And request-header Authenticate (string)
    And request-body (Pet)
    Then status 200

    Examples:
      | name   | type | status    | id | Authenticate  |
      | Archie | dog  | available | 10 | ($auth.token) |

In ($auth.token), auth is the value that we declared above, and token is what was exported from auth.spec.

3. Run the contract tests

Declare the application contract in specmatic.json

Make sure to declare the contract you’re running as a test in the Specmatic configuration. Take a look at specmatic.json in the petstore sample project for an example of this. You can read more about running contract tests using Specmatic here.

Execute the tests

Finally, run the tests. You must specify the environment while doing so, for Specmatic to pick up the variables and baseurls relevant to that environment.

If you’re running the tests from a terminal, the command is specmatic test --env=staging specfile.spec

If you’re running the tests from code, set a property named environments. Take a look at the petstore sample to see an example of this.

How Specmatic runs the tests

The tests are run in 2 stages.

  • Stage 1: The application contract depends on the auth contract. So Specmatic first runs the auth contract as test, and stores all the exported values for the application contract to use.
  • Stage 2: Specmatic then plugs the exported values into the application contract where required, and goes on to run the application contract in test mode.