rspec-request_describer 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2ca21c6862e6856b379b8ccacd6279d5b40f89bb
4
+ data.tar.gz: 8afcab50af6f8ce460b5ba4fbc5fc3a3c22f876e
5
+ SHA512:
6
+ metadata.gz: 710cee94beebe0c190845b52abdb412937942608c622dbe182239e1ef03fd3b2447747dc9a0d4e938bfb6bc98b2f01232f08177a5cfeb779ebd43aeb3f202c4c
7
+ data.tar.gz: 7756bb744d9b772e1da7aef87693d557b09dec428c790491a6e28d1565df77cb939077deabc74d0971c43f1ec6683afc7f53ea7c74b16d70c6239c7ef674671e
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rspec-request_describer.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Ryo Nakamura
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # RSpec::RequestDescriber
2
+ Force some rules to write self-documenting request spec.
3
+
4
+ ## Setup
5
+ Add `rspec-request_describer` into your Gemfile, then run `bundle install`.
6
+
7
+ ```ruby
8
+ # Gemfile
9
+ gem "rspec-request_describer"
10
+
11
+ # rspec-request_describer depends on some methods of rspec-rails (or rack-test),
12
+ # so you may need to add it unless you haven't do it yet.
13
+ gem "rspec-rails" # or "rack-test"
14
+ ```
15
+
16
+ Then include `RSpec::RequestDescriber` into your `RSpec.configuration`.
17
+
18
+ ```ruby
19
+ # spec/spec_helper.rb
20
+ RSpec.configuration.include RSpec::RequestDescriber
21
+ ```
22
+
23
+ ## Usage
24
+ RSpec::RequestDescriber provides some `subject` and `let` to your specs.
25
+
26
+ ### subject
27
+ In the example below, the `subject` calls an HTTP request of GET /users,
28
+ then returns its status code.
29
+
30
+ ```ruby
31
+ describe "GET /users" do
32
+ it { should == 200 }
33
+ end
34
+ ```
35
+
36
+ ### headers
37
+ `headers` is provided to modify request headers.
38
+ In the above example, a token is added into Authorization request header.
39
+
40
+
41
+ ```ruby
42
+ describe "GET /users" do
43
+ context "with Authorization header" do
44
+ before do
45
+ headers["Authorization"] = "token 12345"
46
+ end
47
+ it { should == 200 }
48
+ end
49
+ end
50
+ ```
51
+
52
+ ### params
53
+ You can also pass query parameter or request body by modifying `params`.
54
+ In the this example, `?sort=id` is added into URL query string.
55
+ For GET request `params` is converted into URL query string,
56
+ while it's converted into request body for the other methods
57
+ .
58
+ Note that if you specified `application/json` Content-Type request header,
59
+ `params` would be encoded into JSON format.
60
+
61
+ ```ruby
62
+ describe "GET /users" do
63
+ context "with sort parameter" do
64
+ before do
65
+ params["sort"] = "id"
66
+ end
67
+
68
+ it "returns users in ID order" do
69
+ users = JSON.parse(response.body)
70
+ users[0].id.should == 1
71
+ users[1].id.should == 2
72
+ end
73
+ end
74
+ end
75
+ ```
76
+
77
+ ### variable
78
+ You can use variables in URL path like `:id`.
79
+ In this example, the returned value of `id` method is used as its real value.
80
+
81
+ ```ruby
82
+ describe "GET /users/:id" do
83
+ let(:id) do
84
+ User.create(name: "alice").id
85
+ end
86
+ it { should == 200 }
87
+ end
88
+ ```
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,5 @@
1
+ module RSpec
2
+ module RequestDescriber
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,62 @@
1
+ require "rspec/request_describer/version"
2
+
3
+ module RSpec
4
+ module RequestDescriber
5
+ RESERVED_HEADER_NAMES = %w(
6
+ Content-Type
7
+ Host
8
+ )
9
+
10
+ SUPPORTED_METHODS = %w(
11
+ GET
12
+ POST
13
+ PUT
14
+ PATCH
15
+ DELETE
16
+ )
17
+
18
+ def self.included(base)
19
+ base.instance_eval do
20
+ subject do
21
+ send method, path, request_body, env
22
+ end
23
+
24
+ let(:request_body) do
25
+ if headers["Content-Type"] == "application/json"
26
+ params.to_json
27
+ else
28
+ params
29
+ end
30
+ end
31
+
32
+ let(:headers) do
33
+ {}
34
+ end
35
+
36
+ let(:params) do
37
+ {}
38
+ end
39
+
40
+ let(:env) do
41
+ headers.inject({}) do |result, (key, value)|
42
+ key = "HTTP_" + key unless key.in?(RESERVED_HEADER_NAMES)
43
+ key = key.gsub("-", "_").upcase
44
+ result.merge(key => value)
45
+ end
46
+ end
47
+
48
+ let(:endpoint_segments) do
49
+ example.full_description.match(/(#{SUPPORTED_METHODS.join("|")}) ([\/a-z0-9_:]+)/).to_a
50
+ end
51
+
52
+ let(:method) do
53
+ endpoint_segments[1].downcase
54
+ end
55
+
56
+ let(:path) do
57
+ endpoint_segments[2].gsub(/:([^\s\/]+)/) { send($1) }
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rspec/request_describer/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rspec-request_describer"
8
+ spec.version = RSpec::RequestDescriber::VERSION
9
+ spec.authors = ["Ryo Nakamura"]
10
+ spec.email = ["r7kamura@gmail.com"]
11
+ spec.summary = "Force some rules to write self-documenting request spec."
12
+ spec.homepage = "https://github.com/r7kamura/rspec-request_describer"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.7"
21
+ spec.add_development_dependency "rake", "~> 10.0"
22
+ end
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rspec-request_describer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ryo Nakamura
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ description:
42
+ email:
43
+ - r7kamura@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - Gemfile
50
+ - LICENSE.txt
51
+ - README.md
52
+ - Rakefile
53
+ - lib/rspec/request_describer.rb
54
+ - lib/rspec/request_describer/version.rb
55
+ - rspec-request_describer.gemspec
56
+ homepage: https://github.com/r7kamura/rspec-request_describer
57
+ licenses:
58
+ - MIT
59
+ metadata: {}
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubyforge_project:
76
+ rubygems_version: 2.2.2
77
+ signing_key:
78
+ specification_version: 4
79
+ summary: Force some rules to write self-documenting request spec.
80
+ test_files: []
81
+ has_rdoc: