Search code examples
apiblueprintdredd

Dredd passing trailing square bracket to API


I'm using Dredd to test an API I have written. It works fine until I try to vary the action uri within a resource. When I have an action of the form

## Retrieve Task [GET /task/{id}]

it sends a request to Drakov with the ] appended. This Drakov server is running the blueprint document.

Drakov 0.1.16      Listening on port 8090
[LOG] GET /task/myid]
[LOG] DELETE /task/myid]
[LOG] GET /task/myid]

You can see this request has an extra ] on the end.

This is my blueprint. It is a subset of the example from the Api Blueprint examples:

FORMAT: 1A

# Advanced Action API
A resource action is – in fact – a state transition. This API example demonstrates an action - state transition - to another resource.

## API Blueprint

# Tasks [/tasks/tasks{?status,priority}]

+ Parameters
    + status  `test` (string)
    + priority `1` (number)

## Retrieve Task [GET /task/{id}]
This is a state transition to another resource

+ Parameters
    + id: `myid` (string)

+ Response 200 (application/json)

        {
            "id": 123,
            "name": "Go to gym",
            "done": false,
            "type": "task"
        }

What am I doing wrong?


Solution

  • Your API Blueprint has multiple errors. For instance,

    + Parameters
      + status  `test` (string)
      + priority `1` (number)
    

    ...should be:

    + Parameters
      + status: `test` (string)
      + priority: `1` (number)
    

    Also, you are defining a resource Tasks with URI Template /tasks/tasks{?status,priority} and then you are trying to define a GET action for the resource with a different URI Template. That is confusing.

    I tried to create a sample API Blueprint (saved as sample-blueprint.md) like this:

    FORMAT: 1A
    
    # My API
    
    ## Task [/task/{id}]
    
    ### Retrieve Task [GET]
    
    + Parameters
        + id: `123` (string)
    
    + Response 200 (application/json)
    
            {
                "id": 123,
                "name": "Go to gym",
                "done": false,
                "type": "task"
            }
    

    Then I launched a Drakov server in one terminal like this:

    drakov -f *.md
    

    Then I tried to run Dredd:

    dredd sample-blueprint.md http://localhost:3000
    

    Everything passed correctly:

    $ dredd sample-blueprint.md http://localhost:3000
    info: Beginning Dredd testing...
    pass: GET /task/123 duration: 42ms
    complete: 1 passing, 0 failing, 0 errors, 0 skipped, 1 total
    complete: Tests took 50ms
    

    Is this something you originally wanted to achieve?