has_moderated 1.2.2 → 1.2.3

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