parlement 0.14 → 0.17

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 (205) hide show
  1. data/CHANGES +41 -1
  2. data/MEMORY +66 -5
  3. data/README +10 -5
  4. data/Rakefile +15 -23
  5. data/app/controllers/account_controller.rb +48 -43
  6. data/app/controllers/{application.rb → application_controller.rb} +15 -12
  7. data/app/controllers/elt_controller.rb +77 -32
  8. data/app/controllers/subscriber_controller.rb +11 -10
  9. data/app/helpers/application_helper.rb +14 -1
  10. data/app/helpers/elt_helper.rb +9 -7
  11. data/app/models/elt.rb +25 -24
  12. data/app/models/mail.rb +44 -47
  13. data/app/models/person_notify.rb +2 -2
  14. data/app/models/user.rb +128 -2
  15. data/app/models/user_notify.rb +15 -15
  16. data/app/views/account/_login.rhtml +39 -39
  17. data/app/views/account/_show.rhtml +22 -30
  18. data/app/views/account/signup.rhtml +2 -2
  19. data/app/views/elt/_choice.rhtml +6 -6
  20. data/app/views/elt/_elt.rhtml +27 -32
  21. data/app/views/elt/choices.rhtml +16 -18
  22. data/app/views/elt/list/_byDate.rhtml +14 -14
  23. data/app/views/elt/list/_byVote.rhtml +15 -15
  24. data/app/views/elt/list/_children.rhtml +48 -40
  25. data/app/views/elt/list/_subscribers.rhtml +1 -1
  26. data/app/views/elt/new.rhtml +22 -21
  27. data/app/views/elt/rss.rxml +4 -11
  28. data/app/views/elt/show.rhtml +65 -61
  29. data/app/views/elt/vote_rss.rxml +4 -11
  30. data/app/views/layouts/top.rhtml +39 -50
  31. data/app/views/person/_listElts.rhtml +1 -1
  32. data/app/views/person/show.rhtml +1 -1
  33. data/{vendor/plugins/login_engine/app → app}/views/user_notify/change_password.rhtml +0 -0
  34. data/{vendor/plugins/login_engine/app → app}/views/user_notify/delete.rhtml +0 -0
  35. data/{vendor/plugins/login_engine/app → app}/views/user_notify/forgot_password.rhtml +0 -0
  36. data/{vendor/plugins/login_engine/app → app}/views/user_notify/pending_delete.rhtml +0 -0
  37. data/{vendor/plugins/login_engine/app → app}/views/user_notify/signup.rhtml +0 -0
  38. data/config/boot.rb +97 -32
  39. data/config/environment.rb +37 -35
  40. data/config/environments/development.rb +2 -3
  41. data/config/environments/production.rb +3 -0
  42. data/config/initializers/string_ruby_1.8.rb +10 -0
  43. data/config/routes.rb +17 -22
  44. data/db/schema.rb +102 -74
  45. data/lib/tasks/rspec.rake +167 -0
  46. data/public/404.html +25 -7
  47. data/public/500.html +26 -7
  48. data/public/dispatch.cgi +0 -0
  49. data/public/dispatch.fcgi +0 -0
  50. data/public/dispatch.rb +0 -0
  51. data/public/images/live_tree_branch_collapsed_icon.gif +0 -0
  52. data/public/images/live_tree_branch_expanded_icon.gif +0 -0
  53. data/public/images/live_tree_leaf_icon.gif +0 -0
  54. data/public/javascripts/application.js +258 -0
  55. data/public/javascripts/controls.js +544 -414
  56. data/public/javascripts/dragdrop.js +229 -198
  57. data/public/javascripts/effects.js +499 -459
  58. data/public/javascripts/prototype.js +2926 -1121
  59. data/public/javascripts/shadedborder.js +68 -50
  60. data/public/stylesheets/default.css +34 -34
  61. data/public/stylesheets/live_tree.css +0 -0
  62. data/public/stylesheets/scaffold.css +6 -6
  63. data/script/about +0 -0
  64. data/script/autospec +6 -0
  65. data/script/benchmarker +0 -0
  66. data/script/breakpointer +0 -0
  67. data/script/console +0 -0
  68. data/script/dbconsole +3 -0
  69. data/script/destroy +0 -0
  70. data/script/generate +0 -0
  71. data/script/plugin +0 -0
  72. data/script/profiler +0 -0
  73. data/script/runner +0 -0
  74. data/script/server +0 -0
  75. data/script/spec +10 -0
  76. data/script/spec_server +9 -0
  77. data/test/unit/attachment_test.rb +4 -4
  78. data/test/unit/choice_test.rb +1 -1
  79. data/test/unit/elt_test.rb +9 -9
  80. data/test/unit/mail_notify_test.rb +2 -2
  81. data/test/unit/mail_test.rb +18 -11
  82. data/test/unit/person_notify_test.rb +1 -1
  83. data/test/unit/person_test.rb +1 -1
  84. data/test/unit/subscriber_test.rb +1 -1
  85. data/test/unit/user_test.rb +81 -0
  86. data/test/unit/visit_test.rb +6 -6
  87. data/vendor/plugins/activerecord_foreign_key_extensions/init.rb +2 -0
  88. data/vendor/plugins/activerecord_foreign_key_extensions/lib/active_record_extensions.rb +182 -0
  89. data/vendor/plugins/activerecord_text_id_extensions/init.rb +2 -0
  90. data/vendor/plugins/activerecord_text_id_extensions/lib/active_record_extensions.rb +24 -0
  91. data/vendor/plugins/acts_as_nested_set/README +15 -0
  92. data/vendor/plugins/acts_as_nested_set/init.rb +1 -0
  93. data/vendor/plugins/acts_as_nested_set/lib/active_record/acts/nested_set.rb +210 -0
  94. data/vendor/plugins/acts_as_nested_set/test/nested_set_test.rb +269 -0
  95. data/vendor/plugins/acts_as_tree/README +26 -0
  96. data/vendor/plugins/acts_as_tree/Rakefile +22 -0
  97. data/vendor/plugins/acts_as_tree/init.rb +1 -0
  98. data/vendor/plugins/acts_as_tree/lib/active_record/acts/tree.rb +96 -0
  99. data/vendor/plugins/{output_compression/CHANGELOG → acts_as_tree/test/abstract_unit.rb} +0 -0
  100. data/vendor/plugins/acts_as_tree/test/acts_as_tree_test.rb +219 -0
  101. data/vendor/plugins/acts_as_tree/test/database.yml +0 -0
  102. data/vendor/plugins/acts_as_tree/test/fixtures/mixin.rb +0 -0
  103. data/vendor/plugins/acts_as_tree/test/fixtures/mixins.yml +0 -0
  104. data/vendor/plugins/acts_as_tree/test/schema.rb +0 -0
  105. data/vendor/plugins/classic_pagination/CHANGELOG +152 -0
  106. data/vendor/plugins/classic_pagination/README +18 -0
  107. data/vendor/plugins/{output_compression/rakefile → classic_pagination/Rakefile} +22 -22
  108. data/vendor/plugins/classic_pagination/init.rb +33 -0
  109. data/vendor/plugins/classic_pagination/install.rb +1 -0
  110. data/vendor/plugins/classic_pagination/lib/pagination.rb +405 -0
  111. data/vendor/plugins/classic_pagination/lib/pagination_helper.rb +135 -0
  112. data/vendor/plugins/classic_pagination/test/fixtures/companies.yml +24 -0
  113. data/vendor/plugins/classic_pagination/test/fixtures/company.rb +9 -0
  114. data/vendor/plugins/classic_pagination/test/fixtures/developer.rb +7 -0
  115. data/vendor/plugins/classic_pagination/test/fixtures/developers.yml +21 -0
  116. data/vendor/plugins/classic_pagination/test/fixtures/developers_projects.yml +13 -0
  117. data/vendor/plugins/classic_pagination/test/fixtures/project.rb +3 -0
  118. data/vendor/plugins/classic_pagination/test/fixtures/projects.yml +7 -0
  119. data/vendor/plugins/classic_pagination/test/fixtures/replies.yml +13 -0
  120. data/vendor/plugins/classic_pagination/test/fixtures/reply.rb +5 -0
  121. data/vendor/plugins/classic_pagination/test/fixtures/schema.sql +42 -0
  122. data/vendor/plugins/classic_pagination/test/fixtures/topic.rb +3 -0
  123. data/vendor/plugins/classic_pagination/test/fixtures/topics.yml +22 -0
  124. data/vendor/plugins/classic_pagination/test/helper.rb +117 -0
  125. data/vendor/plugins/classic_pagination/test/pagination_helper_test.rb +38 -0
  126. data/vendor/plugins/classic_pagination/test/pagination_test.rb +177 -0
  127. data/vendor/plugins/file_column/lib/file_column.rb +1 -1
  128. data/vendor/plugins/file_column/test/file_column_test.rb +0 -0
  129. metadata +151 -197
  130. data/app/helpers/live_tree.rb +0 -238
  131. data/app/views/elt/_form.rhtml +0 -31
  132. data/app/views/elt/show_tree.rhtml +0 -8
  133. data/config/environments/user_environment.rb +0 -1
  134. data/db/ROOT/Titemagli.txt +0 -3
  135. data/db/ROOT/titemagli.txt +0 -9
  136. data/public/javascripts/behaviour.js +0 -254
  137. data/public/javascripts/ie7-load.htc +0 -1
  138. data/public/javascripts/ie7.js +0 -6
  139. data/public/javascripts/live_tree.js +0 -749
  140. data/public/javascripts/mybehaviour.js +0 -225
  141. data/public/javascripts/scriptaculous.js +0 -47
  142. data/public/javascripts/slider.js +0 -283
  143. data/public/stylesheets/blue.css +0 -471
  144. data/vendor/plugins/engines/CHANGELOG +0 -241
  145. data/vendor/plugins/engines/MIT-LICENSE +0 -21
  146. data/vendor/plugins/engines/README +0 -64
  147. data/vendor/plugins/engines/Rakefile +0 -32
  148. data/vendor/plugins/engines/UPGRADING +0 -93
  149. data/vendor/plugins/engines/about.yml +0 -7
  150. data/vendor/plugins/engines/generators/plugin_migration/USAGE +0 -45
  151. data/vendor/plugins/engines/generators/plugin_migration/plugin_migration_generator.rb +0 -79
  152. data/vendor/plugins/engines/generators/plugin_migration/templates/plugin_migration.erb +0 -13
  153. data/vendor/plugins/engines/init.rb +0 -40
  154. data/vendor/plugins/engines/install.rb +0 -32
  155. data/vendor/plugins/engines/lib/engines.rb +0 -323
  156. data/vendor/plugins/engines/lib/engines/deprecated_config_support.rb +0 -135
  157. data/vendor/plugins/engines/lib/engines/plugin.rb +0 -214
  158. data/vendor/plugins/engines/lib/engines/plugin_list.rb +0 -31
  159. data/vendor/plugins/engines/lib/engines/plugin_migrator.rb +0 -60
  160. data/vendor/plugins/engines/lib/engines/rails_extensions.rb +0 -6
  161. data/vendor/plugins/engines/lib/engines/rails_extensions/active_record.rb +0 -19
  162. data/vendor/plugins/engines/lib/engines/rails_extensions/dependencies.rb +0 -143
  163. data/vendor/plugins/engines/lib/engines/rails_extensions/migrations.rb +0 -155
  164. data/vendor/plugins/engines/lib/engines/rails_extensions/public_asset_helpers.rb +0 -116
  165. data/vendor/plugins/engines/lib/engines/rails_extensions/rails.rb +0 -20
  166. data/vendor/plugins/engines/lib/engines/rails_extensions/rails_initializer.rb +0 -86
  167. data/vendor/plugins/engines/lib/engines/rails_extensions/routing.rb +0 -77
  168. data/vendor/plugins/engines/lib/engines/rails_extensions/templates.rb +0 -140
  169. data/vendor/plugins/engines/lib/engines/testing.rb +0 -87
  170. data/vendor/plugins/engines/tasks/engines.rake +0 -149
  171. data/vendor/plugins/login_engine/CHANGELOG +0 -22
  172. data/vendor/plugins/login_engine/README +0 -344
  173. data/vendor/plugins/login_engine/app/controllers/user_controller.rb +0 -262
  174. data/vendor/plugins/login_engine/app/helpers/user_helper.rb +0 -88
  175. data/vendor/plugins/login_engine/app/models/user.rb +0 -7
  176. data/vendor/plugins/login_engine/app/models/user_notify.rb +0 -75
  177. data/vendor/plugins/login_engine/app/views/user/_edit.rhtml +0 -11
  178. data/vendor/plugins/login_engine/app/views/user/_password.rhtml +0 -9
  179. data/vendor/plugins/login_engine/app/views/user/change_password.rhtml +0 -17
  180. data/vendor/plugins/login_engine/app/views/user/edit.rhtml +0 -23
  181. data/vendor/plugins/login_engine/app/views/user/forgot_password.rhtml +0 -18
  182. data/vendor/plugins/login_engine/app/views/user/home.rhtml +0 -7
  183. data/vendor/plugins/login_engine/app/views/user/login.rhtml +0 -17
  184. data/vendor/plugins/login_engine/app/views/user/logout.rhtml +0 -8
  185. data/vendor/plugins/login_engine/app/views/user/signup.rhtml +0 -17
  186. data/vendor/plugins/login_engine/db/migrate/001_initial_schema.rb +0 -25
  187. data/vendor/plugins/login_engine/init_engine.rb +0 -11
  188. data/vendor/plugins/login_engine/install.rb +0 -4
  189. data/vendor/plugins/login_engine/lib/login_engine.rb +0 -62
  190. data/vendor/plugins/login_engine/lib/login_engine/authenticated_system.rb +0 -113
  191. data/vendor/plugins/login_engine/lib/login_engine/authenticated_user.rb +0 -155
  192. data/vendor/plugins/login_engine/public/stylesheets/login_engine.css +0 -81
  193. data/vendor/plugins/login_engine/test/fixtures/users.yml +0 -41
  194. data/vendor/plugins/login_engine/test/functional/user_controller_test.rb +0 -536
  195. data/vendor/plugins/login_engine/test/mocks/mail.rb +0 -14
  196. data/vendor/plugins/login_engine/test/mocks/time.rb +0 -19
  197. data/vendor/plugins/login_engine/test/test_helper.rb +0 -11
  198. data/vendor/plugins/login_engine/test/unit/user_test.rb +0 -114
  199. data/vendor/plugins/output_compression/MIT-LICENSE +0 -20
  200. data/vendor/plugins/output_compression/README +0 -4
  201. data/vendor/plugins/output_compression/init.rb +0 -1
  202. data/vendor/plugins/output_compression/lib/output_compression.rb +0 -84
  203. data/vendor/plugins/output_compression/test/output_test.rb +0 -11
  204. data/vendor/plugins/output_compression/test/test_controller.rb +0 -3
  205. data/vendor/plugins/output_compression/test/test_helper.rb +0 -14
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ if ARGV.any? {|arg| %w[--drb -X --generate-options -G --help -h --version -v].include?(arg)}
3
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
4
+ else
5
+ gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
6
+ ENV["RAILS_ENV"] ||= 'test'
7
+ require File.expand_path(File.dirname(__FILE__) + "/../config/environment") unless defined?(RAILS_ROOT)
8
+ end
9
+ require 'spec/autorun'
10
+ exit ::Spec::Runner::CommandLine.run
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
3
+
4
+ puts "Loading Rails environment"
5
+ ENV["RAILS_ENV"] ||= 'test'
6
+ require File.expand_path(File.dirname(__FILE__) + "/../config/environment") unless defined?(RAILS_ROOT)
7
+
8
+ require 'optparse'
9
+ require 'spec/rails/spec_server'
@@ -1,11 +1,11 @@
1
1
  require File.dirname(__FILE__) + '/../test_helper'
