CI License Version Docs

Cuerdo

Arazzo workflow runner and automated testing

Still in alpha. Expect rough edges, cryptic error messages and generally unpolished experience.

Installation

Add :cuerdo to the list of dependencies in mix.exs

def deps do
  [
    {:cuerdo, "~> 0.1"}
  ]
end

Usage

Considering the following minimal Arazzo document

# specs/arazzo.yaml
arazzo: 1.1.0
info:
  title: Item Creation
  version: 1.0.0

sourceDescriptions:
  - name: ecommerce
    url: https://ecommerce-api.example.com/openapi.yaml
    type: openapi

workflows:
  - workflowId: createItem
    summary: Creates an item and verifies the returned fields match the request
    inputs:
      type: object
      additionalProperties: false
      required: ["item"]
      properties:
        item:
          type: object
          additionalProperties: false
          required: ["sku", "price"]
          properties:
            sku:
              type: string
              pattern: ^SKU-[0-9]+$
            price:
              type: number
              minimum: 0.01
    outputs:
      itemId: $steps.createItemStep.response.body#/id
    steps:
      - stepId: createItemStep
        operationId: createItem
        requestBody:
          contentType: application/json
          payload: $inputs.item
        successCriteria:
          - condition: $statusCode == 201
          - condition: $response.body.sku == $request.body.sku
          - condition: $response.body.price == $request.body.price

Manually

iex> inputs = %{"sku" => "SKU-123", "price" => 8.99}
iex> document = YamlElixir.read_from_file!("specs/arazzo.yaml")
iex> {:ok, context} = Cuerdo.Arazzo.run_workflow(inputs, "createItem", document)
iex> Cuerdo.Arazzo.Context.workflow_outputs(context, "createItem")
%{"itemId" => "e80dee5a-c59a-4118-ac38-f03d5ffbd028"}

As part of a Cuerdo.ArazzoCase

defmodule MyArazzoTest do
  use Cuerdo.ArazzoCase

  arazzo_document_test document: YamlElixir.read_from_file!("specs/arazzo.yaml"), max_runs: 4
end
  # Randomly generated inputs
  # [
  #   %{"item" => %{"price" => 1.01, "sku" => "SKU-3"}},
  #   %{"item" => %{"price" => 1.01, "sku" => "SKU-4"}},
  #   %{"item" => %{"price" => 4.01, "sku" => "SKU-11"}},
  #   %{"item" => %{"price" => 0.5725, "sku" => "SKU-56"}}
  # ]

For more in-depth information and guides refer to any of the useful links

Contributions are welcome, please read Contributing before submitting any bug report, feature request or pull request.