ratnikov-shoulda 2.0.6.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 (103) hide show
  1. data/CONTRIBUTION_GUIDELINES.rdoc +12 -0
  2. data/MIT-LICENSE +22 -0
  3. data/README.rdoc +146 -0
  4. data/Rakefile +72 -0
  5. data/bin/convert_to_should_syntax +42 -0
  6. data/lib/shoulda/action_mailer/assertions.rb +38 -0
  7. data/lib/shoulda/action_mailer.rb +10 -0
  8. data/lib/shoulda/active_record/assertions.rb +90 -0
  9. data/lib/shoulda/active_record/macros.rb +748 -0
  10. data/lib/shoulda/active_record.rb +12 -0
  11. data/lib/shoulda/assertions.rb +47 -0
  12. data/lib/shoulda/context.rb +326 -0
  13. data/lib/shoulda/controller/formats/html.rb +199 -0
  14. data/lib/shoulda/controller/formats/xml.rb +168 -0
  15. data/lib/shoulda/controller/helpers.rb +62 -0
  16. data/lib/shoulda/controller/macros.rb +336 -0
  17. data/lib/shoulda/controller/resource_options.rb +233 -0
  18. data/lib/shoulda/controller.rb +30 -0
  19. data/lib/shoulda/helpers.rb +8 -0
  20. data/lib/shoulda/macros.rb +73 -0
  21. data/lib/shoulda/private_helpers.rb +20 -0
  22. data/lib/shoulda/proc_extensions.rb +14 -0
  23. data/lib/shoulda/rails.rb +19 -0
  24. data/lib/shoulda/tasks/list_tests.rake +24 -0
  25. data/lib/shoulda/tasks/yaml_to_shoulda.rake +28 -0
  26. data/lib/shoulda/tasks.rb +3 -0
  27. data/lib/shoulda.rb +21 -0
  28. data/rails/init.rb +1 -0
  29. data/test/README +36 -0
  30. data/test/fail_macros.rb +34 -0
  31. data/test/fixtures/addresses.yml +3 -0
  32. data/test/fixtures/friendships.yml +0 -0
  33. data/test/fixtures/posts.yml +5 -0
  34. data/test/fixtures/products.yml +0 -0
  35. data/test/fixtures/taggings.yml +0 -0
  36. data/test/fixtures/tags.yml +9 -0
  37. data/test/fixtures/users.yml +6 -0
  38. data/test/functional/posts_controller_test.rb +108 -0
  39. data/test/functional/users_controller_test.rb +38 -0
  40. data/test/other/context_test.rb +161 -0
  41. data/test/other/convert_to_should_syntax_test.rb +63 -0
  42. data/test/other/helpers_test.rb +183 -0
  43. data/test/other/private_helpers_test.rb +34 -0
  44. data/test/other/should_test.rb +266 -0
  45. data/test/rails_root/app/controllers/application.rb +25 -0
  46. data/test/rails_root/app/controllers/posts_controller.rb +86 -0
  47. data/test/rails_root/app/controllers/users_controller.rb +84 -0
  48. data/test/rails_root/app/helpers/application_helper.rb +3 -0
  49. data/test/rails_root/app/helpers/posts_helper.rb +2 -0
  50. data/test/rails_root/app/helpers/users_helper.rb +2 -0
  51. data/test/rails_root/app/models/address.rb +7 -0
  52. data/test/rails_root/app/models/flea.rb +3 -0
  53. data/test/rails_root/app/models/friendship.rb +4 -0
  54. data/test/rails_root/app/models/post.rb +12 -0
  55. data/test/rails_root/app/models/product.rb +12 -0
  56. data/test/rails_root/app/models/tag.rb +8 -0
  57. data/test/rails_root/app/models/tagging.rb +4 -0
  58. data/test/rails_root/app/models/user.rb +28 -0
  59. data/test/rails_root/app/views/layouts/posts.rhtml +19 -0
  60. data/test/rails_root/app/views/layouts/users.rhtml +17 -0
  61. data/test/rails_root/app/views/layouts/wide.html.erb +1 -0
  62. data/test/rails_root/app/views/posts/edit.rhtml +27 -0
  63. data/test/rails_root/app/views/posts/index.rhtml +25 -0
  64. data/test/rails_root/app/views/posts/new.rhtml +26 -0
  65. data/test/rails_root/app/views/posts/show.rhtml +18 -0
  66. data/test/rails_root/app/views/users/edit.rhtml +22 -0
  67. data/test/rails_root/app/views/users/index.rhtml +22 -0
  68. data/test/rails_root/app/views/users/new.rhtml +21 -0
  69. data/test/rails_root/app/views/users/show.rhtml +13 -0
  70. data/test/rails_root/config/boot.rb +109 -0
  71. data/test/rails_root/config/database.yml +4 -0
  72. data/test/rails_root/config/environment.rb +14 -0
  73. data/test/rails_root/config/environments/sqlite3.rb +0 -0
  74. data/test/rails_root/config/initializers/new_rails_defaults.rb +15 -0
  75. data/test/rails_root/config/initializers/shoulda.rb +8 -0
  76. data/test/rails_root/config/routes.rb +6 -0
  77. data/test/rails_root/db/migrate/001_create_users.rb +19 -0
  78. data/test/rails_root/db/migrate/002_create_posts.rb +13 -0
  79. data/test/rails_root/db/migrate/003_create_taggings.rb +12 -0
  80. data/test/rails_root/db/migrate/004_create_tags.rb +11 -0
  81. data/test/rails_root/db/migrate/005_create_dogs.rb +12 -0
  82. data/test/rails_root/db/migrate/006_create_addresses.rb +14 -0
  83. data/test/rails_root/db/migrate/007_create_fleas.rb +11 -0
  84. data/test/rails_root/db/migrate/008_create_dogs_fleas.rb +12 -0
  85. data/test/rails_root/db/migrate/009_create_products.rb +17 -0
  86. data/test/rails_root/db/migrate/010_create_friendships.rb +14 -0
  87. data/test/rails_root/db/schema.rb +0 -0
  88. data/test/rails_root/public/404.html +30 -0
  89. data/test/rails_root/public/422.html +30 -0
  90. data/test/rails_root/public/500.html +30 -0
  91. data/test/rails_root/script/console +3 -0
  92. data/test/rails_root/script/generate +3 -0
  93. data/test/test_helper.rb +33 -0
  94. data/test/unit/address_test.rb +10 -0
  95. data/test/unit/dog_test.rb +10 -0
  96. data/test/unit/flea_test.rb +6 -0
  97. data/test/unit/friendship_test.rb +6 -0
  98. data/test/unit/post_test.rb +19 -0
  99. data/test/unit/product_test.rb +27 -0
  100. data/test/unit/tag_test.rb +14 -0
  101. data/test/unit/tagging_test.rb +6 -0
  102. data/test/unit/user_test.rb +60 -0
  103. metadata +189 -0
