controlled_versioning 0.6.3 → 0.7.2

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 (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