simple_form_class 0.9.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.
Files changed (94) hide show
  1. data/.gitignore +28 -0
  2. data/.travis.yml +19 -0
  3. data/Gemfile +27 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +31 -0
  6. data/Rakefile +45 -0
  7. data/lib/simple_form_class.rb +10 -0
  8. data/lib/simple_form_class/base.rb +212 -0
  9. data/lib/simple_form_class/version.rb +3 -0
  10. data/simple_form_class.gemspec +33 -0
  11. data/test/.gitkeep +0 -0
  12. data/test/dummy/.gitignore +15 -0
  13. data/test/dummy/Gemfile +38 -0
  14. data/test/dummy/README.rdoc +261 -0
  15. data/test/dummy/Rakefile +7 -0
  16. data/test/dummy/app/assets/images/rails.png +0 -0
  17. data/test/dummy/app/assets/javascripts/application.js +15 -0
  18. data/test/dummy/app/assets/javascripts/orders.js.coffee +3 -0
  19. data/test/dummy/app/assets/javascripts/products.js.coffee +3 -0
  20. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  21. data/test/dummy/app/assets/stylesheets/orders.css.scss +3 -0
  22. data/test/dummy/app/assets/stylesheets/products.css.scss +3 -0
  23. data/test/dummy/app/assets/stylesheets/scaffolds.css.scss +69 -0
  24. data/test/dummy/app/controllers/application_controller.rb +3 -0
  25. data/test/dummy/app/controllers/orders_controller.rb +83 -0
  26. data/test/dummy/app/controllers/products_controller.rb +83 -0
  27. data/test/dummy/app/helpers/application_helper.rb +2 -0
  28. data/test/dummy/app/helpers/orders_helper.rb +2 -0
  29. data/test/dummy/app/helpers/products_helper.rb +2 -0
  30. data/test/dummy/app/mailers/.gitkeep +0 -0
  31. data/test/dummy/app/models/.gitkeep +0 -0
  32. data/test/dummy/app/models/order.rb +2 -0
  33. data/test/dummy/app/models/product.rb +2 -0
  34. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  35. data/test/dummy/app/views/orders/_form.html.erb +29 -0
  36. data/test/dummy/app/views/orders/edit.html.erb +6 -0
  37. data/test/dummy/app/views/orders/index.html.erb +27 -0
  38. data/test/dummy/app/views/orders/new.html.erb +5 -0
  39. data/test/dummy/app/views/orders/show.html.erb +20 -0
  40. data/test/dummy/app/views/products/_form.html.erb +25 -0
  41. data/test/dummy/app/views/products/edit.html.erb +6 -0
  42. data/test/dummy/app/views/products/index.html.erb +25 -0
  43. data/test/dummy/app/views/products/new.html.erb +5 -0
  44. data/test/dummy/app/views/products/show.html.erb +15 -0
  45. data/test/dummy/config.ru +4 -0
  46. data/test/dummy/config/application.rb +64 -0
  47. data/test/dummy/config/boot.rb +6 -0
  48. data/test/dummy/config/database.yml +25 -0
  49. data/test/dummy/config/environment.rb +5 -0
  50. data/test/dummy/config/environments/development.rb +24 -0
  51. data/test/dummy/config/environments/production.rb +55 -0
  52. data/test/dummy/config/environments/test.rb +25 -0
  53. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  54. data/test/dummy/config/initializers/inflections.rb +15 -0
  55. data/test/dummy/config/initializers/mime_types.rb +5 -0
  56. data/test/dummy/config/initializers/secret_token.rb +7 -0
  57. data/test/dummy/config/initializers/session_store.rb +8 -0
  58. data/test/dummy/config/locales/en.yml +5 -0
  59. data/test/dummy/config/routes.rb +64 -0
  60. data/test/dummy/db/migrate/20130420130732_create_products.rb +10 -0
  61. data/test/dummy/db/migrate/20130420130801_create_orders.rb +11 -0
  62. data/test/dummy/db/schema.rb +31 -0
  63. data/test/dummy/db/seeds.rb +7 -0
  64. data/test/dummy/lib/assets/.gitkeep +0 -0
  65. data/test/dummy/lib/tasks/.gitkeep +0 -0
  66. data/test/dummy/log/.gitkeep +0 -0
  67. data/test/dummy/public/404.html +26 -0
  68. data/test/dummy/public/422.html +26 -0
  69. data/test/dummy/public/500.html +25 -0
  70. data/test/dummy/public/favicon.ico +0 -0
  71. data/test/dummy/public/index.html +241 -0
  72. data/test/dummy/public/robots.txt +5 -0
  73. data/test/dummy/script/rails +6 -0
  74. data/test/dummy/test/fixtures/.gitkeep +0 -0
  75. data/test/dummy/test/fixtures/orders.yml +11 -0
  76. data/test/dummy/test/fixtures/products.yml +9 -0
  77. data/test/dummy/test/functional/.gitkeep +0 -0
  78. data/test/dummy/test/functional/orders_controller_test.rb +49 -0
  79. data/test/dummy/test/functional/products_controller_test.rb +49 -0
  80. data/test/dummy/test/integration/.gitkeep +0 -0
  81. data/test/dummy/test/performance/browsing_test.rb +12 -0
  82. data/test/dummy/test/test_helper.rb +13 -0
  83. data/test/dummy/test/unit/.gitkeep +0 -0
  84. data/test/dummy/test/unit/helpers/orders_helper_test.rb +4 -0
  85. data/test/dummy/test/unit/helpers/products_helper_test.rb +4 -0
  86. data/test/dummy/test/unit/order_test.rb +7 -0
  87. data/test/dummy/test/unit/product_test.rb +7 -0
  88. data/test/dummy/vendor/assets/javascripts/.gitkeep +0 -0
  89. data/test/dummy/vendor/assets/stylesheets/.gitkeep +0 -0
  90. data/test/dummy/vendor/plugins/.gitkeep +0 -0
  91. data/test/support/dummy_app.rb +86 -0
  92. data/test/test_helper.rb +66 -0
  93. data/test/unit/base_test.rb +210 -0
  94. metadata +405 -0
