# API Matchers
Collection of RSpec matchers for create your API.
## Matchers
* be_in_xml
* be_a_json
* create_resource
* be_a_bad_request
* be_unauthorized
* be_internal_server_error
* have_node
* have_json_node
* have_xml_node
* be_json_eql
* be_xml_eql
## Install
gem install api_matchers
## Usage
### Including in RSpec
To include all this matchers you need to include the APIMatchers::RSpecMatchers module:
RSpec.configure do |config|
config.include APIMatchers::RSpecMatchers
end
### Have Node Matcher
The have_node matcher parse the actual and see if have the expcted node with the expected value.
**The default that have_node will parse is JSON.**
"{ 'transaction': { 'id': '54', 'status': 'paid' } }".should have_node(:transaction)
"{ 'transaction': { 'id': '54', 'status': 'paid' } }".should have_node(:id).with(54)
"{ 'error': 'not_authorized', 'transaction': { 'id': '55' } }".should have_node(:error).with('not_authorized')
### HAVE NODE Matcher Configuration
You can configure if you want xml(**JSON is the default**):
APIMatchers.setup do |config|
config.content_type = :xml
end
'200paid'.should have_node(:status).with('paid')
**If you work with xml and json in the same API, I recommend that you check the have_json_node and have_xml_node matchers.**
You can configure the name of the method for example:
## Instead of this
response.body.should have_node(:foo)
## YOU can do this
APIMatchers.setup do |config|
config.body_method = :body
end
Then you can use without call the **#body** method:
response.should have_node(:foo).with('bar')
### Have JSON Node Matcher
"{ 'transaction': { 'id': '54', 'status': 'paid' } }".should have_json_node(:id).with(54)
### Have XML Node Matcher
"gateway".should have_xml_node(:name).with('gateway')
### Create Resource Matcher
This matchers see the HTTP STATUS CODE is equal to 201.
response.status.should create_resource
### BAD REQUEST Matcher
This BAD REQUEST is a matcher that see if the HTTP STATUS code is equal to 400.
response.status.should be_a_bad_request
response.status.should be_bad_request
### UNAUTHORIZED Matcher
This UNAUTHORIZED is a matcher that see if the HTTP STATUS code is equal to 401.
response.status.should be_unauthorized
response.body.should have_node(:message).with('Invalid Credentials')
### INTERNAL SERVER ERROR Matcher
This INTERNAL SERVER Error is a matcher that see if the HTTP STATUS code is equal to 500.
response.status.should be_internal_server_error
response.body.should have_node(:message).with('An Internal Error Occurs in our precious app. :S')
### HTTP STATUS CODE Configuration
You can configure the name method to call the http status code:
APIMatchers.setup do |config|
config.http_status_method = :status
end
Then you can use without call the **#status** method:
response.should create_resource
This configurations affects this matchers:
* create_resource
* be_a_bad_request
* be_internal_server_error
* be_unauthorized
### Be in XML Matcher
This is a matcher that see if the content type is xml:
response.headers['Content-Type'].should be_in_xml
### Be in JSON Matcher
This is a matcher that see if the content type is in JSON:
response.headers['Content-Type'].should be_in_json
### Headers Configuration
You can configure the name method to call the headers and content type:
APIMatchers.setup do |config|
config.header_method = :headers
config.header_content_type_key = 'Content-Type'
end
Then you can use without call the **#headers** calling the **#['Content-Type']** method:
response.should be_in_json
response.should be_in_xml
### Acknowlegments
* Special thanks to Daniel Konishi to contribute in the product that I extracted the matchers to this gem.