controlled_versioning 0.6.3 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +8 -8
  2. data/MIT-LICENSE +1 -1
  3. data/Rakefile +0 -6
  4. data/app/assets/javascripts/controlled_versioning/application.js +13 -0
  5. data/app/assets/stylesheets/controlled_versioning/application.css +13 -0
  6. data/app/controllers/controlled_versioning/application_controller.rb +4 -0
  7. data/app/helpers/controlled_versioning/application_helper.rb +4 -0
  8. data/app/models/controlled_versioning/version.rb +23 -0
  9. data/app/models/controlled_versioning/version_attribute.rb +8 -0
  10. data/app/models/controlled_versioning/version_child.rb +9 -0
  11. data/app/views/layouts/controlled_versioning/application.html.erb +14 -0
  12. data/lib/controlled_versioning/engine.rb +16 -0
  13. data/lib/controlled_versioning/version_number.rb +1 -1
  14. data/lib/controlled_versioning.rb +2 -0
  15. data/spec/controlled_versioning_spec.rb +316 -0
  16. data/spec/dummy/README.rdoc +28 -0
  17. data/spec/dummy/Rakefile +6 -0
  18. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  19. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  20. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  21. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  22. data/spec/dummy/app/models/child_resource.rb +10 -0
  23. data/spec/dummy/app/models/grand_child_resource.rb +7 -0
  24. data/spec/dummy/app/models/nonversionable_resource.rb +2 -0
  25. data/spec/dummy/app/models/parent_resource.rb +9 -0
  26. data/spec/dummy/app/models/partially_exclusive_versionable_resource.rb +3 -0
  27. data/spec/dummy/app/models/partially_inclusive_versionable_resource.rb +3 -0
  28. data/spec/dummy/app/models/user.rb +3 -0
  29. data/spec/dummy/app/models/versionable_resource.rb +5 -0
  30. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  31. data/spec/dummy/bin/bundle +3 -0
  32. data/spec/dummy/bin/rails +4 -0
  33. data/spec/dummy/bin/rake +4 -0
  34. data/spec/dummy/config/application.rb +30 -0
  35. data/spec/dummy/config/boot.rb +5 -0
  36. data/spec/dummy/config/database.yml +60 -0
  37. data/spec/dummy/config/environment.rb +5 -0
  38. data/spec/dummy/config/environments/development.rb +29 -0
  39. data/spec/dummy/config/environments/production.rb +80 -0
  40. data/spec/dummy/config/environments/test.rb +36 -0
  41. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  42. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  43. data/spec/dummy/config/initializers/inflections.rb +16 -0
  44. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  45. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  46. data/spec/dummy/config/initializers/session_store.rb +3 -0
  47. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  48. data/spec/dummy/config/locales/en.yml +23 -0
  49. data/spec/dummy/config/routes.rb +3 -0
  50. data/spec/dummy/config.ru +4 -0
  51. data/spec/dummy/db/migrate/20140117222800_create_users.rb +11 -0
  52. data/spec/dummy/db/migrate/20140117222808_create_versionable_resources.rb +17 -0
  53. data/spec/dummy/db/migrate/20140117222814_create_partially_inclusive_versionable_resources.rb +17 -0
  54. data/spec/dummy/db/migrate/20140117222815_create_partially_exclusive_versionable_resources.rb +17 -0
  55. data/spec/dummy/db/migrate/20140117222828_create_nonversionable_resources.rb +17 -0
  56. data/spec/dummy/db/migrate/20140117222840_create_parent_resources.rb +17 -0
  57. data/spec/dummy/db/migrate/20140117222841_create_child_resources.rb +19 -0
  58. data/spec/dummy/db/migrate/20140117222842_create_grand_child_resources.rb +19 -0
  59. data/spec/dummy/db/migrate/20140206173607_create_controlled_versioning_versions.controlled_versioning.rb +30 -0
  60. data/spec/dummy/db/migrate/20140206173608_create_controlled_versioning_version_attributes.controlled_versioning.rb +15 -0
  61. data/spec/dummy/db/migrate/20140206173609_create_controlled_versioning_version_children.controlled_versioning.rb +19 -0
  62. data/spec/dummy/db/schema.rb +163 -0
  63. data/spec/dummy/public/404.html +58 -0
  64. data/spec/dummy/public/422.html +58 -0
  65. data/spec/dummy/public/500.html +57 -0
  66. data/spec/dummy/public/favicon.ico +0 -0
  67. data/spec/factories/child_resources.rb +28 -0
  68. data/spec/factories/controlled_versioning_versions.rb +7 -0
  69. data/spec/factories/grand_child_resources.rb +17 -0
  70. data/spec/factories/parent_resources.rb +35 -0
  71. data/spec/factories/partially_exclusive_versionable_resources.rb +14 -0
  72. data/spec/factories/partially_inclusive_versionable_resources.rb +14 -0
  73. data/spec/factories/unversionable_resources.rb +14 -0
  74. data/spec/factories/users.rb +6 -0
  75. data/spec/factories/versionable_resources.rb +14 -0
  76. data/spec/spec_helper.rb +86 -0
  77. metadata +136 -11
  78. data/config/locales/en.yml +0 -4
  79. data/lib/generators/controlled_versioning/install_generator.rb +0 -30
  80. data/lib/generators/templates/create_version_attributes.rb +0 -17
  81. data/lib/generators/templates/create_version_children.rb +0 -20
  82. data/lib/generators/templates/create_versions.rb +0 -36
  83. data/lib/generators/templates/version.rb +0 -19
  84. data/lib/generators/templates/version_attribute.rb +0 -7
  85. data/lib/generators/templates/version_child.rb +0 -8
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MjljZWI4NTFhMTI4YjAxMjIzM2Q1NjQ2NjhhODQ5ZmI4ZGI0NGMyYQ==
4
+ NDg0NzM1MTM3ZWQxODQ0NWE0OWFlYTlmZDYzOThjYThkOGUxYmY4ZA==
5
5
  data.tar.gz: !binary |-
