test_unit_pundit 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .ruby-gemset
3
+ .ruby-version
4
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # Test Unit Pundit
2
+
3
+ Adds rake test sub task.
4
+
5
+ ``` sh
6
+ rake test:policies
7
+ ```
8
+
9
+ Extends pundit generators.
10
+
11
+ Provides some test helpers.
12
+
13
+
14
+ ## Installation
15
+
16
+ ``` ruby
17
+ gem 'test_unit_pundit'
18
+ ```
19
+
20
+ ## Test
21
+
22
+ Put your policy test in `test/policies`:
23
+
24
+ ``` ruby
25
+ require 'test_helper'
26
+
27
+ class PostPolicyTest < Pundit::TestCase
28
+ test "update? should deny access if post is published" do
29
+ assert_forbidden User.new(admin: false), Post.new(published: true), :update?
30
+ end
31
+
32
+ test "update? should grant access if post is published and user is an admin" do
33
+ assert_permitted User.new(admin: true), Post.new(published: true), :update?
34
+ end
35
+
36
+ test "update? should grant access if post is unpublished" do
37
+ assert_permitted User.new(admin: false), Post.new(published: false), :update?
38
+ end
39
+ end
40
+ ```
41
+
42
+ *Note: test:policies can't run until original test tasks don't have error or failture, when running `rake test`. Now you should run `rake test:policies` to test policies.*
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ t.pattern = 'test/*_test.rb'
6
+ end
7
+
8
+ desc "Run tests"
9
+ task default: :test
@@ -0,0 +1,9 @@
1
+ module Pundit
2
+ module Generators
3
+ class InstallGenerator < ::Rails::Generators::Base
4
+ def create_test_folder
5
+ empty_directory('test/policies')
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Pundit
2
+ module Generators
3
+ class PolicyGenerator < ::Rails::Generators::NamedBase
4
+ def create_policy_test_file
5
+ template File.join(File.dirname(__FILE__), 'templates/policy_test.rb'), File.join('test/policies', class_path, "#{file_name}_policy_test.rb")
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ require 'test_helper'
2
+
3
+ <% module_namespacing do -%>
4
+ class <%= class_name %>PolicyTest < Pundit::TestCase
5
+ # test "update? should deny access if post is published" do
6
+ # assert_forbidden User.new(admin: false), Post.new(published: true), :update?
7
+ # end
8
+
9
+ # test "update? should grant access if post is published and user is an admin" do
10
+ # assert_permitted User.new(admin: true), Post.new(published: true), :update?
11
+ # end
12
+
13
+ # test "update? should grant access if post is unpublished" do
14
+ # assert_permitted User.new(admin: false), Post.new(published: false), :update?
15
+ # end
16
+ end
17
+ <% end -%>
@@ -0,0 +1,8 @@
1
+ require 'active_support/test_case'
2
+ require 'pundit/testing/assertions'
3
+
4
+ module Pundit
5
+ class TestCase < ::ActiveSupport::TestCase
6
+ include Pundit::Testing::Assertions
7
+ end
8
+ end
@@ -0,0 +1,21 @@
1
+ module Pundit
2
+ module Testing
3
+ module Assertions
4
+ def assert_permitted(user, record, query, message = nil)
5
+ message ||= "Expected to grant #{query} on #{record} but it didn't"
6
+ assert run_authorization(user, record, query), message
7
+ end
8
+
9
+ def assert_forbidden(user, record, query, message = nil)
10
+ message ||= "Expected not to grant #{query} on #{record} but it did"
11
+ assert !run_authorization(user, record, query), message
12
+ end
13
+
14
+ private
15
+
16
+ def run_authorization(user, record, query)
17
+ self.class.to_s.gsub(/Test/, '').constantize.new(user, record).public_send(query)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,10 @@
1
+ namespace :test do
2
+
3
+ Rails::SubTestTask.new(policies: 'test:prepare') do |t|
4
+ t.libs << 'test'
5
+ t.pattern = 'test/policies/**/*_test.rb'
6
+ end
7
+
8
+ end
9
+
10
+ Rake::Task[:test].enhance { Rake::Task['test:policies'].invoke }
@@ -0,0 +1,14 @@
1
+ require 'rails'
2
+
3
+ module TestUnitPundit
4
+ class Railtie < ::Rails::Railtie
5
+ generators do
6
+ load File.join(File.expand_path("../../generators/test_unit_pundit/install", __FILE__), "install_generator.rb")
7
+ load File.join(File.expand_path("../../generators/test_unit_pundit/policy", __FILE__), "policy_generator.rb")
8
+ end
9
+
10
+ rake_tasks do
11
+ load File.join(File.expand_path("../../tasks", __FILE__), "testing.rake")
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,2 @@
1
+ require 'test_unit_pundit/railtie'
2
+ require 'pundit/test_case'
@@ -0,0 +1,67 @@
1
+ require 'pundit/test_case'
2
+
3
+ require 'minitest/unit'
4
+ require 'minitest/autorun'
5
+ require 'minitest/pride'
6
+
7
+ class AssertPermittedTest < Pundit::TestCase
8
+ def test_assert_permitted_true
9
+ assert_permitted User.new(true), Post.new, :update?
10
+ end
11
+
12
+ def test_assert_permitted_false
13
+ begin
14
+ assert_permitted User.new(false), Post.new, :update?
15
+ fail 'should not get to here'
16
+ rescue Exception => e
17
+ assert_match(/Expected to grant/, e.message)
18
+ end
19
+ end
20
+ end
21
+
22
+ class AssertForbiddenTest < Pundit::TestCase
23
+ def test_assert_forbidden_true
24
+ assert_forbidden User.new(false), Post.new, :update?
25
+ end
26
+
27
+ def test_assert_forbidden_false
28
+ begin
29
+ assert_forbidden User.new(true), Post.new, :update?
30
+ fail 'should not get to here'
31
+ rescue Exception => e
32
+ assert_match(/Expected not to grant/, e.message)
33
+ end
34
+ end
35
+ end
36
+
37
+
38
+
39
+ class User
40
+ attr_accessor :admin
41
+
42
+ def initialize(admin)
43
+ @admin = admin
44
+ end
45
+ end
46
+
47
+ class Post
48
+ end
49
+
50
+ class Policy
51
+ attr_reader :user, :record
52
+
53
+ def initialize(user, record)
54
+ @user = user
55
+ @record = record
56
+ end
57
+
58
+ def update?
59
+ return true if user.admin
60
+ end
61
+ end
62
+
63
+ class AssertPermitted < Policy
64
+ end
65
+
66
+ class AssertForbidden < Policy
67
+ end
@@ -0,0 +1,24 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'test_unit_pundit'
3
+ s.version = '0.1.1'
4
+ s.summary = 'Test::Unit support for Pundit'
5
+ s.description = 'Test::Unit support for Pundit'
6
+ s.homepage = 'https://github.com/cqc1008/test_unit_pundit'
7
+
8
+ s.rubyforge_project = 'test_unit_pundit'
9
+ s.authors = ['Tony Cao']
10
+ s.email = ['fm1008rr@sina.com']
11
+ s.license = 'MIT'
12
+
13
+ s.files = `git ls-files`.split($/)
14
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
15
+ s.require_paths = ["lib"]
16
+
17
+ s.add_dependency 'activesupport', '>= 3.0.0'
18
+ s.add_dependency 'railties', '>= 3.0.0'
19
+ s.add_dependency 'pundit', '~> 0.2.3'
20
+
21
+ s.add_development_dependency 'activesupport', '4.1.0'
22
+ s.add_development_dependency 'railties', '4.1.0'
23
+ s.add_development_dependency 'minitest', '5.3.2'
24
+ end
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: test_unit_pundit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Tony Cao
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-04-14 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 3.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 3.0.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: railties
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 3.0.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 3.0.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: pundit
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 0.2.3
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.2.3
62
+ - !ruby/object:Gem::Dependency
63
+ name: activesupport
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - '='
68
+ - !ruby/object:Gem::Version
69
+ version: 4.1.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - '='
76
+ - !ruby/object:Gem::Version
77
+ version: 4.1.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: railties
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - '='
84
+ - !ruby/object:Gem::Version
85
+ version: 4.1.0
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - '='
92
+ - !ruby/object:Gem::Version
93
+ version: 4.1.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: minitest
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - '='
100
+ - !ruby/object:Gem::Version
101
+ version: 5.3.2
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - '='
108
+ - !ruby/object:Gem::Version
109
+ version: 5.3.2
110
+ description: Test::Unit support for Pundit
111
+ email:
112
+ - fm1008rr@sina.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .gitignore
118
+ - Gemfile
119
+ - README.md
120
+ - Rakefile
121
+ - lib/generators/test_unit_pundit/install/install_generator.rb
122
+ - lib/generators/test_unit_pundit/policy/policy_generator.rb
123
+ - lib/generators/test_unit_pundit/policy/templates/policy_test.rb
124
+ - lib/pundit/test_case.rb
125
+ - lib/pundit/testing/assertions.rb
126
+ - lib/tasks/testing.rake
127
+ - lib/test_unit_pundit.rb
128
+ - lib/test_unit_pundit/railtie.rb
129
+ - test/test_case_test.rb
130
+ - test_unit_pundit.gemspec
131
+ homepage: https://github.com/cqc1008/test_unit_pundit
132
+ licenses:
133
+ - MIT
134
+ post_install_message:
135
+ rdoc_options: []
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ none: false
140
+ requirements:
141
+ - - ! '>='
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ required_rubygems_version: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ requirements: []
151
+ rubyforge_project: test_unit_pundit
152
+ rubygems_version: 1.8.24
153
+ signing_key:
154
+ specification_version: 3
155
+ summary: Test::Unit support for Pundit
156
+ test_files:
157
+ - test/test_case_test.rb