king_tokens 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ require File.dirname(__FILE__) + '/king_tokens/token_code'
2
+ require File.dirname(__FILE__) + '/king_tokens/tokenizer'
3
+ ActiveRecord::Base.send(:include, KingTokens::Tokenizer)
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :tokenizer do
3
+ # # Task goes here
4
+ # end
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
@@ -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