6
- OTBlYTk4N2ExNWViZThhNzA2ZDYzMDEyMmQ5YzFhMmYzZWUzOWQ5MQ==
6
+ NzVkOTAwNTMxZWNkMDU0YzNmNzE5NmZhNTc1ZDk4ZGI4MmRhM2E1Mw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZWRhZGI3ZTQ1YzBiYmIzNmZkMzQzNDUyY2VkMTRmYzBlYTNkMDhjNDY0ZjMy
10
- OTc2ZDdmNTllNGVmYmY3N2QxMDk1MmJlMmQ0MjA0ZmRlYTA1ZmMwYzJkN2Ey
11
- ZjlkZGY5ZmY4NzJmNDBjOWM1ZjlmYTQxNjE4N2NhZTFmMGUyOWU=
9
+ ODY3N2JiYzZkMTI4NWQ1YWViODA0NjAzMmM4NjExM2QyYTdiNDc5ZDIxZjUz
10
+ NTliZmVmNTFlYWI4NzFhY2M3YTk0MWJjZGRlNDUzYTM3YzQ2MTRmMTQ0NmE0
11
+ MTk4MWVmYmE3NDQzMzYxN2RiYjFjOTU2OWZiMDdiOTZlOTgyYjU=
12
12
  data.tar.gz: !binary |-
