Project

hyperspec

0.02
No commit activity in last 3 years
No release in over 3 years
By extending minitest/spec HyperSpec provides a Ruby DSL for testing HTTP APIs from the "outside".
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 1.6

Runtime

~> 2.11
 Project Readme
         __  __                     ______
        / / / /_  _________________/ ____/________________
       / /_/ / / / / __ \  _ \_ __/____ \/ __ \  _ \  ___/
      / __  / /_/ / /_/ /  __/ /  ____/ / /_/ /  __/ /__
     /_/ /_/\__, / ____/\___/_/  /_____/ ____/\___/\___/
           /____/_/                   /_/

A full stack testing framework for HTTP APIs.

By extending minitest/spec HyperSpec provides a Ruby DSL for testing HTTP APIs from the outside.

Build Status Dependency Status Code Climate

Example

#source: examples/readme/service_spec.rb

service "http://localhost:4567" do
  def responds_with_json_where
    JSON.parse(response.body)
  end

  resource "/lolz" do
    get do

      it { responds_with.status :ok }

      it { responds_with_json_where['lolz'].must_be_instance_of Array }

      with_query("q=monorail") do

        it "only lists lolz that match the query" do
          responds_with_json_where['lolz'].wont_be_empty
          responds_with_json_where['lolz'].each do |lol|
            lol['title'].must_match /monorail/
          end
        end

      end

      with_query("q=looong") do

        it "only lists lolz that match the query" do
          responds_with_json_where['lolz'].wont_be_empty
          responds_with_json_where['lolz'].each do |lol|
            lol['title'].must_match /looong/
          end
        end

      end
    end

    post do
      describe "without request body" do

        it { responds_with.status :unprocessable_entity }

      end

      describe "with request body" do
        with_headers({ 'Content-Type' => 'application/json' }) do
          with_request_body({ "title" => "Roflcopter!" }.to_json) do

            it { responds_with.status :created }

            it do
              responds_with_json_where['lol']['title'].
                must_equal 'Roflcopter!'
            end

          end
        end
      end
    end
  end
end

Concepts

service

Sets the BASE_URI of the API.

resource

Sets the URI under test. Absolute or relative to the current scope.

get, head, post, put and delete

Selects the HTTP method for the request.

with_query

Sets the query component of a request. Overrides previously set parameters.

with_headers

Sets the headers of a request. Merges with previously set headers.

with_body

Sets the body of a request. Overrides previously set parameters.

response

An object for accessing properties of the "raw" response.

responds_with

Issues the request and returns an object that has the following convenience matchers:

status

Allows for comparing against named status code symbols.

content_type

content_charset

Upcoming features

Representations

  • DSL for matching representations.

Documentation

  • Adding an output format for docs.

Concerns

  • Efficient ways of building up and verifying precondition state.
  • Verify an eventual consistent state.
  • Allowing whitebox testing by "wormholing" into the application(s).

Acknowledgments

Thanks to:

  • Daniel Bornkessel for inspiring me to do README driven development.
  • Matthias Georgi for suggestions for code improvements.
  • Lars Gierth for updating the example server to respond with 415 Unsupported Media Type in the appropriate case.
  • Anton Lindqvist for adding HTTP Basic Auth
  • Josh Devins for noticing missing HTTP status codes and with_query documentation inconsistency.

History

0.0.5 - 2012-12-04

  • Change dependency declaration.

0.0.4 - 2012-11-22

  • Change behavior of with_query to override instead of append.

0.0.3 - 2012-08-10

  • Add complete list of HTTP response codes.

0.0.2 - 2012-03-30

  • Correcting environment dependencies.
  • Adding support for HTTP Basic Auth.

0.0.1 - 2012-02-07

  • Initial release