2
2
 
3
- class AttachmentTest < Test::Unit::TestCase
3
+ class AttachmentTest < ActiveSupport::TestCase
4
4
  fixtures :elts, :mails, :attachments
5
5
 
6
- def setup
7
- @attachment = Attachment.find(0)
8
- end
6
+ def setup
7
+ @attachment = Attachment.find('0')
8
+ end
9
9
 
10
10
  # Replace this with your real tests.
11
11
  def test_truth
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/../test_helper'
2
2
 
3
- class ChoiceTest < Test::Unit::TestCase
3
+ class ChoiceTest < ActiveSupport::TestCase
4
4
  #fixtures :people, :users, :elts, :mails, :attachments, :subscriptions, :choices
5
5
 
6
6
  # Replace this with your real tests.
@@ -1,13 +1,13 @@
1
1
  require File.dirname(__FILE__) + '/../test_helper'
2
2
 
3
- class EltTest < Test::Unit::TestCase
4
- fixtures :people, :users, :elts, :mails, :attachments, :subscriptions
3
+ class EltTest < ActiveSupport::TestCase
4
+ fixtures :people, :users, :elts, :mails, :attachments, :subscriptions
5
5
 
6
- def setup
7
- @elt = Elt.find(1)
8
- end
6
+ def setup
7
+ @elt = Elt.find('1')
8
+ end
9
9
 
