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.
@@ -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