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.
Files changed (61) hide show
  1. data/Rakefile +1 -1
  2. data/lib/has_moderated.rb +1 -1
  3. data/lib/has_moderated/associations/base.rb +7 -1
  4. data/lib/has_moderated/moderation_model.rb +3 -1
  5. data/lib/has_moderated/version.rb +1 -1
  6. data/spec/has_moderated/associations_spec.rb +44 -0
  7. data/spec/has_moderated/attributes_spec.rb +31 -0
  8. data/spec/has_moderated/common_features_spec.rb +56 -0
  9. data/spec/has_moderated/has_and_belongs_to_many_spec.rb +98 -0
  10. data/spec/has_moderated/has_many_spec.rb +108 -0
  11. data/spec/has_moderated/has_many_through_spec.rb +91 -0
  12. data/spec/has_moderated/has_one_spec.rb +119 -0
  13. data/spec/has_moderated/hooks_spec.rb +18 -0
  14. data/spec/has_moderated/moderated_create_spec.rb +41 -0
  15. data/spec/has_moderated/moderated_destroy_spec.rb +24 -0
  16. data/{test/dummy/spec/models → spec/has_moderated}/photo_spec.rb +23 -29
  17. data/spec/has_moderated/polymorphic_spec.rb +70 -0
  18. data/spec/has_moderated/preview_spec.rb +182 -0
  19. data/spec/has_moderated/without_moderation_spec.rb +38 -0
  20. metadata +195 -247
  21. data/test/dummy/Rakefile +0 -7
  22. data/test/dummy/app/assets/javascripts/application.js +0 -9
  23. data/test/dummy/app/assets/stylesheets/application.css +0 -7
  24. data/test/dummy/app/controllers/application_controller.rb +0 -3
  25. data/test/dummy/app/helpers/application_helper.rb +0 -2
  26. data/test/dummy/app/models/moderation.rb +0 -5
  27. data/test/dummy/app/uploaders/generic_uploader.rb +0 -49
  28. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  29. data/test/dummy/config.ru +0 -4
  30. data/test/dummy/config/application.rb +0 -50
  31. data/test/dummy/config/boot.rb +0 -10
  32. data/test/dummy/config/database.yml +0 -25
  33. data/test/dummy/config/environment.rb +0 -5
  34. data/test/dummy/config/environments/development.rb +0 -30
  35. data/test/dummy/config/environments/production.rb +0 -60
  36. data/test/dummy/config/environments/test.rb +0 -42
  37. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  38. data/test/dummy/config/initializers/inflections.rb +0 -10
  39. data/test/dummy/config/initializers/mime_types.rb +0 -5
  40. data/test/dummy/config/initializers/secret_token.rb +0 -7
  41. data/test/dummy/config/initializers/session_store.rb +0 -8
  42. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  43. data/test/dummy/config/locales/en.yml +0 -5
  44. data/test/dummy/config/routes.rb +0 -58
  45. data/test/dummy/db/migrate/20120520215008_initial_schema.rb +0 -48
  46. data/test/dummy/db/migrate/20120520215224_create_photos.rb +0 -13
  47. data/test/dummy/db/schema.rb +0 -71
  48. data/test/dummy/db/test.sqlite3 +0 -0
  49. data/test/dummy/log/test.log +0 -19029
  50. data/test/dummy/public/404.html +0 -26
  51. data/test/dummy/public/422.html +0 -26
  52. data/test/dummy/public/500.html +0 -26
  53. data/test/dummy/public/favicon.ico +0 -0
  54. data/test/dummy/public/test.jpg +0 -0
  55. data/test/dummy/public/uploads/tmp/20121108-2105-18143-8298/test.jpg +0 -0
  56. data/test/dummy/public/uploads/tmp/20121108-2105-18143-8298/thumb_test.jpg +0 -0
  57. data/test/dummy/script/rails +0 -6
  58. data/test/dummy/spec/models/task_spec.rb +0 -886
  59. data/test/dummy/spec/spec_helper.rb +0 -1
  60. data/test/dummy/spec/support/crazy_models.rb +0 -85
  61. 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 File.expand_path('../../spec_helper', __FILE__)
1
+ require 'spec_helper'
2
2
 
3
- def reload_models
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("../../../public/uploads", __FILE__)) # remove uploads dir
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
- reload_models.photo {
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
- reload_models.photo {
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
- reload_models.photo {
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
- reload_models.task {
137
- has_many :renamed_subtasks, :class_name => subtask_class_name, :foreign_key => task_fk
138
- has_many :photos, :class_name => photo_class_name, :foreign_key => "parentable_id"
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 => 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, :class_name => task_class_name, :foreign_key => "parentable_id"
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
- reload_models.photo {
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
- reload_models.photo {
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
- reload_models.photo {
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
- reload_models.photo {
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
- reload_models.task {
281
- has_many :photos, :class_name => photo_class_name, :foreign_key => "parentable_id"
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, :class_name => task_class_name, :foreign_key => "parentable_id"
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
- reload_models.task {
307
- has_many :photos, :class_name => photo_class_name, :foreign_key => "parentable_id"
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, :class_name => task_class_name, :foreign_key => "parentable_id"
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
- reload_models.photo {
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