@@ -0,0 +1,5 @@
1
+ # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
2
+ #
3
+ # To ban all spiders from the entire site uncomment the next two lines:
4
+ # User-Agent: *
5
+ # Disallow: /
@@ -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'
File without changes
@@ -0,0 +1,11 @@
1
+ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html
2
+
3
+ one:
4
+ product_id: 1
5
+ order_number: MyString
6
+ price: 1
7
+
8
+ two:
9
+ product_id: 1
10
+ order_number: MyString
11
+ price: 1
@@ -0,0 +1,9 @@
1
+ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html
2
+
3
+ one:
4
+ name: MyString
5
+ price: 1
6
+
7
+ two:
8
+ name: MyString
9
+ price: 1
File without changes
@@ -0,0 +1,49 @@
1
+ require 'test_helper'
2
+
3
+ class OrdersControllerTest < ActionController::TestCase
4
+ setup do
5
+ @order = orders(:one)
6
+ end
7
+
8
+ test "should get index" do
9
+ get :index
10
+ assert_response :success
11
+ assert_not_nil assigns(:orders)
12
+ end
13
+
14
+ test "should get new" do
15
+ get :new
16
+ assert_response :success
17
+ end
18
+
19
+ test "should create order" do
20
+ assert_difference('Order.count') do
21
+ post :create, order: { order_number: @order.order_number, price: @order.price, product_id: @order.product_id }
22
+ end
23
+
24
+ assert_redirected_to order_path(assigns(:order))
25
+ end
26
+
27
+ test "should show order" do
28
+ get :show, id: @order
29
+ assert_response :success
30
+ end
31
+
32
+ test "should get edit" do
33
+ get :edit, id: @order
34
+ assert_response :success
35
+ end
36
+
37
+ test "should update order" do
38
+ put :update, id: @order, order: { order_number: @order.order_number, price: @order.price, product_id: @order.product_id }
39
+ assert_redirected_to order_path(assigns(:order))
40
+ end
41
+
42
+ test "should destroy order" do
43
+ assert_difference('Order.count', -1) do
44
+ delete :destroy, id: @order
45
+ end
46
+
47
+ assert_redirected_to orders_path
48
+ end
49
+ end
@@ -0,0 +1,49 @@
1
+ require 'test_helper'
2
+
3
+ class ProductsControllerTest < ActionController::TestCase
4
+ setup do
5
+ @product = products(:one)
6
+ end
7
+
8
+ test "should get index" do
9
+ get :index
10
+ assert_response :success
11
+ assert_not_nil assigns(:products)
12
+ end
13
+
14
+ test "should get new" do
15
+ get :new
16
+ assert_response :success
17
+ end
18
+
19
+ test "should create product" do
20
+ assert_difference('Product.count') do
21
+ post :create, product: { name: @product.name, price: @product.price }
22
+ end
23
+
24
+ assert_redirected_to product_path(assigns(:product))
25
+ end
26
+
27
+ test "should show product" do
28
+ get :show, id: @product
29
+ assert_response :success
30
+ end
31
+
32
+ test "should get edit" do
33
+ get :edit, id: @product
34
+ assert_response :success
35
+ end
36
+
37
+ test "should update product" do
38
+ put :update, id: @product, product: { name: @product.name, price: @product.price }
39
+ assert_redirected_to product_path(assigns(:product))
40
+ end
41
+
42
+ test "should destroy product" do
43
+ assert_difference('Product.count', -1) do
44
+ delete :destroy, id: @product
45
+ end
46
+
47
+ assert_redirected_to products_path
48
+ end
49
+ end
File without changes
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+ require 'rails/performance_test_help'
3
+
4
+ class BrowsingTest < ActionDispatch::PerformanceTest
5
+ # Refer to the documentation for all available options
6
+ # self.profile_options = { :runs => 5, :metrics => [:wall_time, :memory]
7
+ # :output => 'tmp/performance', :formats => [:flat] }
8
+
9
+ def test_homepage
10
+ get '/'
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path('../../config/environment', __FILE__)
3
+ require 'rails/test_help'
4
+
5
+ class ActiveSupport::TestCase
6
+ # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
7
+ #
8
+ # Note: You'll currently still have to declare fixtures explicitly in integration tests
9
+ # -- they do not yet inherit this setting
10
+ fixtures :all
11
+
12
+ # Add more helper methods to be used by all tests here...
13
+ end
File without changes
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ class OrdersHelperTest < ActionView::TestCase
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ class ProductsHelperTest < ActionView::TestCase
4
+ end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class OrderTest < ActiveSupport::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class ProductTest < ActiveSupport::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
File without changes
@@ -0,0 +1,86 @@
1
+ require 'socket'
2
+ require 'net/http'
3
+
4
+ # Adapted from code by Jon Leighton and adopted from Draper gem
5
+ # https://github.com/jonleighton/focused_controller/blob/ec7ccf1/test/acceptance/app_test.rb
6
+ # https://github.com/drapergem/draper
7
+
8
+ class DummyApp
9
+
10
+ def initialize(environment)
11
+ raise ArgumentError, "Environment must be development or production" unless ["development", "production"].include?(environment.to_s)
12
+ @environment = environment
13
+ end
14
+
15
+ attr_reader :environment
16
+
17
+ def url
18
+ "http://#{localhost}:#{port}"
19
+ end
20
+
21
+ def get(path)
22
+ Net::HTTP.get(URI(url + path))
23
+ end
24
+
25
+ def within_app(&block)
26
+ Dir.chdir(root, &block)
27
+ end
28
+
29
+ def start_server
30
+ within_app do
31
+ IO.popen("bundle exec rails s -e #{@environment} -p #{port} 2>&1") do |out|
32
+ start = Time.now
33
+ started = false
34
+ output = ""
35
+ timeout = 60.0
36
+
37
+ while !started && !out.eof? && Time.now - start <= timeout
38
+ output << read_output(out)
39
+ sleep 0.1
40
+
41
+ begin
42
+ TCPSocket.new(localhost, port)
43
+ rescue Errno::ECONNREFUSED
44
+ else
45
+ started = true
46
+ end
47
+ end
48
+
49
+ raise "Server failed to start:\n#{output}" unless started
50
+
51
+ yield
52
+
53
+ Process.kill("KILL", out.pid)
54
+ File.delete("tmp/pids/server.pid")
55
+ end
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def root
62
+ File.expand_path("../../dummy", __FILE__)
63
+ end
64
+
65
+ def localhost
66
+ "127.0.0.1"
67
+ end
68
+
69
+ def port
70
+ @port ||= begin
71
+ server = TCPServer.new(localhost, 0)
72
+ server.addr[1]
73
+ ensure
74
+ server.close if server
75
+ end
76
+ end
77
+
78
+ def read_output(stream)
79
+ read = IO.select([stream], [], [stream], 0.1)
80
+ output = ""
81
+ loop { output << stream.read_nonblock(1024) } if read
82
+ output
83
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK, EOFError
84
+ output
85
+ end
86
+ end
@@ -0,0 +1,66 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path('../dummy/config/environment', __FILE__)
3
+ require File.expand_path('../../lib/simple_form_class', __FILE__)
4
+
5
+ require "minitest/autorun"
6
+ require "minitest/unit"
7
+ require "minitest/rails/shoulda"
8
+
9
+
10
+
11
+ class MiniTest::Spec
12
+
13
+ def assert_difference command, expected_delta, message = 'difference must be equal'
14
+ rv = eval command
15
+ yield
16
+ delta = eval(command) - rv
17
+
18
+ assert_equal expected_delta, delta, message
19
+ end
20
+
21
+ # asserts an object does not pass validation, for example:
22
+ #
23
+ # test for invalid on one and two attributes with no specific messages:
24
+ #
25
+ # assert_invalid @user_card, :masked_pan, 'second user_card'
26
+ # assert_invalid @user_card, [:masked_pan, :hashed_pan], 'second user_card'
27
+ #
28
+ # test for invalid on one and attributes with specific messages - please note
29
+ # that validation messages are often used to configure display of certain messages
30
+ # in the view layer, this is why using specific messages may lead to brittle
31
+ # tests that result in false positive assertions after view layer changes
32
+ #
33
+ # assert_invalid @user_card, {:masked_pan => 'has already been taken'}, 'second user_card'
34
+ # assert_invalid @user_card, {:masked_pan => 'has already been taken', :hashed_pan => 'is not a hash'}, 'second user_card'
35
+ def assert_invalid object, errors, message = nil
36
+ refute object.valid?, [message, 'expected to be invalid'].compact.join(': ')
37
+
38
+ errors = [errors] unless errors.respond_to? :each
39
+
40
+ errors.each do |attribute, error_message|
41
+ assert object.errors.messages.has_key?(attribute),
42
+ [message, "expected to have a validation error on #{attribute}, but got #{object.errors.messages}"].compact.join(': ')
43
+
44
+ if error_message
45
+ assert object.errors.messages[attribute].include?(error_message),
46
+ [message, "expected to have a validation error for '#{error_message}' on #{attribute}, got #{object.errors.messages[attribute]}"].compact.join(': ')
47
+ end
48
+ end
49
+ end
50
+
51
+ # asserts an object is valid, for example:
52
+ #
53
+ # assert_valid user_card, 'first user_card'
54
+ # c1.save # will always pass
55
+ def assert_valid object, message = nil
56
+ # Rails 3.0 have error_messages, Rails > 3.0 have errors.messages
57
+ error_messages = if ENV['RAILS_VERSION'] == '3.0'
58
+ object.errors.full_messages
59
+ else
60
+ object.errors.messages
61
+ end
62
+
63
+ assert object.valid?, [message, "expected to be valid, got #{error_messages}"].compact.join(': ')
64
+ end
65
+
66
+ end
@@ -0,0 +1,210 @@
1
+ require 'test_helper'
2
+
3
+ class BaseTest < MiniTest::Spec
4
+
5
+ # TODO: make the rake job work, bundle exec ruby -I lib -I test test/unit/*_test.rb
6
+
7
+ class TestException < Exception; end
8
+
9
+ NON_YIELD_CALLBACKS = [:before_save, :after_save, :before_initialize, :after_initialize,
10
+ :before_validation, :after_validation
11
+ ]
12
+ YIELD_CALLBACKS = [:around_save, :around_initialize, :around_validation]
13
+ CALLBACKS = NON_YIELD_CALLBACKS + YIELD_CALLBACKS
14
+
15
+ context :callbacks do
16
+
17
+ should "get triggered on class methods" do
18
+ @class = Class.new(SimpleFormClass::Base) do
19
+
20
+ attr_reader :callbacks
21
+
22
+ def initialize
23
+ @callbacks = []
24
+ super
25
+ end
26
+
27
+ CALLBACKS.each do |callback|
28
+ self.send(callback) do
29
+ yield if block_given?
30
+ @callbacks << callback
31
+ end
32
+ end
33
+ end
34
+
35
+ @dummy_instance = @class.new # initialize callbacks
36
+ assert_valid @dummy_instance, "test case setup problem, @dummy_instance is not valid" # also, validation callbacks
37
+ @dummy_instance.save # save callbacks
38
+
39
+ CALLBACKS.each do |callback|
40
+ assert_includes @dummy_instance.callbacks, callback,
41
+ "expected #{callback} to leave a trace in callbacks array, that didn't happen"
42
+ end
43
+ end
44
+
45
+ should_eventually "get triggered on callback method override" do
46
+ @class = Class.new(SimpleFormClass::Base) do
47
+
48
+ attr_reader :callbacks
49
+
50
+ def initialize
51
+ @callbacks = []
52
+ super
53
+ end
54
+
55
+ CALLBACKS.each do |callback|
56
+ class_eval <<-RUBY
57
+ def #{callback}
58
+ yield if block_given?
59
+ @callbacks << callback
60
+ end
61
+ RUBY
62
+ end
63
+ end
64
+
65
+ @dummy_instance = @class.new # initialize callbacks
66
+ assert_valid @dummy_instance, "test case setup problem, @dummy_instance is not valid" # also, validation callbacks
67
+ @dummy_instance.save # save callbacks
68
+
69
+ CALLBACKS.each do |callback|
70
+ assert_includes @dummy_instance.callbacks, callback,
71
+ "expected #{callback} to leave a trace in callbacks array, that didn't happen"
72
+ end
73
+ end
74
+
75
+ end
76
+
77
+ context :owners do
78
+
79
+ setup do
80
+ @class = Class.new(SimpleFormClass::Base) do
81
+ add_owner :test
82
+
83
+ field :foo_test, :owner => :foo
84
+ field :self_test, :owner => :self
85
+ end
86
+
87
+ @dummy_instance = @class.new do |o|
88
+ o.foo = Product.new
89
+ o.test = Order.new
90
+ end
91
+ end
92
+
93
+ should "behave like ActiveModel objects and raise otherwise" do
94
+ assert_raises SimpleFormClass::InvalidOwner do
95
+ @class.new do |o|
96
+ o.test = Object.new
97
+ end
98
+ end
99
+ end
100
+
101
+ should "generate a proper owner hash" do
102
+ owner_hash = @dummy_instance.send :owner_hash
103
+
104
+ assert_kind_of Hash, owner_hash, "owner_hash is of wrong type"
105
+ assert_equal [:test, :foo, :self], owner_hash.keys, "owner_hash has wrong keys"
106
+
107
+ assert_kind_of Product, owner_hash[:foo], 'wrong class for :foo'
108
+ assert_kind_of Order, owner_hash[:test], 'wrong class for :test'
109
+ assert_equal @dummy_instance, owner_hash[:self], 'wrong instance for :self'
110
+ end
111
+
112
+ end
113
+
114
+
115
+ context :field do
116
+
117
+ setup do
118
+ @class = Class.new(SimpleFormClass::Base) do
119
+ field :self_foo, :owner => :self, :write => true
120
+ field :price, :owner => :owner, :write => true
121
+
122
+ field :self_boo, :owner => :self
123
+ field :name, :owner => :owner
124
+ end
125
+
126
+ @owner = Product.new
127
+
128
+ @form = @class.new do |o|
129
+ o.owner = @owner
130
+ end
131
+ end
132
+
133
+ # NOTE: only mass assignment is squashed, not regular assignment
134
+
135
+ should "work as attr_accessor on self regardless of write flag" do
136
+ @form.self_foo = 10
137
+ assert_equal 10, @form.self_foo, "expected self_foo to change state after setter"
138
+
139
+ @form.self_boo = 11
140
+ assert_equal 11, @form.self_boo, "expected self_boo to change state after setter"
141
+ end
142
+
143
+ should "work as delegator on owned regardless of write flag" do
144
+ @form.price = 12
145
+ assert_equal 12, @form.price, "expected message to change state after setter on @form"
146
+ assert_equal 12, @form.owner.price, "expected message to change state after setter on @form.owner"
147
+ assert_equal 12, @owner.price, "expected message to change state after setter on @owner"
148
+
149
+ @form.name = 13
150
+ assert_equal 13, @form.name, "expected params to change state after setter on @form"
151
+ assert_equal 13, @form.owner.name, "expected params to change state after setter on @form.owner"
152
+ assert_equal 13, @owner.name, "expected params to change state after setter on @owner"
153
+ end
154
+
155
+ context "mass assignment" do
156
+
157
+ should "work on all attributes if not params.is_a? ActionController::Parameters" do
158
+ params = { self_foo: 20, price: 21, self_boo: 22, name: 23 }
159
+ assert_kind_of Hash, params, "test case setup problem, params is of wrong class"
160
+
161
+ form = @class.new(params) do |o|
162
+ o.owner = @owner
163
+ end
164
+
165
+ assert_equal 20, form.self_foo, "expected self_foo to get mass assigned"
166
+ assert_equal 21, form.price, "expected message to get mass assigned"
167
+
168
+ assert_equal 22, form.self_boo, "expected self_boo to get mass assigned"
169
+ assert_equal 23, form.name, "expected params to get mass assigned"
170
+ end
171
+
172
+ should "filter attributes without write: true if params.is_a? ActionController::Parameters" do
173
+ params = ActionController::Parameters.new(self_foo: 30, price: 31, self_boo: 32, name: 33)
174
+ assert_kind_of ActionController::Parameters, params, "test case setup problem, params is of wrong class"
175
+
176
+ form = @class.new(params) do |o|
177
+ o.owner = @owner
178
+ end
179
+
180
+ assert_equal 30, form.self_foo, "expected self_foo to get mass assigned"
181
+ assert_equal 31, form.price, "expected message to get mass assigned"
182
+ assert_equal nil, form.self_boo, "expected self_boo to get filtered out"
183
+ assert_equal nil, form.name, "expected params to get filtered out"
184
+ end
185
+
186
+ end
187
+
188
+ end
189
+
190
+ context :validators do
191
+
192
+ # TODO
193
+ should_eventually :get_tested do; end
194
+
195
+ end
196
+
197
+ context :inheritancs do
198
+
199
+ # TODO
200
+ should_eventually :propagate_owners_to_subclass do; end
201
+ should_eventually :propagate_fields_to_subclass do; end
202
+
203
+ # TODO
204
+ should_eventually :not_cumulatively_add_owners do; end # see #831
205
+ should_eventually :not_cumulatively_add_fields do; end # see #831
206
+
207
+ end
208
+
209
+
210
+ end