Commit 03861bc6550c346d986dc6b195fc4f257ded84ea
Committed by
Antonio Terceiro
1 parent
bc0cbc25
Exists in
master
and in
22 other branches
Allowing admin to edit articles before approve it
* When approving a task, some fields from published article are displayed and can be edited * Removed PublishedArticle * Added migrate to copy body, article and type from PublishedArticle's reference_article to article (ActionItem1733)
Showing
24 changed files
with
439 additions
and
402 deletions
Show diff stats
app/models/approve_article.rb
@@ -24,7 +24,7 @@ class ApproveArticle < Task | @@ -24,7 +24,7 @@ class ApproveArticle < Task | ||
24 | end | 24 | end |
25 | 25 | ||
26 | def name | 26 | def name |
27 | - data[:name] | 27 | + data[:name].blank? ? article.name : data[:name] |
28 | end | 28 | end |
29 | 29 | ||
30 | def name= value | 30 | def name= value |
@@ -63,12 +63,24 @@ class ApproveArticle < Task | @@ -63,12 +63,24 @@ class ApproveArticle < Task | ||
63 | data[:highlighted] | 63 | data[:highlighted] |
64 | end | 64 | end |
65 | 65 | ||
66 | + def abstract= value | ||
67 | + data[:abstract] = value | ||
68 | + end | ||
69 | + | ||
70 | + def abstract | ||
71 | + data[:abstract].blank? ? article.abstract : data[:abstract] | ||
72 | + end | ||
73 | + | ||
74 | + def body= value | ||
75 | + data[:body] = value | ||
76 | + end | ||
77 | + | ||
78 | + def body | ||
79 | + data[:body].blank? ? article.body : data[:body] | ||
80 | + end | ||
81 | + | ||
66 | def perform | 82 | def perform |
67 | - if article.event? | ||
68 | - article.copy(:name => name, :profile => target, :reference_article => article) | ||
69 | - else | ||
70 | - PublishedArticle.create!(:name => name, :profile => target, :reference_article => article, :parent => article_parent, :highlighted => highlighted, :source => article.source) | ||
71 | - end | 83 | + article.copy!(:name => name, :abstract => abstract, :body => body, :profile => target, :reference_article => article, :parent => article_parent, :highlighted => highlighted, :source => article.source) |
72 | end | 84 | end |
73 | 85 | ||
74 | def target_notification_message | 86 | def target_notification_message |
app/models/article.rb
@@ -30,6 +30,12 @@ class Article < ActiveRecord::Base | @@ -30,6 +30,12 @@ class Article < ActiveRecord::Base | ||
30 | 30 | ||
31 | before_create do |article| | 31 | before_create do |article| |
32 | article.published_at = article.created_at if article.published_at.nil? | 32 | article.published_at = article.created_at if article.published_at.nil? |
33 | + if article.reference_article && !article.parent | ||
34 | + parent = article.reference_article.parent | ||
35 | + if parent && parent.blog? && article.profile.has_blog? | ||
36 | + article.parent = article.profile.blog | ||
37 | + end | ||
38 | + end | ||
33 | end | 39 | end |
34 | 40 | ||
35 | xss_terminate :only => [ :name ], :on => 'validation', :with => 'white_list' | 41 | xss_terminate :only => [ :name ], :on => 'validation', :with => 'white_list' |
@@ -318,6 +324,12 @@ class Article < ActiveRecord::Base | @@ -318,6 +324,12 @@ class Article < ActiveRecord::Base | ||
318 | self.class.create(attrs) | 324 | self.class.create(attrs) |
319 | end | 325 | end |
320 | 326 | ||
327 | + def copy!(options = {}) | ||
328 | + attrs = attributes.reject! { |key, value| ATTRIBUTES_NOT_COPIED.include?(key.to_sym) } | ||
329 | + attrs.merge!(options) | ||
330 | + self.class.create!(attrs) | ||
331 | + end | ||
332 | + | ||
321 | ATTRIBUTES_NOT_COPIED = [ | 333 | ATTRIBUTES_NOT_COPIED = [ |
322 | :id, | 334 | :id, |
323 | :profile_id, | 335 | :profile_id, |
@@ -364,8 +376,11 @@ class Article < ActiveRecord::Base | @@ -364,8 +376,11 @@ class Article < ActiveRecord::Base | ||
364 | end | 376 | end |
365 | 377 | ||
366 | def author | 378 | def author |
367 | - last_changed_by || | ||
368 | - profile | 379 | + if reference_article |
380 | + reference_article.author | ||
381 | + else | ||
382 | + last_changed_by || profile | ||
383 | + end | ||
369 | end | 384 | end |
370 | 385 | ||
371 | alias :active_record_cache_key :cache_key | 386 | alias :active_record_cache_key :cache_key |
app/models/folder.rb
@@ -46,7 +46,5 @@ class Folder < Article | @@ -46,7 +46,5 @@ class Folder < Article | ||
46 | has_many :images, :class_name => 'Article', | 46 | has_many :images, :class_name => 'Article', |
47 | :foreign_key => 'parent_id', | 47 | :foreign_key => 'parent_id', |
48 | :order => 'articles.type, articles.name', | 48 | :order => 'articles.type, articles.name', |
49 | - :include => :reference_article, | ||
50 | - :conditions => ["articles.type = 'UploadedFile' and articles.content_type in (?) or articles.type in ('Folder','Gallery') or (articles.type = 'PublishedArticle' and reference_articles_articles.type = 'UploadedFile' and reference_articles_articles.content_type in (?))", UploadedFile.content_types, UploadedFile.content_types] | ||
51 | - | 49 | + :conditions => ["articles.type = 'UploadedFile' and articles.content_type in (?) or articles.type in ('Folder','Gallery')", UploadedFile.content_types] |
52 | end | 50 | end |
app/models/published_article.rb
@@ -1,44 +0,0 @@ | @@ -1,44 +0,0 @@ | ||
1 | -class PublishedArticle < Article | ||
2 | - before_create do |article| | ||
3 | - unless article.parent | ||
4 | - parent = article.reference_article.parent | ||
5 | - if parent && parent.blog? && article.profile.has_blog? | ||
6 | - article.parent = article.profile.blog | ||
7 | - end | ||
8 | - end | ||
9 | - end | ||
10 | - | ||
11 | - def self.short_description | ||
12 | - _('Reference to other article') | ||
13 | - end | ||
14 | - | ||
15 | - def self.description | ||
16 | - _('A reference to another article published in another profile') | ||
17 | - end | ||
18 | - | ||
19 | - before_validation_on_create :update_name | ||
20 | - def update_name | ||
21 | - self.name = self.reference_article.name if self.name.blank? | ||
22 | - end | ||
23 | - | ||
24 | - def author | ||
25 | - if reference_article | ||
26 | - reference_article.author | ||
27 | - else | ||
28 | - profile | ||
29 | - end | ||
30 | - end | ||
31 | - | ||
32 | - def to_html(options={}) | ||
33 | - reference_article ? reference_article.to_html : ('<em>' + _('The original text was removed.') + '</em>') | ||
34 | - end | ||
35 | - | ||
36 | - def abstract | ||
37 | - reference_article && reference_article.abstract | ||
38 | - end | ||
39 | - | ||
40 | - def notifiable? | ||
41 | - true | ||
42 | - end | ||
43 | - | ||
44 | -end |
app/views/content_viewer/slideshow.rhtml
1 | <p class='back-button' ><%= button('', _('Back to gallery'), @page.url)%></p> | 1 | <p class='back-button' ><%= button('', _('Back to gallery'), @page.url)%></p> |
2 | <ul id='slideshow' > | 2 | <ul id='slideshow' > |
3 | <% @images.each do |img| -%> | 3 | <% @images.each do |img| -%> |
4 | - <% img = img.reference_article if img.kind_of?(PublishedArticle) -%> | ||
5 | <% if img.image? -%> | 4 | <% if img.image? -%> |
6 | <li><%= image_tag(url_for(img.public_filename(:display)), :title => (img.abstract.blank? ? img.name : img.abstract)) %></li> | 5 | <li><%= image_tag(url_for(img.public_filename(:display)), :title => (img.abstract.blank? ? img.name : img.abstract)) %></li> |
7 | <% end -%> | 6 | <% end -%> |
app/views/tasks/_approve_article.rhtml
@@ -27,7 +27,8 @@ | @@ -27,7 +27,8 @@ | ||
27 | 27 | ||
28 | <%= select_folder(_('Select the folder where the article must be published'), 'task', 'article_parent_id', task.target.folders) %> | 28 | <%= select_folder(_('Select the folder where the article must be published'), 'task', 'article_parent_id', task.target.folders) %> |
29 | <%= labelled_form_field( _('Highlight this article'), f.check_box(:highlighted)) %> | 29 | <%= labelled_form_field( _('Highlight this article'), f.check_box(:highlighted)) %> |
30 | - <%= labelled_form_field _('Comment for author'), f.text_area(:closing_statment, :style => 'height:200px; width:80%;') %> | 30 | + <%= labelled_form_field _('Comment for author'), f.text_field(:closing_statment, :style => 'width:80%;') %> |
31 | + <%= render :partial => partial_for_class(task.article.class), :locals => { :f => f } %> | ||
31 | 32 | ||
32 | </div> | 33 | </div> |
33 | <% end %> | 34 | <% end %> |
@@ -0,0 +1,14 @@ | @@ -0,0 +1,14 @@ | ||
1 | +<% button_bar do %> | ||
2 | + <%= button :add, _("Lead"), '#', :id => "lead-button", :title => _('Used when a short version of your text is needed.'), :style => "margin-left: 0px;" %> | ||
3 | + <%= button :add, _("Text"), '#', :id => "body-button", :style => "margin-left: 0px;" %> | ||
4 | +<% end %> | ||
5 | + | ||
6 | +<div id="article-lead"> | ||
7 | + <%= labelled_form_field(_('Lead'), f.text_area(:abstract, :cols => 64, :rows => 10)) %> | ||
8 | +</div> | ||
9 | +<div id="article-body-field" style="margin-top: 10px;"> | ||
10 | + <%= labelled_form_field(_('Text'), f.text_area(:body, :cols => 64)) %> | ||
11 | +</div> | ||
12 | + | ||
13 | +<%= javascript_include_tag 'article'%> | ||
14 | + |
@@ -0,0 +1,15 @@ | @@ -0,0 +1,15 @@ | ||
1 | +<%= render :file => 'shared/tiny_mce' %> | ||
2 | + | ||
3 | +<% button_bar do %> | ||
4 | + <%= button :add, _("Lead"), '#', :id => "lead-button", :title => _('Used when a short version your text is needed.'), :style => "margin-left: 0px;" %> | ||
5 | + <%= button :add, _("Text"), '#', :id => "body-button", :style => "margin-left: 0px;" %> | ||
6 | +<% end %> | ||
7 | + | ||
8 | +<div id="article-lead"> | ||
9 | + <%= labelled_form_field(_('Lead'), f.text_area(:abstract, :style => 'width: 100%; height: 300px;')) %> | ||
10 | +</div> | ||
11 | +<div id="article-body-field" style="margin-top: 10px;"> | ||
12 | + <%= labelled_form_field(_('Text'), f.text_area(:body, :style => 'width:100%')) %> | ||
13 | +</div> | ||
14 | + | ||
15 | +<%= javascript_include_tag 'article' %> |
@@ -0,0 +1,9 @@ | @@ -0,0 +1,9 @@ | ||
1 | +<% button_bar do %> | ||
2 | + <%= button :add, _("Description"), '#', :id => "lead-button", :title => _('Used when a short version your text is needed.') %> | ||
3 | +<% end %> | ||
4 | + | ||
5 | +<div id="article-lead"> | ||
6 | + <%= labelled_form_field(_('Description'), text_area(:article, :abstract, :rows => 3, :cols => 64)) %> | ||
7 | +</div> | ||
8 | + | ||
9 | +<%= javascript_include_tag 'article' %> |
@@ -0,0 +1,16 @@ | @@ -0,0 +1,16 @@ | ||
1 | +class RemovePublishedArticles < ActiveRecord::Migration | ||
2 | + def self.up | ||
3 | + select_all("SELECT * from articles WHERE type = 'PublishedArticle'").each do |published| | ||
4 | + reference = Article.exists?(published['reference_article_id']) ? Article.find(published['reference_article_id']) : nil | ||
5 | + if reference | ||
6 | + execute("UPDATE articles SET type = '#{reference.type}', abstract = '#{reference.abstract}', body = '#{reference.body}' WHERE articles.id = #{published['id']}") | ||
7 | + else | ||
8 | + execute("DELETE from articles where articles.id = #{published['id']}") | ||
9 | + end | ||
10 | + end | ||
11 | + end | ||
12 | + | ||
13 | + def self.down | ||
14 | + say 'Nothing to do' | ||
15 | + end | ||
16 | +end |
db/schema.rb
@@ -9,7 +9,7 @@ | @@ -9,7 +9,7 @@ | ||
9 | # | 9 | # |
10 | # It's strongly recommended to check this file into your version control system. | 10 | # It's strongly recommended to check this file into your version control system. |
11 | 11 | ||
12 | -ActiveRecord::Schema.define(:version => 20100928000952) do | 12 | +ActiveRecord::Schema.define(:version => 20101202205446) do |
13 | 13 | ||
14 | create_table "action_tracker", :force => true do |t| | 14 | create_table "action_tracker", :force => true do |t| |
15 | t.integer "user_id" | 15 | t.integer "user_id" |
@@ -0,0 +1,34 @@ | @@ -0,0 +1,34 @@ | ||
1 | +Feature: approve article | ||
2 | + As a community admin | ||
3 | + I want to approve an article | ||
4 | + In order to share it with other users | ||
5 | + | ||
6 | + Background: | ||
7 | + Given the following users | ||
8 | + | login | name | | ||
9 | + | joaosilva | Joao Silva | | ||
10 | + | mariasilva | Maria Silva | | ||
11 | + And the following articles | ||
12 | + | owner | name | body | homepage | | ||
13 | + | mariasilva | Sample Article | This is an article | true | | ||
14 | + And the following communities | ||
15 | + | identifier | name | | ||
16 | + | sample-community | Sample Community | | ||
17 | + And the articles of "Sample Community" are moderated | ||
18 | + And "Maria Silva" is a member of "Sample Community" | ||
19 | + And "Joao Silva" is admin of "Sample Community" | ||
20 | + | ||
21 | + Scenario: edit an article before approval | ||
22 | + Given I am logged in as "mariasilva" | ||
23 | + And I am on Maria Silva's homepage | ||
24 | + And I follow "Spread" | ||
25 | + And I check "Sample Community" | ||
26 | + And I press "Spread this" | ||
27 | + When I am logged in as "joaosilva" | ||
28 | + And I go to Sample Community's control panel | ||
29 | + And I follow "Process requests" | ||
30 | + And I fill in "Text" with "This is an article edited" | ||
31 | + And I press "Ok!" | ||
32 | + And I go to Sample Community's sitemap | ||
33 | + When I follow "Sample Article" | ||
34 | + Then I should see "This is an article edited" |
features/step_definitions/noosfero_steps.rb
@@ -301,3 +301,9 @@ Given /^the profile "(.+)" has no blocks$/ do |profile| | @@ -301,3 +301,9 @@ Given /^the profile "(.+)" has no blocks$/ do |profile| | ||
301 | box.blocks.destroy_all | 301 | box.blocks.destroy_all |
302 | end | 302 | end |
303 | end | 303 | end |
304 | + | ||
305 | +Given /^the articles of "(.+)" are moderated$/ do |organization| | ||
306 | + organization = Organization.find_by_name(organization) | ||
307 | + organization.moderated_articles = true | ||
308 | + organization.save | ||
309 | +end |
public/javascripts/article.js
@@ -4,4 +4,9 @@ | @@ -4,4 +4,9 @@ | ||
4 | $('#article-lead').slideToggle(); | 4 | $('#article-lead').slideToggle(); |
5 | return false; | 5 | return false; |
6 | }) | 6 | }) |
7 | + $("#body-button").click(function(){ | ||
8 | + $(this).toggleClass('icon-add').toggleClass('icon-remove'); | ||
9 | + $('#article-body-field').slideToggle(); | ||
10 | + return false; | ||
11 | + }) | ||
7 | })(jQuery) | 12 | })(jQuery) |
public/stylesheets/application.css
test/functional/cms_controller_test.rb
@@ -677,10 +677,10 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -677,10 +677,10 @@ class CmsControllerTest < Test::Unit::TestCase | ||
677 | should 'publish the article in the selected community if community is not moderated' do | 677 | should 'publish the article in the selected community if community is not moderated' do |
678 | c = Community.create!(:name => 'test comm', :identifier => 'test_comm', :moderated_articles => false) | 678 | c = Community.create!(:name => 'test comm', :identifier => 'test_comm', :moderated_articles => false) |
679 | c.affiliate(profile, Profile::Roles.all_roles(c.environment.id)) | 679 | c.affiliate(profile, Profile::Roles.all_roles(c.environment.id)) |
680 | - a = profile.articles.create!(:name => 'something intresting', :body => 'ruby on rails') | 680 | + article = profile.articles.create!(:name => 'something intresting', :body => 'ruby on rails') |
681 | 681 | ||
682 | - assert_difference PublishedArticle, :count do | ||
683 | - post :publish, :profile => profile.identifier, :id => a.id, :marked_groups => {c.id.to_s => {:name => 'bli', :group_id => c.id.to_s}} | 682 | + assert_difference article.class, :count do |
683 | + post :publish, :profile => profile.identifier, :id => article.id, :marked_groups => {c.id.to_s => {:name => 'bli', :group_id => c.id.to_s}} | ||
684 | assert_equal [{'group' => c, 'name' => 'bli'}], assigns(:marked_groups) | 684 | assert_equal [{'group' => c, 'name' => 'bli'}], assigns(:marked_groups) |
685 | end | 685 | end |
686 | end | 686 | end |
@@ -710,7 +710,7 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -710,7 +710,7 @@ class CmsControllerTest < Test::Unit::TestCase | ||
710 | Environment.any_instance.stubs(:portal_community).returns(portal_community) | 710 | Environment.any_instance.stubs(:portal_community).returns(portal_community) |
711 | article = profile.articles.create!(:name => 'something intresting', :body => 'ruby on rails') | 711 | article = profile.articles.create!(:name => 'something intresting', :body => 'ruby on rails') |
712 | 712 | ||
713 | - assert_difference PublishedArticle, :count do | 713 | + assert_difference article.class, :count do |
714 | post :publish_on_portal_community, :profile => profile.identifier, :id => article.id, :name => article.name | 714 | post :publish_on_portal_community, :profile => profile.identifier, :id => article.id, :name => article.name |
715 | end | 715 | end |
716 | end | 716 | end |
@@ -720,7 +720,7 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -720,7 +720,7 @@ class CmsControllerTest < Test::Unit::TestCase | ||
720 | c.affiliate(profile, Profile::Roles.all_roles(c.environment.id)) | 720 | c.affiliate(profile, Profile::Roles.all_roles(c.environment.id)) |
721 | a = profile.articles.create!(:name => 'something intresting', :body => 'ruby on rails') | 721 | a = profile.articles.create!(:name => 'something intresting', :body => 'ruby on rails') |
722 | 722 | ||
723 | - assert_no_difference PublishedArticle, :count do | 723 | + assert_no_difference a.class, :count do |
724 | assert_difference ApproveArticle, :count do | 724 | assert_difference ApproveArticle, :count do |
725 | assert_difference c.tasks, :count do | 725 | assert_difference c.tasks, :count do |
726 | post :publish, :profile => profile.identifier, :id => a.id, :marked_groups => {c.id.to_s => {:name => 'bli', :group_id => c.id.to_s}} | 726 | post :publish, :profile => profile.identifier, :id => a.id, :marked_groups => {c.id.to_s => {:name => 'bli', :group_id => c.id.to_s}} |
@@ -737,7 +737,7 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -737,7 +737,7 @@ class CmsControllerTest < Test::Unit::TestCase | ||
737 | Environment.any_instance.stubs(:portal_community).returns(portal_community) | 737 | Environment.any_instance.stubs(:portal_community).returns(portal_community) |
738 | article = profile.articles.create!(:name => 'something intresting', :body => 'ruby on rails') | 738 | article = profile.articles.create!(:name => 'something intresting', :body => 'ruby on rails') |
739 | 739 | ||
740 | - assert_no_difference PublishedArticle, :count do | 740 | + assert_no_difference article.class, :count do |
741 | assert_difference ApproveArticle, :count do | 741 | assert_difference ApproveArticle, :count do |
742 | assert_difference portal_community.tasks, :count do | 742 | assert_difference portal_community.tasks, :count do |
743 | post :publish_on_portal_community, :profile => profile.identifier, :id => article.id, :name => article.name | 743 | post :publish_on_portal_community, :profile => profile.identifier, :id => article.id, :name => article.name |
test/functional/tasks_controller_test.rb
@@ -153,8 +153,7 @@ class TasksControllerTest < Test::Unit::TestCase | @@ -153,8 +153,7 @@ class TasksControllerTest < Test::Unit::TestCase | ||
153 | assert_equal f, assigns(:ticket).target | 153 | assert_equal f, assigns(:ticket).target |
154 | end | 154 | end |
155 | 155 | ||
156 | - should 'create published article after finish approve article task' do | ||
157 | - PublishedArticle.destroy_all | 156 | + should 'create article with reference_article after finish approve article task' do |
158 | c = fast_create(Community) | 157 | c = fast_create(Community) |
159 | c.update_attributes(:moderated_articles => false) | 158 | c.update_attributes(:moderated_articles => false) |
160 | @controller.stubs(:profile).returns(c) | 159 | @controller.stubs(:profile).returns(c) |
@@ -162,12 +161,11 @@ class TasksControllerTest < Test::Unit::TestCase | @@ -162,12 +161,11 @@ class TasksControllerTest < Test::Unit::TestCase | ||
162 | article = profile.articles.create!(:name => 'something interesting', :body => 'ruby on rails') | 161 | article = profile.articles.create!(:name => 'something interesting', :body => 'ruby on rails') |
163 | t = ApproveArticle.create!(:name => 'test name', :article => article, :target => c, :requestor => profile) | 162 | t = ApproveArticle.create!(:name => 'test name', :article => article, :target => c, :requestor => profile) |
164 | 163 | ||
165 | - post :close, :decision => 'finish', :id => t.id, :task => { :name => 'new_name'} | ||
166 | - assert_equal article, PublishedArticle.find(:first).reference_article | 164 | + post :close, :decision => 'finish', :id => t.id, :task => { :name => 'new name'} |
165 | + assert_equal article, c.articles.find_by_name('new name').reference_article | ||
167 | end | 166 | end |
168 | 167 | ||
169 | should 'create published article in folder after finish approve article task' do | 168 | should 'create published article in folder after finish approve article task' do |
170 | - PublishedArticle.destroy_all | ||
171 | c = fast_create(Community) | 169 | c = fast_create(Community) |
172 | c.update_attributes(:moderated_articles => false) | 170 | c.update_attributes(:moderated_articles => false) |
173 | @controller.stubs(:profile).returns(c) | 171 | @controller.stubs(:profile).returns(c) |
@@ -176,35 +174,33 @@ class TasksControllerTest < Test::Unit::TestCase | @@ -176,35 +174,33 @@ class TasksControllerTest < Test::Unit::TestCase | ||
176 | article = profile.articles.create!(:name => 'something interesting', :body => 'ruby on rails') | 174 | article = profile.articles.create!(:name => 'something interesting', :body => 'ruby on rails') |
177 | t = ApproveArticle.create!(:name => 'test name', :article => article, :target => c, :requestor => profile) | 175 | t = ApproveArticle.create!(:name => 'test name', :article => article, :target => c, :requestor => profile) |
178 | 176 | ||
179 | - post :close, :decision => 'finish', :id => t.id, :task => { :name => 'new_name', :article_parent_id => folder.id} | ||
180 | - assert_equal folder, PublishedArticle.find(:first).parent | 177 | + post :close, :decision => 'finish', :id => t.id, :task => { :name => 'new name', :article_parent_id => folder.id} |
178 | + assert_equal folder, c.articles.find_by_name('new name').parent | ||
181 | end | 179 | end |
182 | 180 | ||
183 | should 'be highlighted if asked when approving a published article' do | 181 | should 'be highlighted if asked when approving a published article' do |
184 | - PublishedArticle.destroy_all | ||
185 | c = fast_create(Community) | 182 | c = fast_create(Community) |
186 | c.update_attributes(:moderated_articles => false) | 183 | c.update_attributes(:moderated_articles => false) |
187 | @controller.stubs(:profile).returns(c) | 184 | @controller.stubs(:profile).returns(c) |
188 | folder = c.articles.create!(:name => 'test folder', :type => 'Folder') | 185 | folder = c.articles.create!(:name => 'test folder', :type => 'Folder') |
189 | c.affiliate(profile, Profile::Roles.all_roles(profile.environment.id)) | 186 | c.affiliate(profile, Profile::Roles.all_roles(profile.environment.id)) |
190 | article = profile.articles.create!(:name => 'something interesting', :body => 'ruby on rails') | 187 | article = profile.articles.create!(:name => 'something interesting', :body => 'ruby on rails') |
191 | - t = ApproveArticle.create!(:name => 'test name', :article => article, :target => c, :requestor => profile) | 188 | + t = ApproveArticle.create!(:article => article, :target => c, :requestor => profile) |
192 | 189 | ||
193 | - post :close, :decision => 'finish', :id => t.id, :task => { :name => 'new_name', :article_parent_id => folder.id, :highlighted => true} | ||
194 | - assert_equal true, PublishedArticle.find(:first).highlighted | 190 | + post :close, :decision => 'finish', :id => t.id, :task => { :name => 'new name', :article_parent_id => folder.id, :highlighted => true} |
191 | + assert_equal true, c.articles.find_by_name('new name').highlighted | ||
195 | end | 192 | end |
196 | 193 | ||
197 | - should 'create published article after choosing root folder on approve article task' do | ||
198 | - PublishedArticle.destroy_all | 194 | + should 'create article of same class after choosing root folder on approve article task' do |
199 | c = fast_create(Community) | 195 | c = fast_create(Community) |
200 | c.update_attributes(:moderated_articles => false) | 196 | c.update_attributes(:moderated_articles => false) |
201 | @controller.stubs(:profile).returns(c) | 197 | @controller.stubs(:profile).returns(c) |
202 | c.affiliate(profile, Profile::Roles.all_roles(profile.environment.id)) | 198 | c.affiliate(profile, Profile::Roles.all_roles(profile.environment.id)) |
203 | article = profile.articles.create!(:name => 'something interesting', :body => 'ruby on rails') | 199 | article = profile.articles.create!(:name => 'something interesting', :body => 'ruby on rails') |
204 | - t = ApproveArticle.create!(:name => 'test name', :article => article, :target => c, :requestor => profile) | 200 | + t = ApproveArticle.create!(:article => article, :target => c, :requestor => profile) |
205 | 201 | ||
206 | - post :close, :decision => 'finish', :id => t.id, :task => { :name => 'new_name', :article_parent_id => ""} | ||
207 | - assert_not_nil PublishedArticle.find(:first) | 202 | + post :close, :decision => 'finish', :id => t.id, :task => { :name => 'new name', :article_parent_id => ""} |
203 | + assert_equal article.class, c.articles.find_by_name('new name').class | ||
208 | end | 204 | end |
209 | 205 | ||
210 | should 'handle blank names for published articles' do | 206 | should 'handle blank names for published articles' do |
@@ -220,10 +216,10 @@ class TasksControllerTest < Test::Unit::TestCase | @@ -220,10 +216,10 @@ class TasksControllerTest < Test::Unit::TestCase | ||
220 | a = ApproveArticle.create!(:article => article, :target => c, :requestor => person) | 216 | a = ApproveArticle.create!(:article => article, :target => c, :requestor => person) |
221 | assert_includes c.tasks, a | 217 | assert_includes c.tasks, a |
222 | 218 | ||
223 | - assert_difference PublishedArticle, :count do | 219 | + assert_difference article.class, :count do |
224 | post :close, {"commit"=>"Ok!", "id"=> a.id.to_s, "task"=>{"name"=>"", "closing_statment"=>"", "highlighted"=>"0", "article_parent_id"=>c_blog2.id.to_s}, "decision"=>"finish"} | 220 | post :close, {"commit"=>"Ok!", "id"=> a.id.to_s, "task"=>{"name"=>"", "closing_statment"=>"", "highlighted"=>"0", "article_parent_id"=>c_blog2.id.to_s}, "decision"=>"finish"} |
225 | end | 221 | end |
226 | - assert p_article = PublishedArticle.find_by_reference_article_id(article.id) | 222 | + assert p_article = article.class.find_by_reference_article_id(article.id) |
227 | assert_includes c_blog2.children(true), p_article | 223 | assert_includes c_blog2.children(true), p_article |
228 | end | 224 | end |
229 | 225 |
test/unit/approve_article_test.rb
@@ -7,24 +7,28 @@ class ApproveArticleTest < ActiveSupport::TestCase | @@ -7,24 +7,28 @@ class ApproveArticleTest < ActiveSupport::TestCase | ||
7 | ActionMailer::Base.perform_deliveries = true | 7 | ActionMailer::Base.perform_deliveries = true |
8 | ActionMailer::Base.deliveries = [] | 8 | ActionMailer::Base.deliveries = [] |
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') | ||
11 | + @community = fast_create(Community) | ||
10 | end | 12 | end |
11 | - attr_reader :profile | 13 | + attr_reader :profile, :article, :community |
12 | 14 | ||
13 | should 'have name, reference article and profile' do | 15 | should 'have name, reference article and profile' do |
14 | - article = fast_create(TextArticle, :profile_id => profile.id, :name => 'test article') | ||
15 | - | ||
16 | - a = ApproveArticle.create!(:name => 'test name', :article => article, :target => profile, :requestor => profile) | 16 | + a = ApproveArticle.create!(:name => 'test name', :article => article, :target => community, :requestor => profile) |
17 | 17 | ||
18 | - assert_equal 'test name', a.name | ||
19 | assert_equal article, a.article | 18 | assert_equal article, a.article |
20 | - assert_equal profile, a.target | 19 | + assert_equal community, a.target |
21 | end | 20 | end |
22 | 21 | ||
23 | - should 'create published article when finished' do | ||
24 | - article = fast_create(TextArticle, :profile_id => profile.id, :name => 'test article') | ||
25 | - a = ApproveArticle.create!(:name => 'test name', :article => article, :target => profile, :requestor => profile) | 22 | + should 'have abstract and body' do |
23 | + a = ApproveArticle.create!(:name => 'test name', :article => article, :target => community, :requestor => profile) | ||
24 | + | ||
25 | + assert_equal ['Lead of article', 'This is my article'], [a.abstract, a.body] | ||
26 | + end | ||
27 | + | ||
28 | + should 'create an article with the same class as original when finished' do | ||
29 | + a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile) | ||
26 | 30 | ||
27 | - assert_difference PublishedArticle, :count do | 31 | + assert_difference article.class, :count do |
28 | a.finish | 32 | a.finish |
29 | end | 33 | end |
30 | end | 34 | end |
@@ -39,7 +43,6 @@ class ApproveArticleTest < ActiveSupport::TestCase | @@ -39,7 +43,6 @@ class ApproveArticleTest < ActiveSupport::TestCase | ||
39 | end | 43 | end |
40 | 44 | ||
41 | should 'have parent if defined' do | 45 | should 'have parent if defined' do |
42 | - article = fast_create(TextArticle, :profile_id => profile.id, :name => 'test article') | ||
43 | folder = profile.articles.create!(:name => 'test folder', :type => 'Folder') | 46 | folder = profile.articles.create!(:name => 'test folder', :type => 'Folder') |
44 | 47 | ||
45 | a = ApproveArticle.create!(:name => 'test name', :article => article, :target => profile, :requestor => profile, :article_parent_id => folder.id) | 48 | a = ApproveArticle.create!(:name => 'test name', :article => article, :target => profile, :requestor => profile, :article_parent_id => folder.id) |
@@ -48,16 +51,12 @@ class ApproveArticleTest < ActiveSupport::TestCase | @@ -48,16 +51,12 @@ class ApproveArticleTest < ActiveSupport::TestCase | ||
48 | end | 51 | end |
49 | 52 | ||
50 | should 'not have parent if not defined' do | 53 | should 'not have parent if not defined' do |
51 | - article = fast_create(TextArticle, :profile_id => profile.id, :name => 'test article') | ||
52 | - | ||
53 | a = ApproveArticle.create!(:name => 'test name', :article => article, :target => profile, :requestor => profile) | 54 | a = ApproveArticle.create!(:name => 'test name', :article => article, :target => profile, :requestor => profile) |
54 | 55 | ||
55 | assert_nil a.article_parent | 56 | assert_nil a.article_parent |
56 | end | 57 | end |
57 | 58 | ||
58 | should 'alert when reference article is removed' do | 59 | should 'alert when reference article is removed' do |
59 | - article = profile.articles.create!(:name => 'test article') | ||
60 | - | ||
61 | a = ApproveArticle.create!(:name => 'test name', :article => article, :target => profile, :requestor => profile) | 60 | a = ApproveArticle.create!(:name => 'test name', :article => article, :target => profile, :requestor => profile) |
62 | 61 | ||
63 | article.destroy | 62 | article.destroy |
@@ -67,44 +66,269 @@ class ApproveArticleTest < ActiveSupport::TestCase | @@ -67,44 +66,269 @@ class ApproveArticleTest < ActiveSupport::TestCase | ||
67 | end | 66 | end |
68 | 67 | ||
69 | should 'preserve article_parent' do | 68 | should 'preserve article_parent' do |
70 | - article = profile.articles.create!(:name => 'test article') | ||
71 | a = ApproveArticle.new(:article_parent => article) | 69 | a = ApproveArticle.new(:article_parent => article) |
72 | 70 | ||
73 | assert_equal article, a.article_parent | 71 | assert_equal article, a.article_parent |
74 | end | 72 | end |
75 | 73 | ||
76 | should 'handle blank names' do | 74 | should 'handle blank names' do |
77 | - article = profile.articles.create!(:name => 'test article') | ||
78 | - community = fast_create(Community, :name => 'test comm') | ||
79 | a = ApproveArticle.create!(:name => '', :article => article, :target => community, :requestor => profile) | 75 | a = ApproveArticle.create!(:name => '', :article => article, :target => community, :requestor => profile) |
80 | 76 | ||
81 | - assert_difference PublishedArticle, :count do | 77 | + assert_difference article.class, :count do |
82 | a.finish | 78 | a.finish |
83 | end | 79 | end |
84 | end | 80 | end |
85 | 81 | ||
86 | should 'notify target if group is moderated' do | 82 | should 'notify target if group is moderated' do |
87 | - article = fast_create(TextArticle, :profile_id => profile.id, :name => 'test article') | ||
88 | - community = Community.create!(:name => 'test comm', :moderated_articles => true) | 83 | + community.moderated_articles = true |
84 | + community.save | ||
85 | + | ||
89 | a = ApproveArticle.create!(:name => '', :article => article, :target => community, :requestor => profile) | 86 | a = ApproveArticle.create!(:name => '', :article => article, :target => community, :requestor => profile) |
90 | assert !ActionMailer::Base.deliveries.empty? | 87 | assert !ActionMailer::Base.deliveries.empty? |
91 | end | 88 | end |
92 | 89 | ||
93 | should 'not notify target if group is not moderated' do | 90 | should 'not notify target if group is not moderated' do |
94 | - article = fast_create(TextArticle, :profile_id => profile.id, :name => 'test article') | ||
95 | - community = Community.create!(:name => 'test comm', :moderated_articles => false) | 91 | + community.moderated_articles = false |
92 | + community.save | ||
93 | + | ||
96 | a = ApproveArticle.create!(:name => '', :article => article, :target => community, :requestor => profile) | 94 | a = ApproveArticle.create!(:name => '', :article => article, :target => community, :requestor => profile) |
97 | assert ActionMailer::Base.deliveries.empty? | 95 | assert ActionMailer::Base.deliveries.empty? |
98 | end | 96 | end |
99 | 97 | ||
100 | should 'copy the source from the original article' do | 98 | should 'copy the source from the original article' do |
101 | - article = fast_create(TextArticle, :profile_id => profile.id, :name => 'test article', :source => "sample-feed.com") | ||
102 | - community = fast_create(Community, :name => 'test comm') | 99 | + article.source = 'sample-feed.com' |
100 | + article.save | ||
101 | + | ||
102 | + a = ApproveArticle.create!(:name => 'test name', :article => article, :target => community, :requestor => profile) | ||
103 | + a.finish | ||
104 | + | ||
105 | + assert_equal article.class.last.source, article.source | ||
106 | + end | ||
107 | + | ||
108 | + should 'have a reference article and profile on published article' do | ||
109 | + a = ApproveArticle.create!(:name => 'test name', :article => article, :target => community, :requestor => profile) | ||
110 | + a.finish | ||
111 | + | ||
112 | + published = article.class.last | ||
113 | + assert_equal [article, community], [published.reference_article, published.profile] | ||
114 | + end | ||
115 | + | ||
116 | + should 'copy name from original article' do | ||
117 | + a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile) | ||
118 | + a.finish | ||
103 | 119 | ||
120 | + assert_equal 'test name', article.class.last.name | ||
121 | + end | ||
122 | + | ||
123 | + should 'be able to edit name of generated article' do | ||
124 | + a = ApproveArticle.create!(:name => 'Other name', :article => article, :target => community, :requestor => profile) | ||
125 | + a.abstract = 'Abstract edited';a.save | ||
126 | + a.finish | ||
127 | + | ||
128 | + assert_equal 'Other name', article.class.last.name | ||
129 | + end | ||
130 | + | ||
131 | + should 'copy abstract from original article' do | ||
104 | a = ApproveArticle.create!(:name => 'test name', :article => article, :target => community, :requestor => profile) | 132 | a = ApproveArticle.create!(:name => 'test name', :article => article, :target => community, :requestor => profile) |
105 | a.finish | 133 | a.finish |
106 | 134 | ||
107 | - assert_equal PublishedArticle.last.source, article.source | 135 | + assert_equal 'Lead of article', article.class.last.abstract |
108 | end | 136 | end |
109 | 137 | ||
138 | + should 'be able to edit abstract of generated article' do | ||
139 | + a = ApproveArticle.create!(:name => 'test name', :article => article, :target => community, :requestor => profile) | ||
140 | + a.abstract = 'Abstract edited';a.save | ||
141 | + a.finish | ||
142 | + | ||
143 | + assert_equal 'Abstract edited', article.class.last.abstract | ||
144 | + end | ||
145 | + | ||
146 | + should 'copy body from original article' do | ||
147 | + a = ApproveArticle.create!(:name => 'test name', :article => article, :target => community, :requestor => profile) | ||
148 | + a.finish | ||
149 | + | ||
150 | + assert_equal 'This is my article', article.class.last.body | ||
151 | + end | ||
152 | + | ||
153 | + should 'be able to edit body of generated article' do | ||
154 | + a = ApproveArticle.create!(:name => 'test name', :article => article, :target => community, :requestor => profile) | ||
155 | + a.body = 'Body edited';a.save | ||
156 | + a.finish | ||
157 | + | ||
158 | + assert_equal 'Body edited', article.class.last.body | ||
159 | + end | ||
160 | + | ||
161 | + should 'not be created in blog if community does not have a blog' do | ||
162 | + profile_blog = fast_create(Blog, :profile_id => profile.id) | ||
163 | + article.parent = profile_blog | ||
164 | + article.save | ||
165 | + | ||
166 | + a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile) | ||
167 | + a.finish | ||
168 | + | ||
169 | + assert !community.has_blog? | ||
170 | + assert_nil article.class.last.parent | ||
171 | + end | ||
172 | + | ||
173 | + should 'be created in community blog if came from a blog' do | ||
174 | + profile_blog = fast_create(Blog, :profile_id => profile.id) | ||
175 | + article.parent = profile_blog | ||
176 | + article.save | ||
177 | + | ||
178 | + community.articles << Blog.new(:profile => community) | ||
179 | + a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile) | ||
180 | + a.finish | ||
181 | + | ||
182 | + assert_equal community.blog, article.class.last.parent | ||
183 | + end | ||
184 | + | ||
185 | + should 'not be created in community blog if did not come from a blog' do | ||
186 | + profile_folder = fast_create(Folder, :profile_id => profile.id) | ||
187 | + article.parent = profile_folder | ||
188 | + article.save | ||
189 | + | ||
190 | + blog = fast_create(Blog, :profile_id => community.id) | ||
191 | + a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile) | ||
192 | + a.finish | ||
193 | + | ||
194 | + assert_nil article.class.last.parent | ||
195 | + end | ||
196 | + | ||
197 | + should 'overwrite blog if parent was choosen on published' do | ||
198 | + profile_blog = fast_create(Blog, :profile_id => profile.id) | ||
199 | + article.parent = profile_blog | ||
200 | + article.save | ||
201 | + | ||
202 | + community.articles << Blog.new(:profile => community) | ||
203 | + community_folder = fast_create(Folder, :profile_id => profile.id) | ||
204 | + | ||
205 | + a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile, :article_parent => community_folder) | ||
206 | + a.finish | ||
207 | + | ||
208 | + assert_equal community_folder, article.class.last.parent | ||
209 | + end | ||
210 | + | ||
211 | + should 'use author from original article on published' do | ||
212 | + article.stubs(:last_changed_by_id).returns(profile) | ||
213 | + | ||
214 | + a = ApproveArticle.create!(:name => 'test name', :article => article, :target => community, :requestor => profile) | ||
215 | + a.finish | ||
216 | + | ||
217 | + assert_equal profile, article.class.last.author | ||
218 | + end | ||
219 | + | ||
220 | + | ||
221 | + should 'use owning profile as author when there is no referenced article' do | ||
222 | + a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile) | ||
223 | + a.finish | ||
224 | + | ||
225 | + article.destroy | ||
226 | + | ||
227 | + assert_equal community, article.class.last.author | ||
228 | + end | ||
229 | + | ||
230 | + should 'the published article have parent if defined' do | ||
231 | + folder = fast_create(Folder, :profile_id => community.id) | ||
232 | + a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile, :article_parent => folder) | ||
233 | + a.finish | ||
234 | + | ||
235 | + assert_equal folder, article.class.last.parent | ||
236 | + end | ||
237 | + | ||
238 | + should 'copy to_html from reference_article' do | ||
239 | + a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile) | ||
240 | + a.finish | ||
241 | + | ||
242 | + assert_equal article.to_html, article.class.last.to_html | ||
243 | + end | ||
244 | + | ||
245 | + should 'notify activity on creating published' do | ||
246 | + ActionTracker::Record.delete_all | ||
247 | + a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile) | ||
248 | + a.finish | ||
249 | + | ||
250 | + assert_equal 1, ActionTracker::Record.count | ||
251 | + end | ||
252 | + | ||
253 | + should 'notify with different trackers activity create with different targets' do | ||
254 | + ActionTracker::Record.delete_all | ||
255 | + | ||
256 | + article = fast_create(TextileArticle) | ||
257 | + a = ApproveArticle.create!(:name => 'bar', :article => article, :target => community, :requestor => profile) | ||
258 | + a.finish | ||
259 | + | ||
260 | + article = fast_create(TextileArticle) | ||
261 | + a = ApproveArticle.create!(:name => 'another bar', :article => article, :target => community, :requestor => profile) | ||
262 | + a.finish | ||
263 | + assert_equal 1, ActionTracker::Record.count | ||
264 | + | ||
265 | + article = fast_create(TextileArticle) | ||
266 | + other_community = fast_create(Community) | ||
267 | + a = ApproveArticle.create!(:name => 'another bar', :article => article, :target => other_community, :requestor => profile) | ||
268 | + a.finish | ||
269 | + assert_equal 2, ActionTracker::Record.count | ||
270 | + end | ||
271 | + | ||
272 | + should 'notify activity on update' do | ||
273 | + ActionTracker::Record.delete_all | ||
274 | + a = ApproveArticle.create!(:name => 'bar', :article => article, :target => community, :requestor => profile) | ||
275 | + a.finish | ||
276 | + assert_equal 1, ActionTracker::Record.count | ||
277 | + | ||
278 | + published = article.class.last | ||
279 | + published.name = 'foo' | ||
280 | + published.save! | ||
281 | + assert_equal 2, ActionTracker::Record.count | ||
282 | + end | ||
283 | + | ||
284 | + should 'notify with different trackers activity update with different targets' do | ||
285 | + ActionTracker::Record.delete_all | ||
286 | + article1 = fast_create(TextileArticle) | ||
287 | + a = ApproveArticle.create!(:name => 'bar', :article => article1, :target => community, :requestor => profile) | ||
288 | + a.finish | ||
289 | + | ||
290 | + article2 = fast_create(TinyMceArticle) | ||
291 | + other_community = fast_create(Community) | ||
292 | + a = ApproveArticle.create!(:name => 'another bar', :article => article2, :target => other_community, :requestor => profile) | ||
293 | + a.finish | ||
294 | + assert_equal 2, ActionTracker::Record.count | ||
295 | + | ||
296 | + published = article1.class.last | ||
297 | + published.name = 'foo';published.save! | ||
298 | + assert_equal 3, ActionTracker::Record.count | ||
299 | + | ||
300 | + published = article2.class.last | ||
301 | + published.name = 'another foo';published.save! | ||
302 | + assert_equal 4, ActionTracker::Record.count | ||
303 | + end | ||
304 | + | ||
305 | + should "the tracker action target be defined as Community by custom_target method on articles'creation in communities" do | ||
306 | + ActionTracker::Record.delete_all | ||
307 | + person = fast_create(Person) | ||
308 | + community.add_member(person) | ||
309 | + | ||
310 | + a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile) | ||
311 | + a.finish | ||
312 | + | ||
313 | + assert_equal Community, ActionTracker::Record.last.target.class | ||
314 | + end | ||
315 | + | ||
316 | + should "the tracker action target be defined as person by custom_target method on articles'creation in profile" do | ||
317 | + ActionTracker::Record.delete_all | ||
318 | + person = fast_create(Person) | ||
319 | + | ||
320 | + a = ApproveArticle.create!(:article => article, :target => person, :requestor => profile) | ||
321 | + a.finish | ||
322 | + | ||
323 | + assert_equal Person, ActionTracker::Record.last.target.class | ||
324 | + end | ||
325 | + | ||
326 | + should "have the same is_trackable method as original article" do | ||
327 | + a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile) | ||
328 | + a.finish | ||
329 | + | ||
330 | + assert_equal article.is_trackable?, article.class.last.is_trackable? | ||
331 | + end | ||
332 | + | ||
333 | + | ||
110 | end | 334 | end |
test/unit/article_test.rb
@@ -866,13 +866,16 @@ class ArticleTest < Test::Unit::TestCase | @@ -866,13 +866,16 @@ class ArticleTest < Test::Unit::TestCase | ||
866 | end | 866 | end |
867 | 867 | ||
868 | should 'not doubly escape quotes in the name' do | 868 | should 'not doubly escape quotes in the name' do |
869 | - profile = fast_create(Profile) | ||
870 | - a = fast_create(Article, :profile_id => profile.id) | ||
871 | - p = PublishedArticle.create!(:reference_article => a, :profile => fast_create(Community)) | ||
872 | - | ||
873 | - p.name = 'title with "quotes"' | ||
874 | - p.save | ||
875 | - assert_equal 'title with "quotes"', p.name | 869 | + person = fast_create(Person) |
870 | + community = fast_create(Community) | ||
871 | + article = fast_create(Article, :name => 'article name', :profile_id => person.id) | ||
872 | + a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile) | ||
873 | + a.finish | ||
874 | + | ||
875 | + published = community.articles.find_by_name('article name') | ||
876 | + published.name = 'title with "quotes"' | ||
877 | + published.save | ||
878 | + assert_equal 'title with "quotes"', published.name | ||
876 | end | 879 | end |
877 | 880 | ||
878 | should 'remove script tags from name' do | 881 | should 'remove script tags from name' do |
test/unit/folder_test.rb
@@ -89,14 +89,15 @@ class FolderTest < ActiveSupport::TestCase | @@ -89,14 +89,15 @@ class FolderTest < ActiveSupport::TestCase | ||
89 | end | 89 | end |
90 | 90 | ||
91 | should 'return published images as images' do | 91 | should 'return published images as images' do |
92 | - p = create_user('test_user').person | ||
93 | - i = UploadedFile.create!(:profile => p, :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')) | 92 | + person = create_user('test_user').person |
93 | + image = UploadedFile.create!(:profile => person, :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')) | ||
94 | 94 | ||
95 | - c = fast_create(Community) | ||
96 | - folder = fast_create(Folder, :profile_id => c.id) | ||
97 | - pi = PublishedArticle.create!(:profile => c, :reference_article => i, :parent => folder) | 95 | + community = fast_create(Community) |
96 | + folder = fast_create(Folder, :profile_id => community.id) | ||
97 | + a = ApproveArticle.create!(:article => image, :target => community, :requestor => person, :article_parent => folder) | ||
98 | + a.finish | ||
98 | 99 | ||
99 | - assert_includes folder.images(true), pi | 100 | + assert_includes folder.images(true), community.articles.find_by_name('rails.png') |
100 | end | 101 | end |
101 | 102 | ||
102 | should 'not let pass javascript in the body' do | 103 | should 'not let pass javascript in the body' do |
test/unit/gallery_test.rb
@@ -98,9 +98,11 @@ class GalleryTest < ActiveSupport::TestCase | @@ -98,9 +98,11 @@ class GalleryTest < ActiveSupport::TestCase | ||
98 | 98 | ||
99 | c = fast_create(Community) | 99 | c = fast_create(Community) |
100 | gallery = fast_create(Gallery, :profile_id => c.id) | 100 | gallery = fast_create(Gallery, :profile_id => c.id) |
101 | - pi = PublishedArticle.create!(:profile => c, :reference_article => i, :parent => gallery) | ||
102 | 101 | ||
103 | - assert_includes gallery.images(true), pi | 102 | + a = ApproveArticle.create!(:article => i, :target => c, :requestor => p, :article_parent => gallery) |
103 | + a.finish | ||
104 | + | ||
105 | + assert_includes gallery.images(true), c.articles.find_by_name('rails.png') | ||
104 | end | 106 | end |
105 | 107 | ||
106 | should 'not let pass javascript in the body' do | 108 | should 'not let pass javascript in the body' do |
test/unit/published_article_test.rb
@@ -1,272 +0,0 @@ | @@ -1,272 +0,0 @@ | ||
1 | -require File.dirname(__FILE__) + '/../test_helper' | ||
2 | - | ||
3 | -class PublishedArticleTest < ActiveSupport::TestCase | ||
4 | - | ||
5 | - def setup | ||
6 | - @profile = create_user('test_user').person | ||
7 | - @article = fast_create(Article, :profile_id => @profile.id, :name => 'test_article', :body => 'some trivial body') | ||
8 | - end | ||
9 | - | ||
10 | - should 'have a reference article and profile' do | ||
11 | - prof = fast_create(Community) | ||
12 | - p = PublishedArticle.create(:reference_article => @article, :profile => prof) | ||
13 | - | ||
14 | - assert p | ||
15 | - assert_equal prof, p.profile | ||
16 | - assert_equal @article, p.reference_article | ||
17 | - end | ||
18 | - | ||
19 | - should 'have a different name than reference article' do | ||
20 | - prof = fast_create(Community) | ||
21 | - p = PublishedArticle.create(:reference_article => @article, :profile => prof, :name => 'other title') | ||
22 | - | ||
23 | - assert_equal 'other title', p.name | ||
24 | - assert_not_equal @article.name, p.name | ||
25 | - | ||
26 | - end | ||
27 | - | ||
28 | - should 'use name of reference article a default name' do | ||
29 | - prof = fast_create(Community) | ||
30 | - p = PublishedArticle.create!(:reference_article => @article, :profile => prof) | ||
31 | - | ||
32 | - assert_equal @article.name, p.name | ||
33 | - end | ||
34 | - | ||
35 | - should 'not be created in blog if community does not have a blog' do | ||
36 | - parent = mock | ||
37 | - @article.expects(:parent).returns(parent) | ||
38 | - parent.expects(:blog?).returns(true) | ||
39 | - prof = fast_create(Community) | ||
40 | - p = PublishedArticle.create!(:reference_article => @article, :profile => prof) | ||
41 | - | ||
42 | - assert !prof.has_blog? | ||
43 | - assert_nil p.parent | ||
44 | - end | ||
45 | - | ||
46 | - should 'be created in community blog if came from a blog' do | ||
47 | - parent = mock | ||
48 | - @article.expects(:parent).returns(parent) | ||
49 | - parent.expects(:blog?).returns(true) | ||
50 | - prof = fast_create(Community) | ||
51 | - prof.articles << Blog.new(:profile => prof, :name => 'Blog test') | ||
52 | - p = PublishedArticle.create!(:reference_article => @article, :profile => prof) | ||
53 | - | ||
54 | - assert_equal p.parent, prof.blog | ||
55 | - end | ||
56 | - | ||
57 | - should 'not be created in community blog if did not come from a blog' do | ||
58 | - parent = mock | ||
59 | - @article.expects(:parent).returns(parent) | ||
60 | - parent.expects(:blog?).returns(false) | ||
61 | - prof = fast_create(Community) | ||
62 | - blog = fast_create(Blog, :profile_id => prof.id, :name => 'Blog test') | ||
63 | - p = PublishedArticle.create!(:reference_article => @article, :profile => prof) | ||
64 | - | ||
65 | - assert_nil p.parent | ||
66 | - end | ||
67 | - | ||
68 | - should "use author of original article as its author" do | ||
69 | - original = Article.new(:last_changed_by => @profile) | ||
70 | - community = Community.new | ||
71 | - published = PublishedArticle.new(:reference_article => original, :profile => community) | ||
72 | - assert_equal @profile, published.author | ||
73 | - end | ||
74 | - | ||
75 | - should 'use owning profile as author when there is no referenced article yet' do | ||
76 | - assert_equal @profile, PublishedArticle.new(:profile => @profile).author | ||
77 | - end | ||
78 | - | ||
79 | - should 'have parent if defined' do | ||
80 | - prof = fast_create(Community) | ||
81 | - folder = fast_create(Folder, :name => 'folder test', :profile_id => prof.id) | ||
82 | - p = PublishedArticle.create(:reference_article => @article, :profile => prof, :parent => folder) | ||
83 | - | ||
84 | - assert p | ||
85 | - assert_equal folder, p.parent | ||
86 | - end | ||
87 | - | ||
88 | - should 'use to_html from reference_article' do | ||
89 | - prof = fast_create(Community) | ||
90 | - p = PublishedArticle.create!(:reference_article => @article, :profile => prof) | ||
91 | - | ||
92 | - assert_equal @article.to_html, p.to_html | ||
93 | - end | ||
94 | - | ||
95 | - should 'use to_html from reference_article when is Textile' do | ||
96 | - prof = fast_create(Community) | ||
97 | - textile_article = fast_create(TextileArticle, :name => 'textile_article', :body => '*my text*', :profile_id => prof.id) | ||
98 | - p = PublishedArticle.create!(:reference_article => textile_article, :profile => prof) | ||
99 | - | ||
100 | - assert_equal textile_article.to_html, p.to_html | ||
101 | - end | ||
102 | - | ||
103 | - should 'display message when reference_article does not exist' do | ||
104 | - prof = fast_create(Community) | ||
105 | - textile_article = fast_create(TextileArticle, :name => 'textile_article', :body => '*my text*', :profile_id => prof.id) | ||
106 | - p = PublishedArticle.create!(:reference_article => textile_article, :profile => prof) | ||
107 | - textile_article.destroy | ||
108 | - p.reload | ||
109 | - | ||
110 | - assert_match /removed/, p.to_html | ||
111 | - end | ||
112 | - | ||
113 | - should 'use abstract from referenced article' do | ||
114 | - original = Article.new(:abstract => 'this is the abstract') | ||
115 | - published = PublishedArticle.new | ||
116 | - published.stubs(:reference_article).returns(original) | ||
117 | - | ||
118 | - assert_equal 'this is the abstract', published.abstract | ||
119 | - end | ||
120 | - | ||
121 | - should 'return no abstract when reference_article does not exist' do | ||
122 | - published = PublishedArticle.new | ||
123 | - published.stubs(:reference_article).returns(nil) | ||
124 | - | ||
125 | - assert_nil published.abstract | ||
126 | - end | ||
127 | - | ||
128 | - should 'specified parent overwrite blog' do | ||
129 | - parent = mock | ||
130 | - @article.stubs(:parent).returns(parent) | ||
131 | - parent.stubs(:blog?).returns(true) | ||
132 | - prof = fast_create(Community) | ||
133 | - prof.articles << Blog.new(:profile => prof, :name => 'Blog test') | ||
134 | - new_parent = fast_create(Folder, :profile_id => prof.id, :name => 'Folder test') | ||
135 | - p = PublishedArticle.create!(:reference_article => @article, :profile => prof, :parent => new_parent) | ||
136 | - | ||
137 | - assert_equal p.parent, new_parent | ||
138 | - end | ||
139 | - | ||
140 | - should 'notifiable be true' do | ||
141 | - a = fast_create(PublishedArticle) | ||
142 | - assert a.notifiable? | ||
143 | - end | ||
144 | - | ||
145 | - should 'notify activity on create' do | ||
146 | - ActionTracker::Record.delete_all | ||
147 | - a = fast_create(Article) | ||
148 | - PublishedArticle.create! :reference_article => a, :name => 'test', :profile_id => fast_create(Profile).id, :published => true | ||
149 | - assert_equal 1, ActionTracker::Record.count | ||
150 | - end | ||
151 | - | ||
152 | - should 'notify with different trackers activity create with different targets' do | ||
153 | - ActionTracker::Record.delete_all | ||
154 | - profile = fast_create(Profile) | ||
155 | - a = fast_create(Article) | ||
156 | - PublishedArticle.create! :reference_article => a, :name => 'bar', :profile_id => profile.id, :published => true | ||
157 | - a = fast_create(Article) | ||
158 | - PublishedArticle.create! :reference_article => a, :name => 'another bar', :profile_id => profile.id, :published => true | ||
159 | - assert_equal 1, ActionTracker::Record.count | ||
160 | - a = fast_create(Article) | ||
161 | - PublishedArticle.create! :reference_article => a, :name => 'another bar', :profile_id => fast_create(Profile).id, :published => true | ||
162 | - assert_equal 2, ActionTracker::Record.count | ||
163 | - end | ||
164 | - | ||
165 | - should 'notify activity on update' do | ||
166 | - ActionTracker::Record.delete_all | ||
167 | - a = fast_create(Article) | ||
168 | - a = PublishedArticle.create! :reference_article => a, :name => 'bar', :profile_id => fast_create(Profile).id, :published => true | ||
169 | - assert_equal 1, ActionTracker::Record.count | ||
170 | - a.name = 'foo' | ||
171 | - a.save! | ||
172 | - assert_equal 2, ActionTracker::Record.count | ||
173 | - end | ||
174 | - | ||
175 | - should 'notify with different trackers activity update with different targets' do | ||
176 | - ActionTracker::Record.delete_all | ||
177 | - a = fast_create(Article) | ||
178 | - a1 = PublishedArticle.create! :reference_article => a, :name => 'bar', :profile_id => fast_create(Profile).id, :published => true | ||
179 | - a = fast_create(Article) | ||
180 | - a2 = PublishedArticle.create! :reference_article => a, :name => 'another bar', :profile_id => fast_create(Profile).id, :published => true | ||
181 | - assert_equal 2, ActionTracker::Record.count | ||
182 | - a1.name = 'foo' | ||
183 | - a1.save! | ||
184 | - assert_equal 3, ActionTracker::Record.count | ||
185 | - a2.name = 'another foo' | ||
186 | - a2.save! | ||
187 | - assert_equal 4, ActionTracker::Record.count | ||
188 | - end | ||
189 | - | ||
190 | - should 'notify activity on destroy' do | ||
191 | - ActionTracker::Record.delete_all | ||
192 | - a = fast_create(Article) | ||
193 | - a = PublishedArticle.create! :reference_article => a, :name => 'bar', :profile_id => fast_create(Profile).id, :published => true | ||
194 | - assert_equal 1, ActionTracker::Record.count | ||
195 | - a.destroy | ||
196 | - assert_equal 2, ActionTracker::Record.count | ||
197 | - end | ||
198 | - | ||
199 | - should 'notify different activities when destroy articles with diferrents targets' do | ||
200 | - ActionTracker::Record.delete_all | ||
201 | - a = fast_create(Article) | ||
202 | - a1 = PublishedArticle.create! :reference_article => a, :name => 'bar', :profile_id => fast_create(Profile).id, :published => true | ||
203 | - a = fast_create(Article) | ||
204 | - a2 = PublishedArticle.create! :reference_article => a, :name => 'another bar', :profile_id => fast_create(Profile).id, :published => true | ||
205 | - assert_equal 2, ActionTracker::Record.count | ||
206 | - a1.destroy | ||
207 | - assert_equal 3, ActionTracker::Record.count | ||
208 | - a2.destroy | ||
209 | - assert_equal 4, ActionTracker::Record.count | ||
210 | - end | ||
211 | - | ||
212 | - should "the tracker action target be defined as Community by custom_target method on articles'creation in communities" do | ||
213 | - ActionTracker::Record.delete_all | ||
214 | - community = fast_create(Community) | ||
215 | - p1 = Person.first | ||
216 | - community.add_member(p1) | ||
217 | - assert p1.is_member_of?(community) | ||
218 | - a = fast_create(Article) | ||
219 | - article = PublishedArticle.create! :reference_article => a, :name => 'test', :profile_id => community.id | ||
220 | - assert_equal true, article.published? | ||
221 | - assert_equal true, article.notifiable? | ||
222 | - assert_equal false, article.image? | ||
223 | - assert_equal Community, article.profile.class | ||
224 | - assert_equal Community, ActionTracker::Record.last.target.class | ||
225 | - end | ||
226 | - | ||
227 | - should "the tracker action target be defined as person by custom_target method on articles'creation in profile" do | ||
228 | - ActionTracker::Record.delete_all | ||
229 | - person = Person.first | ||
230 | - a = fast_create(Article) | ||
231 | - article = PublishedArticle.create! :reference_article => a, :name => 'test', :profile_id => person.id | ||
232 | - assert_equal true, article.published? | ||
233 | - assert_equal true, article.notifiable? | ||
234 | - assert_equal false, article.image? | ||
235 | - assert_equal Person, article.profile.class | ||
236 | - assert_equal person, ActionTracker::Record.last.target | ||
237 | - end | ||
238 | - | ||
239 | - should 'not notify activity if the article is not advertise' do | ||
240 | - ActionTracker::Record.delete_all | ||
241 | - article = fast_create(Article) | ||
242 | - a = PublishedArticle.create! :reference_article => article, :name => 'bar', :profile_id => fast_create(Profile).id, :published => true, :advertise => false | ||
243 | - assert_equal true, a.published? | ||
244 | - assert_equal true, a.notifiable? | ||
245 | - assert_equal false, a.image? | ||
246 | - assert_equal false, a.profile.is_a?(Community) | ||
247 | - assert_equal 0, ActionTracker::Record.count | ||
248 | - end | ||
249 | - | ||
250 | - should "have defined the is_trackable method defined" do | ||
251 | - assert PublishedArticle.method_defined?(:is_trackable?) | ||
252 | - end | ||
253 | - | ||
254 | - should "the common trackable conditions return the correct value" do | ||
255 | - a = PublishedArticle.new | ||
256 | - a.published = a.advertise = true | ||
257 | - assert_equal true, a.published? | ||
258 | - assert_equal true, a.notifiable? | ||
259 | - assert_equal true, a.advertise? | ||
260 | - assert_equal true, a.is_trackable? | ||
261 | - | ||
262 | - a.published=false | ||
263 | - assert_equal false, a.published? | ||
264 | - assert_equal false, a.is_trackable? | ||
265 | - | ||
266 | - a.published=true | ||
267 | - a.advertise=false | ||
268 | - assert_equal false, a.advertise? | ||
269 | - assert_equal false, a.is_trackable? | ||
270 | - end | ||
271 | - | ||
272 | -end |
test/unit/rss_feed_test.rb
@@ -123,7 +123,7 @@ class RssFeedTest < Test::Unit::TestCase | @@ -123,7 +123,7 @@ class RssFeedTest < Test::Unit::TestCase | ||
123 | feed.profile = profile | 123 | feed.profile = profile |
124 | feed.save! | 124 | feed.save! |
125 | 125 | ||
126 | - assert_match "<link>http://colivre.net/testuser</link>", feed.data | 126 | + assert_match "<link>http://#{profile.environment.default_hostname}/testuser</link>", feed.data |
127 | end | 127 | end |
128 | 128 | ||
129 | should 'provide link to each article' do | 129 | should 'provide link to each article' do |
@@ -205,15 +205,17 @@ class RssFeedTest < Test::Unit::TestCase | @@ -205,15 +205,17 @@ class RssFeedTest < Test::Unit::TestCase | ||
205 | assert_equal false, a.can_display_hits? | 205 | assert_equal false, a.can_display_hits? |
206 | end | 206 | end |
207 | 207 | ||
208 | - should 'display the referenced body of a PublishedArticle' do | ||
209 | - article = fast_create(Article, :body => 'This is the content of the Sample Article.') | 208 | + should 'display the referenced body of a article published' do |
209 | + article = fast_create(TextileArticle, :body => 'This is the content of the Sample Article.') | ||
210 | profile = fast_create(Profile) | 210 | profile = fast_create(Profile) |
211 | blog = fast_create(Blog, :profile_id => profile.id) | 211 | blog = fast_create(Blog, :profile_id => profile.id) |
212 | - published_article = PublishedArticle.create!(:reference_article => article, :profile => profile) | ||
213 | - blog.posts << published_article | 212 | + a = ApproveArticle.create!(:name => 'test name', :article => article, :target => profile, :requestor => fast_create(Person)) |
213 | + a.finish | ||
214 | + | ||
215 | + blog.posts << published_article = article.class.last | ||
214 | feed = RssFeed.new(:parent => blog, :profile => profile) | 216 | feed = RssFeed.new(:parent => blog, :profile => profile) |
215 | 217 | ||
216 | - assert_match published_article.to_html, feed.data | 218 | + assert_match "This is the content of the Sample Article", feed.data |
217 | end | 219 | end |
218 | 220 | ||
219 | should 'display articles even within a private profile' do | 221 | should 'display articles even within a private profile' do |