has_moderated 1.2.2 → 1.2.3
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.
- data/Rakefile +1 -1
- data/lib/has_moderated.rb +1 -1
- data/lib/has_moderated/associations/base.rb +7 -1
- data/lib/has_moderated/moderation_model.rb +3 -1
- data/lib/has_moderated/version.rb +1 -1
- data/spec/has_moderated/associations_spec.rb +44 -0
- data/spec/has_moderated/attributes_spec.rb +31 -0
- data/spec/has_moderated/common_features_spec.rb +56 -0
- data/spec/has_moderated/has_and_belongs_to_many_spec.rb +98 -0
- data/spec/has_moderated/has_many_spec.rb +108 -0
- data/spec/has_moderated/has_many_through_spec.rb +91 -0
- data/spec/has_moderated/has_one_spec.rb +119 -0
- data/spec/has_moderated/hooks_spec.rb +18 -0
- data/spec/has_moderated/moderated_create_spec.rb +41 -0
- data/spec/has_moderated/moderated_destroy_spec.rb +24 -0
- data/{test/dummy/spec/models → spec/has_moderated}/photo_spec.rb +23 -29
- data/spec/has_moderated/polymorphic_spec.rb +70 -0
- data/spec/has_moderated/preview_spec.rb +182 -0
- data/spec/has_moderated/without_moderation_spec.rb +38 -0
- metadata +195 -247
- data/test/dummy/Rakefile +0 -7
- data/test/dummy/app/assets/javascripts/application.js +0 -9
- data/test/dummy/app/assets/stylesheets/application.css +0 -7
- data/test/dummy/app/controllers/application_controller.rb +0 -3
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/app/models/moderation.rb +0 -5
- data/test/dummy/app/uploaders/generic_uploader.rb +0 -49
- data/test/dummy/app/views/layouts/application.html.erb +0 -14
- data/test/dummy/config.ru +0 -4
- data/test/dummy/config/application.rb +0 -50
- data/test/dummy/config/boot.rb +0 -10
- data/test/dummy/config/database.yml +0 -25
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -30
- data/test/dummy/config/environments/production.rb +0 -60
- data/test/dummy/config/environments/test.rb +0 -42
- data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/test/dummy/config/initializers/inflections.rb +0 -10
- data/test/dummy/config/initializers/mime_types.rb +0 -5
- data/test/dummy/config/initializers/secret_token.rb +0 -7
- data/test/dummy/config/initializers/session_store.rb +0 -8
- data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/test/dummy/config/locales/en.yml +0 -5
- data/test/dummy/config/routes.rb +0 -58
- data/test/dummy/db/migrate/20120520215008_initial_schema.rb +0 -48
- data/test/dummy/db/migrate/20120520215224_create_photos.rb +0 -13
- data/test/dummy/db/schema.rb +0 -71
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/test.log +0 -19029
- data/test/dummy/public/404.html +0 -26
- data/test/dummy/public/422.html +0 -26
- data/test/dummy/public/500.html +0 -26
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/test.jpg +0 -0
- data/test/dummy/public/uploads/tmp/20121108-2105-18143-8298/test.jpg +0 -0
- data/test/dummy/public/uploads/tmp/20121108-2105-18143-8298/thumb_test.jpg +0 -0
- data/test/dummy/script/rails +0 -6
- data/test/dummy/spec/models/task_spec.rb +0 -886
- data/test/dummy/spec/spec_helper.rb +0 -1
- data/test/dummy/spec/support/crazy_models.rb +0 -85
- data/test/dummy/spec/support/photos.rb +0 -33
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "has_one" do
|
4
|
+
context "has_one association:" do
|
5
|
+
before do
|
6
|
+
dynamic_models.task {
|
7
|
+
has_one :renamed_subtask, :class_name => "Subtask", :foreign_key => "task_id"
|
8
|
+
has_moderated_association :renamed_subtask
|
9
|
+
}.subtask {
|
10
|
+
belongs_to :task
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
it "creates and associates subtask (= new, task save)" do
|
15
|
+
task = Task.create! :title => "Task 1"
|
16
|
+
Moderation.count.should eq(0)
|
17
|
+
task.renamed_subtask = Subtask.new :title => "Subtask 1"
|
18
|
+
task.save
|
19
|
+
|
20
|
+
task = Task.first
|
21
|
+
task.renamed_subtask.should be_nil
|
22
|
+
Subtask.count.should eq(0)
|
23
|
+
|
24
|
+
Moderation.count.should eq(1)
|
25
|
+
Moderation.last.accept
|
26
|
+
Moderation.count.should eq(0)
|
27
|
+
|
28
|
+
subtask = Task.first.renamed_subtask
|
29
|
+
subtask.title.should eq("Subtask 1")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "creates and associates subtask (= create, task save)" do
|
33
|
+
task = Task.create! :title => "Task 1"
|
34
|
+
Moderation.count.should eq(0)
|
35
|
+
task.renamed_subtask = Subtask.create! :title => "Subtask 1"
|
36
|
+
task.save
|
37
|
+
|
38
|
+
task = Task.first
|
39
|
+
task.renamed_subtask.should be_nil
|
40
|
+
|
41
|
+
Moderation.count.should eq(1)
|
42
|
+
Moderation.last.accept
|
43
|
+
Moderation.count.should eq(0)
|
44
|
+
|
45
|
+
subtask = Task.first.renamed_subtask
|
46
|
+
subtask.title.should eq("Subtask 1")
|
47
|
+
end
|
48
|
+
|
49
|
+
it "set subtask to nil (delete)" do
|
50
|
+
task = Task.create! :title => "Task 1"
|
51
|
+
task.renamed_subtask = Subtask.new :title => "Subtask 1"
|
52
|
+
task.save
|
53
|
+
Moderation.last.accept
|
54
|
+
|
55
|
+
Moderation.count.should eq(0)
|
56
|
+
Task.first.renamed_subtask.should_not be_nil
|
57
|
+
|
58
|
+
Task.first.renamed_subtask = nil
|
59
|
+
Task.first.renamed_subtask.should_not be_nil
|
60
|
+
|
61
|
+
Moderation.last.accept
|
62
|
+
Task.first.renamed_subtask.should be_nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "has_one association (create moderation):" do
|
67
|
+
before :each do
|
68
|
+
dynamic_models.task {
|
69
|
+
has_one :renamed_subtask, :class_name => "Subtask", :foreign_key => "task_id"
|
70
|
+
has_moderated_create :with_associations => [:renamed_subtask]
|
71
|
+
}.subtask {
|
72
|
+
belongs_to :task
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
it "associates an existing subtask on create 1" do
|
77
|
+
Task.has_moderated_association :renamed_subtask
|
78
|
+
Subtask.create! :title => "Subtask 1"
|
79
|
+
Subtask.count.should eq(1)
|
80
|
+
Moderation.count.should eq(0)
|
81
|
+
|
82
|
+
task = Task.new :title => "Task 1"
|
83
|
+
task.renamed_subtask = Subtask.first
|
84
|
+
task.save
|
85
|
+
|
86
|
+
Subtask.first.task_id.should be_nil
|
87
|
+
|
88
|
+
Task.count.should eq(0)
|
89
|
+
Moderation.count.should eq(1)
|
90
|
+
Moderation.last.accept
|
91
|
+
Moderation.count.should eq(0)
|
92
|
+
Subtask.first.task_id.should_not be_nil
|
93
|
+
|
94
|
+
subtask = Task.first.renamed_subtask
|
95
|
+
subtask.title.should eq("Subtask 1")
|
96
|
+
end
|
97
|
+
|
98
|
+
it "associates an existing subtask on create 2" do
|
99
|
+
Subtask.create! :title => "Subtask 1"
|
100
|
+
Subtask.count.should eq(1)
|
101
|
+
Moderation.count.should eq(0)
|
102
|
+
|
103
|
+
task = Task.new :title => "Task 1"
|
104
|
+
task.renamed_subtask = Subtask.first
|
105
|
+
task.save
|
106
|
+
|
107
|
+
Subtask.first.task_id.should be_nil
|
108
|
+
|
109
|
+
Task.count.should eq(0)
|
110
|
+
Moderation.count.should eq(1)
|
111
|
+
Moderation.last.accept
|
112
|
+
Moderation.count.should eq(0)
|
113
|
+
Subtask.first.task_id.should_not be_nil
|
114
|
+
|
115
|
+
subtask = Task.first.renamed_subtask
|
116
|
+
subtask.title.should eq("Subtask 1")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "hooks:" do
|
4
|
+
before do
|
5
|
+
dynamic_models.task {
|
6
|
+
has_moderated :title
|
7
|
+
moderation_creating do |moderation|
|
8
|
+
moderation.data = "Test!"
|
9
|
+
end
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
it "handles a creating hook properly" do
|
14
|
+
Task.create! :title => "Task 1"
|
15
|
+
Moderation.count.should eq(1)
|
16
|
+
Moderation.last.data.should eq("Test!")
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "create moderation with association:" do
|
4
|
+
before do
|
5
|
+
dynamic_models.task {
|
6
|
+
has_many :renamed_subtasks, :class_name => "Subtask", :foreign_key => "task_id"
|
7
|
+
has_moderated_create :with_associations => [:renamed_subtasks]
|
8
|
+
}.subtask {
|
9
|
+
belongs_to :task
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
it "moderates create" do
|
14
|
+
task = Task.create! :title => "Task 1"
|
15
|
+
Moderation.count.should eq(1)
|
16
|
+
Task.count.should eq(0)
|
17
|
+
|
18
|
+
Moderation.last.accept
|
19
|
+
Task.count.should eq(1)
|
20
|
+
Task.first.title.should eq("Task 1")
|
21
|
+
end
|
22
|
+
|
23
|
+
# TODO: test all associations on create
|
24
|
+
it "moderates assoc on create" do
|
25
|
+
task = Task.new :title => "Task 1"
|
26
|
+
task.renamed_subtasks.build :title => "Subtask 1"
|
27
|
+
task.save
|
28
|
+
Subtask.count.should eq(0)
|
29
|
+
Moderation.last.accept
|
30
|
+
|
31
|
+
Task.last.renamed_subtasks.count.should eq(1)
|
32
|
+
Task.last.renamed_subtasks.first.title.should eq("Subtask 1")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "doesn't create anything if nothing was created" do
|
36
|
+
task = Task.create! :title => "Task 1"
|
37
|
+
Moderation.last.accept
|
38
|
+
|
39
|
+
Task.first.renamed_subtasks.count.should eq(0)
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "destroy moderation:" do
|
4
|
+
before do
|
5
|
+
dynamic_models.task {
|
6
|
+
has_moderated_destroy
|
7
|
+
}
|
8
|
+
end
|
9
|
+
|
10
|
+
it "moderates destroy" do
|
11
|
+
Task.create! :title => "Task 1"
|
12
|
+
Task.count.should eq(1)
|
13
|
+
Task.first.destroy
|
14
|
+
Task.count.should eq(1)
|
15
|
+
Moderation.last.accept
|
16
|
+
Task.count.should eq(0)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns nil for #preview" do
|
20
|
+
Task.create! :title => "Task 1"
|
21
|
+
Task.first.destroy
|
22
|
+
Moderation.last.preview.should be_nil
|
23
|
+
end
|
24
|
+
end
|
@@ -1,20 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
crazy_models.reset
|
5
|
-
crazy_models.with_helpers &block if block_given?
|
6
|
-
crazy_models
|
7
|
-
end
|
8
|
-
|
9
|
-
describe Photo do
|
3
|
+
describe "Photo" do
|
10
4
|
before(:each) do
|
11
5
|
FileUtils.rm_rf(TEMPDIR) # remove temp dir
|
12
|
-
FileUtils.rm_rf(File.expand_path("
|
6
|
+
FileUtils.rm_rf(File.expand_path("../../tmp/uploads", __FILE__)) # remove uploads dir
|
13
7
|
end
|
14
8
|
|
15
9
|
context "create moderated:" do
|
16
10
|
before do
|
17
|
-
|
11
|
+
dynamic_models.photo {
|
18
12
|
mount_uploader :avatar, GenericUploader
|
19
13
|
has_moderated_create
|
20
14
|
send :include, HasModerated::CarrierWave
|
@@ -52,7 +46,7 @@ describe Photo do
|
|
52
46
|
|
53
47
|
context "not moderated:" do
|
54
48
|
before do
|
55
|
-
|
49
|
+
dynamic_models.photo {
|
56
50
|
mount_uploader :avatar, GenericUploader
|
57
51
|
}
|
58
52
|
end
|
@@ -71,7 +65,7 @@ describe Photo do
|
|
71
65
|
|
72
66
|
context "update moderated:" do
|
73
67
|
before do
|
74
|
-
|
68
|
+
dynamic_models.photo {
|
75
69
|
mount_uploader :avatar, GenericUploader
|
76
70
|
send :include, HasModerated::CarrierWave
|
77
71
|
has_moderated_carrierwave_field :avatar
|
@@ -133,17 +127,17 @@ describe Photo do
|
|
133
127
|
|
134
128
|
context "moderated as association to has_moderated_create:" do
|
135
129
|
before do
|
136
|
-
|
137
|
-
has_many :renamed_subtasks, :class_name =>
|
138
|
-
has_many :photos, :class_name =>
|
130
|
+
dynamic_models.task {
|
131
|
+
has_many :renamed_subtasks, :class_name => "Subtask", :foreign_key => "task_id"
|
132
|
+
has_many :photos, :class_name => "Photo", :foreign_key => "parentable_id"
|
139
133
|
has_moderated_create :with_associations => [:photos, :renamed_subtasks]
|
140
134
|
}.subtask {
|
141
|
-
belongs_to :task, :class_name =>
|
135
|
+
belongs_to :task, :class_name => "Task"
|
142
136
|
}.photo {
|
143
137
|
mount_uploader :avatar, GenericUploader
|
144
138
|
send :include, HasModerated::CarrierWave
|
145
139
|
has_moderated_carrierwave_field :avatar
|
146
|
-
belongs_to :task, :
|
140
|
+
belongs_to :task, :foreign_key => "parentable_id"
|
147
141
|
}
|
148
142
|
|
149
143
|
end
|
@@ -196,7 +190,7 @@ describe Photo do
|
|
196
190
|
|
197
191
|
context "moderation preview" do
|
198
192
|
it "should show the temporary file as the photo" do
|
199
|
-
|
193
|
+
dynamic_models.photo {
|
200
194
|
mount_uploader :avatar, GenericUploader
|
201
195
|
send :include, HasModerated::CarrierWave
|
202
196
|
has_moderated_carrierwave_field :avatar
|
@@ -218,7 +212,7 @@ describe Photo do
|
|
218
212
|
end
|
219
213
|
|
220
214
|
it "should show the temporary file as the photo (create moderation)" do
|
221
|
-
|
215
|
+
dynamic_models.photo {
|
222
216
|
mount_uploader :avatar, GenericUploader
|
223
217
|
send :include, HasModerated::CarrierWave
|
224
218
|
has_moderated_create
|
@@ -239,7 +233,7 @@ describe Photo do
|
|
239
233
|
end
|
240
234
|
|
241
235
|
it "should not move image to uploads when calling save on live_preview" do
|
242
|
-
|
236
|
+
dynamic_models.photo {
|
243
237
|
mount_uploader :avatar, GenericUploader
|
244
238
|
send :include, HasModerated::CarrierWave
|
245
239
|
has_moderated_create
|
@@ -259,7 +253,7 @@ describe Photo do
|
|
259
253
|
end
|
260
254
|
|
261
255
|
it "should not move image to uploads when calling save on preview" do
|
262
|
-
|
256
|
+
dynamic_models.photo {
|
263
257
|
mount_uploader :avatar, GenericUploader
|
264
258
|
send :include, HasModerated::CarrierWave
|
265
259
|
has_moderated_create
|
@@ -277,14 +271,14 @@ describe Photo do
|
|
277
271
|
end
|
278
272
|
|
279
273
|
it "should show the temporary file as the photo (create assoc moderation)" do
|
280
|
-
|
281
|
-
has_many :photos, :class_name =>
|
274
|
+
dynamic_models.task {
|
275
|
+
has_many :photos, :class_name => "Photo", :foreign_key => "parentable_id"
|
282
276
|
has_moderated_create :with_associations => [:photos]
|
283
277
|
}.photo {
|
284
278
|
mount_uploader :avatar, GenericUploader
|
285
279
|
send :include, HasModerated::CarrierWave
|
286
280
|
has_moderated_carrierwave_field :avatar
|
287
|
-
belongs_to :task, :
|
281
|
+
belongs_to :task, :foreign_key => "parentable_id"
|
288
282
|
}
|
289
283
|
|
290
284
|
photo_file = carrierwave_test_photo
|
@@ -303,16 +297,16 @@ describe Photo do
|
|
303
297
|
end
|
304
298
|
|
305
299
|
it "should show the temporary file as the photo (assoc moderation)" do
|
306
|
-
|
307
|
-
has_many :photos, :class_name =>
|
300
|
+
dynamic_models.task {
|
301
|
+
has_many :photos, :class_name => "Photo", :foreign_key => "parentable_id"
|
308
302
|
has_moderated_association :photos
|
309
303
|
}.photo {
|
310
304
|
mount_uploader :avatar, GenericUploader
|
311
305
|
send :include, HasModerated::CarrierWave
|
312
306
|
has_moderated_carrierwave_field :avatar
|
313
|
-
belongs_to :task, :
|
307
|
+
belongs_to :task, :foreign_key => "parentable_id"
|
314
308
|
}
|
315
|
-
|
309
|
+
|
316
310
|
photo_file = carrierwave_test_photo
|
317
311
|
task = Task.new
|
318
312
|
photo = task.photos.build :avatar => photo_file
|
@@ -329,7 +323,7 @@ describe Photo do
|
|
329
323
|
end
|
330
324
|
|
331
325
|
it "should display preview of photo versions correctly" do
|
332
|
-
|
326
|
+
dynamic_models.photo {
|
333
327
|
mount_uploader :avatar, GenericUploader
|
334
328
|
send :include, HasModerated::CarrierWave
|
335
329
|
has_moderated_carrierwave_field :avatar
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "polymorphic associations" do
|
4
|
+
#
|
5
|
+
# has_moderated_association
|
6
|
+
# has_many polymorphic
|
7
|
+
#
|
8
|
+
|
9
|
+
context "has_many polymorphic association:" do
|
10
|
+
before do
|
11
|
+
dynamic_models.task {
|
12
|
+
has_many :renamed_subtasks, :class_name => "Subtask", :as => :parentable
|
13
|
+
has_moderated_association :renamed_subtasks
|
14
|
+
}.subtask {
|
15
|
+
belongs_to :parentable, :polymorphic => true
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
it "creates and associates subtask (create)" do
|
20
|
+
task = Task.create! :title => "Task 1"
|
21
|
+
Moderation.count.should eq(0)
|
22
|
+
task.renamed_subtasks.create! :title => "Subtask 1"
|
23
|
+
|
24
|
+
task = Task.first
|
25
|
+
task.renamed_subtasks.count.should eq(0)
|
26
|
+
|
27
|
+
Moderation.count.should eq(1)
|
28
|
+
Moderation.last.accept
|
29
|
+
Moderation.count.should eq(0)
|
30
|
+
|
31
|
+
subtask = Task.first.renamed_subtasks.first
|
32
|
+
subtask.title.should eq("Subtask 1")
|
33
|
+
subtask.parentable.should eq(Task.first)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# has_moderated_association
|
39
|
+
# has_one polymorphic
|
40
|
+
#
|
41
|
+
|
42
|
+
context "has_one polymorphic association:" do
|
43
|
+
before do
|
44
|
+
dynamic_models.task {
|
45
|
+
has_one :renamed_subtask, :class_name => "Subtask", :as => :parentable
|
46
|
+
has_moderated_association :renamed_subtask
|
47
|
+
}.subtask {
|
48
|
+
belongs_to :parentable, :polymorphic => true
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
it "creates and associates subtask (create)" do
|
53
|
+
task = Task.create! :title => "Task 1"
|
54
|
+
Moderation.count.should eq(0)
|
55
|
+
task.renamed_subtask = Subtask.new :title => "Subtask 1"
|
56
|
+
task.save
|
57
|
+
|
58
|
+
task = Task.first
|
59
|
+
task.renamed_subtask.should be_nil
|
60
|
+
|
61
|
+
Moderation.count.should eq(1)
|
62
|
+
Moderation.last.accept
|
63
|
+
Moderation.count.should eq(0)
|
64
|
+
|
65
|
+
subtask = Task.first.renamed_subtask
|
66
|
+
subtask.title.should eq("Subtask 1")
|
67
|
+
subtask.parentable.should eq(Task.first)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "preview:" do
|
4
|
+
it "shows a live preview of changed attributes" do
|
5
|
+
dynamic_models.task {
|
6
|
+
has_moderated :title
|
7
|
+
}
|
8
|
+
|
9
|
+
Task.create! :title => "Task 1"
|
10
|
+
Task.last.title.should be_blank
|
11
|
+
|
12
|
+
last_task_id = Task.last.id
|
13
|
+
Moderation.last.live_preview do |preview|
|
14
|
+
preview.title.should eq("Task 1")
|
15
|
+
preview.id.should eq(last_task_id)
|
16
|
+
end
|
17
|
+
|
18
|
+
Task.last.title.should be_blank
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns a preview for create moderations (issue #13)" do
|
22
|
+
dynamic_models.task {
|
23
|
+
has_moderated_create
|
24
|
+
}
|
25
|
+
|
26
|
+
Task.create! :title => "Task 1"
|
27
|
+
Moderation.last.preview.should_not be_nil
|
28
|
+
Moderation.last.preview.title.should eq("Task 1")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "shows a saved preview of changed attributes" do
|
32
|
+
dynamic_models.task {
|
33
|
+
has_moderated :title
|
34
|
+
}
|
35
|
+
|
36
|
+
task = Task.create! :title => "Task 1"
|
37
|
+
Task.last.title.should be_blank
|
38
|
+
|
39
|
+
preview = Moderation.last.preview
|
40
|
+
preview.title.should eq("Task 1")
|
41
|
+
preview.id.should eq(Task.last.id)
|
42
|
+
Task.last.title.should be_blank
|
43
|
+
end
|
44
|
+
|
45
|
+
it "supports dirty tracking for the saved preview" do
|
46
|
+
dynamic_models.task {
|
47
|
+
has_moderated :title
|
48
|
+
}
|
49
|
+
|
50
|
+
task = Task.create! :title => "Task 1"
|
51
|
+
Task.last.title.should be_blank
|
52
|
+
|
53
|
+
preview = Moderation.last.preview
|
54
|
+
preview.title_changed?.should be_true
|
55
|
+
preview.title_change.should eq([nil, "Task 1"])
|
56
|
+
end
|
57
|
+
|
58
|
+
it "supports updating moderation attributes for the saved preview if :saveable => true" do
|
59
|
+
dynamic_models.task {
|
60
|
+
has_moderated :title
|
61
|
+
}
|
62
|
+
|
63
|
+
task = Task.create! :title => "Task 1"
|
64
|
+
Task.last.title.should be_blank
|
65
|
+
|
66
|
+
preview = Moderation.last.preview(:saveable => true)
|
67
|
+
preview.title = "Task 2"
|
68
|
+
preview.update_moderation
|
69
|
+
|
70
|
+
moderation = Moderation.last
|
71
|
+
moderation.parsed_data.should eq({:attributes=>{"title"=>"Task 2"}})
|
72
|
+
moderation.accept
|
73
|
+
Task.last.title.should eq("Task 2")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "doesn't support updating moderation attributes for the saved preview by default" do
|
77
|
+
dynamic_models.task {
|
78
|
+
has_moderated :title
|
79
|
+
}
|
80
|
+
|
81
|
+
task = Task.create! :title => "Task 1"
|
82
|
+
Task.last.title.should be_blank
|
83
|
+
|
84
|
+
moderation = Moderation.last
|
85
|
+
preview = Moderation.last.preview
|
86
|
+
preview.frozen?.should be_true
|
87
|
+
expect { preview.title = "Task 2" }.to raise_error
|
88
|
+
expect { preview.update_moderation }.to raise_error
|
89
|
+
|
90
|
+
moderation = Moderation.last
|
91
|
+
moderation.accept
|
92
|
+
Task.last.title.should eq("Task 1")
|
93
|
+
end
|
94
|
+
|
95
|
+
it "shows a saved preview of has_many association" do
|
96
|
+
dynamic_models.task {
|
97
|
+
has_many :renamed_subtasks, :class_name => "Subtask", :foreign_key => "task_id"
|
98
|
+
has_moderated_association :renamed_subtasks
|
99
|
+
}.subtask {
|
100
|
+
belongs_to :task
|
101
|
+
}
|
102
|
+
|
103
|
+
task = Task.create! :title => "Task 1"
|
104
|
+
|
105
|
+
task.renamed_subtasks.create! :title => "Subtask 1"
|
106
|
+
preview = Moderation.last.preview
|
107
|
+
subtask = preview.renamed_subtasks.first
|
108
|
+
subtask.title.should eq("Subtask 1")
|
109
|
+
subtask.id.should_not be_blank
|
110
|
+
subtask.task.should_not be_blank
|
111
|
+
|
112
|
+
Task.last.renamed_subtasks.count.should eq(0)
|
113
|
+
Subtask.count.should eq(0)
|
114
|
+
end
|
115
|
+
|
116
|
+
it "shows a saved preview of has_many :through association" do
|
117
|
+
dynamic_models.task {
|
118
|
+
has_many :renamed_connections, :class_name => "TaskConnection", :foreign_key => "m1_id"
|
119
|
+
has_many :renamed_subtasks, :class_name => "Subtask", :through => :renamed_connections, :source => :renamed_subtask
|
120
|
+
has_moderated_association :renamed_subtasks
|
121
|
+
has_moderated_association :renamed_connections
|
122
|
+
}.subtask {
|
123
|
+
belongs_to :task
|
124
|
+
has_many :renamed_connections, :class_name => "TaskConnection", :foreign_key => "m2_id"
|
125
|
+
has_many :renamed_tasks, :through => :renamed_connections, :source => :renamed_task
|
126
|
+
}.task_connection {
|
127
|
+
belongs_to :renamed_task, :class_name => "Task", :foreign_key => "m1_id"
|
128
|
+
belongs_to :renamed_subtask, :class_name => "Subtask", :foreign_key => "m2_id"
|
129
|
+
}
|
130
|
+
|
131
|
+
task = Task.create! :title => "Task 1"
|
132
|
+
conn = TaskConnection.new :title => "Connection 1"
|
133
|
+
conn.renamed_subtask = Subtask.new :title => "Subtask 1"
|
134
|
+
task.renamed_connections << conn
|
135
|
+
task.save
|
136
|
+
|
137
|
+
TaskConnection.count.should eq(0)
|
138
|
+
Subtask.count.should eq(0)
|
139
|
+
|
140
|
+
task = Moderation.last.preview
|
141
|
+
|
142
|
+
TaskConnection.count.should eq(0)
|
143
|
+
Subtask.count.should eq(0)
|
144
|
+
Moderation.count.should eq(1)
|
145
|
+
|
146
|
+
subtask = task.renamed_subtasks.first
|
147
|
+
subtask.title.should eq("Subtask 1")
|
148
|
+
subtask.renamed_connections.first.should be_present
|
149
|
+
conn = task.renamed_connections.first
|
150
|
+
conn.title.should eq("Connection 1")
|
151
|
+
conn.renamed_subtask.title.should eq("Subtask 1")
|
152
|
+
conn.renamed_task.title.should eq("Task 1")
|
153
|
+
|
154
|
+
# everything has to be frozen
|
155
|
+
task.frozen?.should be_true
|
156
|
+
task.renamed_subtasks.frozen?.should be_true
|
157
|
+
task.renamed_connections.frozen?.should be_true
|
158
|
+
subtask.frozen?.should be_true
|
159
|
+
subtask.renamed_connections.frozen?.should be_true
|
160
|
+
conn.frozen?.should be_true
|
161
|
+
conn.renamed_task.frozen?.should be_true
|
162
|
+
conn.renamed_subtask.frozen?.should be_true
|
163
|
+
end
|
164
|
+
|
165
|
+
it "freezes preview correctly" do
|
166
|
+
# especially important for Ruby 1.8 which behaves differently
|
167
|
+
dynamic_models.task {
|
168
|
+
has_many :subtasks
|
169
|
+
has_moderated_association :subtasks
|
170
|
+
}.subtask {
|
171
|
+
belongs_to :task
|
172
|
+
}
|
173
|
+
|
174
|
+
t = Task.create!
|
175
|
+
t.subtasks.create!
|
176
|
+
|
177
|
+
preview = Moderation.last.preview
|
178
|
+
preview.frozen?.should be_true
|
179
|
+
preview.instance_variable_get(:@has_moderated_fake_associations).frozen?.should be_true
|
180
|
+
preview.subtasks.frozen?.should be_true
|
181
|
+
end
|
182
|
+
end
|