mass_spec
Mass Spec
Web API testing library
Mass Spec prevents the HTTP::Server from starting a TCPServer and use IO::Memory instead of TCPSocket for fast testing.
Because Mass Spec works with standard library, it can easily support the frameworks based on HTTP::Server.
Installation
Add this to your application's shard.yml:
development_dependencies:
mass_spec:
github: c910335/mass-spec
Usage
require "spec"
require "mass_spec"
include MassSpec::GlobalDSL
server = HTTP::Server.new(8080) do |context|
context.response.content_type = "application/json"
context.response.print({path: context.request.path}.to_json)
end
server.listen
describe "Server" do
it "returns the path in json" do
get("/nas/beru/uhn'adarr")
status_code.should eq(200)
headers.should contain({"Content-Type", ["application/json"]})
body.should eq(%({"path":"/nas/beru/uhn'adarr"}))
json_body.should eq({"path" => "/nas/beru/uhn'adarr"})
end
end
Making Requests
Mass Spec supports the following HTTP verbs via HTTP::Client, and the usage of them is the same as HTTP::Client.
Handling Responses
After a request, you can access these getters.
- response :
HTTP::Client::Response - status_code :
Int32 - headers :
HTTP::Headers - body :
String - json_body :
JSON::Type- The body parsed asJSON::Type
Frameworks
Kemal
Kemal doesn't run HTTP::Server#listen when ENV["KEMAL_ENV"] is "test", so you need to set MassSpec.server manually.
Kemal DSL and MassSpec::GlobalDSL have same method names, so you need to use MassSpec.get instead of get without include MassSpec::GlobalDSL, and so do the other verbs and getters.
ENV["KEMAL_ENV"] = "test"
require "spec"
require "mass_spec"
require "kemal"
get "/hello" do
{hello: "kemal"}.to_json
end
Kemal.run do |config|
MassSpec.server = config.server.not_nil! # set `MassSpec.server` manually
end
describe "GET /hello" do
it "says hello to Kemal" do
MassSpec.get "/hello" # `MassSpec.get` instead of `get`
MassSpec.json_body.should eq({"hello" => "kemal"}) # `MassSpec.json_body` instead of `json_body`
end
end
Amber
Note: Mass Spec is only compatible with master but not v0.7.2 currently.
# src/controllers/hello_controller.cr
class HelloController < Amber::Controller::Base
def hello
respond_with { json({"hello" => "amber"}) }
end
end
# config/routes.cr
Amber::Server.configure do
routes :web do
get "/hello", HelloController, :hello
end
end
# spec/spec_helper.cr
ENV["AMBER_ENV"] = "test"
require "spec"
require "mass_spec"
require "../src/*" # not `require "../config/*"`
include MassSpec::GlobalDSL
# spec/controllers/hello_controller_spec.cr
describe HelloController do
describe "GET #hello" do
it "says hello to Amber" do
get "/hello"
json_body.should eq({"hello" => "amber"})
end
end
end
Contributing
- Fork it ( https://github.com/c910335/mass-spec/fork )
- Create your feature branch (git checkout -b my-new-feature)
- Commit your changes (git commit -am 'Add some feature')
- Push to the branch (git push origin my-new-feature)
- Create a new Pull Request
Contributors
- c910335 Tatsiujin Chin - creator, maintainer