13
- ZWZhNjA5OTRjNmM1MzhiNzgyNjE3NjkzMjY3OWU3ZjM1YzJhY2QxZmIxYzc1
14
- NjhhOTRmNzFlZGQ5Mzc5Nzc0Y2Q2MzNhYjkwYjRjNDE0YzE5ZjBjMDQ0ZDk2
15
- Yzk5YzVmOWJiMGU4Yzg1YWJhNGM3MzE2NjNiZTg4MDhjZjE2MTc=
13
+ OWJhOTE5MTNjNDkwM2JlZjNiYjM3ZTQxZTljZjYzNjRkZjlhYjY0OWUzMDc5
14
+ NmJmY2FiN2E0Zjk4NTU5MGI5NmE1Y2U1ODY1YzlkY2VmMmEwMjFjODU4MGEy
15
+ NmI0ZDc5MTQxNzhiYWVkMTJiOTE4NDdjY2YxODIxNjY5M2MyMjE=
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2014 Timothy Baron
1
+ Copyright 2014 YOURNAME
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -1,9 +1,3 @@
1
- begin
2
- require 'bundler/setup'
3
- rescue LoadError
4
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
- end
6
-
7
1
  require 'rdoc/task'
8
2
 
9
3
  RDoc::Task.new(:rdoc) do |rdoc|
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,13 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require_tree .
13
+ */
@@ -0,0 +1,4 @@
1
+ module ControlledVersioning
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module ControlledVersioning
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,23 @@
1
+ module ControlledVersioning
2
+ class Version < ActiveRecord::Base
3
+ belongs_to :versionable, polymorphic: true
4
+ belongs_to :user
5
+ has_many :version_attributes, as: :version
6
+ has_many :version_children, as: :version
7
+
8
+ validates :versionable, presence: true
9
+
10
+ scope :pending, -> { where(pending: true) }
11
+ scope :accepted, -> { where(accepted: true) }
12
+ scope :declined, -> { where(declined: true) }
13
+
14
+ def accept
15
+ Revision::Publisher.new(self).accept_revision unless initial?
16
+ update_attributes(pending: false, accepted: true)
17
+ end
18
+
19
+ def decline
20
+ update_attributes(pending: false, declined: true)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,8 @@
1
+ module ControlledVersioning
2
+ class VersionAttribute < ActiveRecord::Base
3
+
4
+ belongs_to :version, polymorphic: true
5
+
6
+ validates :name, presence: true
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module ControlledVersioning
2
+ class VersionChild < ActiveRecord::Base
3
+
4
+ belongs_to :versionable, polymorphic: true
5
+ belongs_to :version, polymorphic: true
6
+ has_many :version_attributes, as: :version
7
+ has_many :version_children, as: :version
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>ControlledVersioning</title>
5
+ <%= stylesheet_link_tag "controlled_versioning/application", media: "all" %>
6
+ <%= javascript_include_tag "controlled_versioning/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,16 @@
1
+ module ControlledVersioning
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace ControlledVersioning
4
+ end
5
+ end
6
+
7
+ module ControlledVersioning
8
+ class Engine < ::Rails::Engine
9
+ config.generators do |g|
10
+ g.test_framework :rspec, :fixture => false
11
+ g.fixture_replacement :factory_girl, :dir => 'spec/factories'
12
+ g.assets false
13
+ g.helper false
14
+ end
15
+ end
16
+ end
@@ -1,3 +1,3 @@
1
1
  module ControlledVersioning
2
- VERSION_NUMBER = "0.6.3"
2
+ VERSION_NUMBER = "0.7.2"
3
3
  end
@@ -1,3 +1,5 @@
1
+ require "controlled_versioning/engine"
2
+
1
3
  # Core
2
4
  require "controlled_versioning/version"
3
5
 
