Commit e46d23ce9ab2d42db5119253b039f871e1dbef19
1 parent
ed0554c6
Exists in
api_private_token
and in
2 other branches
proper validations for approve_article task
Showing
2 changed files
with
62 additions
and
6 deletions
Show diff stats
app/models/approve_article.rb
@@ -2,8 +2,18 @@ class ApproveArticle < Task | @@ -2,8 +2,18 @@ class ApproveArticle < Task | ||
2 | validates_presence_of :requestor_id, :target_id | 2 | validates_presence_of :requestor_id, :target_id |
3 | 3 | ||
4 | validates :requestor, kind_of: {kind: Person} | 4 | validates :requestor, kind_of: {kind: Person} |
5 | - #validates :target, kind_of: {kind: Organization} | ||
6 | - #validate :request_is_member_of_target | 5 | + validate :allowed_requestor |
6 | + | ||
7 | + def allowed_requestor | ||
8 | + if target | ||
9 | + if target.person? && requestor != target | ||
10 | + self.errors.add(:requestor, _('You can not post articles to other users.')) | ||
11 | + end | ||
12 | + if target.organization? && !target.members.include?(requestor) && target.environment.portal_community != target | ||
13 | + self.errors.add(:requestor, _('Only members can post articles on communities.')) | ||
14 | + end | ||
15 | + end | ||
16 | + end | ||
7 | 17 | ||
8 | def article_title | 18 | def article_title |
9 | article ? article.title : _('(The original text was removed)') | 19 | article ? article.title : _('(The original text was removed)') |
test/unit/approve_article_test.rb
@@ -9,6 +9,7 @@ class ApproveArticleTest < ActiveSupport::TestCase | @@ -9,6 +9,7 @@ class ApproveArticleTest < ActiveSupport::TestCase | ||
9 | @profile = create_user('test_user').person | 9 | @profile = create_user('test_user').person |
10 | @article = fast_create(TextileArticle, :profile_id => @profile.id, :name => 'test name', :abstract => 'Lead of article', :body => 'This is my article') | 10 | @article = fast_create(TextileArticle, :profile_id => @profile.id, :name => 'test name', :abstract => 'Lead of article', :body => 'This is my article') |
11 | @community = fast_create(Community) | 11 | @community = fast_create(Community) |
12 | + @community.add_member(@profile) | ||
12 | end | 13 | end |
13 | attr_reader :profile, :article, :community | 14 | attr_reader :profile, :article, :community |
14 | 15 | ||
@@ -251,6 +252,8 @@ class ApproveArticleTest < ActiveSupport::TestCase | @@ -251,6 +252,8 @@ class ApproveArticleTest < ActiveSupport::TestCase | ||
251 | end | 252 | end |
252 | 253 | ||
253 | should 'not group trackers activity of article\'s creation' do | 254 | should 'not group trackers activity of article\'s creation' do |
255 | + other_community = fast_create(Community) | ||
256 | + other_community.add_member(profile) | ||
254 | ActionTracker::Record.delete_all | 257 | ActionTracker::Record.delete_all |
255 | 258 | ||
256 | article = fast_create(TextileArticle) | 259 | article = fast_create(TextileArticle) |
@@ -262,20 +265,20 @@ class ApproveArticleTest < ActiveSupport::TestCase | @@ -262,20 +265,20 @@ class ApproveArticleTest < ActiveSupport::TestCase | ||
262 | a.finish | 265 | a.finish |
263 | 266 | ||
264 | article = fast_create(TextileArticle) | 267 | article = fast_create(TextileArticle) |
265 | - other_community = fast_create(Community) | ||
266 | a = create(ApproveArticle, :name => 'another bar', :article => article, :target => other_community, :requestor => profile) | 268 | a = create(ApproveArticle, :name => 'another bar', :article => article, :target => other_community, :requestor => profile) |
267 | a.finish | 269 | a.finish |
268 | assert_equal 3, ActionTracker::Record.count | 270 | assert_equal 3, ActionTracker::Record.count |
269 | end | 271 | end |
270 | 272 | ||
271 | should 'not create trackers activity when updating articles' do | 273 | should 'not create trackers activity when updating articles' do |
274 | + other_community = fast_create(Community) | ||
275 | + other_community.add_member(profile) | ||
272 | ActionTracker::Record.delete_all | 276 | ActionTracker::Record.delete_all |
273 | article1 = fast_create(TextileArticle) | 277 | article1 = fast_create(TextileArticle) |
274 | a = create(ApproveArticle, :name => 'bar', :article => article1, :target => community, :requestor => profile) | 278 | a = create(ApproveArticle, :name => 'bar', :article => article1, :target => community, :requestor => profile) |
275 | a.finish | 279 | a.finish |
276 | 280 | ||
277 | article2 = fast_create(TinyMceArticle) | 281 | article2 = fast_create(TinyMceArticle) |
278 | - other_community = fast_create(Community) | ||
279 | a = create(ApproveArticle, :name => 'another bar', :article => article2, :target => other_community, :requestor => profile) | 282 | a = create(ApproveArticle, :name => 'another bar', :article => article2, :target => other_community, :requestor => profile) |
280 | a.finish | 283 | a.finish |
281 | assert_equal 2, ActionTracker::Record.count | 284 | assert_equal 2, ActionTracker::Record.count |
@@ -283,7 +286,7 @@ class ApproveArticleTest < ActiveSupport::TestCase | @@ -283,7 +286,7 @@ class ApproveArticleTest < ActiveSupport::TestCase | ||
283 | assert_no_difference 'ActionTracker::Record.count' do | 286 | assert_no_difference 'ActionTracker::Record.count' do |
284 | published = article1.class.last | 287 | published = article1.class.last |
285 | published.name = 'foo';published.save! | 288 | published.name = 'foo';published.save! |
286 | - | 289 | + |
287 | published = article2.class.last | 290 | published = article2.class.last |
288 | published.name = 'another foo';published.save! | 291 | published.name = 'another foo';published.save! |
289 | end | 292 | end |
@@ -307,7 +310,7 @@ class ApproveArticleTest < ActiveSupport::TestCase | @@ -307,7 +310,7 @@ class ApproveArticleTest < ActiveSupport::TestCase | ||
307 | person = fast_create(Person) | 310 | person = fast_create(Person) |
308 | person.stubs(:notification_emails).returns(['target@example.org']) | 311 | person.stubs(:notification_emails).returns(['target@example.org']) |
309 | 312 | ||
310 | - a = create(ApproveArticle, :article => article, :target => person, :requestor => profile) | 313 | + a = create(ApproveArticle, :article => article, :target => person, :requestor => person) |
311 | a.finish | 314 | a.finish |
312 | 315 | ||
313 | approved_article = person.articles.find_by_name(article.name) | 316 | approved_article = person.articles.find_by_name(article.name) |
@@ -440,4 +443,47 @@ class ApproveArticleTest < ActiveSupport::TestCase | @@ -440,4 +443,47 @@ class ApproveArticleTest < ActiveSupport::TestCase | ||
440 | assert_equal article, LinkArticle.last.reference_article | 443 | assert_equal article, LinkArticle.last.reference_article |
441 | end | 444 | end |
442 | 445 | ||
446 | + should 'not allow non-person requestor' do | ||
447 | + task = ApproveArticle.new(:requestor => Community.new) | ||
448 | + task.valid? | ||
449 | + assert task.invalid?(:requestor) | ||
450 | + end | ||
451 | + | ||
452 | + should 'allow only self requestors when the target is a person' do | ||
453 | + person = fast_create(Person) | ||
454 | + another_person = fast_create(Person) | ||
455 | + | ||
456 | + t1 = ApproveArticle.new(:requestor => person, :target => person) | ||
457 | + t2 = ApproveArticle.new(:requestor => another_person, :target => person) | ||
458 | + | ||
459 | + assert t1.valid? | ||
460 | + assert !t2.valid? | ||
461 | + assert t2.invalid?(:requestor) | ||
462 | + end | ||
463 | + | ||
464 | + should 'allow only members to be requestors when target is a community' do | ||
465 | + community = fast_create(Community) | ||
466 | + member = fast_create(Person) | ||
467 | + community.add_member(member) | ||
468 | + non_member = fast_create(Person) | ||
469 | + | ||
470 | + t1 = ApproveArticle.new(:requestor => member, :target => community) | ||
471 | + t2 = ApproveArticle.new(:requestor => non_member, :target => community) | ||
472 | + | ||
473 | + assert t1.valid? | ||
474 | + assert !t2.valid? | ||
475 | + assert t2.invalid?(:requestor) | ||
476 | + end | ||
477 | + | ||
478 | + should 'allow any user to be requestor whe the target is the portal community' do | ||
479 | + community = fast_create(Community) | ||
480 | + environment = community.environment | ||
481 | + environment.portal_community = community | ||
482 | + environment.save! | ||
483 | + person = fast_create(Person) | ||
484 | + | ||
485 | + task = ApproveArticle.new(:requestor => person, :target => community) | ||
486 | + | ||
487 | + assert task.valid? | ||
488 | + end | ||
443 | end | 489 | end |