king_tokens 1.0.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.
- data/.document +3 -0
- data/.gitignore +20 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +87 -0
- data/Rakefile +40 -0
- data/VERSION +1 -0
- data/coverage/index.html +112 -0
- data/coverage/lib-token_code_rb.html +290 -0
- data/coverage/lib-tokenizer_rb.html +344 -0
- data/init.rb +1 -0
- data/lib/king_tokens/token_code.rb +81 -0
- data/lib/king_tokens/tokenizer.rb +121 -0
- data/lib/king_tokens.rb +3 -0
- data/tasks/tokenizer_tasks.rake +4 -0
- data/test/schema.rb +14 -0
- data/test/test_helper.rb +17 -0
- data/test/tokenizer_test.rb +141 -0
- metadata +91 -0
data/lib/king_tokens.rb
ADDED
data/test/schema.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
ActiveRecord::Schema.define(:version => 0) do
|
2
|
+
|
3
|
+
create_table :token_codes do |t|
|
4
|
+
t.integer :object_id
|
5
|
+
t.string :object_type, :name, :token
|
6
|
+
t.datetime :used_at, :valid_until
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
|
10
|
+
create_table :users do |t|
|
11
|
+
t.string :name
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'active_record'
|
4
|
+
require 'active_support'
|
5
|
+
|
6
|
+
# in active support 2.2.2 assert_difference helper has moved
|
7
|
+
# Must find a method to detect if method can be found
|
8
|
+
require 'active_support/test_case'
|
9
|
+
#require 'active_support/testing/assertions'
|
10
|
+
#require ActiveSupport::TestCase
|
11
|
+
require "#{File.dirname(__FILE__)}/../lib/king_tokens"
|
12
|
+
|
13
|
+
ActiveRecord::Base.establish_connection({
|
14
|
+
'adapter' => 'sqlite3',
|
15
|
+
'database' => ':memory:'
|
16
|
+
})
|
17
|
+
load(File.join(File.dirname(__FILE__), 'schema.rb'))
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), 'test_helper'))
|
2
|
+
|
3
|
+
# TODO:
|
4
|
+
# - make some nice mock objects!
|
5
|
+
# - Tests still mixed for two classes
|
6
|
+
class User < ActiveRecord::Base
|
7
|
+
can_has_tokens :forgot_password, :change_email
|
8
|
+
end
|
9
|
+
class Article < ActiveRecord::Base; end
|
10
|
+
|
11
|
+
class TokenizerTest < Test::Unit::TestCase
|
12
|
+
include ActiveSupport::Testing::Assertions
|
13
|
+
def test_should_respond_to_all_tokenizer_methods
|
14
|
+
assert_respond_to User, "find_by_token"
|
15
|
+
%w{set_forgot_password_token forgot_password_token forgot_password_token?}.each do |m|
|
16
|
+
assert_respond_to User.new, m
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_should_set_the_token_automatically
|
21
|
+
user = User.create(:name=>"joe")
|
22
|
+
assert_difference "TokenCode.count" do
|
23
|
+
user.set_forgot_password_token
|
24
|
+
end
|
25
|
+
assert user.forgot_password_token
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_should_respond_to_token?
|
29
|
+
user = User.create(:name=>"joe")
|
30
|
+
assert_equal false, user.forgot_password_token?
|
31
|
+
user.set_forgot_password_token
|
32
|
+
assert user.forgot_password_token?
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_unique_name_in_polymorphic_scope
|
37
|
+
user = User.create(:name=>"joe")
|
38
|
+
user.set_forgot_password_token
|
39
|
+
assert_no_difference "TokenCode.count" do
|
40
|
+
user.set_forgot_password_token
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_same_token_should_be_deleted
|
45
|
+
user = User.create(:name=>"joe")
|
46
|
+
user.set_forgot_password_token
|
47
|
+
token1 = user.forgot_password_token
|
48
|
+
assert_no_difference "TokenCode.count" do
|
49
|
+
user.set_forgot_password_token
|
50
|
+
token2 = user.forgot_password_token
|
51
|
+
assert user.token('forgot_password').valid? # check unique name validation
|
52
|
+
assert_not_equal token1, token2
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_token_should_only_valid_for_a_limited_time
|
57
|
+
user = User.create(:name=>"joe")
|
58
|
+
user.set_forgot_password_token
|
59
|
+
assert_in_delta user.token(:forgot_password).valid_until.to_i, 5.days.from_now.to_i, 10
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_token_to_string
|
63
|
+
user = User.create(:name=>"joe")
|
64
|
+
user.set_forgot_password_token(:valid=>2.days)
|
65
|
+
assert_not_nil user.token(:forgot_password).to_s
|
66
|
+
|
67
|
+
end
|
68
|
+
def test_token_valid_until_should_be_editable
|
69
|
+
user = User.create(:name=>"joe")
|
70
|
+
user.set_forgot_password_token(:valid=>2.days)
|
71
|
+
assert_in_delta user.token(:forgot_password).valid_until.to_i, 2.days.from_now.to_i,10
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_should_use_and_return_unavailable
|
75
|
+
user = User.create(:name=>"joe")
|
76
|
+
user.set_forgot_password_token
|
77
|
+
assert user.get_forgot_password_token.use!
|
78
|
+
assert user.get_forgot_password_token.used?
|
79
|
+
assert !user.get_forgot_password_token.valid_for_use?
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_should_unuse_dates
|
83
|
+
user = User.create(:name=>"joe")
|
84
|
+
user.set_forgot_password_token
|
85
|
+
assert user.get_forgot_password_token.use!
|
86
|
+
assert user.get_forgot_password_token.unuse!
|
87
|
+
assert user.get_forgot_password_token.valid_for_use?
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_should_delete_all_used
|
91
|
+
user = User.create(:name=>"joe")
|
92
|
+
# set a couple of tokens
|
93
|
+
user.set_forgot_password_token
|
94
|
+
user.set_change_email_token
|
95
|
+
cnt = TokenCode.count
|
96
|
+
# use those tokens
|
97
|
+
user.get_forgot_password_token.use!
|
98
|
+
user.get_change_email_token.use!
|
99
|
+
# now kick all used
|
100
|
+
TokenCode.delete_used
|
101
|
+
#tokens from other tests are still present, so we compare by count
|
102
|
+
assert cnt > TokenCode.count
|
103
|
+
assert_nil user.get_forgot_password_token
|
104
|
+
assert_nil user.get_change_email_token
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_should_delete_all_expired
|
108
|
+
user = User.create(:name=>"joe")
|
109
|
+
# set a couple of dead tokens
|
110
|
+
token = user.create_token(:forgot_password, :valid_until=>1.year.ago)
|
111
|
+
token1 = user.create_token(:change_email, :valid_until=>2.weeks.ago)
|
112
|
+
cnt = TokenCode.count
|
113
|
+
# now kick all expired
|
114
|
+
TokenCode.delete_expired
|
115
|
+
#tokens from other tests are still present, so we compare by count
|
116
|
+
assert cnt > TokenCode.count
|
117
|
+
assert_nil user.get_forgot_password_token
|
118
|
+
assert_nil user.get_change_email_token
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_should_find_polymorphic_object
|
122
|
+
user = User.create(:name=>"joe")
|
123
|
+
token = user.create_token(:forgot_password, :valid_until=>2.days.from_now)
|
124
|
+
assert_kind_of User, User.find_by_token(:forgot_password, token.token)
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_should_not_find_object_with_invalid_token
|
128
|
+
user = User.create(:name=>"joe")
|
129
|
+
token = user.create_token(:forgot_password, :valid_until=>1.days.ago)
|
130
|
+
assert_nil User.find_by_valid_token(:forgot_password, token.token)
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_should_find_object_with_valid_token
|
134
|
+
user = User.create(:name=>"joe")
|
135
|
+
token = user.create_token(:forgot_password, :valid_until=>2.days.from_now)
|
136
|
+
assert_equal user, User.find_by_valid_token(:forgot_password, token.token)
|
137
|
+
end
|
138
|
+
def test_should_not_leak_token_options
|
139
|
+
|
140
|
+
end
|
141
|
+
end
|
metadata
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: king_tokens
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
version: 1.0.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Georg Leciejewski
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-03-09 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: thoughtbot-shoulda
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :development
|
31
|
+
version_requirements: *id001
|
32
|
+
description: Tokens are a usefull way to give users access to an application. This can be for a limited time or just once. Just think of password resets, changing email, protected rss feed urls, timed out private links
|
33
|
+
email: gl@salesking.eu
|
34
|
+
executables: []
|
35
|
+
|
36
|
+
extensions: []
|
37
|
+
|
38
|
+
extra_rdoc_files:
|
39
|
+
- README.rdoc
|
40
|
+
files:
|
41
|
+
- .document
|
42
|
+
- .gitignore
|
43
|
+
- MIT-LICENSE
|
44
|
+
- README.rdoc
|
45
|
+
- Rakefile
|
46
|
+
- VERSION
|
47
|
+
- coverage/index.html
|
48
|
+
- coverage/lib-token_code_rb.html
|
49
|
+
- coverage/lib-tokenizer_rb.html
|
50
|
+
- init.rb
|
51
|
+
- lib/king_tokens.rb
|
52
|
+
- lib/king_tokens/token_code.rb
|
53
|
+
- lib/king_tokens/tokenizer.rb
|
54
|
+
- tasks/tokenizer_tasks.rake
|
55
|
+
- test/schema.rb
|
56
|
+
- test/test_helper.rb
|
57
|
+
- test/tokenizer_test.rb
|
58
|
+
has_rdoc: true
|
59
|
+
homepage: http://github.com/schorsch/king_tokens
|
60
|
+
licenses: []
|
61
|
+
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options:
|
64
|
+
- --charset=UTF-8
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
version: "0"
|
81
|
+
requirements: []
|
82
|
+
|
83
|
+
rubyforge_project:
|
84
|
+
rubygems_version: 1.3.6
|
85
|
+
signing_key:
|
86
|
+
specification_version: 3
|
87
|
+
summary: Access tokens for any active record object
|
88
|
+
test_files:
|
89
|
+
- test/schema.rb
|
90
|
+
- test/test_helper.rb
|
91
|
+
- test/tokenizer_test.rb
|