npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

cucumber-steps-api

v0.1.4

Published

Cucumber step library for API testing and support functions

Downloads

6

Readme

cucumber-steps-api

Build Status Coverage Status

Cucumber step library for API testing and support functions

Installation

Install npm module as dev dependency using

npm install --save-dev cucumber-steps-api

If target module is executable test suite then add cucumber-steps-api as normal dependency using

npm install --save cucumber-steps-api

Getting started

Add cucumber-steps-api as dependency and require the module to register step definitions.

Executing cucumber feature tests at commandline

./node_modules/.bin/cucumber-js features/**/*.feature --require=cucumber-steps-api

Executing cucumber feature tests using gulp-cucumber

Assuming the feature specification are located in features directory

const gulp = require('gulp');
const cucumber = require('gulp-cucumber');

gulp.src('features/**/*.feature').pipe(
  cucumber({
    steps: ['cucumber-steps-api', `features/**/*.js`],
    format: ['summary', `json:output/json/results-${Date.now()}.json`],
  })
)

Upcoming features

These features are not fully implemented yet.

  • XML, FormData and multipart content-type support

These features are yet to be implemented

  • handlebars, ejs template engine support
  • JSON schema validation for response
  • XML schema validation for response

Gherkin step definitions

A new request client is initialized for each scenario. Any default options set on client are used for all subsequent requests. Any request level options are used for next requests only.

Initialize a new Request Context

Cucumber Expression: I request {string} method at {expression} url

I request "GET" method at "https://httpbin.org/anything" url
I request "POST" method at "https://httpbin.org/anything" url
I request "OPTIONS" method at "https://httpbin.org/anything" url
RegExp: /I request (GET|POST|PUT|PATCH|DEL|DELETE|HEAD|OPTIONS|LINK) method at "([^"]+)" url/
I request GET method at "https://httpbin.org/anything" url
I request POST method at "https://httpbin.org/anything" url
I request PUT method at "${ENV_NAME_FOR_URL}" url
RegExp: /(?:\w|\s|[-_])+ is available at "([^"]+)" url/
API is available at "https://httpbin.org/anything" url
Service is available at "https://httpbin.org/anything" url
Any String Here is available at "${ENV_NAME_FOR_URL}" url

Set request options

RegExp: /I set "([^"]+)" header as "([^"]+)"/
I set "some-name" header as "some-value"
I set "other-name" header as "${some-variable}"
I set "Content-Type" header as "json"
I set "Accept" header as "application/json"
RegExp: /I set headers(?: as):/
I set headers:
  | some-name  | some-value  |
  | some-other | other-value |
I set headers as:
  | some-name  | some-value  |
  | some-other | other-value |
RegExp: /I set "([^"]+)" query param as "([^"]+)"/
I set "some-name" query param as "some-value"
I set "other-name" query param as "${some-variable}"
RegExp: /I set query params as "([^"]+)"/
I set query params as "some-name=${some-variable-value}&other-name=other-uri-encoded-value"
RegExp: /I set query params(?: as):/
I set query params:
  | some-name  | some-value  |
  | some-other | other-value |
I set query params as:
  | some-name  | some-value  |
  | some-other | other-value |

Set request body

Set body using content, text, content template, data table or template files. Setting body for GET or HEAD method has no effect, the body will be ignored for GET and HEAD method.

RegExp: /I set ?(JSON|XML|FormData|json|xml|form|form-data|multipart)? request body to '([^']+)'/

Set request body using provided text content and optionally set content-type for request.

I set request body to 'some text here'
I set JSON request body to '{"name":"value","other":"value"}'
I set XML request body to '<request><name>value</name><other>value</other></request>'
I set form request body to 'name=value&other=uriencodedvalue'
RegExp: /I set ?(JSON|XML|FormData|json|xml|form|form-data|multipart)? request body with content:$/

Set request body using provided text content and optionally set content-type for request. Content can not use expression/variable resolvers. Any variable mentioned in content in form of $somevar or ${somevar} will be ignored.

I set request body with content:
  """
  some multiline text here
  some more text here
  """
I set JSON request body with content:
  """
  {
    "name":"value",
    "other":"value"
  }
  """
I set XML request body with content:
  """
  <request>
    <name>value</name>
    <other>value</other>
  </request>
  """
I set form request body with content:
  """
  name=value&other=uriencodedvalue
  """
RegExp: /I set ?(JSON|XML|FormData|json|xml|form|form-data|multipart)? request body (?:to|as):$/

Set request body using data table and optionally set content-type for request. The data table follows two column structure with first column having key and second column having value. Data table can not use expression/variable resolvers.