10
- def test_generated_id
10
+ def test_generated_id
11
11
  e = @elt.children.new
12
12
  e.subject = "\"Test: /de, .. -\ #?&subject!\""
13
13
  e.body = "Test de body"
@@ -23,9 +23,9 @@ class EltTest < Test::Unit::TestCase
23
23
  @elt.add_child e
24
24
 
25
25
  assert_equal "Test_de_subject_1", e.id
26
- end
26
+ end
27
27
 
28
- def test_vote_hidden_from_view
28
+ def test_vote_hidden_from_view
29
29
  vote = @elt.children.new
30
30
  vote.save
31
31
  @elt.add_child vote
@@ -34,7 +34,7 @@ class EltTest < Test::Unit::TestCase
34
34
 
35
35
  assert_equal -1, vote.result
36
36
  assert_equal 1, vote.parent.result
37
- end
37
+ end
38
38
 
39
39
  def test_position
40
40
  e = @elt.children.new
@@ -1,8 +1,8 @@
1
1
  require File.dirname(__FILE__) + '/../test_helper'
2
2
  require 'mail_notify'
3
3
 
4
- class MailNotifyTest < Test::Unit::TestCase
5
- fixtures :elts, :mails, :attachments, :people, :users, :subscriptions
4
+ class MailNotifyTest < ActiveSupport::TestCase
5
+ fixtures :elts, :mails, :attachments, :people, :users, :subscriptions
6
6
 
