aygabtu 0.2.0
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 +7 -0
- data/.gitignore +24 -0
- data/.travis.yml +10 -0
- data/CHANGELOG.md +10 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +22 -0
- data/README.md +245 -0
- data/Rakefile +10 -0
- data/aygabtu.gemspec +23 -0
- data/lib/aygabtu.rb +5 -0
- data/lib/aygabtu/generator.rb +64 -0
- data/lib/aygabtu/handle.rb +38 -0
- data/lib/aygabtu/point_of_call.rb +28 -0
- data/lib/aygabtu/route_mark.rb +18 -0
- data/lib/aygabtu/route_wrapper.rb +96 -0
- data/lib/aygabtu/rspec.rb +119 -0
- data/lib/aygabtu/scope/action.rb +38 -0
- data/lib/aygabtu/scope/base.rb +85 -0
- data/lib/aygabtu/scope/named.rb +38 -0
- data/lib/aygabtu/scope/namespace_controller.rb +50 -0
- data/lib/aygabtu/scope/remaining.rb +27 -0
- data/lib/aygabtu/scope/requiring.rb +26 -0
- data/lib/aygabtu/scope/static_dynamic.rb +33 -0
- data/lib/aygabtu/scope/visiting_with.rb +19 -0
- data/lib/aygabtu/scope_actor.rb +104 -0
- data/lib/aygabtu/scope_chain.rb +39 -0
- data/lib/aygabtu/version.rb +3 -0
- data/spec/actions_spec.rb +152 -0
- data/spec/example_spec.rb +61 -0
- data/spec/lib/route_wrapper_spec.rb +140 -0
- data/spec/matching_routes_spec.rb +384 -0
- data/spec/nesting_spec.rb +59 -0
- data/spec/rails_application_helper.rb +8 -0
- data/spec/support/aygabtu_sees_routes.rb +17 -0
- data/spec/support/identifies_routes.rb +18 -0
- data/spec/support/invokes_rspec.rb +93 -0
- data/spec/support/matcher_shims.rb +39 -0
- data/spec/support_spec/identifies_routes_spec.rb +49 -0
- data/spec/visiting_routes_spec.rb +57 -0
- metadata +123 -0
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'rails_application_helper'
|
2
|
+
|
3
|
+
require 'aygabtu/rspec'
|
4
|
+
|
5
|
+
require 'support/aygabtu_sees_routes'
|
6
|
+
|
7
|
+
describe "nesting and chaining scopes" do
|
8
|
+
extend AygabtuSeesRoutes
|
9
|
+
|
10
|
+
include Aygabtu::RSpec.example_group_module
|
11
|
+
|
12
|
+
aygabtu_sees_routes do
|
13
|
+
scope module: :namespace do
|
14
|
+
get 'for_action1', to: 'bogus#action1'
|
15
|
+
get 'for_action2', to: 'bogus#action2'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "asserting the right route is being visited" do
|
20
|
+
before do
|
21
|
+
@spy = double
|
22
|
+
expect(@spy).to receive(:visit).with(be_path_for_this_route)
|
23
|
+
end
|
24
|
+
attr_reader :spy
|
25
|
+
|
26
|
+
def visit(path)
|
27
|
+
spy.visit(path)
|
28
|
+
end
|
29
|
+
|
30
|
+
def aygabtu_assertions
|
31
|
+
end
|
32
|
+
|
33
|
+
context "visiting one route" do
|
34
|
+
def be_path_for_this_route
|
35
|
+
include('for_action1')
|
36
|
+
end
|
37
|
+
|
38
|
+
namespace(:namespace) do
|
39
|
+
action(:action1).visit
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "visiting another route" do
|
44
|
+
def be_path_for_this_route
|
45
|
+
include('for_action2')
|
46
|
+
end
|
47
|
+
|
48
|
+
namespace(:namespace).action(:action2).visit
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
remaining do
|
53
|
+
# sanity check.
|
54
|
+
it "has covered routes and thus created two examples" do
|
55
|
+
expect(self.class.aygabtu_matching_routes).to be_empty
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'support/identifies_routes'
|
2
|
+
|
3
|
+
module AygabtuSeesRoutes
|
4
|
+
def aygabtu_sees_routes(&block)
|
5
|
+
engine = Class.new(Rails::Engine)
|
6
|
+
engine.instance.routes.draw do
|
7
|
+
# Rails evaluates the block given inside the context of
|
8
|
+
# some routing related object. Since we do not want to repeat
|
9
|
+
# the following line every time this method is called,
|
10
|
+
# we need to to this instance_eval trick.
|
11
|
+
extend IdentifiesRoutes
|
12
|
+
instance_eval(&Proc.new)
|
13
|
+
end
|
14
|
+
aygabtu_handle.send(:rails_application_routes=, engine.routes)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module IdentifiesRoutes
|
2
|
+
def identified_by(identifier)
|
3
|
+
{ defaults: { route_identifier: identifier } }
|
4
|
+
end
|
5
|
+
|
6
|
+
def be_identified_by(identifier)
|
7
|
+
satisfy { |rw| rw.journey_route.defaults[:route_identifier] == identifier }
|
8
|
+
end
|
9
|
+
|
10
|
+
def route_identified_by(identifier, all_routes = all_routes)
|
11
|
+
identified_routes = all_routes.select do |rw|
|
12
|
+
rw.journey_route.defaults[:route_identifier] == identifier
|
13
|
+
end
|
14
|
+
expect(identified_routes.length).to be == 1
|
15
|
+
identified_routes.first
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module InvokesRspec
|
5
|
+
private
|
6
|
+
|
7
|
+
def rspec_result(specfile = nil)
|
8
|
+
specfile ||= prepare_specfile
|
9
|
+
|
10
|
+
arglist = ['rspec', '--format', 'json', specfile.to_s]
|
11
|
+
output = `#{arglist.shelljoin}`
|
12
|
+
raise "rspec gave no output, file not found?, syntax error in spec file? excption outside example?" if output.empty?
|
13
|
+
|
14
|
+
# rspec-rails 2.99 pollutes STDOUT with a deprecation warning. Work around that.
|
15
|
+
# This workaround assumes the warning does not contain a '{', while the JSON starts with it
|
16
|
+
output = output[%r{\A[^\{]*(.*)}m, 1]
|
17
|
+
|
18
|
+
_convert_raw_rspec_result(JSON.parse(output))
|
19
|
+
end
|
20
|
+
|
21
|
+
def prepare_specfile
|
22
|
+
path = Pathname(__FILE__).dirname.join('../../_generated_spec.rb')
|
23
|
+
path.open('w') do |file|
|
24
|
+
file << rspec_file_content
|
25
|
+
end
|
26
|
+
|
27
|
+
root_path = Pathname(__FILE__).parent.parent.parent
|
28
|
+
|
29
|
+
path.relative_path_from(root_path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def _convert_raw_rspec_result(json)
|
33
|
+
examples = json['examples'].map { |raw| Example.new(raw) }
|
34
|
+
RSpecResult.new(json, examples)
|
35
|
+
end
|
36
|
+
|
37
|
+
RSpecResult = Struct.new(:original_json, :examples)
|
38
|
+
|
39
|
+
class Example
|
40
|
+
attr_reader :raw
|
41
|
+
|
42
|
+
def initialize(raw)
|
43
|
+
@raw = raw
|
44
|
+
end
|
45
|
+
|
46
|
+
def full_description
|
47
|
+
raw['full_description']
|
48
|
+
end
|
49
|
+
|
50
|
+
def line_number
|
51
|
+
raw['line_number']
|
52
|
+
end
|
53
|
+
|
54
|
+
def status
|
55
|
+
raw['status'].to_sym
|
56
|
+
end
|
57
|
+
|
58
|
+
def passed?
|
59
|
+
status == :passed
|
60
|
+
end
|
61
|
+
|
62
|
+
def pending?
|
63
|
+
status == :pending
|
64
|
+
end
|
65
|
+
|
66
|
+
def failed?
|
67
|
+
status == :failed
|
68
|
+
end
|
69
|
+
|
70
|
+
def exception_message
|
71
|
+
raw.fetch('exception').fetch('message')
|
72
|
+
end
|
73
|
+
|
74
|
+
def payload
|
75
|
+
Marshal.load(exception_message)
|
76
|
+
end
|
77
|
+
|
78
|
+
def inspect
|
79
|
+
hash = {
|
80
|
+
line: line_number,
|
81
|
+
status: status
|
82
|
+
}
|
83
|
+
hash[:exception_message] = exception_message if failed?
|
84
|
+
|
85
|
+
segments = [
|
86
|
+
'Example',
|
87
|
+
*hash.map { |key, value| "#{key}: #{value.inspect}" }
|
88
|
+
]
|
89
|
+
segments.join(' ')
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module MatcherShims
|
2
|
+
def contain_exactly(*objects_or_matchers)
|
3
|
+
return super if defined?(super)
|
4
|
+
|
5
|
+
satisfy do |actual|
|
6
|
+
next false unless actual.length == objects_or_matchers.length
|
7
|
+
|
8
|
+
objects_or_matchers.permutation.any? do |permutation|
|
9
|
+
permutation.zip(actual).all? do |object_or_matcher, actual_item|
|
10
|
+
if object_or_matcher.respond_to?(:matches?)
|
11
|
+
object_or_matcher.matches?(actual_item)
|
12
|
+
else
|
13
|
+
object_or_matcher == actual_item
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def all(matcher)
|
21
|
+
return super if defined?(super)
|
22
|
+
|
23
|
+
satisfy do |collection|
|
24
|
+
collection.all? { |item| matcher.matches?(item) }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module And
|
29
|
+
def and(another_matcher)
|
30
|
+
return super if defined?(super)
|
31
|
+
|
32
|
+
RSpec::Matchers::BuiltIn::Satisfy.new do |actual|
|
33
|
+
matches?(actual) && another_matcher.matches?(actual)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
RSpec::Matchers::BuiltIn::BaseMatcher.send :include, MatcherShims::And
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'rails_application_helper'
|
2
|
+
|
3
|
+
require 'aygabtu/rspec'
|
4
|
+
|
5
|
+
require 'support/identifies_routes'
|
6
|
+
require 'support/aygabtu_sees_routes'
|
7
|
+
require 'support/matcher_shims'
|
8
|
+
|
9
|
+
describe "test mechanism for identifying routes independently of controller, name and action" do
|
10
|
+
extend AygabtuSeesRoutes
|
11
|
+
|
12
|
+
include Aygabtu::RSpec.example_group_module
|
13
|
+
|
14
|
+
aygabtu_sees_routes do
|
15
|
+
get 'bogus', identified_by(:an_identifier).merge(to: 'bogus#action1')
|
16
|
+
get 'bogus', identified_by(:another_identifier).merge(to: 'bogus#action2')
|
17
|
+
end
|
18
|
+
|
19
|
+
include IdentifiesRoutes
|
20
|
+
include MatcherShims
|
21
|
+
|
22
|
+
describe "route_identified_by" do
|
23
|
+
it "returns the correct route" do
|
24
|
+
expect(route_identified_by(:an_identifier).action).to be == 'action1'
|
25
|
+
expect(route_identified_by(:another_identifier).action).to be == 'action2'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "be_identified_by" do
|
30
|
+
it "works inside our matcher" do
|
31
|
+
expect(all_routes).to contain_exactly(
|
32
|
+
be_identified_by(:an_identifier),
|
33
|
+
be_identified_by(:another_identifier)
|
34
|
+
)
|
35
|
+
|
36
|
+
# assert difference is really taken into account
|
37
|
+
expect(all_routes).not_to contain_exactly(
|
38
|
+
be_identified_by(:an_identifier),
|
39
|
+
be_identified_by(:an_identifier)
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# interface expected by IdentifiesRoutes
|
45
|
+
def all_routes
|
46
|
+
self.class.aygabtu_matching_routes
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'rails_application_helper'
|
2
|
+
|
3
|
+
require 'aygabtu/rspec'
|
4
|
+
|
5
|
+
require 'support/aygabtu_sees_routes'
|
6
|
+
require 'support/identifies_routes'
|
7
|
+
|
8
|
+
describe "path construction when visiting a route", type: :feature do
|
9
|
+
extend AygabtuSeesRoutes
|
10
|
+
|
11
|
+
include Aygabtu::RSpec.example_group_module
|
12
|
+
|
13
|
+
aygabtu_sees_routes do
|
14
|
+
get 'bogus', to: 'bogus#route_without'
|
15
|
+
get 'bogus/:segment1', to: 'bogus#route_with'
|
16
|
+
get 'bogus/:segment1/:segment2', to: 'bogus#route_with_two'
|
17
|
+
end
|
18
|
+
|
19
|
+
def assert_path(path)
|
20
|
+
# The fact that the path has already been formed means
|
21
|
+
# that the router accepted the route arguments, so no segment
|
22
|
+
# can be missing.
|
23
|
+
# We just asssert here that no excess parameters have been passed.
|
24
|
+
expect(path).not_to include('?')
|
25
|
+
end
|
26
|
+
|
27
|
+
def visit(path)
|
28
|
+
assert_path path
|
29
|
+
end
|
30
|
+
|
31
|
+
def aygabtu_assertions
|
32
|
+
end
|
33
|
+
|
34
|
+
action(:route_without).visit
|
35
|
+
context "with an additional parameter" do
|
36
|
+
def assert_path(path)
|
37
|
+
expect(URI.parse(path).query).to be == "additional_parameter=bogus"
|
38
|
+
end
|
39
|
+
|
40
|
+
action(:route_without).visit_with(additional_parameter: "bogus")
|
41
|
+
end
|
42
|
+
|
43
|
+
action(:route_with).visit_with(segment1: "bogus")
|
44
|
+
action(:route_with).visiting_with(segment1: "bogus") do
|
45
|
+
visit
|
46
|
+
end
|
47
|
+
|
48
|
+
action(:route_with) do
|
49
|
+
visit_with(segment1: "bogus")
|
50
|
+
end
|
51
|
+
|
52
|
+
action(:route_with_two).visit_with(segment1: "bogus", segment2: "bogus")
|
53
|
+
action(:route_with_two).visiting_with(segment1: "bogus") do
|
54
|
+
visit_with(segment2: "bogus")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: aygabtu
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Thomas Stratmann
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-04-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec-rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: capybara
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: Feature test generator for GET requests, using Capybara and RSpec
|
42
|
+
email:
|
43
|
+
- thomas.stratmann@9elements.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- ".gitignore"
|
49
|
+
- ".travis.yml"
|
50
|
+
- CHANGELOG.md
|
51
|
+
- Gemfile
|
52
|
+
- LICENSE.txt
|
53
|
+
- README.md
|
54
|
+
- Rakefile
|
55
|
+
- aygabtu.gemspec
|
56
|
+
- lib/aygabtu.rb
|
57
|
+
- lib/aygabtu/generator.rb
|
58
|
+
- lib/aygabtu/handle.rb
|
59
|
+
- lib/aygabtu/point_of_call.rb
|
60
|
+
- lib/aygabtu/route_mark.rb
|
61
|
+
- lib/aygabtu/route_wrapper.rb
|
62
|
+
- lib/aygabtu/rspec.rb
|
63
|
+
- lib/aygabtu/scope/action.rb
|
64
|
+
- lib/aygabtu/scope/base.rb
|
65
|
+
- lib/aygabtu/scope/named.rb
|
66
|
+
- lib/aygabtu/scope/namespace_controller.rb
|
67
|
+
- lib/aygabtu/scope/remaining.rb
|
68
|
+
- lib/aygabtu/scope/requiring.rb
|
69
|
+
- lib/aygabtu/scope/static_dynamic.rb
|
70
|
+
- lib/aygabtu/scope/visiting_with.rb
|
71
|
+
- lib/aygabtu/scope_actor.rb
|
72
|
+
- lib/aygabtu/scope_chain.rb
|
73
|
+
- lib/aygabtu/version.rb
|
74
|
+
- spec/actions_spec.rb
|
75
|
+
- spec/example_spec.rb
|
76
|
+
- spec/lib/route_wrapper_spec.rb
|
77
|
+
- spec/matching_routes_spec.rb
|
78
|
+
- spec/nesting_spec.rb
|
79
|
+
- spec/rails_application_helper.rb
|
80
|
+
- spec/support/aygabtu_sees_routes.rb
|
81
|
+
- spec/support/identifies_routes.rb
|
82
|
+
- spec/support/invokes_rspec.rb
|
83
|
+
- spec/support/matcher_shims.rb
|
84
|
+
- spec/support_spec/identifies_routes_spec.rb
|
85
|
+
- spec/visiting_routes_spec.rb
|
86
|
+
homepage: ''
|
87
|
+
licenses:
|
88
|
+
- MIT
|
89
|
+
metadata: {}
|
90
|
+
post_install_message:
|
91
|
+
rdoc_options: []
|
92
|
+
require_paths:
|
93
|
+
- lib
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
requirements: []
|
105
|
+
rubyforge_project:
|
106
|
+
rubygems_version: 2.2.2
|
107
|
+
signing_key:
|
108
|
+
specification_version: 4
|
109
|
+
summary: Feature test generator for GET requests
|
110
|
+
test_files:
|
111
|
+
- spec/actions_spec.rb
|
112
|
+
- spec/example_spec.rb
|
113
|
+
- spec/lib/route_wrapper_spec.rb
|
114
|
+
- spec/matching_routes_spec.rb
|
115
|
+
- spec/nesting_spec.rb
|
116
|
+
- spec/rails_application_helper.rb
|
117
|
+
- spec/support/aygabtu_sees_routes.rb
|
118
|
+
- spec/support/identifies_routes.rb
|
119
|
+
- spec/support/invokes_rspec.rb
|
120
|
+
- spec/support/matcher_shims.rb
|
121
|
+
- spec/support_spec/identifies_routes_spec.rb
|
122
|
+
- spec/visiting_routes_spec.rb
|
123
|
+
has_rdoc:
|