proposal 0.0.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.
Files changed (37) hide show
  1. data/Rakefile +38 -0
  2. data/app/models/proposal/token.rb +184 -0
  3. data/app/validators/proposal/arguments_validator.rb +36 -0
  4. data/app/validators/proposal/email_validator.rb +11 -0
  5. data/db/migrate/20121026005348_create_proposal_tokens.rb +33 -0
  6. data/lib/proposal.rb +5 -0
  7. data/lib/proposal/engine.rb +101 -0
  8. data/lib/proposal/version.rb +3 -0
  9. data/lib/tasks/proposal_tasks.rake +4 -0
  10. data/test/dummy/Rakefile +7 -0
  11. data/test/dummy/app/models/project.rb +3 -0
  12. data/test/dummy/app/models/user.rb +5 -0
  13. data/test/dummy/config.ru +4 -0
  14. data/test/dummy/config/application.rb +59 -0
  15. data/test/dummy/config/boot.rb +10 -0
  16. data/test/dummy/config/database.yml +25 -0
  17. data/test/dummy/config/environment.rb +5 -0
  18. data/test/dummy/config/environments/development.rb +37 -0
  19. data/test/dummy/config/environments/production.rb +67 -0
  20. data/test/dummy/config/environments/test.rb +37 -0
  21. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  22. data/test/dummy/config/initializers/inflections.rb +15 -0
  23. data/test/dummy/config/initializers/mime_types.rb +5 -0
  24. data/test/dummy/config/initializers/secret_token.rb +7 -0
  25. data/test/dummy/config/initializers/session_store.rb +8 -0
  26. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  27. data/test/dummy/config/locales/en.yml +5 -0
  28. data/test/dummy/config/routes.rb +58 -0
  29. data/test/dummy/db/migrate/20121026035505_create_users.rb +9 -0
  30. data/test/dummy/db/migrate/20121031041439_create_projects.rb +8 -0
  31. data/test/dummy/db/proposal.sqlite3 +0 -0
  32. data/test/dummy/log/development.log +3 -0
  33. data/test/dummy/log/test.log +31285 -0
  34. data/test/dummy/script/rails +6 -0
  35. data/test/proposal_test.rb +227 -0
  36. data/test/test_helper.rb +18 -0
  37. metadata +162 -0
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,227 @@
1
+ require 'test_helper'
2
+
3
+ class ProposalTest < ActiveSupport::TestCase
4
+ def email
5
+ "user@example.com"
6
+ end
7
+
8
+ test "truth" do
9
+ assert_kind_of Module, Proposal
10
+ end
11
+
12
+ test "user should have proposal" do
13
+ assert_equal User.propose.class, Proposal::Adapter
14
+ assert_equal User.propose.to(email).class, Proposal::Token
15
+ end
16
+
17
+ test "should respond to the recipient" do
18
+ user = User.create email: email
19
+ proposal = User.propose.to email
20
+ assert_equal user, proposal.recipient
21
+ end
22
+
23
+ test "should return proposals for instance" do
24
+ user = User.create email: email
25
+ project = Project.create!
26
+ proposal = User.propose(project).to(email)
27
+ proposal.save
28
+ assert_equal [proposal], project.proposals
29
+ end
30
+
31
+ test "should add errors when not acceptable accepted safe" do
32
+ errors = {:token=>["has been accepted"]}
33
+ proposal = User.propose.to email
34
+ proposal.save
35
+ assert_equal true, proposal.accept
36
+ assert_equal false, proposal.accept
37
+ assert_equal errors, proposal.errors.messages
38
+ end
39
+
40
+ test "should add errors when not acceptable accepted" do
41
+ errors = {:token=>["has been accepted"]}
42
+ proposal = User.propose.to email
43
+ proposal.save
44
+ proposal.accept!
45
+ assert_equal false, proposal.acceptable?
46
+ assert_equal errors, proposal.errors.messages
47
+ end
48
+
49
+ test "should add errors when not acceptable expired" do
50
+ errors = {:token=>["has expired"]}
51
+ proposal = User.propose.to email
52
+ proposal.save
53
+ proposal.expires = -> { Time.now - 1.day }
54
+ assert_equal false, proposal.acceptable?
55
+ assert_equal errors, proposal.errors.messages
56
+ end
57
+
58
+ test "should respond to the resource" do
59
+ project = Project.create!
60
+ user = User.create email: email
61
+ proposal = User.propose(project).to email
62
+ assert_equal project, proposal.resource
63
+ end
64
+
65
+ test "should create valid proposal token" do
66
+ proposal = User.propose.to email
67
+ proposal.save
68
+
69
+ assert_equal proposal.token.class, String
70
+ end
71
+
72
+ test "should return all proposals for type" do
73
+ proposal = User.propose.to email
74
+ proposal.save
75
+
76
+ assert_equal User.proposals, [proposal]
77
+ end
78
+
79
+ test "should accept a resource" do
80
+ project_one = Project.create!
81
+
82
+ context_one = User.propose(project_one).to(email)
83
+ assert_equal true, context_one.save
84
+
85
+ project_two = Project.create!
86
+
87
+ context_two = User.propose(project_two).to(email)
88
+ assert_equal true, context_two.save
89
+
90
+ context_three = User.propose(project_two).to(email)
91
+ assert_equal context_two, context_three
92
+ end
93
+
94
+ test "should return the resource" do
95
+ project = Project.create!
96
+ proposal = User.propose(project).to(email)
97
+ assert_equal proposal.resource, project
98
+ end
99
+
100
+ test "should return all arguments" do
101
+ arguments = ['admin', 1]
102
+ proposal = User.propose.with(*arguments).to('user@example.com')
103
+ proposal.save
104
+
105
+ retrieved = User.proposals.find_by_token proposal.token
106
+ assert_equal arguments, retrieved.arguments
107
+ end
108
+
109
+ test "should return hash when arguments is hash" do
110
+ arguments = { role: 'admin' }
111
+ proposal = User.propose.with(arguments).to(email)
112
+
113
+ assert_equal true, proposal.save
114
+
115
+ retrieved = User.proposals.find_by_token proposal.token
116
+ assert_equal arguments, retrieved.arguments
117
+ end
118
+
119
+ test "should validate arguments with symbol" do
120
+ error_messages = ["must be a hash", "is missing role"]
121
+ errors = { arguments: error_messages }
122
+ proposal = User.propose.to email, expects: :role
123
+
124
+ assert_equal false, proposal.valid?
125
+ assert_equal errors, proposal.errors.messages
126
+ end
127
+
128
+ test "should validate arguments with symbol and args" do
129
+ error_messages = ["is missing role"]
130
+ errors = { arguments: error_messages }
131
+ proposal = User.propose.to email
132
+ proposal.expects = :role
133
+
134
+ proposal.args = [{extra: 'foo'}]
135
+
136
+ assert_equal false, proposal.valid?
137
+ assert_equal errors, proposal.errors.messages
138
+ end
139
+
140
+ test "should validate arguments with symbols" do
141
+ error_messages = ["must be a hash", "is missing role", "is missing count"]
142
+ errors = { arguments: error_messages }
143
+ proposal = User.propose.to email, expects: [:role, :count]
144
+
145
+ assert_equal false, proposal.valid?
146
+ assert_equal errors, proposal.errors.messages
147
+ end
148
+
149
+ test "should validate arguments with a proc" do
150
+ error_messages = ["is invalid"]
151
+ errors = { arguments: error_messages }
152
+ proposal = User.propose.to email, expects: -> arguments {
153
+ !arguments.nil? && !arguments.empty?
154
+ }
155
+
156
+ assert_equal false, proposal.valid?
157
+ assert_equal errors, proposal.errors.messages
158
+ end
159
+
160
+ test "should return proposal instance" do
161
+ user = User.create email: email
162
+ proposal = User.propose.to email
163
+ assert_equal user, proposal.recipient
164
+ assert_equal true, proposal.notify?
165
+ end
166
+
167
+ test "should not return proposal instance" do
168
+ proposal = User.propose.to email
169
+ assert_equal nil, proposal.recipient
170
+ assert_raises(Proposal::RecordNotFound) { proposal.recipient! }
171
+ end
172
+
173
+ test "should not return proposal action notify" do
174
+ user = User.create email: email
175
+ proposal = User.propose.to email
176
+ assert_equal :notify, proposal.action
177
+ assert_equal true, proposal.notify?
178
+ end
179
+
180
+ test "should not return proposal action invite" do
181
+ proposal = User.propose.to email
182
+ assert_equal :invite, proposal.action
183
+ assert_equal true, proposal.invite?
184
+ end
185
+
186
+ test "should not return proposal action remind" do
187
+ user = User.create email: email
188
+ existing = User.propose.to email
189
+ existing.save!
190
+ existing.accept!
191
+
192
+ proposal = User.propose.to email
193
+ assert_equal :remind, proposal.action
194
+ assert_equal true, proposal.remind?
195
+ end
196
+
197
+ test "should set reminded" do
198
+ user = User.create email: email
199
+ existing = User.propose.to email
200
+ existing.save!
201
+ existing.accept!
202
+
203
+ proposal = User.propose.to email
204
+ assert_equal true, proposal.reminded!
205
+ end
206
+
207
+ test "should find and accept proposal" do
208
+ email = "user@example.com"
209
+ user = User.create email: email
210
+ proposal = User.propose.to email
211
+ proposal.save
212
+
213
+ retrieved = User.proposals.find_by_token proposal.token
214
+
215
+ assert_equal retrieved, proposal
216
+
217
+ retrieved.accept!
218
+
219
+ assert_equal true, retrieved.accepted?
220
+ end
221
+
222
+ test "should return token from to_s method" do
223
+ proposal = User.propose.to email
224
+ proposal.save
225
+ assert_equal proposal.token, proposal.to_s
226
+ end
227
+ end
@@ -0,0 +1,18 @@
1
+ # Configure Rails Environment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
+ require "rails/test_help"
6
+
7
+ Rails.backtrace_cleaner.remove_silencers!
8
+
9
+ # Load support files
10
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
11
+
12
+ # Load fixtures from the engine
13
+ if ActiveSupport::TestCase.method_defined?(:fixture_path=)
14
+ ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
15
+ end
16
+
17
+ ActiveRecord::Migrator.up("db/migrate")
18
+ ActiveRecord::Migrator.up(File.expand_path("../dummy/db/migrate", __FILE__))
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: proposal
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Rufus Post
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '3.2'
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.2'
30
+ - !ruby/object:Gem::Dependency
31
+ name: sqlite3
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: turn
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description:
63
+ email:
64
+ - rufuspost@gmail.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - app/models/proposal/token.rb
70
+ - app/validators/proposal/arguments_validator.rb
71
+ - app/validators/proposal/email_validator.rb
72
+ - db/migrate/20121026005348_create_proposal_tokens.rb
73
+ - lib/proposal/engine.rb
74
+ - lib/proposal/version.rb
75
+ - lib/proposal.rb
76
+ - lib/tasks/proposal_tasks.rake
77
+ - Rakefile
78
+ - test/dummy/Rakefile
79
+ - test/dummy/app/models/project.rb
80
+ - test/dummy/app/models/user.rb
81
+ - test/dummy/config/application.rb
82
+ - test/dummy/config/boot.rb
83
+ - test/dummy/config/database.yml
84
+ - test/dummy/config/environment.rb
85
+ - test/dummy/config/environments/development.rb
86
+ - test/dummy/config/environments/production.rb
87
+ - test/dummy/config/environments/test.rb
88
+ - test/dummy/config/initializers/backtrace_silencers.rb
89
+ - test/dummy/config/initializers/inflections.rb
90
+ - test/dummy/config/initializers/mime_types.rb
91
+ - test/dummy/config/initializers/secret_token.rb
92
+ - test/dummy/config/initializers/session_store.rb
93
+ - test/dummy/config/initializers/wrap_parameters.rb
94
+ - test/dummy/config/locales/en.yml
95
+ - test/dummy/config/routes.rb
96
+ - test/dummy/config.ru
97
+ - test/dummy/db/migrate/20121026035505_create_users.rb
98
+ - test/dummy/db/migrate/20121031041439_create_projects.rb
99
+ - test/dummy/db/proposal.sqlite3
100
+ - test/dummy/log/development.log
101
+ - test/dummy/log/test.log
102
+ - test/dummy/script/rails
103
+ - test/proposal_test.rb
104
+ - test/test_helper.rb
105
+ homepage: https://github.com/mynameisrufus/proposal
106
+ licenses: []
107
+ post_install_message:
108
+ rdoc_options: []
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ segments:
118
+ - 0
119
+ hash: 2799481107552733339
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ segments:
127
+ - 0
128
+ hash: 2799481107552733339
129
+ requirements: []
130
+ rubyforge_project:
131
+ rubygems_version: 1.8.24
132
+ signing_key:
133
+ specification_version: 3
134
+ summary: Simple unobtrusive token invitation engine for rails
135
+ test_files:
136
+ - test/dummy/Rakefile
137
+ - test/dummy/app/models/project.rb
138
+ - test/dummy/app/models/user.rb
139
+ - test/dummy/config/application.rb
140
+ - test/dummy/config/boot.rb
141
+ - test/dummy/config/database.yml
142
+ - test/dummy/config/environment.rb
143
+ - test/dummy/config/environments/development.rb
144
+ - test/dummy/config/environments/production.rb
145
+ - test/dummy/config/environments/test.rb
146
+ - test/dummy/config/initializers/backtrace_silencers.rb
147
+ - test/dummy/config/initializers/inflections.rb
148
+ - test/dummy/config/initializers/mime_types.rb
149
+ - test/dummy/config/initializers/secret_token.rb
150
+ - test/dummy/config/initializers/session_store.rb
151
+ - test/dummy/config/initializers/wrap_parameters.rb
152
+ - test/dummy/config/locales/en.yml
153
+ - test/dummy/config/routes.rb
154
+ - test/dummy/config.ru
155
+ - test/dummy/db/migrate/20121026035505_create_users.rb
156
+ - test/dummy/db/migrate/20121031041439_create_projects.rb
157
+ - test/dummy/db/proposal.sqlite3
158
+ - test/dummy/log/development.log
159
+ - test/dummy/log/test.log
160
+ - test/dummy/script/rails
161
+ - test/proposal_test.rb
162
+ - test/test_helper.rb