7
7
  def setup
8
8
  ActionMailer::Base.delivery_method = :test
@@ -1,11 +1,11 @@
1
1
  require File.dirname(__FILE__) + '/../test_helper'
2
2
 
3
- class MailTest < Test::Unit::TestCase
4
- fixtures :people, :users, :elts, :mails, :attachments, :subscriptions
3
+ class MailTest < ActiveSupport::TestCase
4
+ fixtures :people, :users, :elts, :mails, :attachments, :subscriptions
5
5
 
6
- def setup
7
- @mail = Mail.find(1)
8
- end
6
+ def setup
7
+ @mail = Mail.find('1')
8
+ end
9
9
 
10
10
  def test_receive
11
11
  ActionMailer::Base.deliveries = []
@@ -23,7 +23,7 @@ class MailTest < Test::Unit::TestCase
23
23
  assert_equal (eltsCount + 2), Elt.count
24
24
  # manu@noos.fr, manu@localhost
25
25
  # delivering elt and parent's
26
- assert_equal (deliveredMailsCount + 2), ActionMailer::Base.deliveries.size
26
+ assert_equal (deliveredMailsCount + 3), ActionMailer::Base.deliveries.size
27
27
  assert_equal mailFile.message_id, ActionMailer::Base.deliveries[1].message_id
