token_attribute 0.1.0 → 0.1.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/.rspec +2 -0
- data/README.md +1 -1
- data/RELEASE_NOTE.md +4 -0
- data/Rakefile +3 -9
- data/lib/token_attribute/version.rb +1 -1
- data/spec/lib/token_attribute_spec.rb +135 -0
- data/{test/test_helper.rb → spec/spec_helper.rb} +10 -6
- data/token_attribute.gemspec +2 -4
- metadata +8 -55
- data/test/lib/token_attribute_test.rb +0 -110
data/.rspec
ADDED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# token_attribute [<img src="https://secure.travis-ci.org/fujimura/token_attribute.png"/>](http://travis-ci.org/fujimura/token_attribute)
|
1
|
+
# token_attribute [<img src="https://secure.travis-ci.org/fujimura/token_attribute.png"/>](http://travis-ci.org/fujimura/token_attribute)[](https://codeclimate.com/github/fujimura/token_attribute)
|
2
2
|
|
3
3
|
Small macro to define unique random token generator for ActiveRecord.
|
4
4
|
|
data/RELEASE_NOTE.md
CHANGED
data/Rakefile
CHANGED
@@ -1,13 +1,7 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
-
require 'rake/testtask'
|
3
2
|
|
4
|
-
|
5
|
-
task :default => [ :test ]
|
3
|
+
require 'rspec/core/rake_task'
|
6
4
|
|
7
|
-
|
8
|
-
Rake::TestTask.new { |t|
|
9
|
-
t.libs << "test"
|
10
|
-
t.pattern = 'test/**/*_test.rb'
|
11
|
-
t.warning = true
|
12
|
-
}
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
13
6
|
|
7
|
+
task :default => :spec
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TokenAttribute do
|
4
|
+
|
5
|
+
before do
|
6
|
+
User.new # OMG
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
describe '.token_attribute' do
|
11
|
+
context 'given multiple attributes' do
|
12
|
+
subject do
|
13
|
+
define_new_class_instance_for User do
|
14
|
+
include TokenAttribute
|
15
|
+
token_attribute :download_ticket, :password_recovery
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'can token_attribute-ize multiple attributes' do
|
20
|
+
[:download_ticket, :password_recovery].each do |a|
|
21
|
+
method_name = ('set_' + a.to_s).to_sym
|
22
|
+
subject.new.methods.map(&:to_sym).should include method_name
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'with :protected => true' do
|
28
|
+
subject do
|
29
|
+
define_new_class_instance_for User do
|
30
|
+
include TokenAttribute
|
31
|
+
token_attribute :download_ticket, :protected => true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should protect attribute' do
|
36
|
+
subject.protected_attributes.should include :download_ticket
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'with scope' do
|
41
|
+
subject do
|
42
|
+
define_new_class_instance_for User do
|
43
|
+
include TokenAttribute
|
44
|
+
token_attribute :download_ticket, :scope => :name
|
45
|
+
before_save :set_download_ticket
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'assign token attribute with given scope' do
|
50
|
+
one = subject.new :name => 'fujimura'
|
51
|
+
two = subject.new :name => 'tanaka'
|
52
|
+
[one, two].each {|u| u.stub(:generate_download_ticket).and_return 'a' }
|
53
|
+
[one, two].each {|u| u.save }
|
54
|
+
one.download_ticket.should == two.download_ticket
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe 'Token length' do
|
59
|
+
context 'default' do
|
60
|
+
subject do
|
61
|
+
define_new_class_instance_for User do
|
62
|
+
include TokenAttribute
|
63
|
+
token_attribute :download_ticket
|
64
|
+
before_save :set_download_ticket
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
specify do
|
69
|
+
one = subject.new :name => 'fujimura'
|
70
|
+
one.save
|
71
|
+
one.download_ticket.length.should == 10
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'set to 8' do
|
76
|
+
subject do
|
77
|
+
define_new_class_instance_for User do
|
78
|
+
include TokenAttribute
|
79
|
+
token_attribute :download_ticket, :length => 8
|
80
|
+
before_save :set_download_ticket
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
specify do
|
85
|
+
one = subject.new :name => 'fujimura'
|
86
|
+
one.save
|
87
|
+
one.download_ticket.length.should == 8
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'class with access_token as token_attribute' do
|
94
|
+
let(:user) { User.new }
|
95
|
+
|
96
|
+
after do
|
97
|
+
User.delete_all
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '#generate_access_token' do
|
101
|
+
it 'returns random string' do
|
102
|
+
SecureRandom.stub(:hex).and_return 'abcde'
|
103
|
+
user.generate_access_token.should == 'abcde'
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe '#set_access_token' do
|
108
|
+
it 'sets access_token' do
|
109
|
+
user.set_access_token
|
110
|
+
user.access_token.should_not be_nil
|
111
|
+
end
|
112
|
+
|
113
|
+
context 'when User with same token already exists' do
|
114
|
+
let(:token) { 'duplicating' }
|
115
|
+
before do
|
116
|
+
User.create :access_token => token
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'set again' do
|
120
|
+
user.stub(:generate_access_token).and_return token
|
121
|
+
user.should_receive(:generate_access_token).and_return token + 'a'
|
122
|
+
user.set_access_token
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe 'class with its own random string generator' do
|
129
|
+
it 'will use it instead of TokenAttribute#generate_random_string' do
|
130
|
+
coupon = Coupon.new
|
131
|
+
coupon.set_code
|
132
|
+
coupon.code.should == 'my code'
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
|
2
3
|
require File.expand_path('../../lib/token_attribute', __FILE__)
|
3
|
-
require 'minitest/unit'
|
4
|
-
require 'contest'
|
5
|
-
require 'rr'
|
6
4
|
require 'pry'
|
7
|
-
|
8
|
-
|
5
|
+
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.order = "random"
|
8
|
+
end
|
9
9
|
|
10
10
|
ActiveRecord::Base.configurations = {
|
11
11
|
'test' => {
|
@@ -43,3 +43,7 @@ class CreateAllTables < ActiveRecord::Migration
|
|
43
43
|
end
|
44
44
|
|
45
45
|
CreateAllTables.up
|
46
|
+
|
47
|
+
def define_new_class_instance_for(klass, &block)
|
48
|
+
klass.dup.tap { |k| k.class_eval &block }
|
49
|
+
end
|
data/token_attribute.gemspec
CHANGED
@@ -23,9 +23,7 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_dependency "activesupport", '>= 3.0.0'
|
24
24
|
s.add_development_dependency "rake"
|
25
25
|
s.add_development_dependency "sqlite3"
|
26
|
-
|
27
|
-
s.add_development_dependency "
|
28
|
-
s.add_development_dependency "turn", '>= 0.8.3'
|
29
|
-
s.add_development_dependency "rr"
|
26
|
+
|
27
|
+
s.add_development_dependency "rspec"
|
30
28
|
s.add_development_dependency "pry"
|
31
29
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: token_attribute
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -76,55 +76,7 @@ dependencies:
|
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- - ! '>='
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: '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: '0'
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
|
-
name: contest
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
|
-
requirements:
|
99
|
-
- - ! '>='
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: '0'
|
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: '0'
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
|
-
name: turn
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
|
-
requirements:
|
115
|
-
- - ! '>='
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: 0.8.3
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- - ! '>='
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: 0.8.3
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: rr
|
79
|
+
name: rspec
|
128
80
|
requirement: !ruby/object:Gem::Requirement
|
129
81
|
none: false
|
130
82
|
requirements:
|
@@ -163,6 +115,7 @@ extensions: []
|
|
163
115
|
extra_rdoc_files: []
|
164
116
|
files:
|
165
117
|
- .gitignore
|
118
|
+
- .rspec
|
166
119
|
- .travis.yml
|
167
120
|
- Gemfile
|
168
121
|
- README.md
|
@@ -171,8 +124,8 @@ files:
|
|
171
124
|
- TODO.md
|
172
125
|
- lib/token_attribute.rb
|
173
126
|
- lib/token_attribute/version.rb
|
174
|
-
-
|
175
|
-
-
|
127
|
+
- spec/lib/token_attribute_spec.rb
|
128
|
+
- spec/spec_helper.rb
|
176
129
|
- token_attribute.gemspec
|
177
130
|
homepage: https://github.com/fujimura/token_attribute
|
178
131
|
licenses: []
|
@@ -199,6 +152,6 @@ signing_key:
|
|
199
152
|
specification_version: 3
|
200
153
|
summary: Small macro to generate unique random token attribute for ActiveRecord
|
201
154
|
test_files:
|
202
|
-
-
|
203
|
-
-
|
155
|
+
- spec/lib/token_attribute_spec.rb
|
156
|
+
- spec/spec_helper.rb
|
204
157
|
has_rdoc:
|
@@ -1,110 +0,0 @@
|
|
1
|
-
require File.expand_path('../../test_helper', __FILE__)
|
2
|
-
|
3
|
-
class TokenAttributeTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
setup do
|
6
|
-
@user = User.new
|
7
|
-
end
|
8
|
-
|
9
|
-
teardown do
|
10
|
-
User.delete_all
|
11
|
-
end
|
12
|
-
|
13
|
-
describe '.token_attribute' do
|
14
|
-
test 'can token_attribute-ize multiple attributes' do
|
15
|
-
klass = User.dup
|
16
|
-
klass.class_eval do
|
17
|
-
include TokenAttribute
|
18
|
-
token_attribute :download_ticket, :password_recovery
|
19
|
-
end
|
20
|
-
[:download_ticket, :password_recovery].each do |a|
|
21
|
-
method_name = ('set_' + a.to_s).to_sym
|
22
|
-
assert klass.new.methods.map(&:to_sym).include? method_name
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
test 'can make attr_protected with option' do
|
27
|
-
klass = User.dup
|
28
|
-
klass.class_eval do
|
29
|
-
include TokenAttribute
|
30
|
-
token_attribute :download_ticket, :protected => true
|
31
|
-
end
|
32
|
-
assert klass.protected_attributes.include? :download_ticket
|
33
|
-
end
|
34
|
-
|
35
|
-
test 'can scope' do
|
36
|
-
klass = User.dup
|
37
|
-
klass.class_eval do
|
38
|
-
include TokenAttribute
|
39
|
-
token_attribute :download_ticket, :scope => :name
|
40
|
-
before_save :set_download_ticket
|
41
|
-
end
|
42
|
-
one = klass.new :name => 'fujimura'
|
43
|
-
two = klass.new :name => 'tanaka'
|
44
|
-
[one, two].each {|u| stub(u).generate_download_ticket.once { 'a' } }
|
45
|
-
[one, two].each {|u| u.save }
|
46
|
-
assert one.download_ticket == two.download_ticket
|
47
|
-
end
|
48
|
-
|
49
|
-
describe 'Token length' do
|
50
|
-
test '10 by default' do
|
51
|
-
klass = User.dup
|
52
|
-
klass.class_eval do
|
53
|
-
include TokenAttribute
|
54
|
-
token_attribute :download_ticket
|
55
|
-
before_save :set_download_ticket
|
56
|
-
end
|
57
|
-
one = klass.new :name => 'fujimura'
|
58
|
-
one.save
|
59
|
-
assert_equal one.download_ticket.length, 10
|
60
|
-
end
|
61
|
-
|
62
|
-
test 'can be configured' do
|
63
|
-
klass = User.dup
|
64
|
-
klass.class_eval do
|
65
|
-
include TokenAttribute
|
66
|
-
token_attribute :download_ticket, :length => 8
|
67
|
-
before_save :set_download_ticket
|
68
|
-
end
|
69
|
-
one = klass.new :name => 'fujimura'
|
70
|
-
one.save
|
71
|
-
assert_equal one.download_ticket.length, 8
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
context 'class with access_token as token_attribute' do
|
77
|
-
|
78
|
-
describe '#generate_access_token' do
|
79
|
-
test 'returns random string' do
|
80
|
-
stub(SecureRandom).hex { 'abcde' }
|
81
|
-
assert_equal @user.generate_access_token, 'abcde'
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
describe '#set_access_token' do
|
86
|
-
test 'sets access_token' do
|
87
|
-
@user.set_access_token
|
88
|
-
assert @user.access_token != nil
|
89
|
-
end
|
90
|
-
|
91
|
-
test 'set again if it duplicates' do
|
92
|
-
dup = 'duplicating'
|
93
|
-
User.create :access_token => dup
|
94
|
-
uniq = 'notduplicating'
|
95
|
-
mock(@user).generate_access_token.times(1) { dup }
|
96
|
-
mock(@user).generate_access_token.times(1) { uniq }
|
97
|
-
@user.set_access_token
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
end
|
102
|
-
|
103
|
-
describe 'class with its own random string generator' do
|
104
|
-
test 'will use it instead of TokenAttribute#generate_random_string' do
|
105
|
-
coupon = Coupon.new
|
106
|
-
coupon.set_code
|
107
|
-
assert coupon.code == 'my code'
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|