I set request body to:
  | some-name | some-value |
  | other     | value      |
I set JSON request body as:
  | some-name | some-value |
  | other     | value      |
RegExp: /I set ?(JSON|XML|FormData|json|xml|form|form-data|multipart)? request body from "([^"]+)"(?: file)?$/

Set request body using content from a file and optionally set content-type for request.

I set request body from "sample.json" file
I set JSON request body from "sample.json"
I set XML request body from "sample.xml"
RegExp: /I set ?(JSON|XML|FormData|json|xml|form|form-data|multipart)? request body from ?(JS|js)? template content:$/

Set request body using provided template and optionally set content-type for request. If template type is not specified then default value is js.

I set request body from template content:
  """
  {
    id: options.guid(),
    otherId: options.uuid.v4(),
    name: options.faker.name.findName(),
    address: options.chance.address()
  }
  """
I set JSON request body from JS template content:
  """
  {
    id: options.guid(),
    otherId: options.uuid.v4(),
    name: options.faker.name.findName(),
    address: options.chance.address()
  }
  """
RegExp: /I set ?(JSON|XML|FormData|json|xml|form|form-data|multipart)? request body from "([^"]+)" template$/

Set request body using a template file and optionally set content-type for request.

I set request body from "sample.js" template
I set JSON request body from "sample.tpl.js" template
RegExp: /I set ?(JSON|XML|FormData|json|xml|form|form-data|multipart)? request body from "([^"]+)" template with options(?: as)?:$/

Set request body using a template file and context for template and optionally set content-type for request. The values defined in data table is available as options object in template.

I set request body from "sample.js" template with options as:
  | param1 | value1 |
  | param2 | value2 |
I set JSON request body from "sample.tpl.js" template with options:
  | param1 | value1 |
  | param2 | value2 |

HttpClient interface

HttpClient provides utility api to formulate request and send to remote server. It internally uses superagent instance.

Setting default request options for all subsequent requests -

const { HttpClient } = require('cucumber-steps-api');
const client = new HttpClient();

client.defaults
  .authorization('AAAAAAAA', 'Digest')
  .authorization('x.y.z', 'Bearer')
  .type('json')
  .type('application/json')
  .accept('json')
  .header('accept', 'json')
  .header('name1', 'value1')
  .headers({ name1: 'value1', name2: 'value2' })
  .headers([
    { name: 'name1', value: 'value1' },
    { name: 'name2', value: 'value2' },
  ])
  .query('name1', 'value1')
  .queries(['name1=value1', 'name2=value2'])
  .queries([
    { name: 'name1', value: 'value1' },
    { name: 'name2', value: 'value2' },
  ])
  .queries([['name1', 'value1'], ['name2', 'value2']])
  .key('path/to/key/file')
  .cert('path/to/key/file')
  .ca('path/to/key/file')
  .timeout(30000) // 30 sec in milliseconds
  .timeout({ deadline: 30000, response: 5000 });

Setting request options for next requests -

const { HttpClient } = require('cucumber-steps-api');
const client = new HttpClient();

client
  .url('https://httpbin.org/anything')
  .method('POST')
  .authorization('AAAAAAAA', 'Digest')
  .authorization('x.y.z', 'Bearer')
  .type('json')
  .type('application/json')
  .accept('json')
  .header('accept', 'json')
  .header('name1', 'value1')
  .headers({ name1: 'value1', name2: 'value2' })
  .headers([
    { name: 'name1', value: 'value1' },
    { name: 'name2', value: 'value2' },
  ])
  .query('name1', 'value1')
  .queries(['name1=value1', 'name2=value2'])
  .queries([
    { name: 'name1', value: 'value1' },
    { name: 'name2', value: 'value2' },
  ])
  .queries([['name1', 'value1'], ['name2', 'value2']])
  .key('path/to/key/file')
  .cert('path/to/key/file')
  .ca('path/to/key/file')
  .timeout(30000) // 30 sec in milliseconds
  .timeout({ deadline: 30000, response: 5000 })
  .body({ somekey: 'somevalue' };

Send request with body client.send([body, headers, queries, type, accept])

const { HttpClient } = require('cucumber-steps-api');
const client = new HttpClient();

client
  .url('https://httpbin.org/anything')
  .method('POST')
  .send(
    { somekey: 'somevalue' },
    { headername: 'headervalue', otherheader: 'value' },
    [{ name: 'name1', value: 'value1' }, { name: 'name2', value: 'value2' }],
    'json',
    'json'
  );