28
28
  end
29
29
 
@@ -291,7 +291,7 @@ class MailTest < Test::Unit::TestCase
291
291
  deliveredMailsCount = ActionMailer::Base.deliveries.size
292
292
  mail = TMail::Mail.parse(read_fixture('avatar').to_s)
293
293
  elt = Mail.receive(mail).elt
294
- assert_equal deliveredMailsCount + 2, ActionMailer::Base.deliveries.size
294
+ assert_equal deliveredMailsCount + 3, ActionMailer::Base.deliveries.size
295
295
  assert_equal 1, elt.attachments.size
296
296
  assert_equal "image/jpeg", elt.attachments.first.content_type
297
297
  assert_equal 2, ActionMailer::Base.deliveries.last.parts.size
@@ -305,13 +305,20 @@ class MailTest < Test::Unit::TestCase
305
305
  elt = Mail.receive(mail).elt
306
306
  # people and avatar mail!
307
307
  #puts "--------------------------"
308
- assert_equal deliveredMailsCount + 2, ActionMailer::Base.deliveries.size
308
+ assert_equal deliveredMailsCount + 3, ActionMailer::Base.deliveries.size
309
309
 
310
310
  # TODO make sure the pseudo parent has a vote "result"!!!
311
- assert_equal elt.all_recipients.size, PersonMail.count
311
+ assert_equal elt.all_recipients.size, PersonMail.count / 2
312
312
  # Again, to check there is no second sending
313
313
  elt.publish
314
- assert_equal elt.all_recipients.size, PersonMail.count
314
+ assert_equal elt.all_recipients.size, PersonMail.count / 2
315
315
  end
316
- end
317
316
 
317
+ def test_send_and_record_mails
318
+ #puts "test_send_and_record_mails"
319
+ ActionMailer::Base.deliveries = []
320
+ deliveredMailsCount = ActionMailer::Base.deliveries.size
321
+ mail = TMail::Mail.parse(read_fixture('file').to_s)
322
+ elt = Mail.receive(mail).elt
323
+ end
324
+ end
@@ -1,7 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/../test_helper'
2
2
  require 'person_notify'
