niessner-rspec_controller_macros 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.
- data/README +116 -0
- data/Rakefile +22 -0
- data/lib/rspec/controller_as_a_macro.rb +39 -0
- data/lib/rspec/controller_be_a_redirect_macro.rb +17 -0
- data/lib/rspec/controller_be_a_success_macro.rb +16 -0
- data/lib/rspec/controller_do_action_macro.rb +61 -0
- data/lib/rspec/controller_post_macro.rb +16 -0
- data/lib/rspec/controller_redirect_to_macro.rb +19 -0
- data/lib/rspec/controller_render_template_macro.rb +37 -0
- data/lib/rspec/user_roles.rb +29 -0
- data/lib/rspec_controller_macros.rb +16 -0
- metadata +63 -0
data/README
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
Installing
|
2
|
+
----------
|
3
|
+
1) Add:
|
4
|
+
ENV["RAILS_ENV"] = "test"
|
5
|
+
to the top of /spec/spec_helper.rb
|
6
|
+
2) Add:
|
7
|
+
config.gem "niessner-rspec_view_macros", :lib => "rspec_view_macros", :source => "http://gems.github.com"
|
8
|
+
to your environment.rb inside the Initializer.run block
|
9
|
+
|
10
|
+
Usage
|
11
|
+
----------
|
12
|
+
|
13
|
+
Registering roles
|
14
|
+
In the configure block of your spec/spec_helper.rb register roles by doing:
|
15
|
+
|
16
|
+
Rspec::UserRoles.register(:visitor) {nil}
|
17
|
+
Rspec::UserRoles.register(:user) {User.new}
|
18
|
+
Rspec::UserRoles.register(:admin) do
|
19
|
+
user = User.new
|
20
|
+
user.admin = true
|
21
|
+
user
|
22
|
+
end
|
23
|
+
|
24
|
+
Let's you write specs similar to:
|
25
|
+
|
26
|
+
describe Admin::ArticlesController do
|
27
|
+
describe "get index" do
|
28
|
+
as_a(:visitor) {it_should_redirect_to {new_session_path}}
|
29
|
+
as_a(:user) {it_should_render_template.permission_denied}
|
30
|
+
|
31
|
+
as_an :admin do
|
32
|
+
before do
|
33
|
+
@articles = [Article.new, Article.new]
|
34
|
+
stub(Article).find(:all) {@articles}
|
35
|
+
end
|
36
|
+
|
37
|
+
it_should_render_view Admin::Articles::Index
|
38
|
+
it_should_render_layout Layouts::Admin
|
39
|
+
it_should_set_rendered_view.articles.to {@articles}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "post create" do
|
44
|
+
as_a(:visitor) {it_should_redirect_to {new_session_path}}
|
45
|
+
as_a(:user) {it_should_render_template.permission_denied}
|
46
|
+
|
47
|
+
as_an :admin do
|
48
|
+
before {stub(Article).create!("title" => "Title", "body" => "Body")}
|
49
|
+
post :article => {:title => "Title", :body => "Body"}
|
50
|
+
|
51
|
+
it "should call finishing_editing" do
|
52
|
+
response.should have_text("finish_editing(null);")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "post update" do
|
58
|
+
as_a(:visitor) {it_should_redirect_to {new_session_path}}
|
59
|
+
as_a(:user) {it_should_render_template.permission_denied}
|
60
|
+
|
61
|
+
as_an :admin do
|
62
|
+
before(:each) do
|
63
|
+
article = Article.new
|
64
|
+
strong.stub(Article).find("5") {article}
|
65
|
+
strong.stub(Article).find(:all) {[]}
|
66
|
+
strong.stub(article).update_attributes!("title" => "Title", "body" => "Body")
|
67
|
+
end
|
68
|
+
|
69
|
+
post :id => 5, :article => {:title => "Title", :body => "Body"}
|
70
|
+
|
71
|
+
it "should call finishing_editing" do
|
72
|
+
response.should have_text("finish_editing(null);")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "post publish" do
|
78
|
+
as_a(:visitor) {it_should_redirect_to {new_session_path}}
|
79
|
+
as_a(:user) {it_should_render_template.permission_denied}
|
80
|
+
|
81
|
+
as_an :admin do
|
82
|
+
before(:each) do
|
83
|
+
@article = Article.new
|
84
|
+
strong.stub(@article).publish!
|
85
|
+
strong.stub(Article).find("5") {@article}
|
86
|
+
strong.stub(Article).find(:all) {[]}
|
87
|
+
end
|
88
|
+
|
89
|
+
post :id => 5
|
90
|
+
|
91
|
+
it "should publish the article" do
|
92
|
+
verify_invocation of_spy(@article).publish!
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "post destroy" do
|
98
|
+
as_a(:visitor) {it_should_redirect_to {new_session_path}}
|
99
|
+
as_a(:user) {it_should_render_template.permission_denied}
|
100
|
+
|
101
|
+
as_an :admin do
|
102
|
+
before(:each) do
|
103
|
+
@article = Article.new
|
104
|
+
strong.stub(@article).destroy
|
105
|
+
strong.stub(Article).find("5") {@article}
|
106
|
+
strong.stub(Article).find(:all) {[]}
|
107
|
+
end
|
108
|
+
|
109
|
+
post :id => 5
|
110
|
+
|
111
|
+
it "should destroy the article" do
|
112
|
+
verify_invocation of_spy(@article).destroy
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/gempackagetask'
|
4
|
+
require 'date'
|
5
|
+
|
6
|
+
spec = Gem::Specification.new do |s|
|
7
|
+
s.name = "rspec_controller_macros"
|
8
|
+
s.version = "0.0.1"
|
9
|
+
s.summary = "Some macros to make it more convenient to spec controllers."
|
10
|
+
s.files = FileList['[A-Z]*', 'lib/**/*.rb']
|
11
|
+
s.require_path = 'lib'
|
12
|
+
s.author = "Michael Niessner"
|
13
|
+
s.email = "michael@niessner.us"
|
14
|
+
s.platform = Gem::Platform::RUBY
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Generate a gemspec file"
|
18
|
+
task :gemspec do
|
19
|
+
File.open("#{spec.name}.gemspec", 'w') do |f|
|
20
|
+
f.write spec.to_ruby
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Rspec
|
2
|
+
module ControllerAsAMacro
|
3
|
+
module ExampleMethods
|
4
|
+
def login_with_user(user)
|
5
|
+
@current_user = user
|
6
|
+
stub(controller).current_user {@current_user}
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module ExampleGroupMethods
|
11
|
+
def as_a(*role_symbols, &as_a_block)
|
12
|
+
as_role(:a, *role_symbols, &as_a_block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def as_an(*role_symbols, &as_a_block)
|
16
|
+
as_role(:an, *role_symbols, &as_a_block)
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
def as_role(description_symbol, *role_symbols, &as_a_block)
|
21
|
+
role_symbols.each do |role_symbol|
|
22
|
+
describe "as #{description_symbol} #{role_symbol}" do
|
23
|
+
before do
|
24
|
+
login_with_user Rspec::UserRoles.user_with_role(role_symbol)
|
25
|
+
end
|
26
|
+
|
27
|
+
instance_eval(&as_a_block)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.included(object)
|
34
|
+
object.send :include, ExampleMethods
|
35
|
+
object.extend ExampleGroupMethods
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Rspec
|
2
|
+
module ControllerBeARedirectMacro
|
3
|
+
module ExampleGroupMethods
|
4
|
+
def it_should_be_a_redirect
|
5
|
+
it "should be a redirect" do
|
6
|
+
do_action
|
7
|
+
response.should be_redirect
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.included(object)
|
13
|
+
object.extend ExampleGroupMethods
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Rspec
|
2
|
+
module ControllerBeASuccessMacro
|
3
|
+
module ExampleGroupMethods
|
4
|
+
def it_should_be_a_success
|
5
|
+
it "should be a success" do
|
6
|
+
do_action
|
7
|
+
response.should be_success
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.included(object)
|
13
|
+
object.extend ExampleGroupMethods
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Rspec
|
2
|
+
module ControllerDoActionMacro
|
3
|
+
module ExampleMethods
|
4
|
+
def described_action
|
5
|
+
self.class.description_parts[1].split(" ")
|
6
|
+
end
|
7
|
+
|
8
|
+
def set_post_parameters_to(hash)
|
9
|
+
set_action_parameters(hash)
|
10
|
+
end
|
11
|
+
|
12
|
+
def set_get_parameters_to(hash)
|
13
|
+
set_action_parameters(hash)
|
14
|
+
end
|
15
|
+
|
16
|
+
def set_put_parameters_to(hash)
|
17
|
+
set_action_parameters(hash)
|
18
|
+
end
|
19
|
+
|
20
|
+
def set_delete_parameters_to(hash)
|
21
|
+
set_action_parameters(hash)
|
22
|
+
end
|
23
|
+
|
24
|
+
def set_action_parameters(hash)
|
25
|
+
@action_parameters = hash
|
26
|
+
end
|
27
|
+
|
28
|
+
def action_parameters(hash=nil)
|
29
|
+
hash || @action_parameters
|
30
|
+
end
|
31
|
+
|
32
|
+
def do_post(hash=nil)
|
33
|
+
do_action(hash)
|
34
|
+
end
|
35
|
+
|
36
|
+
def do_get(hash=nil)
|
37
|
+
do_action(hash)
|
38
|
+
end
|
39
|
+
|
40
|
+
def do_put(hash=nil)
|
41
|
+
do_action(hash)
|
42
|
+
end
|
43
|
+
|
44
|
+
def do_delete(hash=nil)
|
45
|
+
do_action(hash)
|
46
|
+
end
|
47
|
+
|
48
|
+
def do_action(hash=nil)
|
49
|
+
send_parameters = described_action
|
50
|
+
send_parameters = send_parameters + [action_parameters(hash)] if action_parameters(hash).not.nil?
|
51
|
+
self.send(*send_parameters)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.included(receiver)
|
56
|
+
receiver.send :include, ExampleMethods
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Rspec
|
2
|
+
module ControllerPostMacro
|
3
|
+
module ExampleGroupMethods
|
4
|
+
def post(hash)
|
5
|
+
before do
|
6
|
+
set_post_parameters_to(hash)
|
7
|
+
do_action
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.included(object)
|
13
|
+
object.extend ExampleGroupMethods
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Rspec
|
2
|
+
module ControllerRedirectToMacro
|
3
|
+
module ExampleGroupMethods
|
4
|
+
def it_should_redirect_to(&block)
|
5
|
+
it "should redirect to " do
|
6
|
+
do_action
|
7
|
+
path = self.instance_eval(&block)
|
8
|
+
new_description = instance_variable_get("@_defined_description") + path.to_s
|
9
|
+
instance_variable_set("@_defined_description", new_description)
|
10
|
+
response.should redirect_to(path)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.included(object)
|
16
|
+
object.extend ExampleGroupMethods
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Rspec
|
2
|
+
module ControllerRenderTemplateMacro
|
3
|
+
module ExampleGroupMethods
|
4
|
+
class RenderTemplateProxy < BlankSlate
|
5
|
+
def initialize(example_group)
|
6
|
+
@example_group = example_group
|
7
|
+
end
|
8
|
+
|
9
|
+
def permission_denied
|
10
|
+
@example_group.it_should_render_template_with_template_string("app/views/shared/permission_denied.html.erb")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def it_should_render_template(template_string=nil)
|
15
|
+
if template_string.nil?
|
16
|
+
RenderTemplateProxy.new(self)
|
17
|
+
else
|
18
|
+
it_should_render_template_with_template_string(template_string)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def it_should_render_template_with_template_string(template_string)
|
23
|
+
it "should render template #{template_string}" do
|
24
|
+
do_action
|
25
|
+
response.should render_template(template_string)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.included(object)
|
31
|
+
object.extend ExampleGroupMethods
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Rspec
|
2
|
+
class UserRoles
|
3
|
+
include Singleton
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def register(role, &block)
|
7
|
+
instance.register(role, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
def user_with_role(role)
|
11
|
+
instance.user_with_role(role)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def register(role, &block)
|
16
|
+
roles[role] = block
|
17
|
+
end
|
18
|
+
|
19
|
+
def user_with_role(role)
|
20
|
+
raise "Role not found" if roles[role].nil?
|
21
|
+
roles[role].call
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
def roles
|
26
|
+
@roles ||= Hash.new
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
ActionController::Base.send(:include, ViewObjects::ActionControllerEnhancements)
|
2
|
+
|
3
|
+
if ENV["RAILS_ENV"] == "test"
|
4
|
+
require 'spec'
|
5
|
+
require 'spec/rails'
|
6
|
+
|
7
|
+
Spec::Runner.configure do |config|
|
8
|
+
config.include(Rspec::ControllerAsAMacro, :type => :controllers)
|
9
|
+
config.include(Rspec::ControllerDoActionMacro, :type => :controllers)
|
10
|
+
config.include(Rspec::ControllerBeASuccessMacro, :type => :controllers)
|
11
|
+
config.include(Rspec::ControllerBeARedirectMacro, :type => :controllers)
|
12
|
+
config.include(Rspec::ControllerRenderTemplateMacro, :type => :controllers)
|
13
|
+
config.include(Rspec::ControllerRedirectToMacro, :type => :controllers)
|
14
|
+
config.include(Rspec::ControllerPostMacro, :type => :controllers)
|
15
|
+
end
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: niessner-rspec_controller_macros
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Michael Niessner
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-11-10 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: michael@niessner.us
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- Rakefile
|
26
|
+
- README
|
27
|
+
- lib/rspec_controller_macros.rb
|
28
|
+
- lib/rspec/controller_as_a_macro.rb
|
29
|
+
- lib/rspec/controller_be_a_redirect_macro.rb
|
30
|
+
- lib/rspec/controller_be_a_success_macro.rb
|
31
|
+
- lib/rspec/controller_do_action_macro.rb
|
32
|
+
- lib/rspec/controller_post_macro.rb
|
33
|
+
- lib/rspec/controller_redirect_to_macro.rb
|
34
|
+
- lib/rspec/controller_render_template_macro.rb
|
35
|
+
- lib/rspec/user_roles.rb
|
36
|
+
has_rdoc: false
|
37
|
+
homepage:
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options: []
|
40
|
+
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: "0"
|
48
|
+
version:
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
55
|
+
requirements: []
|
56
|
+
|
57
|
+
rubyforge_project:
|
58
|
+
rubygems_version: 1.2.0
|
59
|
+
signing_key:
|
60
|
+
specification_version: 2
|
61
|
+
summary: Some macros to make it more convenient to spec controllers.
|
62
|
+
test_files: []
|
63
|
+
|