@@ -0,0 +1,18 @@
1
+ <p>
2
+ <b>User:</b>
3
+ <%=h @post.user_id %>
4
+ </p>
5
+
6
+ <p>
7
+ <b>Title:</b>
8
+ <%=h @post.title %>
9
+ </p>
10
+
11
+ <p>
12
+ <b>Body:</b>
13
+ <%=h @post.body %>
14
+ </p>
15
+
16
+
17
+ <%= link_to 'Edit', edit_user_post_path(@post.user, @post) %> |
18
+ <%= link_to 'Back', user_posts_path(@post.user) %>
@@ -0,0 +1,22 @@
1
+ <h1>Editing user</h1>
2
+
3
+ <%= error_messages_for :user %>
4
+
5
+ <% form_for(:user, :url => user_path(@user), :html => { :method => :put }) do |f| %>
6
+ <p>
7
+ <b>Email</b><br />
8
+ <%= f.text_field :email %>
9
+ </p>
10
+
11
+ <p>
12
+ <b>Age</b><br />
13
+ <%= f.text_field :age %>
14
+ </p>
15
+
16
+ <p>
17
+ <%= submit_tag "Update" %>
18
+ </p>
19
+ <% end %>
20
+
21
+ <%= link_to 'Show', user_path(@user) %> |
22
+ <%= link_to 'Back', users_path %>
@@ -0,0 +1,22 @@
1
+ <h1>Listing users</h1>
2
+
3
+ <table>
4
+ <tr>
5
+ <th>Email</th>
6
+ <th>Age</th>
7
+ </tr>
8
+
9
+ <% for user in @users %>
10
+ <tr>
11
+ <td><%=h user.email %></td>
12
+ <td><%=h user.age %></td>
13
+ <td><%= link_to 'Show', user_path(user) %></td>
14
+ <td><%= link_to 'Edit', edit_user_path(user) %></td>
15
+ <td><%= link_to 'Destroy', user_path(user), :confirm => 'Are you sure?', :method => :delete %></td>
16
+ </tr>
17
+ <% end %>
18
+ </table>
19
+
20
+ <br />
21
+
22
+ <%= link_to 'New user', new_user_path %>
@@ -0,0 +1,21 @@
1
+ <h1>New user</h1>
2
+
3
+ <%= error_messages_for :user %>
4
+
5
+ <% form_for(:user, :url => users_path) do |f| %>
6
+ <p>
7
+ <b>Email</b><br />
8
+ <%= f.text_field :email %>
9
+ </p>
10
+
11
+ <p>
12
+ <b>Age</b><br />
13
+ <%= f.text_field :age %>
14
+ </p>
15
+
16
+ <p>
17
+ <%= submit_tag "Create" %>
18
+ </p>
19
+ <% end %>
20
+
21
+ <%= link_to 'Back', users_path %>
@@ -0,0 +1,13 @@
1
+ <p>
2
+ <b>Email:</b>
3
+ <%=h @user.email %>
4
+ </p>
5
+
6
+ <p>
7
+ <b>Age:</b>
8
+ <%=h @user.age %>
9
+ </p>
10
+
11
+
12
+ <%= link_to 'Edit', edit_user_path(@user) %> |
13
+ <%= link_to 'Back', users_path %>
@@ -0,0 +1,109 @@
1
+ # Don't change this file!
2
+ # Configure your app in config/environment.rb and config/environments/*.rb
3
+
4
+ RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
5
+
6
+ module Rails
7
+ class << self
8
+ def boot!
9
+ unless booted?
10
+ preinitialize
11
+ pick_boot.run
12
+ end
13
+ end
14
+
15
+ def booted?
16
+ defined? Rails::Initializer
17
+ end
18
+
19
+ def pick_boot
20
+ (vendor_rails? ? VendorBoot : GemBoot).new
21
+ end
22
+
23
+ def vendor_rails?
24
+ File.exist?("#{RAILS_ROOT}/vendor/rails")
25
+ end
26
+
27
+ def preinitialize
28
+ load(preinitializer_path) if File.exist?(preinitializer_path)
29
+ end
30
+
31
+ def preinitializer_path
32
+ "#{RAILS_ROOT}/config/preinitializer.rb"
33
+ end
34
+ end
35
+
36
+ class Boot
37
+ def run
38
+ load_initializer
39
+ Rails::Initializer.run(:set_load_path)
40
+ end
41
+ end
42
+
43
+ class VendorBoot < Boot
44
+ def load_initializer
45
+ require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
46
+ Rails::Initializer.run(:install_gem_spec_stubs)
47
+ end
48
+ end
49
+
50
+ class GemBoot < Boot
51
+ def load_initializer
52
+ self.class.load_rubygems
53
+ load_rails_gem
54
+ require 'initializer'
55
+ end
56
+
57
+ def load_rails_gem
58
+ if version = self.class.gem_version
59
+ gem 'rails', version
60
+ else
61
+ gem 'rails'
62
+ end
63
+ rescue Gem::LoadError => load_error
64
+ $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
65
+ exit 1
66
+ end
67
+
68
+ class << self
69
+ def rubygems_version
70
+ Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion
71
+ end
72
+
73
+ def gem_version
74
+ if defined? RAILS_GEM_VERSION
75
+ RAILS_GEM_VERSION
76
+ elsif ENV.include?('RAILS_GEM_VERSION')
77
+ ENV['RAILS_GEM_VERSION']
78
+ else
79
+ parse_gem_version(read_environment_rb)
80
+ end
81
+ end
82
+
83
+ def load_rubygems
84
+ require 'rubygems'
85
+
86
+ unless rubygems_version >= '0.9.4'
87
+ $stderr.puts %(Rails requires RubyGems >= 0.9.4 (you have #{rubygems_version}). Please `gem update --system` and try again.)
88
+ exit 1
89
+ end
90
+
91
+ rescue LoadError
92
+ $stderr.puts %(Rails requires RubyGems >= 0.9.4. Please install RubyGems and try again: http://rubygems.rubyforge.org)
93
+ exit 1
94
+ end
95
+
96
+ def parse_gem_version(text)
97
+ $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
98
+ end
99
+
100
+ private
101
+ def read_environment_rb
102
+ File.read("#{RAILS_ROOT}/config/environment.rb")
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ # All that for this:
109
+ Rails.boot!
@@ -0,0 +1,4 @@
1
+ sqlite3:
2
+ :adapter: sqlite3
3
+ # :dbfile: db/sqlite3.db
4
+ :dbfile: ":memory:"
@@ -0,0 +1,14 @@
1
+ # Specifies gem version of Rails to use when vendor/rails is not present
2
+ old_verbose, $VERBOSE = $VERBOSE, nil
3
+ RAILS_GEM_VERSION = '>= 2.1.0' unless defined? RAILS_GEM_VERSION
4
+ $VERBOSE = old_verbose
5
+
6
+ require File.join(File.dirname(__FILE__), 'boot')
7
+
8
+ Rails::Initializer.run do |config|
9
+ config.log_level = :debug
10
+ config.cache_classes = false
11
+ config.whiny_nils = true
12
+ end
13
+
14
+ # Dependencies.log_activity = true
File without changes
@@ -0,0 +1,15 @@
1
+ # These settings change the behavior of Rails 2 apps and will be defaults
2
+ # for Rails 3. You can remove this initializer when Rails 3 is released.
3
+
4
+ # Include Active Record class name as root for JSON serialized output.
5
+ ActiveRecord::Base.include_root_in_json = true
6
+
7
+ # Store the full class name (including module namespace) in STI type column.
8
+ ActiveRecord::Base.store_full_sti_class = true
9
+
10
+ # Use ISO 8601 format for JSON serialized times and dates.
11
+ ActiveSupport.use_standard_json_time_format = true
12
+
13
+ # Don't escape HTML entities in JSON, leave that for the #json_escape helper.
14
+ # if you're including raw json in an HTML page.
15
+ ActiveSupport.escape_html_entities_in_json = false
@@ -0,0 +1,8 @@
1
+ # This simulates loading the shoulda plugin, but without relying on
2
+ # vendor/plugins
3
+
4
+ shoulda_path = File.join(File.dirname(__FILE__), *%w(.. .. .. ..))
5
+ shoulda_lib_path = File.join(shoulda_path, "lib")
6
+
7
+ $LOAD_PATH.unshift(shoulda_lib_path)
8
+ load File.join(shoulda_path, "init.rb")
@@ -0,0 +1,6 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+
3
+ map.resources :posts
4
+ map.resources :users, :has_many => :posts
5
+
6
+ end
@@ -0,0 +1,19 @@
1
+ class CreateUsers < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :users do |t|
4
+ t.column :name, :string
5
+ t.column :email, :string
6
+ t.column :age, :integer
7
+ t.column :ssn, :string
8
+ t.column :phone, :string
9
+ end
10
+ add_index :users, :email, :unique => true
11
+ add_index :users, :name
12
+ add_index :users, :age
13
+ add_index :users, [:email, :name], :unique => true
14
+ end
15
+
16
+ def self.down
17
+ drop_table :users
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ class CreatePosts < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :posts do |t|
4
+ t.column :user_id, :integer
5
+ t.column :title, :string
6
+ t.column :body, :text
7
+ end
8
+ end
9
+
10
+ def self.down
11
+ drop_table :posts
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ class CreateTaggings < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :taggings do |t|
4
+ t.column :post_id, :integer
5
+ t.column :tag_id, :integer
6
+ end
7
+ end
8
+
9
+ def self.down
10
+ drop_table :taggings
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ class CreateTags < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :tags do |t|
4
+ t.column :name, :string
5
+ end
6
+ end
7
+
8
+ def self.down
9
+ drop_table :tags
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ class CreateDogs < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :dogs do |t|
4
+ t.column :owner_id, :integer
5
+ t.column :address_id, :integer
6
+ end
7
+ end
8
+
9
+ def self.down
10
+ drop_table :dogs
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ class CreateAddresses < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :addresses do |t|
4
+ t.column :title, :string
5
+ t.column :addressable_id, :integer
6
+ t.column :addressable_type, :string
7
+ t.column :zip, :string
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :addresses
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ class CreateFleas < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :fleas do |t|
4
+ t.string :name
5
+ end
6
+ end
7
+
8
+ def self.down
9
+ drop_table :fleas
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ class CreateDogsFleas < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :dogs_fleas do |t|
4
+ t.integer :dog_id
5
+ t.integer :flea_id
6
+ end
7
+ end
8
+
9
+ def self.down
10
+ drop_table :dogs_fleas
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ class CreateProducts < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :products do |t|
4
+ t.string :title
5
+ t.integer :price
6
+ t.integer :weight
7
+ t.string :size
8
+ t.boolean :tangible
9
+
10
+ t.timestamps
11
+ end
12
+ end
13
+
14
+ def self.down
15
+ drop_table :products
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ class CreateFriendships < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :friendships do |t|
4
+ t.integer :user_id
5
+ t.integer :friend_id
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :friendships
13
+ end
14
+ end
File without changes
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+
6
+ <head>
7
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
8
+ <title>The page you were looking for doesn't exist (404)</title>
9
+ <style type="text/css">
10
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
11
+ div.dialog {
12
+ width: 25em;
13
+ padding: 0 4em;
14
+ margin: 4em auto 0 auto;
15
+ border: 1px solid #ccc;
16
+ border-right-color: #999;
17
+ border-bottom-color: #999;
18
+ }
19
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
20
+ </style>
21
+ </head>
22
+
23
+ <body>
24
+ <!-- This file lives in public/404.html -->
25
+ <div class="dialog">
26
+ <h1>The page you were looking for doesn't exist.</h1>
27
+ <p>You may have mistyped the address or the page may have moved.</p>
28
+ </div>
29
+ </body>
30
+ </html>
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+
6
+ <head>
7
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
8
+ <title>The change you wanted was rejected (422)</title>
9
+ <style type="text/css">
10
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
11
+ div.dialog {
12
+ width: 25em;
13
+ padding: 0 4em;
14
+ margin: 4em auto 0 auto;
15
+ border: 1px solid #ccc;
16
+ border-right-color: #999;
17
+ border-bottom-color: #999;
18
+ }
19
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
20
+ </style>
21
+ </head>
22
+
23
+ <body>
24
+ <!-- This file lives in public/422.html -->
25
+ <div class="dialog">
26
+ <h1>The change you wanted was rejected.</h1>
27
+ <p>Maybe you tried to change something you didn't have access to.</p>
28
+ </div>
29
+ </body>
30
+ </html>
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+
6
+ <head>
7
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
8
+ <title>We're sorry, but something went wrong (500)</title>
9
+ <style type="text/css">
10
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
11
+ div.dialog {
12
+ width: 25em;
13
+ padding: 0 4em;
14
+ margin: 4em auto 0 auto;
15
+ border: 1px solid #ccc;
16
+ border-right-color: #999;
17
+ border-bottom-color: #999;
18
+ }
19
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
20
+ </style>
21
+ </head>
22
+
23
+ <body>
24
+ <!-- This file lives in public/500.html -->
25
+ <div class="dialog">
26
+ <h1>We're sorry, but something went wrong.</h1>
27
+ <p>We've been notified about this issue and we'll take a look at it shortly.</p>
28
+ </div>
29
+ </body>
30
+ </html>
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../config/boot'
3
+ require 'commands/console'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../config/boot'
3
+ require 'commands/generate'
@@ -0,0 +1,33 @@
1
+ require 'fileutils'
2
+ # Load the environment
3
+ ENV['RAILS_ENV'] = 'sqlite3'
4
+
5
+ rails_root = File.dirname(__FILE__) + '/rails_root'
6
+
7
+ require "#{rails_root}/config/environment.rb"
8
+
9
+ # Load the testing framework
10
+ require 'test_help'
11
+ silence_warnings { RAILS_ENV = ENV['RAILS_ENV'] }
12
+
13
+ # Run the migrations
14
+ ActiveRecord::Migration.verbose = false
15
+ ActiveRecord::Migrator.migrate("#{RAILS_ROOT}/db/migrate")
16
+
17
+ # Setup the fixtures path
18
+ Test::Unit::TestCase.fixture_path = File.join(File.dirname(__FILE__), "fixtures")
19
+
20
+ class Test::Unit::TestCase #:nodoc:
21
+ def create_fixtures(*table_names)
22
+ if block_given?
23
+ Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names) { yield }
24
+ else
25
+ Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names)
26
+ end
27
+ end
28
+
29
+ self.use_transactional_fixtures = false
30
+ self.use_instantiated_fixtures = false
31
+ end
32
+
33
+ require 'test/fail_macros'
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class AddressTest < Test::Unit::TestCase
4
+ fixtures :all
5
+
6
+ should_belong_to :addressable
7
+ should_require_unique_attributes :title, :scoped_to => [:addressable_id, :addressable_type]
8
+ should_ensure_length_at_least :zip, 5
9
+ should_only_allow_numeric_values_for :zip
10
+ end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class Pets::DogTest < Test::Unit::TestCase
4
+ should_belong_to :user
5
+ should_belong_to :address, :dependent => :destroy
6
+ should_have_many :treats
7
+ should_have_and_belong_to_many :fleas
8
+ should_require_attributes :treats, :fleas
9
+ should_require_attributes :owner_id
10
+ end
@@ -0,0 +1,6 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class FleaTest < Test::Unit::TestCase
4
+ should_have_and_belong_to_many :dogs
5
+ end
6
+
@@ -0,0 +1,6 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class FriendshipTest < ActiveSupport::TestCase
4
+ should_belong_to :user
5
+ should_belong_to :friend
6
+ end
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class PostTest < Test::Unit::TestCase
4
+ fixtures :all
5
+
6
+ should_belong_to :user
7
+ should_belong_to :owner
8
+ should_have_many :tags, :through => :taggings
9
+ should_have_many :through_tags, :through => :taggings
10
+
11
+ should_require_unique_attributes :title
12
+ should_require_attributes :body, :message => /wtf/
13
+ should_require_attributes :title
14
+ should_only_allow_numeric_values_for :user_id
15
+
16
+ should_fail do
17
+ should_require_unique_attributes :title, :case_sensitive => false
18
+ end
19
+ end
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class ProductTest < ActiveSupport::TestCase
4
+ context "An intangible product" do
5
+ setup do
6
+ @product = Product.new(:tangible => false)
7
+ end
8
+
9
+ should_require_attributes :title
10
+ should_not_allow_values_for :size, "22"
11
+ should_allow_values_for :size, "22kb"
12
+ should_ensure_value_in_range :price, 0..99
13
+ end
14
+
15
+ context "A tangible product" do
16
+ setup do
17
+ @product = Product.new(:tangible => true)
18
+ end
19
+
20
+ should_require_attributes :price
21
+ should_ensure_value_in_range :price, 1..9999
22
+ should_ensure_value_in_range :weight, 1..100
23
+ should_not_allow_values_for :size, "22", "10x15"
24
+ should_allow_values_for :size, "12x12x1"
25
+ should_ensure_length_in_range :size, 5..20
26
+ end
27
+ end
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class TagTest < Test::Unit::TestCase
4
+ should_have_many :taggings, :dependent => :destroy
5
+ should_have_many :posts
6
+
7
+ should_ensure_length_at_least :name, 2
8
+
9
+ should_protect_attributes :secret
10
+
11
+ should_fail do
12
+ should_protect_attributes :name
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class TaggingTest < Test::Unit::TestCase
4
+ should_belong_to :post
5
+ should_belong_to :tag
6
+ end