3
3
 
4
- class PersonNotifyTest < Test::Unit::TestCase
4
+ class PersonNotifyTest < ActiveSupport::TestCase
5
5
  def setup
6
6
  ActionMailer::Base.delivery_method = :test
7
7
  ActionMailer::Base.perform_deliveries = true
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/../test_helper'
2
2
 
3
- class PersonTest < Test::Unit::TestCase
3
+ class PersonTest < ActiveSupport::TestCase
4
4
  #fixtures :people, LoginEngine.config(:user_table).to_sym
5
5
  fixtures :people, :users, :elts, :mails, :attachments, :subscriptions
6
6
 
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/../test_helper'
2
2
 
3
- class SubscriberTest < Test::Unit::TestCase
3
+ class SubscriberTest < ActiveSupport::TestCase
4
4
  fixtures :people, :users, :elts, :mails, :attachments, :subscriptions
5
5
 
6
6
  def setup
@@ -0,0 +1,81 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class UserTest < ActiveSupport::TestCase
4
+ fixtures :users
5
+
6
+ def setup
7
+ LOGIN_ENGINE[:salt] = "test-salt"
8
+ end
9
+
10
+ def test_auth
11
+ assert_equal users(:bob), User.authenticate("bob", "atest")
12
+ assert_nil User.authenticate("nonbob", "atest")
13
+ end
14
+
15
+ def test_passwordchange
16
+ users(:longbob).change_password("nonbobpasswd")
17
+ users(:longbob).save
18
+ assert_equal users(:longbob), User.authenticate("longbob", "nonbobpasswd")
19
+ assert_nil User.authenticate("longbob", "alongtest")
20
+ users(:longbob).change_password("alongtest")
21
+ users(:longbob).save
22
+ assert_equal users(:longbob), User.authenticate("longbob", "alongtest")
23
+ assert_nil User.authenticate("longbob", "nonbobpasswd")
24
+ end
25
+
26
+ def test_disallowed_passwords
27
+ u = User.new
28
+ u.login = "nonbob"
29
+ u.email = "bobs@email.com"
30
+
31
+ u.change_password("tiny")
32
+ assert !u.save
33
+ assert u.errors.invalid?('password')
34
+
35
+ u.change_password("hugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehuge")
36
+ assert !u.save
37
+ assert u.errors.invalid?('password')
38
+
39
+ u.change_password("")
40
+ assert !u.save
41
+ assert u.errors.invalid?('password')
42
+ end
43
+
44
+ def test_bad_logins
45
+ u = User.new
46
+ u.change_password("bobs_secure_password")
47
+ u.email = "bobs@email.com"
48
+
49
+ u.login = "x"
50
+ assert !u.save
51
+ assert u.errors.invalid?('login')
52
+
53
+ u.login = "hugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhug"
54
+ assert !u.save
55
+ assert u.errors.invalid?('login')
56
+
57
+ u.login = ""
58
+ assert !u.save
59
+ assert u.errors.invalid?('login')
60
+ end
61
+
62
+ def test_collision
63
+ u = User.new
64
+ u.login = "existingbob"
65
+ u.change_password("bobs_secure_password")
66
+ assert !u.save
67
+ end
68
+
69
+ def test_email_should_be_nominally_valid
70
+ u = User.new
71
+ u.login = "email_test"
72
+ u.change_password("email_test_password")
73
+
74
+ assert !u.save
75
+ assert u.errors.invalid?('email')
76
+
77
+ u.email = "invalid_email"
78
+ assert !u.save
79
+ assert u.errors.invalid?('email')
80
+ end
81
+ end
@@ -1,10 +1,10 @@
1
1
  require File.dirname(__FILE__) + '/../test_helper'
2
2
 
3
- class VisitTest < Test::Unit::TestCase
4
- fixtures :visits
3
+ class VisitTest < ActiveSupport::TestCase
4
+ fixtures :visits
5
5
 
6
- # Replace this with your real tests.
7
- def test_truth
8
- assert true
9
- end
6
+ # Replace this with your real tests.
7
+ def test_truth
8
+ assert true
9
+ end
10
10
  end