@@ -0,0 +1,316 @@
1
+ require 'spec_helper'
2
+
3
+ describe "ControlledVersioning" do
4
+
5
+ it 'sets the initial version contributor if one is provided' do
6
+ user = create(:user)
7
+ resource = create(:versionable_resource, user: user)
8
+ expect(resource.initial_version.user).to eq user
9
+ end
10
+
11
+ it 'does not set the initial version contributor if one is not provided' do
12
+ resource = create(:versionable_resource)
13
+ expect(resource.initial_version.user).to be_nil
14
+ end
15
+
16
+ it 'sets the revision contributor if they are provided' do
17
+ user = create(:user)
18
+ resource = create(:versionable_resource)
19
+ revision = resource.submit_revision(r_string: "new string",
20
+ r_float: 90.1, user: user)
21
+ expect(revision.user).to eq user
22
+ end
23
+
24
+ it 'does not set the revision contributor if they are not provided' do
25
+ resource = create(:versionable_resource)
26
+ revision = resource.submit_revision(r_string: "new string",
27
+ r_float: 90.1)
28
+ expect(revision.user).to be_nil
29
+ end
30
+
31
+ it 'writes initial version notes if they are provided' do
32
+ notes = "These are my notes"
33
+ resource = create(:versionable_resource, notes: notes)
34
+ expect(resource.initial_version.notes).to eq notes
35
+ end
36
+
37
+ it 'does not write initial version notes if they are not provided' do
38
+ resource = create(:versionable_resource)
39
+ expect(resource.initial_version.notes).to be_nil
40
+ end
41
+
42
+ it 'writes revision notes if they are provided' do
43
+ notes = "These are my notes"
44
+ resource = create(:versionable_resource)
45
+ revision = resource.submit_revision(r_string: "new string",
46
+ r_float: 90.1, notes: notes)
47
+ expect(revision.notes).to eq notes
48
+ end
49
+
50
+ it 'does not write revision notes if they are not provided' do
51
+ resource = create(:versionable_resource)
52
+ revision = resource.submit_revision(r_string: "new string",
53
+ r_float: 90.1)
54
+ expect(revision.notes).to be_nil
55
+ end
56
+
57
+ context 'has a scope that' do
58
+ before :each do
59
+ @resource = create(:versionable_resource)
60
+ @accepted_1 = @resource.submit_revision(r_string: "accepted 1")
61
+ @accepted_2 = @resource.submit_revision(r_string: "accepted 2")
62
+ @declined_1 = @resource.submit_revision(r_string: "declined 1")
63
+ @declined_2 = @resource.submit_revision(r_string: "declined 2")
64
+ @pending_1 = @resource.initial_version
65
+ @pending_2 = @resource.submit_revision(r_string: "pending 2")
66
+ @accepted_1.accept
67
+ @accepted_2.accept
68
+ @declined_1.decline
69
+ @declined_2.decline
70
+ end
71
+
72
+ it 'returns an array of pending versions' do
73
+ expect(@resource.versions.pending).to match_array(
74
+ [@pending_1, @pending_2])
75
+ end
76
+
77
+ it 'returns an array of accepted versions' do
78
+ expect(@resource.versions.accepted).to match_array(
79
+ [@accepted_1, @accepted_2])
80
+ end
81
+
82
+ it 'returns an array of declined versions' do
83
+ expect(@resource.versions.declined).to match_array(
84
+ [@declined_1, @declined_2])
85
+ end
86
+ end
87
+
88
+ context 'by default' do
89
+ before :each do
90
+ @resource = create(:versionable_resource)
91
+ end
92
+
93
+ it 'returns a list of versionable attributes' do
94
+ expect(@resource.versionable_attributes).to eq(
95
+ @resource.attributes.except("id", "updated_at", "created_at"))
96
+ end
97
+
98
+ it 'returns the initial version' do
99
+ @resource.versions.create
100
+ @resource.versions.create
101
+ expect(@resource.initial_version).to eq(
102
+ @resource.versions.find_by(initial: true))
103
+ end
104
+
105
+ it "rejects revisions with invalid changes" do
106
+ version = @resource.submit_revision(r_string: "new string",
107
+ r_float: 9000000.1)
108
+ expect(version).to have(1).error_on(:r_float)
109
+ end
110
+
111
+ it "rejects revisions that make no changes" do
112
+ version = @resource.submit_revision(@resource.versionable_attributes)
113
+ expect(version).to have(1).error
114
+ end
115
+
116
+ context 'handles revision' do
117
+ before :each do
118
+ @version = @resource.submit_revision(r_string: "new string",
119
+ r_float: 90.1)
120
+ end
121
+
122
+ it 'by creating versions with the suggested attributes' do
123
+ @resource.reload
124
+ r_string = @version.version_attributes.find_by(name: "r_string")
125
+ r_float = @version.version_attributes.find_by(name: "r_float")
126
+ expect(r_string.old_value).to eq("my string")
127
+ expect(r_string.new_value).to eq("new string")
128
+ expect(r_float.old_value).to eq("3.14")
129
+ expect(r_float.new_value).to eq("90.1")
130
+ expect(@resource.r_string).to eq("my string")
131
+ expect(@resource.r_float).to eq(3.14)
132
+ end
133
+
134
+ it "by skipping non-revised attributes" do
135
+ expect(@version.version_attributes.find_by(name: "r_text")).to be_nil
136
+ end
137
+
138
+ it 'by updating model data if its revisions are accepted' do
139
+ @version.accept
140
+ @resource.reload
141
+ @version.reload
142
+ expect(@resource.r_string).to eq "new string"
143
+ expect(@resource.r_float).to eq 90.1
144
+ expect(@version.pending).to eq false
145
+ expect(@version.declined).to eq false
146
+ expect(@version.accepted).to eq true
147
+ end
148
+
149
+ it 'by maintaining model data if its revisions are declined' do
150
+ @version.decline
151
+ @resource.reload
152
+ @version.reload
153
+ expect(@resource.r_string).to eq "my string"
154
+ expect(@resource.r_float).to eq 3.14
155
+ expect(@version.pending).to eq false
156
+ expect(@version.declined).to eq true
157
+ expect(@version.accepted).to eq false
158
+ end
159
+
160
+ it 'by not updating model data if the initial version is accepted' do
161
+ @version.accept
162
+ @resource.initial_version.accept
163
+ @resource.reload
164
+ expect(@resource.r_string).to eq "new string"
165
+ expect(@resource.r_float).to eq 90.1
166
+ end
167
+ end
168
+ end
169
+
170
+ context 'with nested attributes' do
171
+ before :each do
172
+ @resource = create(:parent_with_grand_children)
173
+ end
174
+
175
+ it 'creates version children' do
176
+ expect(@resource.initial_version.version_children.length).to eq 3
177
+ expect(@resource.initial_version.version_children.last.version_children.
178
+ length).to eq 3
179
+ end
180
+
181
+ it 'rejects invalid children' do
182
+ first_child_resource = @resource.child_resources.first
183
+ version = @resource.submit_revision(child_resources_attributes: [
184
+ {id: first_child_resource.id, r_float: 90000000000.6}
185
+ ])
186
+ expect(version).to have(1).error
187
+ end
188
+
189
+ context 'handles revision' do
190
+ before :each do
191
+ @first_child_resource = @resource.child_resources[0]
192
+ @version = @resource.submit_revision(child_resources_attributes: [
193
+ {id: @first_child_resource.id, r_string: "new string"}
194
+ ])
195
+ end
196
+
197
+ it 'by creating versions for its children' do
198
+ expect(@version.version_children.length).to eq 1
199
+ changed_attribute = @version.version_children.
200
+ find_by(versionable: @first_child_resource).
201
+ version_attributes.find_by(name: "r_string")
202
+ expect(changed_attribute.new_value).to eq "new string"
203
+ expect(changed_attribute.old_value).to eq "my string"
204
+ end
205
+
206
+ it 'by updating its children data if its revisions are approved' do
207
+ @version.accept
208
+ @first_child_resource.reload
209
+ expect(@first_child_resource.r_string).to eq "new string"
210
+ end
211
+ end
212
+
213
+ context 'handles revision for deeply nested children' do
214
+ before :each do
215
+ @first_child_resource = @resource.child_resources[0]
216
+ @first_grand_child_resource = @first_child_resource.
217
+ grand_child_resources.first
218
+ @version = @resource.submit_revision(child_resources_attributes: [
219
+ {id: @first_child_resource.id, grand_child_resources_attributes: [
220
+ {id: @first_grand_child_resource.id, r_string: "new string"}
221
+ ]}
222
+ ])
223
+ @child_version = @version.version_children.
224
+ find_by(versionable_id: @first_child_resource.id)
225
+ end
226
+
227
+ it 'by creating versions for the full family' do
228
+ expect(@child_version.version_children.length).to eq 1
229
+ changed_attribute = @child_version.version_children.
230
+ find_by(versionable: @first_grand_child_resource).
231
+ version_attributes.find_by(name: "r_string")
232
+ expect(changed_attribute.new_value).to eq "new string"
233
+ expect(changed_attribute.old_value).to eq "my string"
234
+ end
235
+
236
+ it 'by updating its deeply nested data if its revisions are approved' do
237
+ @version.accept
238
+ @first_grand_child_resource.reload
239
+ expect(@first_grand_child_resource.r_string).to eq "new string"
240
+ end
241
+ end
242
+
243
+ context 'handles new children' do
244
+ before :each do
245
+ @version = @resource.submit_revision(child_resources_attributes: [
246
+ {r_float: 14.0}
247
+ ])
248
+ @child_version = @version.version_children.first
249
+ end
250
+
251
+ it 'by creating version for new children' do
252
+ expect(@version.version_children.length).to eq 1
253
+ end
254
+
255
+ it 'by creating attributes for new children' do
256
+ changed_attribute = @child_version.version_attributes.
257
+ find_by(name: "r_float")
258
+ expect(changed_attribute.new_value).to eq "14.0"
259
+ expect(changed_attribute.old_value).to be_nil
260
+ end
261
+
262
+ it 'by creating new children when approved' do
263
+ @version.accept
264
+ @resource.reload
265
+ expect(@resource.child_resources.find_by(r_float: 14.0)).to_not be_nil
266
+ end
267
+ end
268
+
269
+ context 'handles child destruction' do
270
+ before :each do
271
+ @first_child_resource = @resource.child_resources[0]
272
+ @version = @resource.submit_revision(child_resources_attributes: [
273
+ {id: @first_child_resource.id, _destroy: "1"}
274
+ ])
275
+ @child_version = @version.version_children.find_by(versionable_id:
276
+ @first_child_resource.id)
277
+ end
278
+
279
+ it 'by creating a version for the marked child' do
280
+ expect(@version.version_children.length).to eq 1
281
+ end
282
+
283
+ it 'by marking a resource for removal if _destroy is sent' do
284
+ expect(@child_version.marked_for_removal).to be true
285
+ end
286
+
287
+ it 'by preserving a resource until its mark is approved' do
288
+ @first_child_resource.reload
289
+ expect(@first_child_resource).to be_an_instance_of(ChildResource)
290
+ end
291
+
292
+ it 'by removing a resource if its mark was approved' do
293
+ @version.accept
294
+ @resource.reload
295
+ expect(@resource.child_resources.length).to eq 2
296
+ end
297
+ end
298
+ end
299
+
300
+ context 'with versionable_attributes' do
301
+ it 'returns a list of versionable attributes' do
302
+ resource = create(:partially_inclusive_versionable_resource)
303
+ expect(resource.versionable_attributes).to eq(
304
+ resource.attributes.slice("r_boolean", "r_date"))
305
+ end
306
+ end
307
+
308
+ context 'with nonversionable_attributes' do
309
+ it 'returns a list of versionable attributes' do
310
+ resource = create(:partially_exclusive_versionable_resource)
311
+ expect(resource.versionable_attributes).to eq(
312
+ resource.attributes.except("id", "updated_at", "created_at",
313
+ "r_boolean", "r_date"))
314
+ end
315
+ end
316
+ end