simple_form_class 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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