@@ -0,0 +1,2 @@
1
+ require 'active_record/schema_dumper'
2
+ require 'active_record_extensions'
@@ -0,0 +1,182 @@
1
+ # Postgres and MySQL by bubbleware.com
2
+ # Oracle and cleanups by atmos.org
3
+ require 'digest/sha1'
4
+
5
+ module ActiveRecord
6
+ class SchemaDumper
7
+ private
8
+ alias old_tables tables
9
+ def tables(stream)
10
+ old_tables(stream)
11
+ @connection.tables.sort.each do |tbl|
12
+ next if tbl == "schema_info"
13
+ foreign_key_constraints(tbl, stream)
14
+ end
15
+ end
16
+
17
+ def foreign_key_constraints(table, stream)
18
+ keys = @connection.foreign_key_constraints(table)
19
+ keys.each do |key|
20
+ stream.print " add_foreign_key_constraint #{table.inspect}, #{key.foreign_key.inspect}, #{key.reference_table.inspect}, #{key.reference_column.inspect}, :name => #{key.name.inspect}, :on_update => #{key.on_update.inspect}, :on_delete => #{key.on_delete.inspect}"
21
+ stream.puts
22
+ end
23
+ stream.puts unless keys.empty?
24
+ end
25
+ end
26
+
27
+ module ConnectionAdapters
28
+ class ForeignKeyConstraintDefinition < Struct.new(:name, :foreign_key, :reference_table, :reference_column, :on_update, :on_delete) #:nodoc:
29
+ end
30
+
31
+ class AbstractAdapter
32
+ protected
33
+ def symbolize_foreign_key_constraint_action(constraint_action)
34
+ constraint_action.downcase.gsub(/\s/, '_').to_sym
35
+ end
36
+ end
37
+
38
+ class PostgreSQLAdapter < AbstractAdapter
39
+ def foreign_key_constraints(table, name = nil)
40
+ sql = "SELECT conname, pg_catalog.pg_get_constraintdef(oid) AS consrc FROM pg_catalog.pg_constraint WHERE contype='f' "
41
+ sql += "AND conrelid = (SELECT oid FROM pg_catalog.pg_class WHERE relname='#{table}')"
42
+
43
+ query(sql,name).collect do |row|
44
+ if row[1] =~ /FOREIGN KEY \((.+)\) REFERENCES (.+)\((.+)\)(?: ON UPDATE (\w+))?(?: ON DELETE (\w+))?/
45
+ ForeignKeyConstraintDefinition.new(row[0], $1, $2, $3,
46
+ ($4 ? symbolize_foreign_key_constraint_action($4) : nil),
47
+ ($5 ? symbolize_foreign_key_constraint_action($5) : nil))
48
+ end
49
+ end
50
+ end
51
+
52
+ def remove_foreign_key_constraint(table_name, constraint_name)
53
+ execute "ALTER TABLE #{table_name} DROP CONSTRAINT #{constraint_name}"
54
+ end
55
+
56
+ #alias old_default_value default_value
57
+ #def default_value(value)
58
+ # return ":now" if value =~ /^now\(\)|^\('now'::text\)::(date|timestamp)/i
59
+ # return old_default_value(value)
60
+ #end
61
+ end
62
+
63
+ class OracleAdapter < AbstractAdapter
64
+ def foreign_key_constraints(table, name = nil)
65
+ uc = 'user_constraints'
66
+ ucc = 'user_cons_columns'
67
+
68
+ sql = %Q{SELECT
69
+ c.table_name, cc.column_name,
70
+ r.table_name as rtable_name, rc.column_name as rcolumn_name,
71
+ c.delete_rule
72
+ from
73
+ #{uc} c, #{uc} r, #{ucc} cc, #{ucc} rc
74
+ where
75
+ c.constraint_type = 'R' and
76
+ c.table_name = UPPER('#{table}') and
77
+ c.r_constraint_name = r.constraint_name and
78
+ c.constraint_name = cc.constraint_name and
79
+ r.constraint_name = rc.constraint_name and
80
+ cc.position = rc.position}.gsub(/(\n|^\W+)/, ' ')
81
+
82
+ select(sql).collect do |row|
83
+ ForeignKeyConstraintDefinition.new('', row['column_name'].downcase,
84
+ row['rtable_name'].downcase, row['rcolumn_name'].downcase,
85
+ nil, symbolize_foreign_key_constraint_action(row['delete_rule']))
86
+ end
87
+ end
88
+ def remove_foreign_key_constraint(table_name, constraint_name)
89
+ constraint = 'c'+Digest::SHA1.hexdigest(constraint_name)[0,29]
90
+ execute "ALTER TABLE #{table_name} DROP FOREIGN KEY #{constraint}"
91
+ end
92
+ end
93
+
94
+ class MysqlAdapter < AbstractAdapter
95
+ def foreign_key_constraints(table, name = nil)
96
+ constraints = []
97
+ execute("SHOW CREATE TABLE #{table}", name).each do |row|
98
+ row[1].each do |create_line|
99
+ if create_line.strip =~ /CONSTRAINT `([^`]+)` FOREIGN KEY \(`([^`]+)`\) REFERENCES `([^`]+)` \(`([^`]+)`\)([^,]*)/
100
+ constraint = ForeignKeyConstraintDefinition.new(Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3), Regexp.last_match(4), nil, nil)
101
+
102
+ constraint_params = {}
103
+
104
+ unless Regexp.last_match(5).nil?
105
+ Regexp.last_match(5).strip.split('ON ').each do |param|
106
+ constraint_params[Regexp.last_match(1).upcase] = Regexp.last_match(2).strip.upcase if param.strip =~ /([^ ]+) (.+)/
107
+ end
108
+ end
109
+
110
+ constraint.on_update = symbolize_foreign_key_constraint_action(constraint_params['UPDATE']) if constraint_params.include? 'UPDATE'
111
+ constraint.on_delete = symbolize_foreign_key_constraint_action(constraint_params['DELETE']) if constraint_params.include? 'DELETE'
112
+
113
+ constraints << constraint
114
+ end
115
+ end
116
+ end
117
+
118
+ constraints
119
+ end
120
+
121
+ def remove_foreign_key_constraint(table_name, constraint_name)
122
+ execute "ALTER TABLE #{table_name} DROP FOREIGN KEY #{constraint_name}"
123
+ end
124
+ end
125
+ class Column
126
+ private
127
+ alias old_extract_limit extract_limit
128
+ def extract_limit(sql_type)
129
+ return 255 if sql_type =~ /enum/i
130
+ old_extract_limit(sql_type)
131
+ end
132
+
133
+ alias old_simplified_type simplified_type
134
+ def simplified_type(field_type)
135
+ return :string if field_type =~ /enum/i
136
+ old_simplified_type(field_type)
137
+ end
138
+ end
139
+
140
+ module SchemaStatements
141
+ # Adds a new foreign key constraint to the table.
142
+ #
143
+ # The constrinat will be named after the table and the reference table and column
144
+ # unless you pass +:name+ as an option.
145
+ #
146
+ # options: :name, :on_update, :on_delete
147
+ def foreign_key_constraint_statement(condition, fkc_sym)
148
+ action = { :restrict => 'RESTRICT', :cascade => 'CASCADE', :set_null => 'SET NULL' }[fkc_sym]
149
+ action ? ' ON ' << condition << ' ' << action : ''
150
+ end
151
+
152
+ def add_foreign_key_constraint(table_name, foreign_key, reference_table, reference_column, options = {})
153
+ # sqlite and fks don't mix well, http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers
154
+ return if adapter_name =~ /^sqlite/i
155
+ constraint_name = options[:name] || "#{table_name}_ibfk_#{foreign_key}"
156
+
157
+ # oracle chokes on constraints longer than 30 chars
158
+ if adapter_name =~ /^(oci|oracle)$/i
159
+ constraint_name = 'c'+Digest::SHA1.hexdigest(constraint_name)[0,29]
160
+ end
161
+
162
+ sql = "ALTER TABLE #{table_name} ADD CONSTRAINT #{constraint_name} FOREIGN KEY (#{foreign_key}) REFERENCES #{reference_table} (#{reference_column})"
163
+
164
+ sql << foreign_key_constraint_statement('UPDATE', options[:on_update])
165
+ sql << foreign_key_constraint_statement('DELETE', options[:on_delete])
166
+
167
+ execute sql
168
+ end
169
+
170
+ # options: Must enter one of the two options:
171
+ # 1) :name => the name of the foreign key constraint
172
+ # 2) :foreign_key => the name of the column for which the foreign key was created
173
+ # (only if the default constraint_name was used)
174
+ def remove_foreign_key_constraint(table_name, options={})
175
+ constraint_name = options[:name] || "#{table_name}_ibfk_#{foreign_key}"
176
+ raise ArgumentError, "You must specify the constraint name" if constraint_name.blank?
177
+
178
+ @connection.remove_foreign_key_constraint(table_name, constraint_name)
179
+ end
180
+ end
181
+ end
182
+ end