jakewendt-rails_extension 2.0.22

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/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Jake
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,42 @@
1
+ = Rails Extension (RubyGem)
2
+
3
+ Contains a collection of validations and complex assertions.
4
+
5
+ == Usage
6
+
7
+ config.gem 'jakewendt-rails_extension',
8
+ :source => 'http://rubygems.org'
9
+
10
+ script/generate rails_extension
11
+
12
+ == ToDo
13
+
14
+ * add assert_should_protect_attributes(*attributes)
15
+ * add assert_should_allow_attributes(*attributes)
16
+ * include assert_only_difference
17
+ * add legitimate text to Rakefile
18
+ * options to polymorphic associations
19
+
20
+ == Gemified with Jeweler
21
+
22
+ vi Rakefile
23
+ rake version:write
24
+
25
+ rake version:bump:patch
26
+ rake version:bump:minor
27
+ rake version:bump:major
28
+
29
+ rake gemspec
30
+
31
+ rake install
32
+ rake release
33
+
34
+
35
+ == Thanks
36
+
37
+ * http://github.com/rails/rails
38
+ * http://github.com/technicalpickles/jeweler
39
+
40
+ == Copyright
41
+
42
+ Copyright (c) 2010 Jake. See LICENSE for details.
File without changes
@@ -0,0 +1,72 @@
1
+ class RailsExtensionGenerator < Rails::Generator::Base
2
+
3
+ def manifest
4
+ # See Rails::Generator::Commands::Create
5
+ # rails-2.3.10/lib/rails_generator/commands.rb
6
+ # for code methods for record (Manifest)
7
+ record do |m|
8
+ File.open('.autotest','a'){|f|
9
+ f.puts <<-EOF
10
+ # From `script/generate simply_testable` ...
11
+ Dir["\#{File.dirname(__FILE__)}/config/autotest/**/*rb"].sort.each { |ext| load ext }
12
+ EOF
13
+ }
14
+
15
+ # %w( create_pages ).each do |migration|
16
+ # m.migration_template "migrations/#{migration}.rb",
17
+ # 'db/migrate', :migration_file_name => migration
18
+ # end
19
+ #
20
+ # m.directory('public/javascripts')
21
+ # Dir["#{File.dirname(__FILE__)}/templates/javascripts/*js"].each{|file|
22
+ # f = file.split('/').slice(-2,2).join('/')
23
+ # m.file(f, "public/javascripts/#{File.basename(file)}")
24
+ # }
25
+ # m.directory('public/stylesheets')
26
+ # Dir["#{File.dirname(__FILE__)}/templates/stylesheets/*css"].each{|file|
27
+ # f = file.split('/').slice(-2,2).join('/')
28
+ # m.file(f, "public/stylesheets/#{File.basename(file)}")
29
+ # }
30
+ # m.directory('test/functional/pages')
31
+ # Dir["#{File.dirname(__FILE__)}/templates/functional/*rb"].each{|file|
32
+ # f = file.split('/').slice(-2,2).join('/')
33
+ # m.file(f, "test/functional/pages/#{File.basename(file)}")
34
+ # }
35
+ # m.directory('test/unit/pages')
36
+ # Dir["#{File.dirname(__FILE__)}/templates/unit/*rb"].each{|file|
37
+ # f = file.split('/').slice(-2,2).join('/')
38
+ # m.file(f, "test/unit/pages/#{File.basename(file)}")
39
+ # }
40
+ end
41
+ end
42
+
43
+ end
44
+ module Rails::Generator::Commands
45
+ class Create
46
+ def migration_template(relative_source,
47
+ relative_destination, template_options = {})
48
+ migration_directory relative_destination
49
+ migration_file_name = template_options[
50
+ :migration_file_name] || file_name
51
+ if migration_exists?(migration_file_name)
52
+ puts "Another migration is already named #{migration_file_name}: #{existing_migrations(migration_file_name).first}: Skipping"
53
+ else
54
+ template(relative_source, "#{relative_destination}/#{next_migration_string}_#{migration_file_name}.rb", template_options)
55
+ end
56
+ end
57
+ end # Create
58
+ class Base
59
+ protected
60
+ # the loop through migrations happens so fast
61
+ # that they all have the same timestamp which
62
+ # won't work when you actually try to migrate.
63
+ # All the timestamps MUST be unique.
64
+ def next_migration_string(padding = 3)
65
+ @s = (!@s.nil?)? @s.to_i + 1 : if ActiveRecord::Base.timestamped_migrations
66
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
67
+ else
68
+ "%.#{padding}d" % next_migration_number
69
+ end
70
+ end
71
+ end # Base
72
+ end
@@ -0,0 +1 @@
1
+ require 'rails_extension'
@@ -0,0 +1,18 @@
1
+ def brand
2
+ "@@ "
3
+ end
4
+ module RailsExtension
5
+ # predefine namespaces
6
+ module ActiveSupportExtension
7
+ end
8
+ module ActiveRecordExtension
9
+ end
10
+ module ActionControllerExtension
11
+ end
12
+ end
13
+ #
14
+ # This may require the addition of other gem requirements
15
+ #
16
+ require 'rails_extension/active_support_extension'
17
+ require 'rails_extension/active_record_extension'
18
+ require 'rails_extension/action_controller_extension'
@@ -0,0 +1,8 @@
1
+ require 'action_controller'
2
+ require 'action_controller/test_case'
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+ require 'action_controller_extension/test_case'
5
+ require 'action_controller_extension/accessible_via_protocol'
6
+ require 'action_controller_extension/accessible_via_format'
7
+ require 'action_controller_extension/accessible_via_user'
8
+ require 'action_controller_extension/routing'
@@ -0,0 +1,2 @@
1
+ module RailsExtension::ActionControllerExtension::AccessibleViaFormat
2
+ end
@@ -0,0 +1,403 @@
1
+ module RailsExtension::ActionControllerExtension::AccessibleViaProtocol
2
+
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+
9
+ def awihttp_title(options={})
10
+ "with #{options[:login]} login#{options[:suffix]}"
11
+ end
12
+
13
+ def assert_access_with_http(*actions)
14
+ user_options = actions.extract_options!
15
+
16
+ options = {
17
+ :login => :admin
18
+ }
19
+ if ( self.constants.include?('ASSERT_ACCESS_OPTIONS') )
20
+ options.merge!(self::ASSERT_ACCESS_OPTIONS)
21
+ end
22
+ options.merge!(user_options)
23
+ actions += options[:actions]||[]
24
+
25
+ m_key = options[:model].try(:underscore).try(:to_sym)
26
+
27
+ test "#{brand}AWiHTTP should get new #{awihttp_title(options)}" do
28
+ turn_https_off
29
+ login_as send(options[:login])
30
+ args = options[:new] || {}
31
+ send(:get,:new,args)
32
+ assert_response :success
33
+ assert_template 'new'
34
+ assert assigns(m_key), "#{m_key} was not assigned"
35
+ assert_nil flash[:error], "flash[:error] was not nil"
36
+ end if actions.include?(:new) || options.keys.include?(:new)
37
+
38
+ test "#{brand}AWiHTTP should post create #{awihttp_title(options)}" do
39
+ turn_https_off
40
+ login_as send(options[:login])
41
+ args = if options[:create]
42
+ options[:create]
43
+ elsif options[:attributes_for_create]
44
+ {m_key => send(options[:attributes_for_create])}
45
+ else
46
+ {}
47
+ end
48
+ assert_difference("#{options[:model]}.count",1) do
49
+ send(:post,:create,args)
50
+ end
51
+ assert_response :redirect
52
+ assert_nil flash[:error], "flash[:error] was not nil"
53
+ end if actions.include?(:create) || options.keys.include?(:create)
54
+
55
+ test "#{brand}AWiHTTP should get edit #{awihttp_title(options)}" do
56
+ turn_https_off
57
+ login_as send(options[:login])
58
+ args={}
59
+ if options[:method_for_create]
60
+ obj = send(options[:method_for_create])
61
+ args[:id] = obj.id
62
+ end
63
+ send(:get,:edit, args)
64
+ assert_response :success
65
+ assert_template 'edit'
66
+ assert assigns(m_key), "#{m_key} was not assigned"
67
+ assert_nil flash[:error], "flash[:error] was not nil"
68
+ end if actions.include?(:edit) || options.keys.include?(:edit)
69
+
70
+ test "#{brand}AWiHTTP should put update #{awihttp_title(options)}" do
71
+ turn_https_off
72
+ login_as send(options[:login])
73
+ args={}
74
+ if options[:method_for_create] && options[:attributes_for_create]
75
+ obj = send(options[:method_for_create])
76
+ args[:id] = obj.id
77
+ args[m_key] = send(options[:attributes_for_create])
78
+ end
79
+ before = obj.updated_at if obj
80
+ sleep 1 if obj # if updated too quickly, updated_at won't change
81
+ send(:put,:update, args)
82
+ after = obj.reload.updated_at if obj
83
+ assert_not_equal( before.to_i,after.to_i, "updated_at did not change" ) if obj
84
+ assert_response :redirect
85
+ assert_nil flash[:error], "flash[:error] was not nil"
86
+ end if actions.include?(:update) || options.keys.include?(:update)
87
+
88
+ test "#{brand}AWiHTTP should get show #{awihttp_title(options)}" do
89
+ turn_https_off
90
+ login_as send(options[:login])
91
+ args={}
92
+ if options[:method_for_create]
93
+ obj = send(options[:method_for_create])
94
+ args[:id] = obj.id
95
+ end
96
+ send(:get,:show, args)
97
+ assert_response :success
98
+ assert_template 'show'
99
+ assert assigns(m_key), "#{m_key} was not assigned"
100
+ assert_nil flash[:error], "flash[:error] was not nil"
101
+ end if actions.include?(:show) || options.keys.include?(:show)
102
+
103
+ test "#{brand}AWiHTTP should delete destroy #{awihttp_title(options)}" do
104
+ turn_https_off
105
+ login_as send(options[:login])
106
+ args={}
107
+ if options[:method_for_create]
108
+ obj = send(options[:method_for_create])
109
+ args[:id] = obj.id
110
+ end
111
+ assert_difference("#{options[:model]}.count",-1) do
112
+ send(:delete,:destroy,args)
113
+ end
114
+ assert_response :redirect
115
+ assert assigns(m_key), "#{m_key} was not assigned"
116
+ assert_nil flash[:error], "flash[:error] was not nil"
117
+ end if actions.include?(:destroy) || options.keys.include?(:destroy)
118
+
119
+ test "#{brand}AWiHTTP should get index #{awihttp_title(options)}" do
120
+ turn_https_off
121
+ login_as send(options[:login])
122
+ get :index
123
+ assert_response :success
124
+ assert_template 'index'
125
+ assert assigns(m_key.try(:to_s).try(:pluralize).try(:to_sym)),
126
+ "#{m_key.try(:to_s).try(:pluralize).try(:to_sym)} was not assigned"
127
+ assert_nil flash[:error], "flash[:error] was not nil"
128
+ end if actions.include?(:index) || options.keys.include?(:index)
129
+
130
+ test "#{brand}AWiHTTP should get index #{awihttp_title(options)} and items" do
131
+ turn_https_off
132
+ send(options[:before]) if !options[:before].blank?
133
+ login_as send(options[:login])
134
+ 3.times{ send(options[:method_for_create]) } if !options[:method_for_create].blank?
135
+ get :index
136
+ assert_response :success
137
+ assert_template 'index'
138
+ assert assigns(m_key.try(:to_s).try(:pluralize).try(:to_sym)),
139
+ "#{m_key.try(:to_s).try(:pluralize).try(:to_sym)} was not assigned"
140
+ assert_nil flash[:error], "flash[:error] was not nil"
141
+ end if actions.include?(:index) || options.keys.include?(:index)
142
+
143
+ end
144
+
145
+ def awihttps_title(options={})
146
+ "with #{options[:login]} login#{options[:suffix]}"
147
+ end
148
+
149
+ def assert_access_with_https(*actions)
150
+ user_options = actions.extract_options!
151
+
152
+ options = {
153
+ :login => :admin
154
+ }
155
+ if ( self.constants.include?('ASSERT_ACCESS_OPTIONS') )
156
+ options.merge!(self::ASSERT_ACCESS_OPTIONS)
157
+ end
158
+ options.merge!(user_options)
159
+ actions += options[:actions]||[]
160
+
161
+ m_key = options[:model].try(:underscore).try(:to_sym)
162
+
163
+ test "#{brand}AWiHTTPS should get new #{awihttps_title(options)}" do
164
+ login_as send(options[:login])
165
+ args = options[:new] || {}
166
+ turn_https_on
167
+ send(:get,:new,args)
168
+ assert_response :success
169
+ assert_template 'new'
170
+ assert assigns(m_key), "#{m_key} was not assigned"
171
+ assert_nil flash[:error], "flash[:error] was not nil"
172
+ end if actions.include?(:new) || options.keys.include?(:new)
173
+
174
+ test "#{brand}AWiHTTPS should post create #{awihttps_title(options)}" do
175
+ login_as send(options[:login])
176
+ args = if options[:create]
177
+ options[:create]
178
+ elsif options[:attributes_for_create]
179
+ {m_key => send(options[:attributes_for_create])}
180
+ else
181
+ {}
182
+ end
183
+ turn_https_on
184
+ assert_difference("#{options[:model]}.count",1) do
185
+ send(:post,:create,args)
186
+ end
187
+ assert_response :redirect
188
+ assert_nil flash[:error], "flash[:error] was not nil"
189
+ end if actions.include?(:create) || options.keys.include?(:create)
190
+
191
+ test "#{brand}AWiHTTPS should get edit #{awihttps_title(options)}" do
192
+ login_as send(options[:login])
193
+ args={}
194
+ if options[:method_for_create]
195
+ obj = send(options[:method_for_create])
196
+ args[:id] = obj.id
197
+ end
198
+ turn_https_on
199
+ send(:get,:edit, args)
200
+ assert_response :success
201
+ assert_template 'edit'
202
+ assert assigns(m_key), "#{m_key} was not assigned"
203
+ assert_nil flash[:error], "flash[:error] was not nil"
204
+ end if actions.include?(:edit) || options.keys.include?(:edit)
205
+
206
+ test "#{brand}AWiHTTPS should put update #{awihttps_title(options)}" do
207
+ login_as send(options[:login])
208
+ args={}
209
+ if options[:method_for_create] && options[:attributes_for_create]
210
+ obj = send(options[:method_for_create])
211
+ args[:id] = obj.id
212
+ args[m_key] = send(options[:attributes_for_create])
213
+ end
214
+ before = obj.updated_at if obj
215
+ sleep 1 if obj # if updated too quickly, updated_at won't change
216
+ turn_https_on
217
+ send(:put,:update, args)
218
+ after = obj.reload.updated_at if obj
219
+ assert_not_equal( before.to_i,after.to_i, "updated_at did not change" ) if obj
220
+ assert_response :redirect
221
+ assert_nil flash[:error], "flash[:error] was not nil"
222
+ end if actions.include?(:update) || options.keys.include?(:update)
223
+
224
+ test "#{brand}AWiHTTPS should get show #{awihttps_title(options)}" do
225
+ login_as send(options[:login])
226
+ args={}
227
+ if options[:method_for_create]
228
+ obj = send(options[:method_for_create])
229
+ args[:id] = obj.id
230
+ end
231
+ turn_https_on
232
+ send(:get,:show, args)
233
+ assert_response :success
234
+ assert_template 'show'
235
+ assert assigns(m_key), "#{m_key} was not assigned"
236
+ assert_nil flash[:error], "flash[:error] was not nil"
237
+ end if actions.include?(:show) || options.keys.include?(:show)
238
+
239
+ test "#{brand}AWiHTTPS should delete destroy #{awihttps_title(options)}" do
240
+ login_as send(options[:login])
241
+ args={}
242
+ if options[:method_for_create]
243
+ obj = send(options[:method_for_create])
244
+ args[:id] = obj.id
245
+ end
246
+ turn_https_on
247
+ assert_difference("#{options[:model]}.count",-1) do
248
+ send(:delete,:destroy,args)
249
+ end
250
+ assert_response :redirect
251
+ assert assigns(m_key), "#{m_key} was not assigned"
252
+ assert_nil flash[:error], "flash[:error] was not nil"
253
+ end if actions.include?(:destroy) || options.keys.include?(:destroy)
254
+
255
+ test "#{brand}AWiHTTPS should get index #{awihttps_title(options)}" do
256
+ login_as send(options[:login])
257
+ turn_https_on
258
+ get :index
259
+ assert_response :success
260
+ assert_template 'index'
261
+ assert assigns(m_key.try(:to_s).try(:pluralize).try(:to_sym)),
262
+ "#{m_key.try(:to_s).try(:pluralize).try(:to_sym)} was not assigned"
263
+ assert_nil flash[:error], "flash[:error] was not nil"
264
+ end if actions.include?(:index) || options.keys.include?(:index)
265
+
266
+ test "#{brand}AWiHTTPS should get index #{awihttps_title(options)} and items" do
267
+ send(options[:before]) if !options[:before].blank?
268
+ login_as send(options[:login])
269
+ 3.times{ send(options[:method_for_create]) } if !options[:method_for_create].blank?
270
+ turn_https_on
271
+ get :index
272
+ assert_response :success
273
+ assert_template 'index'
274
+ assert assigns(m_key.try(:to_s).try(:pluralize).try(:to_sym)),
275
+ "#{m_key.try(:to_s).try(:pluralize).try(:to_sym)} was not assigned"
276
+ assert_nil flash[:error], "flash[:error] was not nil"
277
+ end if actions.include?(:index) || options.keys.include?(:index)
278
+
279
+ end
280
+
281
+ def nawihttp_title(options={})
282
+ "with #{options[:login]} login#{options[:suffix]}"
283
+ end
284
+
285
+ def assert_no_access_with_http(*actions)
286
+ user_options = actions.extract_options!
287
+
288
+ options = {
289
+ :login => :admin
290
+ }
291
+ if ( self.constants.include?('ASSERT_ACCESS_OPTIONS') )
292
+ options.merge!(self::ASSERT_ACCESS_OPTIONS)
293
+ end
294
+ options.merge!(user_options)
295
+ actions += options[:actions]||[]
296
+
297
+ m_key = options[:model].try(:underscore).try(:to_sym)
298
+
299
+ test "#{brand}NAWiHTTP should NOT get new #{nawihttp_title(options)}" do
300
+ turn_https_off
301
+ login_as send(options[:login])
302
+ args = options[:new]||{}
303
+ send(:get,:new,args)
304
+ assert_redirected_to @controller.url_for(
305
+ :controller => @controller.controller_name,
306
+ :action => 'new', :protocol => "https://")
307
+ end if actions.include?(:new) || options.keys.include?(:new)
308
+
309
+ test "#{brand}NAWiHTTP should NOT post create #{nawihttp_title(options)}" do
310
+ turn_https_off
311
+ login_as send(options[:login])
312
+ args = if options[:create]
313
+ options[:create]
314
+ elsif options[:attributes_for_create]
315
+ {m_key => send(options[:attributes_for_create])}
316
+ else
317
+ {}
318
+ end
319
+ assert_no_difference("#{options[:model]}.count") do
320
+ send(:post,:create,args)
321
+ end
322
+ assert_match @controller.url_for(
323
+ :controller => @controller.controller_name,
324
+ :action => 'create', :protocol => "https://"),@response.redirected_to
325
+ end if actions.include?(:create) || options.keys.include?(:create)
326
+
327
+ test "#{brand}NAWiHTTP should NOT get edit #{nawihttp_title(options)}" do
328
+ turn_https_off
329
+ login_as send(options[:login])
330
+ args=options[:edit]||{}
331
+ if options[:method_for_create]
332
+ obj = send(options[:method_for_create])
333
+ args[:id] = obj.id
334
+ end
335
+ send(:get,:edit, args)
336
+ assert_redirected_to @controller.url_for(
337
+ :controller => @controller.controller_name,
338
+ :action => 'edit', :id => args[:id], :protocol => "https://")
339
+ end if actions.include?(:edit) || options.keys.include?(:edit)
340
+
341
+ test "#{brand}NAWiHTTP should NOT put update #{nawihttp_title(options)}" do
342
+ turn_https_off
343
+ login_as send(options[:login])
344
+ args={}
345
+ if options[:method_for_create] && options[:attributes_for_create]
346
+ obj = send(options[:method_for_create])
347
+ args[:id] = obj.id
348
+ args[m_key] = send(options[:attributes_for_create])
349
+ end
350
+ before = obj.updated_at if obj
351
+ send(:put,:update, args)
352
+ after = obj.reload.updated_at if obj
353
+ assert_equal( before.to_s(:db), after.to_s(:db), "updated_at changed" ) if obj
354
+ assert_match @controller.url_for(
355
+ :controller => @controller.controller_name,
356
+ :action => 'update', :id => args[:id], :protocol => "https://"), @response.redirected_to
357
+ end if actions.include?(:update) || options.keys.include?(:update)
358
+
359
+ test "#{brand}NAWiHTTP should NOT get show #{nawihttp_title(options)}" do
360
+ turn_https_off
361
+ login_as send(options[:login])
362
+ args=options[:show]||{}
363
+ if options[:method_for_create]
364
+ obj = send(options[:method_for_create])
365
+ args[:id] = obj.id
366
+ end
367
+ send(:get,:show, args)
368
+ assert_redirected_to @controller.url_for(
369
+ :controller => @controller.controller_name,
370
+ :action => 'show', :id => args[:id], :protocol => "https://")
371
+ end if actions.include?(:show) || options.keys.include?(:show)
372
+
373
+ test "#{brand}NAWiHTTP should NOT delete destroy #{nawihttp_title(options)}" do
374
+ turn_https_off
375
+ login_as send(options[:login])
376
+ args=options[:destroy]||{}
377
+ if options[:method_for_create]
378
+ obj = send(options[:method_for_create])
379
+ args[:id] = obj.id
380
+ end
381
+ assert_no_difference("#{options[:model]}.count") do
382
+ send(:delete,:destroy,args)
383
+ end
384
+ assert_redirected_to @controller.url_for(
385
+ :controller => @controller.controller_name,
386
+ :action => 'destroy', :id => args[:id], :protocol => "https://")
387
+ end if actions.include?(:destroy) || options.keys.include?(:destroy)
388
+
389
+ test "#{brand}NAWiHTTP should NOT get index #{nawihttp_title(options)}" do
390
+ turn_https_off
391
+ login_as send(options[:login])
392
+ get :index
393
+ assert_redirected_to @controller.url_for(
394
+ :controller => @controller.controller_name,
395
+ :action => 'index', :protocol => "https://")
396
+ end if actions.include?(:index) || options.keys.include?(:index)
397
+
398
+ end
399
+
400
+ end # module ClassMethods
401
+ end # module RailsExtension::ActionControllerExtension::AccessibleViaProtocol
402
+ ActionController::TestCase.send(:include,
403
+ RailsExtension::ActionControllerExtension::AccessibleViaProtocol)