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
data/test/dummy/public/404.html
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>The page you were looking for doesn't exist (404)</title>
|
5
|
-
<style type="text/css">
|
6
|
-
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
-
div.dialog {
|
8
|
-
width: 25em;
|
9
|
-
padding: 0 4em;
|
10
|
-
margin: 4em auto 0 auto;
|
11
|
-
border: 1px solid #ccc;
|
12
|
-
border-right-color: #999;
|
13
|
-
border-bottom-color: #999;
|
14
|
-
}
|
15
|
-
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
-
</style>
|
17
|
-
</head>
|
18
|
-
|
19
|
-
<body>
|
20
|
-
<!-- This file lives in public/404.html -->
|
21
|
-
<div class="dialog">
|
22
|
-
<h1>The page you were looking for doesn't exist.</h1>
|
23
|
-
<p>You may have mistyped the address or the page may have moved.</p>
|
24
|
-
</div>
|
25
|
-
</body>
|
26
|
-
</html>
|
data/test/dummy/public/422.html
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>The change you wanted was rejected (422)</title>
|
5
|
-
<style type="text/css">
|
6
|
-
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
-
div.dialog {
|
8
|
-
width: 25em;
|
9
|
-
padding: 0 4em;
|
10
|
-
margin: 4em auto 0 auto;
|
11
|
-
border: 1px solid #ccc;
|
12
|
-
border-right-color: #999;
|
13
|
-
border-bottom-color: #999;
|
14
|
-
}
|
15
|
-
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
-
</style>
|
17
|
-
</head>
|
18
|
-
|
19
|
-
<body>
|
20
|
-
<!-- This file lives in public/422.html -->
|
21
|
-
<div class="dialog">
|
22
|
-
<h1>The change you wanted was rejected.</h1>
|
23
|
-
<p>Maybe you tried to change something you didn't have access to.</p>
|
24
|
-
</div>
|
25
|
-
</body>
|
26
|
-
</html>
|
data/test/dummy/public/500.html
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>We're sorry, but something went wrong (500)</title>
|
5
|
-
<style type="text/css">
|
6
|
-
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
-
div.dialog {
|
8
|
-
width: 25em;
|
9
|
-
padding: 0 4em;
|
10
|
-
margin: 4em auto 0 auto;
|
11
|
-
border: 1px solid #ccc;
|
12
|
-
border-right-color: #999;
|
13
|
-
border-bottom-color: #999;
|
14
|
-
}
|
15
|
-
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
-
</style>
|
17
|
-
</head>
|
18
|
-
|
19
|
-
<body>
|
20
|
-
<!-- This file lives in public/500.html -->
|
21
|
-
<div class="dialog">
|
22
|
-
<h1>We're sorry, but something went wrong.</h1>
|
23
|
-
<p>We've been notified about this issue and we'll take a look at it shortly.</p>
|
24
|
-
</div>
|
25
|
-
</body>
|
26
|
-
</html>
|
File without changes
|
data/test/dummy/public/test.jpg
DELETED
Binary file
|
Binary file
|
Binary file
|
data/test/dummy/script/rails
DELETED
@@ -1,6 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
|
-
|
4
|
-
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
5
|
-
require File.expand_path('../../config/boot', __FILE__)
|
6
|
-
require 'rails/commands'
|
@@ -1,886 +0,0 @@
|
|
1
|
-
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
-
|
3
|
-
def reload_models &block
|
4
|
-
crazy_models.reset
|
5
|
-
crazy_models.with_helpers &block if block_given?
|
6
|
-
crazy_models
|
7
|
-
end
|
8
|
-
|
9
|
-
describe Task do
|
10
|
-
|
11
|
-
#
|
12
|
-
# has_moderated_association
|
13
|
-
# has_many
|
14
|
-
#
|
15
|
-
|
16
|
-
context "has_many association:" do
|
17
|
-
before do
|
18
|
-
reload_models.task {
|
19
|
-
has_many :renamed_subtasks, :class_name => subtask_class_name, :foreign_key => task_fk
|
20
|
-
has_moderated_association :renamed_subtasks
|
21
|
-
}.subtask {
|
22
|
-
belongs_to :task, :class_name => task_class_name, :foreign_key => task_fk
|
23
|
-
}
|
24
|
-
end
|
25
|
-
|
26
|
-
it "creates and associates subtask (create)" do
|
27
|
-
task = Task.create! :title => "Task 1"
|
28
|
-
Moderation.count.should eq(0)
|
29
|
-
task.renamed_subtasks.create! :title => "Subtask 1"
|
30
|
-
|
31
|
-
task = Task.first
|
32
|
-
task.renamed_subtasks.count.should eq(0)
|
33
|
-
|
34
|
-
Moderation.count.should eq(1)
|
35
|
-
Moderation.last.accept
|
36
|
-
Moderation.count.should eq(0)
|
37
|
-
|
38
|
-
subtask = Task.first.renamed_subtasks.first
|
39
|
-
subtask.title.should eq("Subtask 1")
|
40
|
-
end
|
41
|
-
|
42
|
-
it "creates and associates subtask (build, save task)" do
|
43
|
-
task = Task.create! :title => "Task 1"
|
44
|
-
Moderation.count.should eq(0)
|
45
|
-
task.renamed_subtasks.build :title => "Subtask 1"
|
46
|
-
task.save
|
47
|
-
|
48
|
-
task = Task.first
|
49
|
-
task.renamed_subtasks.count.should eq(0)
|
50
|
-
|
51
|
-
Moderation.count.should eq(1)
|
52
|
-
Moderation.last.accept
|
53
|
-
Moderation.count.should eq(0)
|
54
|
-
|
55
|
-
subtask = Task.first.renamed_subtasks.first
|
56
|
-
subtask.title.should eq("Subtask 1")
|
57
|
-
end
|
58
|
-
|
59
|
-
it "creates and associates subtask (build, save subtask)", :broken => true do
|
60
|
-
task = Task.create! :title => "Task 1"
|
61
|
-
Moderation.count.should eq(0)
|
62
|
-
subtask = task.renamed_subtasks.build :title => "Subtask 1"
|
63
|
-
subtask.save
|
64
|
-
|
65
|
-
task = Task.first
|
66
|
-
task.renamed_subtasks.count.should eq(0)
|
67
|
-
|
68
|
-
Moderation.count.should eq(1)
|
69
|
-
Moderation.last.accept
|
70
|
-
Moderation.count.should eq(0)
|
71
|
-
|
72
|
-
subtask = Task.first.renamed_subtasks.first
|
73
|
-
subtask.title.should eq("Subtask 1")
|
74
|
-
end
|
75
|
-
|
76
|
-
it "associates (<<) existing subtask" do
|
77
|
-
task = Task.create! :title => "Task 1"
|
78
|
-
Subtask.create! :title => "Subtask 1"
|
79
|
-
Moderation.count.should eq(0)
|
80
|
-
task.renamed_subtasks << Subtask.first
|
81
|
-
|
82
|
-
task = Task.first
|
83
|
-
task.renamed_subtasks.count.should eq(0)
|
84
|
-
|
85
|
-
Moderation.count.should eq(1)
|
86
|
-
Moderation.last.accept
|
87
|
-
Moderation.count.should eq(0)
|
88
|
-
|
89
|
-
subtask = Task.first.renamed_subtasks.first
|
90
|
-
subtask.title.should eq("Subtask 1")
|
91
|
-
end
|
92
|
-
|
93
|
-
it "associates (push) existing subtask" do
|
94
|
-
task = Task.create! :title => "Task 1"
|
95
|
-
Subtask.create! :title => "Subtask 1"
|
96
|
-
Moderation.count.should eq(0)
|
97
|
-
task.renamed_subtasks.push Subtask.first
|
98
|
-
|
99
|
-
task = Task.first
|
100
|
-
task.renamed_subtasks.count.should eq(0)
|
101
|
-
|
102
|
-
Moderation.count.should eq(1)
|
103
|
-
Moderation.last.accept
|
104
|
-
Moderation.count.should eq(0)
|
105
|
-
|
106
|
-
subtask = Task.first.renamed_subtasks.first
|
107
|
-
subtask.title.should eq("Subtask 1")
|
108
|
-
end
|
109
|
-
|
110
|
-
it "moderates deleting association" do
|
111
|
-
task = Task.create! :title => "Task 1"
|
112
|
-
task.renamed_subtasks.create! :title => "Subtask 1"
|
113
|
-
Moderation.last.accept
|
114
|
-
|
115
|
-
Task.last.renamed_subtasks.delete(Task.last.renamed_subtasks.last)
|
116
|
-
Task.last.renamed_subtasks.count.should eq(1)
|
117
|
-
|
118
|
-
Moderation.last.accept
|
119
|
-
Task.last.renamed_subtasks.count.should eq(0)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
#
|
124
|
-
# has_moderated_association
|
125
|
-
# has_many polymorphic
|
126
|
-
#
|
127
|
-
|
128
|
-
context "has_many polymorphic association:" do
|
129
|
-
before do
|
130
|
-
reload_models.task {
|
131
|
-
has_many :renamed_subtasks, :class_name => subtask_class_name, :as => :parentable
|
132
|
-
has_moderated_association :renamed_subtasks
|
133
|
-
}.subtask {
|
134
|
-
belongs_to :parentable, :class_name => task_class_name, :polymorphic => true
|
135
|
-
}
|
136
|
-
end
|
137
|
-
|
138
|
-
it "creates and associates subtask (create)" do
|
139
|
-
task = Task.create! :title => "Task 1"
|
140
|
-
Moderation.count.should eq(0)
|
141
|
-
task.renamed_subtasks.create! :title => "Subtask 1"
|
142
|
-
|
143
|
-
task = Task.first
|
144
|
-
task.renamed_subtasks.count.should eq(0)
|
145
|
-
|
146
|
-
Moderation.count.should eq(1)
|
147
|
-
Moderation.last.accept
|
148
|
-
Moderation.count.should eq(0)
|
149
|
-
|
150
|
-
subtask = Task.first.renamed_subtasks.first
|
151
|
-
subtask.title.should eq("Subtask 1")
|
152
|
-
subtask.parentable.should eq(Task.first)
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
#
|
157
|
-
# has_moderated_association
|
158
|
-
# has_one polymorphic
|
159
|
-
#
|
160
|
-
|
161
|
-
context "has_one polymorphic association:" do
|
162
|
-
before do
|
163
|
-
reload_models.task {
|
164
|
-
has_one :renamed_subtask, :class_name => subtask_class_name, :as => :parentable
|
165
|
-
has_moderated_association :renamed_subtask
|
166
|
-
}.subtask {
|
167
|
-
belongs_to :parentable, :class_name => task_class_name, :polymorphic => true
|
168
|
-
}
|
169
|
-
end
|
170
|
-
|
171
|
-
it "creates and associates subtask (create)" do
|
172
|
-
task = Task.create! :title => "Task 1"
|
173
|
-
Moderation.count.should eq(0)
|
174
|
-
task.renamed_subtask = Subtask.new :title => "Subtask 1"
|
175
|
-
task.save
|
176
|
-
|
177
|
-
task = Task.first
|
178
|
-
task.renamed_subtask.should be_nil
|
179
|
-
|
180
|
-
Moderation.count.should eq(1)
|
181
|
-
Moderation.last.accept
|
182
|
-
Moderation.count.should eq(0)
|
183
|
-
|
184
|
-
subtask = Task.first.renamed_subtask
|
185
|
-
subtask.title.should eq("Subtask 1")
|
186
|
-
subtask.parentable.should eq(Task.first)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
#
|
191
|
-
# has_moderated_association
|
192
|
-
# has_and_belongs_to_many
|
193
|
-
#
|
194
|
-
|
195
|
-
context "has_and_belongs_to_many association:" do
|
196
|
-
before do
|
197
|
-
reload_models.task {
|
198
|
-
has_and_belongs_to_many :renamed_subtasks, :class_name => subtask_class_name, :join_table => "tasks_jointable", :foreign_key => "m1_id", :association_foreign_key => "m2_id"
|
199
|
-
has_moderated_association :renamed_subtasks
|
200
|
-
}.subtask {
|
201
|
-
has_and_belongs_to_many :renamed_tasks, :class_name => task_class_name, :join_table => "tasks_jointable", :foreign_key => "m2_id", :association_foreign_key => "m1_id"
|
202
|
-
}
|
203
|
-
end
|
204
|
-
|
205
|
-
it "creates and associates a new subtask" do
|
206
|
-
task = Task.create! :title => "Task 1"
|
207
|
-
Moderation.count.should eq(0)
|
208
|
-
task.renamed_subtasks.create! :title => "Subtask 1"
|
209
|
-
|
210
|
-
Subtask.count.should eq(0)
|
211
|
-
task = Task.first
|
212
|
-
task.renamed_subtasks.count.should eq(0)
|
213
|
-
|
214
|
-
Moderation.count.should eq(1)
|
215
|
-
Moderation.last.accept
|
216
|
-
Moderation.count.should eq(0)
|
217
|
-
|
218
|
-
subtask = Task.first.renamed_subtasks.first
|
219
|
-
subtask.title.should eq("Subtask 1")
|
220
|
-
end
|
221
|
-
|
222
|
-
it "associates an existing subtask" do
|
223
|
-
task = Task.create! :title => "Task 1"
|
224
|
-
Subtask.create! :title => "Subtask 1"
|
225
|
-
Task.first.renamed_subtasks.count.should eq(0)
|
226
|
-
Subtask.count.should eq(1)
|
227
|
-
Moderation.count.should eq(0)
|
228
|
-
task.renamed_subtasks << Subtask.first
|
229
|
-
|
230
|
-
Moderation.count.should eq(1)
|
231
|
-
Moderation.last.accept
|
232
|
-
Moderation.count.should eq(0)
|
233
|
-
|
234
|
-
Task.first.renamed_subtasks.count.should eq(1)
|
235
|
-
subtask = Task.first.renamed_subtasks.first
|
236
|
-
subtask.title.should eq("Subtask 1")
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
context "has_and_belongs_to_many association (create moderation):" do
|
241
|
-
before :each do # important that we do this before EACH
|
242
|
-
reload_models.task {
|
243
|
-
has_moderated_create :with_associations => [:renamed_subtasks]
|
244
|
-
has_and_belongs_to_many :renamed_subtasks, :class_name => subtask_class_name, :join_table => "tasks_jointable", :foreign_key => "m1_id", :association_foreign_key => "m2_id"
|
245
|
-
}.subtask {
|
246
|
-
has_and_belongs_to_many :renamed_tasks, :class_name => task_class_name, :join_table => "tasks_jointable", :foreign_key => "m2_id", :association_foreign_key => "m1_id"
|
247
|
-
}
|
248
|
-
end
|
249
|
-
|
250
|
-
it "associates an existing subtask on create 1" do
|
251
|
-
Task.has_moderated_association :renamed_subtasks # important difference (had different behavior based
|
252
|
-
# on presence of this line, need to test with and without)
|
253
|
-
Subtask.create! :title => "Subtask 1"
|
254
|
-
Subtask.count.should eq(1)
|
255
|
-
Moderation.count.should eq(0)
|
256
|
-
|
257
|
-
task = Task.new :title => "Task 1"
|
258
|
-
task.renamed_subtasks << Subtask.first
|
259
|
-
task.save
|
260
|
-
|
261
|
-
Moderation.count.should eq(1)
|
262
|
-
Moderation.last.accept
|
263
|
-
Moderation.count.should eq(0)
|
264
|
-
|
265
|
-
Task.first.renamed_subtasks.count.should eq(1)
|
266
|
-
subtask = Task.first.renamed_subtasks.first
|
267
|
-
subtask.title.should eq("Subtask 1")
|
268
|
-
end
|
269
|
-
|
270
|
-
it "associates an existing subtask on create 2" do
|
271
|
-
Subtask.create! :title => "Subtask 1"
|
272
|
-
Subtask.count.should eq(1)
|
273
|
-
Moderation.count.should eq(0)
|
274
|
-
|
275
|
-
task = Task.new :title => "Task 1"
|
276
|
-
task.renamed_subtasks << Subtask.first
|
277
|
-
task.save
|
278
|
-
|
279
|
-
Task.count.should eq(0)
|
280
|
-
Moderation.count.should eq(1)
|
281
|
-
Moderation.last.accept
|
282
|
-
Moderation.count.should eq(0)
|
283
|
-
|
284
|
-
Task.last.renamed_subtasks.count.should eq(1)
|
285
|
-
subtask = Task.first.renamed_subtasks.first
|
286
|
-
subtask.title.should eq("Subtask 1")
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
|
-
#
|
291
|
-
# has_moderated_association
|
292
|
-
# has_many :through
|
293
|
-
#
|
294
|
-
|
295
|
-
context "has_many :through association:" do
|
296
|
-
before do
|
297
|
-
reload_models.task {
|
298
|
-
has_many :renamed_connections, :class_name => task_connection_class_name, :foreign_key => "m1_id"
|
299
|
-
has_many :renamed_subtasks, :class_name => subtask_class_name, :through => :renamed_connections, :source => :renamed_subtask
|
300
|
-
has_moderated_association :renamed_subtasks
|
301
|
-
has_moderated_association :renamed_connections
|
302
|
-
}.subtask {
|
303
|
-
has_many :renamed_connections, :class_name => task_connection_class_name, :foreign_key => "m2_id"
|
304
|
-
has_many :renamed_tasks, :class_name => task_class_name, :through => :renamed_connections, :source => :renamed_task
|
305
|
-
}.task_connection {
|
306
|
-
belongs_to :renamed_task, :class_name => task_class_name, :foreign_key => "m1_id"
|
307
|
-
belongs_to :renamed_subtask, :class_name => subtask_class_name, :foreign_key => "m2_id"
|
308
|
-
}
|
309
|
-
end
|
310
|
-
|
311
|
-
it "associates subtask 1 (update)" do
|
312
|
-
task = Task.create! :title => "Task 1"
|
313
|
-
Moderation.count.should eq(0)
|
314
|
-
|
315
|
-
conn = TaskConnection.new :title => "Connection 1"
|
316
|
-
conn.renamed_subtask = Subtask.new :title => "Subtask 1"
|
317
|
-
task.renamed_connections << conn
|
318
|
-
task.save
|
319
|
-
|
320
|
-
TaskConnection.count.should eq(0)
|
321
|
-
Subtask.count.should eq(0)
|
322
|
-
|
323
|
-
Moderation.last.accept
|
324
|
-
Moderation.count.should eq(0)
|
325
|
-
|
326
|
-
subtask = Task.first.renamed_subtasks.first
|
327
|
-
subtask.title.should eq("Subtask 1")
|
328
|
-
conn = Subtask.first.renamed_connections.first
|
329
|
-
conn.title.should eq("Connection 1")
|
330
|
-
conn.renamed_subtask.title.should eq("Subtask 1")
|
331
|
-
conn.renamed_task.title.should eq("Task 1")
|
332
|
-
end
|
333
|
-
|
334
|
-
it "associates subtask 2 (update)" do
|
335
|
-
task = Task.create! :title => "Task 1"
|
336
|
-
Moderation.count.should eq(0)
|
337
|
-
|
338
|
-
task.renamed_subtasks.build :title => "Subtask 1"
|
339
|
-
task.save
|
340
|
-
|
341
|
-
TaskConnection.count.should eq(0)
|
342
|
-
Subtask.count.should eq(0)
|
343
|
-
Moderation.last.accept
|
344
|
-
Moderation.count.should eq(0)
|
345
|
-
Subtask.count.should eq(1)
|
346
|
-
|
347
|
-
subtask = Task.first.renamed_subtasks.first
|
348
|
-
subtask.title.should eq("Subtask 1")
|
349
|
-
end
|
350
|
-
|
351
|
-
it "associates subtask 3 (update)" do
|
352
|
-
task = Task.create! :title => "Task 1"
|
353
|
-
Moderation.count.should eq(0)
|
354
|
-
|
355
|
-
task.renamed_subtasks.create! :title => "Subtask 1"
|
356
|
-
|
357
|
-
TaskConnection.count.should eq(0)
|
358
|
-
Subtask.count.should eq(0)
|
359
|
-
|
360
|
-
Moderation.last.accept
|
361
|
-
Moderation.count.should eq(0)
|
362
|
-
Subtask.count.should eq(1)
|
363
|
-
|
364
|
-
subtask = Task.first.renamed_subtasks.first
|
365
|
-
subtask.title.should eq("Subtask 1")
|
366
|
-
end
|
367
|
-
|
368
|
-
it "associates subtask 1 (create)" do
|
369
|
-
t = Task.new :title => "Task 1"
|
370
|
-
t.renamed_subtasks.build :title => "Subtask 1"
|
371
|
-
t.save
|
372
|
-
|
373
|
-
Subtask.count.should eq(0)
|
374
|
-
Task.first.title.should eq("Task 1")
|
375
|
-
Task.first.renamed_subtasks.count.should eq(0)
|
376
|
-
Task.count.should eq(1)
|
377
|
-
|
378
|
-
Moderation.last.accept
|
379
|
-
|
380
|
-
Task.first.renamed_subtasks.count.should eq(1)
|
381
|
-
Task.first.renamed_subtasks.first.title.should eq("Subtask 1")
|
382
|
-
end
|
383
|
-
end
|
384
|
-
|
385
|
-
#
|
386
|
-
# has_moderated_association
|
387
|
-
# has_one
|
388
|
-
#
|
389
|
-
|
390
|
-
context "has_one association:" do
|
391
|
-
before do
|
392
|
-
reload_models.task {
|
393
|
-
has_one :renamed_subtask, :class_name => subtask_class_name, :foreign_key => task_fk
|
394
|
-
has_moderated_association :renamed_subtask
|
395
|
-
}.subtask {
|
396
|
-
belongs_to :task, :class_name => task_class_name
|
397
|
-
}
|
398
|
-
end
|
399
|
-
|
400
|
-
it "creates and associates subtask (= new, task save)" do
|
401
|
-
task = Task.create! :title => "Task 1"
|
402
|
-
Moderation.count.should eq(0)
|
403
|
-
task.renamed_subtask = Subtask.new :title => "Subtask 1"
|
404
|
-
task.save
|
405
|
-
|
406
|
-
task = Task.first
|
407
|
-
task.renamed_subtask.should be_nil
|
408
|
-
Subtask.count.should eq(0)
|
409
|
-
|
410
|
-
Moderation.count.should eq(1)
|
411
|
-
Moderation.last.accept
|
412
|
-
Moderation.count.should eq(0)
|
413
|
-
|
414
|
-
subtask = Task.first.renamed_subtask
|
415
|
-
subtask.title.should eq("Subtask 1")
|
416
|
-
end
|
417
|
-
|
418
|
-
it "creates and associates subtask (= create, task save)" do
|
419
|
-
task = Task.create! :title => "Task 1"
|
420
|
-
Moderation.count.should eq(0)
|
421
|
-
task.renamed_subtask = Subtask.create! :title => "Subtask 1"
|
422
|
-
task.save
|
423
|
-
|
424
|
-
task = Task.first
|
425
|
-
task.renamed_subtask.should be_nil
|
426
|
-
|
427
|
-
Moderation.count.should eq(1)
|
428
|
-
Moderation.last.accept
|
429
|
-
Moderation.count.should eq(0)
|
430
|
-
|
431
|
-
subtask = Task.first.renamed_subtask
|
432
|
-
subtask.title.should eq("Subtask 1")
|
433
|
-
end
|
434
|
-
|
435
|
-
it "set subtask to nil (delete)" do
|
436
|
-
task = Task.create! :title => "Task 1"
|
437
|
-
task.renamed_subtask = Subtask.new :title => "Subtask 1"
|
438
|
-
task.save
|
439
|
-
Moderation.last.accept
|
440
|
-
|
441
|
-
Moderation.count.should eq(0)
|
442
|
-
Task.first.renamed_subtask.should_not be_nil
|
443
|
-
|
444
|
-
Task.first.renamed_subtask = nil
|
445
|
-
Task.first.renamed_subtask.should_not be_nil
|
446
|
-
|
447
|
-
Moderation.last.accept
|
448
|
-
Task.first.renamed_subtask.should be_nil
|
449
|
-
end
|
450
|
-
end
|
451
|
-
|
452
|
-
context "has_one association (create moderation):" do
|
453
|
-
before :each do
|
454
|
-
reload_models.task {
|
455
|
-
has_one :renamed_subtask, :class_name => subtask_class_name, :foreign_key => task_fk
|
456
|
-
has_moderated_create :with_associations => [:renamed_subtask]
|
457
|
-
}.subtask {
|
458
|
-
belongs_to :task, :class_name => task_class_name
|
459
|
-
}
|
460
|
-
end
|
461
|
-
|
462
|
-
it "associates an existing subtask on create 1" do
|
463
|
-
Task.has_moderated_association :renamed_subtask
|
464
|
-
Subtask.create! :title => "Subtask 1"
|
465
|
-
Subtask.count.should eq(1)
|
466
|
-
Moderation.count.should eq(0)
|
467
|
-
|
468
|
-
task = Task.new :title => "Task 1"
|
469
|
-
task.renamed_subtask = Subtask.first
|
470
|
-
task.save
|
471
|
-
|
472
|
-
Subtask.first.task_id.should be_nil
|
473
|
-
|
474
|
-
Task.count.should eq(0)
|
475
|
-
Moderation.count.should eq(1)
|
476
|
-
Moderation.last.accept
|
477
|
-
Moderation.count.should eq(0)
|
478
|
-
Subtask.first.task_id.should_not be_nil
|
479
|
-
|
480
|
-
subtask = Task.first.renamed_subtask
|
481
|
-
subtask.title.should eq("Subtask 1")
|
482
|
-
end
|
483
|
-
|
484
|
-
it "associates an existing subtask on create 2" do
|
485
|
-
Subtask.create! :title => "Subtask 1"
|
486
|
-
Subtask.count.should eq(1)
|
487
|
-
Moderation.count.should eq(0)
|
488
|
-
|
489
|
-
task = Task.new :title => "Task 1"
|
490
|
-
task.renamed_subtask = Subtask.first
|
491
|
-
task.save
|
492
|
-
|
493
|
-
Subtask.first.task_id.should be_nil
|
494
|
-
|
495
|
-
Task.count.should eq(0)
|
496
|
-
Moderation.count.should eq(1)
|
497
|
-
Moderation.last.accept
|
498
|
-
Moderation.count.should eq(0)
|
499
|
-
Subtask.first.task_id.should_not be_nil
|
500
|
-
|
501
|
-
subtask = Task.first.renamed_subtask
|
502
|
-
subtask.title.should eq("Subtask 1")
|
503
|
-
end
|
504
|
-
end
|
505
|
-
|
506
|
-
#
|
507
|
-
# has_moderated_create
|
508
|
-
#
|
509
|
-
|
510
|
-
context "create moderation with association:" do
|
511
|
-
before do
|
512
|
-
reload_models.task {
|
513
|
-
has_many :renamed_subtasks, :class_name => subtask_class_name, :foreign_key => task_fk
|
514
|
-
has_moderated_create :with_associations => [:renamed_subtasks]
|
515
|
-
}.subtask {
|
516
|
-
belongs_to :task, :class_name => task_class_name
|
517
|
-
}
|
518
|
-
end
|
519
|
-
|
520
|
-
it "moderates create" do
|
521
|
-
task = Task.create! :title => "Task 1"
|
522
|
-
Moderation.count.should eq(1)
|
523
|
-
Task.count.should eq(0)
|
524
|
-
|
525
|
-
Moderation.last.accept
|
526
|
-
Task.count.should eq(1)
|
527
|
-
Task.first.title.should eq("Task 1")
|
528
|
-
end
|
529
|
-
|
530
|
-
# TODO: test all associations on create
|
531
|
-
it "moderates assoc on create" do
|
532
|
-
task = Task.new :title => "Task 1"
|
533
|
-
task.renamed_subtasks.build :title => "Subtask 1"
|
534
|
-
task.save
|
535
|
-
Subtask.count.should eq(0)
|
536
|
-
Moderation.last.accept
|
537
|
-
|
538
|
-
Task.last.renamed_subtasks.count.should eq(1)
|
539
|
-
Task.last.renamed_subtasks.first.title.should eq("Subtask 1")
|
540
|
-
end
|
541
|
-
|
542
|
-
it "doesn't create anything if nothing was created" do
|
543
|
-
task = Task.create! :title => "Task 1"
|
544
|
-
Moderation.last.accept
|
545
|
-
|
546
|
-
Task.first.renamed_subtasks.count.should eq(0)
|
547
|
-
end
|
548
|
-
end
|
549
|
-
|
550
|
-
#
|
551
|
-
# has_moderated_destroy
|
552
|
-
#
|
553
|
-
|
554
|
-
context "destroy moderation:" do
|
555
|
-
before do
|
556
|
-
reload_models.task {
|
557
|
-
has_moderated_destroy
|
558
|
-
}
|
559
|
-
end
|
560
|
-
|
561
|
-
it "moderates destroy" do
|
562
|
-
Task.create! :title => "Task 1"
|
563
|
-
Task.count.should eq(1)
|
564
|
-
Task.first.destroy
|
565
|
-
Task.count.should eq(1)
|
566
|
-
Moderation.last.accept
|
567
|
-
Task.count.should eq(0)
|
568
|
-
end
|
569
|
-
|
570
|
-
it "returns nil for #preview" do
|
571
|
-
Task.create! :title => "Task 1"
|
572
|
-
Task.first.destroy
|
573
|
-
Moderation.last.preview.should be_nil
|
574
|
-
end
|
575
|
-
end
|
576
|
-
|
577
|
-
#
|
578
|
-
# has_moderated_attributes
|
579
|
-
#
|
580
|
-
|
581
|
-
context "moderates attributes:" do
|
582
|
-
it "moderates an attribute" do
|
583
|
-
reload_models.task {
|
584
|
-
has_moderated :title
|
585
|
-
}
|
586
|
-
Task.create! :title => "Task 1", :desc => "Description"
|
587
|
-
Task.first.title.should be_blank
|
588
|
-
Task.first.desc.should eq("Description")
|
589
|
-
Moderation.last.accept
|
590
|
-
Task.first.title.should eq("Task 1")
|
591
|
-
Task.first.update_attribute(:title, "Task 2")
|
592
|
-
Task.first.title.should eq("Task 1")
|
593
|
-
Moderation.last.accept
|
594
|
-
Task.first.title.should eq("Task 2")
|
595
|
-
end
|
596
|
-
|
597
|
-
it "validates uniqueness properly" do
|
598
|
-
reload_models.task {
|
599
|
-
has_moderated :title
|
600
|
-
validates_uniqueness_of :title
|
601
|
-
}
|
602
|
-
Task.create! :title => "Task 1"
|
603
|
-
Task.create! :title => "Task 1"
|
604
|
-
Moderation.first.accept
|
605
|
-
expect { Task.create! :title => "Task 1" }.should raise_error
|
606
|
-
Moderation.first.accept.should be_false
|
607
|
-
expect { Moderation.first.accept! }.should raise_error
|
608
|
-
end
|
609
|
-
end
|
610
|
-
|
611
|
-
#
|
612
|
-
# other features
|
613
|
-
#
|
614
|
-
|
615
|
-
context "common features:" do
|
616
|
-
it "get_moderation_attributes can be overriden in model" do
|
617
|
-
reload_models.task {
|
618
|
-
has_moderated_create
|
619
|
-
self.class_eval do
|
620
|
-
def get_moderation_attributes
|
621
|
-
{ :test => "ok" }
|
622
|
-
end
|
623
|
-
end
|
624
|
-
}
|
625
|
-
Task.create! :title => "Task 1"
|
626
|
-
data = YAML::load(Moderation.last.data)[:create][:attributes]
|
627
|
-
data.should_not be_blank
|
628
|
-
data[:test].should_not be_blank
|
629
|
-
data[:test].should eq("ok")
|
630
|
-
data.keys.count.should eq(1)
|
631
|
-
end
|
632
|
-
|
633
|
-
it "knows if it's a create moderation" do
|
634
|
-
reload_models.task {
|
635
|
-
has_moderated_create
|
636
|
-
}
|
637
|
-
|
638
|
-
Task.create! :title => "Task 1"
|
639
|
-
|
640
|
-
Moderation.last.create?.should be_true
|
641
|
-
Moderation.last.destroy?.should be_false
|
642
|
-
Moderation.last.update?.should be_false
|
643
|
-
end
|
644
|
-
|
645
|
-
it "knows if it's a destroy moderation" do
|
646
|
-
reload_models.task {
|
647
|
-
has_moderated_destroy
|
648
|
-
}
|
649
|
-
|
650
|
-
Task.create! :title => "Task 1"
|
651
|
-
Task.last.destroy
|
652
|
-
|
653
|
-
Moderation.last.destroy?.should be_true
|
654
|
-
Moderation.last.create?.should be_false
|
655
|
-
Moderation.last.update?.should be_false
|
656
|
-
end
|
657
|
-
|
658
|
-
it "calls moderation callbacks on destroy" do
|
659
|
-
reload_models.task {
|
660
|
-
has_moderated_create
|
661
|
-
def self.moderatable_discard(m, opts)
|
662
|
-
raise "moderatable_discard"
|
663
|
-
end
|
664
|
-
}
|
665
|
-
Task.create!
|
666
|
-
expect { Moderation.last.destroy }.should raise_error("moderatable_discard")
|
667
|
-
end
|
668
|
-
end
|
669
|
-
|
670
|
-
context "hooks:" do
|
671
|
-
before do
|
672
|
-
reload_models.task {
|
673
|
-
has_moderated :title
|
674
|
-
moderation_creating do |moderation|
|
675
|
-
moderation.data = "Test!"
|
676
|
-
end
|
677
|
-
}
|
678
|
-
end
|
679
|
-
|
680
|
-
it "handles a creating hook properly" do
|
681
|
-
Task.create! :title => "Task 1"
|
682
|
-
Moderation.count.should eq(1)
|
683
|
-
Moderation.last.data.should eq("Test!")
|
684
|
-
end
|
685
|
-
end
|
686
|
-
|
687
|
-
context "without_moderation:" do
|
688
|
-
before do
|
689
|
-
reload_models.task {
|
690
|
-
has_moderated :title
|
691
|
-
}
|
692
|
-
end
|
693
|
-
|
694
|
-
it "can bypass moderation for specific model" do
|
695
|
-
Task.create!
|
696
|
-
Moderation.count.should eq(0)
|
697
|
-
t = Task.first
|
698
|
-
t.title = "Task 2"
|
699
|
-
t.without_moderation do
|
700
|
-
t.save
|
701
|
-
end
|
702
|
-
Moderation.count.should eq(0)
|
703
|
-
Task.first.title.should eq("Task 2")
|
704
|
-
end
|
705
|
-
|
706
|
-
it "can bypass moderation for all models" do
|
707
|
-
Task.create!
|
708
|
-
Moderation.count.should eq(0)
|
709
|
-
t = Task.first
|
710
|
-
t.title = "Task 2"
|
711
|
-
Moderation.without_moderation do
|
712
|
-
t.save
|
713
|
-
end
|
714
|
-
Moderation.count.should eq(0)
|
715
|
-
Task.first.title.should eq("Task 2")
|
716
|
-
Moderation.moderation_disabled.should be_false
|
717
|
-
t.title = "Task 3"
|
718
|
-
t.save
|
719
|
-
Moderation.count.should eq(1)
|
720
|
-
Task.first.title.should eq("Task 2")
|
721
|
-
end
|
722
|
-
end
|
723
|
-
|
724
|
-
context "preview:" do
|
725
|
-
it "shows a live preview of changed attributes" do
|
726
|
-
reload_models.task {
|
727
|
-
has_moderated :title
|
728
|
-
}
|
729
|
-
|
730
|
-
Task.create! :title => "Task 1"
|
731
|
-
Task.last.title.should be_blank
|
732
|
-
|
733
|
-
last_task_id = Task.last.id
|
734
|
-
Moderation.last.live_preview do |preview|
|
735
|
-
preview.title.should eq("Task 1")
|
736
|
-
preview.id.should eq(last_task_id)
|
737
|
-
end
|
738
|
-
|
739
|
-
Task.last.title.should be_blank
|
740
|
-
end
|
741
|
-
|
742
|
-
it "returns a preview for create moderations (issue #13)" do
|
743
|
-
reload_models.task {
|
744
|
-
has_moderated_create
|
745
|
-
}
|
746
|
-
|
747
|
-
Task.create! :title => "Task 1"
|
748
|
-
Moderation.last.preview.should_not be_nil
|
749
|
-
Moderation.last.preview.title.should eq("Task 1")
|
750
|
-
end
|
751
|
-
|
752
|
-
it "shows a saved preview of changed attributes" do
|
753
|
-
reload_models.task {
|
754
|
-
has_moderated :title
|
755
|
-
}
|
756
|
-
|
757
|
-
task = Task.create! :title => "Task 1"
|
758
|
-
Task.last.title.should be_blank
|
759
|
-
|
760
|
-
preview = Moderation.last.preview
|
761
|
-
preview.title.should eq("Task 1")
|
762
|
-
preview.id.should eq(Task.last.id)
|
763
|
-
Task.last.title.should be_blank
|
764
|
-
end
|
765
|
-
|
766
|
-
it "supports dirty tracking for the saved preview" do
|
767
|
-
reload_models.task {
|
768
|
-
has_moderated :title
|
769
|
-
}
|
770
|
-
|
771
|
-
task = Task.create! :title => "Task 1"
|
772
|
-
Task.last.title.should be_blank
|
773
|
-
|
774
|
-
preview = Moderation.last.preview
|
775
|
-
preview.title_changed?.should be_true
|
776
|
-
preview.title_change.should eq([nil, "Task 1"])
|
777
|
-
end
|
778
|
-
|
779
|
-
it "supports updating moderation attributes for the saved preview if :saveable => true" do
|
780
|
-
reload_models.task {
|
781
|
-
has_moderated :title
|
782
|
-
}
|
783
|
-
|
784
|
-
task = Task.create! :title => "Task 1"
|
785
|
-
Task.last.title.should be_blank
|
786
|
-
|
787
|
-
preview = Moderation.last.preview(:saveable => true)
|
788
|
-
preview.title = "Task 2"
|
789
|
-
preview.update_moderation
|
790
|
-
|
791
|
-
moderation = Moderation.last
|
792
|
-
moderation.parsed_data.should eq({:attributes=>{"title"=>"Task 2"}})
|
793
|
-
moderation.accept
|
794
|
-
Task.last.title.should eq("Task 2")
|
795
|
-
end
|
796
|
-
|
797
|
-
it "doesn't support updating moderation attributes for the saved preview by default" do
|
798
|
-
reload_models.task {
|
799
|
-
has_moderated :title
|
800
|
-
}
|
801
|
-
|
802
|
-
task = Task.create! :title => "Task 1"
|
803
|
-
Task.last.title.should be_blank
|
804
|
-
|
805
|
-
moderation = Moderation.last
|
806
|
-
preview = Moderation.last.preview
|
807
|
-
preview.frozen?.should be_true
|
808
|
-
expect { preview.title = "Task 2" }.should raise_error
|
809
|
-
expect { preview.update_moderation }.should raise_error
|
810
|
-
|
811
|
-
moderation = Moderation.last
|
812
|
-
moderation.accept
|
813
|
-
Task.last.title.should eq("Task 1")
|
814
|
-
end
|
815
|
-
|
816
|
-
it "shows a saved preview of has_many association" do
|
817
|
-
reload_models.task {
|
818
|
-
has_many :renamed_subtasks, :class_name => subtask_class_name, :foreign_key => task_fk
|
819
|
-
has_moderated_association :renamed_subtasks
|
820
|
-
}.subtask {
|
821
|
-
belongs_to :task, :class_name => task_class_name
|
822
|
-
}
|
823
|
-
|
824
|
-
task = Task.create! :title => "Task 1"
|
825
|
-
|
826
|
-
task.renamed_subtasks.create! :title => "Subtask 1"
|
827
|
-
preview = Moderation.last.preview
|
828
|
-
subtask = preview.renamed_subtasks.first
|
829
|
-
subtask.title.should eq("Subtask 1")
|
830
|
-
subtask.id.should_not be_blank
|
831
|
-
subtask.task.should_not be_blank
|
832
|
-
|
833
|
-
Task.last.renamed_subtasks.count.should eq(0)
|
834
|
-
Subtask.count.should eq(0)
|
835
|
-
end
|
836
|
-
|
837
|
-
it "shows a saved preview of has_many :through association" do
|
838
|
-
reload_models.task {
|
839
|
-
has_many :renamed_connections, :class_name => task_connection_class_name, :foreign_key => "m1_id"
|
840
|
-
has_many :renamed_subtasks, :class_name => subtask_class_name, :through => :renamed_connections, :source => :renamed_subtask
|
841
|
-
has_moderated_association :renamed_subtasks
|
842
|
-
has_moderated_association :renamed_connections
|
843
|
-
}.subtask {
|
844
|
-
belongs_to :task
|
845
|
-
has_many :renamed_connections, :class_name => task_connection_class_name, :foreign_key => "m2_id"
|
846
|
-
has_many :renamed_tasks, :class_name => task_class_name, :through => :renamed_connections, :source => :renamed_task
|
847
|
-
}.task_connection {
|
848
|
-
belongs_to :renamed_task, :class_name => task_class_name, :foreign_key => "m1_id"
|
849
|
-
belongs_to :renamed_subtask, :class_name => subtask_class_name, :foreign_key => "m2_id"
|
850
|
-
}
|
851
|
-
|
852
|
-
task = Task.create! :title => "Task 1"
|
853
|
-
conn = TaskConnection.new :title => "Connection 1"
|
854
|
-
conn.renamed_subtask = Subtask.new :title => "Subtask 1"
|
855
|
-
task.renamed_connections << conn
|
856
|
-
task.save
|
857
|
-
|
858
|
-
TaskConnection.count.should eq(0)
|
859
|
-
Subtask.count.should eq(0)
|
860
|
-
|
861
|
-
task = Moderation.last.preview
|
862
|
-
|
863
|
-
TaskConnection.count.should eq(0)
|
864
|
-
Subtask.count.should eq(0)
|
865
|
-
Moderation.count.should eq(1)
|
866
|
-
|
867
|
-
subtask = task.renamed_subtasks.first
|
868
|
-
subtask.title.should eq("Subtask 1")
|
869
|
-
subtask.renamed_connections.first.should be_present
|
870
|
-
conn = task.renamed_connections.first
|
871
|
-
conn.title.should eq("Connection 1")
|
872
|
-
conn.renamed_subtask.title.should eq("Subtask 1")
|
873
|
-
conn.renamed_task.title.should eq("Task 1")
|
874
|
-
|
875
|
-
# everything has to be frozen
|
876
|
-
task.frozen?.should be_true
|
877
|
-
task.renamed_subtasks.frozen?.should be_true
|
878
|
-
task.renamed_connections.frozen?.should be_true
|
879
|
-
subtask.frozen?.should be_true
|
880
|
-
subtask.renamed_connections.frozen?.should be_true
|
881
|
-
conn.frozen?.should be_true
|
882
|
-
conn.renamed_task.frozen?.should be_true
|
883
|
-
conn.renamed_subtask.frozen?.should be_true
|
884
|
-
end
|
885
|
-
end
|
886
|
-
end
|