Commit 1ebe69246be928d7943e3320085aa81415852963
Exists in
send_email_to_admins
and in
5 other branches
Merge branch 'archived_articles_api' into 'master'
Archived and Followed articles API improvements - Adds archived to article API entity; - Adds tests to archived and followed articles; - Adds archived validation to vote; - Limits article children; Signed-off-by: Ábner Silva de Oliveira <abner.oliveira@serpro.gov.br> Signed-off-by: Michel Felipe de Oliveira Ferreira <michel.ferreira@serpro.gov.br> Signed-off-by: Victor Costa <vfcosta@gmail.com> See merge request !855
Showing
8 changed files
with
66 additions
and
4 deletions
Show diff stats
lib/noosfero/api/entities.rb
@@ -188,6 +188,7 @@ module Noosfero | @@ -188,6 +188,7 @@ module Noosfero | ||
188 | expose :followers_count | 188 | expose :followers_count |
189 | expose :votes_count | 189 | expose :votes_count |
190 | expose :comments_count | 190 | expose :comments_count |
191 | + expose :archived, :documentation => {:type => "Boolean", :desc => "Defines if a article is readonly"} | ||
191 | expose :type | 192 | expose :type |
192 | expose :comments, using: CommentBase, :if => lambda{|obj,opt| opt[:params] && ['1','true',true].include?(opt[:params][:show_comments])} | 193 | expose :comments, using: CommentBase, :if => lambda{|obj,opt| opt[:params] && ['1','true',true].include?(opt[:params][:show_comments])} |
193 | end | 194 | end |
@@ -195,7 +196,9 @@ module Noosfero | @@ -195,7 +196,9 @@ module Noosfero | ||
195 | class Article < ArticleBase | 196 | class Article < ArticleBase |
196 | root 'articles', 'article' | 197 | root 'articles', 'article' |
197 | expose :parent, :using => ArticleBase | 198 | expose :parent, :using => ArticleBase |
198 | - expose :children, :using => ArticleBase | 199 | + expose :children, :using => ArticleBase do |article, options| |
200 | + article.children.limit(Noosfero::API::V1::Articles::MAX_PER_PAGE) | ||
201 | + end | ||
199 | end | 202 | end |
200 | 203 | ||
201 | class User < Entity | 204 | class User < Entity |
lib/noosfero/api/helpers.rb
@@ -5,7 +5,7 @@ require_relative '../../find_by_contents' | @@ -5,7 +5,7 @@ require_relative '../../find_by_contents' | ||
5 | module API | 5 | module API |
6 | module APIHelpers | 6 | module APIHelpers |
7 | PRIVATE_TOKEN_PARAM = :private_token | 7 | PRIVATE_TOKEN_PARAM = :private_token |
8 | - DEFAULT_ALLOWED_PARAMETERS = [:parent_id, :from, :until, :content_type, :author_id, :identifier] | 8 | + DEFAULT_ALLOWED_PARAMETERS = [:parent_id, :from, :until, :content_type, :author_id, :identifier, :archived] |
9 | 9 | ||
10 | include SanitizeParams | 10 | include SanitizeParams |
11 | include Noosfero::Plugin::HotSpot | 11 | include Noosfero::Plugin::HotSpot |
lib/noosfero/vote_ext.rb
@@ -8,4 +8,15 @@ class Vote | @@ -8,4 +8,15 @@ class Vote | ||
8 | voter.blank? | 8 | voter.blank? |
9 | end | 9 | end |
10 | 10 | ||
11 | + validate :verify_target_archived | ||
12 | + | ||
13 | + def verify_target_archived | ||
14 | + if voteable.kind_of?(Article) || voteable.kind_of?(Comment) | ||
15 | + if voteable.archived? | ||
16 | + errors.add(:base, _("The target is achived and can't accept votes")) | ||
17 | + false | ||
18 | + end | ||
19 | + end | ||
20 | + end | ||
21 | + | ||
11 | end | 22 | end |
test/api/articles_test.rb
@@ -195,6 +195,32 @@ class ArticlesTest < ActiveSupport::TestCase | @@ -195,6 +195,32 @@ class ArticlesTest < ActiveSupport::TestCase | ||
195 | assert_equal 400, last_response.status | 195 | assert_equal 400, last_response.status |
196 | end | 196 | end |
197 | 197 | ||
198 | + should 'not perform a vote in a archived article' do | ||
199 | + article = fast_create(Article, :profile_id => @person.id, :name => "Some thing", :archived => true) | ||
200 | + @params[:value] = 1 | ||
201 | + post "/api/v1/articles/#{article.id}/vote?#{params.to_query}" | ||
202 | + puts JSON.parse(last_response.body) | ||
203 | + assert_equal 400, last_response.status | ||
204 | + end | ||
205 | + | ||
206 | + should 'not update hit attribute of a specific child if a article is archived' do | ||
207 | + folder = fast_create(Folder, :profile_id => user.person.id, :archived => true) | ||
208 | + article = fast_create(Article, :parent_id => folder.id, :profile_id => user.person.id) | ||
209 | + get "/api/v1/articles/#{folder.id}/children/#{article.id}?#{params.to_query}" | ||
210 | + json = JSON.parse(last_response.body) | ||
211 | + assert_equal 0, json['article']['hits'] | ||
212 | + end | ||
213 | + | ||
214 | + should 'find archived articles' do | ||
215 | + article1 = fast_create(Article, :profile_id => user.person.id, :name => "Some thing") | ||
216 | + article2 = fast_create(Article, :profile_id => user.person.id, :name => "Some thing", :archived => true) | ||
217 | + params[:archived] = true | ||
218 | + get "/api/v1/articles/?#{params.to_query}" | ||
219 | + json = JSON.parse(last_response.body) | ||
220 | + assert_not_includes json["articles"].map { |a| a["id"] }, article1.id | ||
221 | + assert_includes json["articles"].map { |a| a["id"] }, article2.id | ||
222 | + end | ||
223 | + | ||
198 | should "update body of article created by me" do | 224 | should "update body of article created by me" do |
199 | new_value = "Another body" | 225 | new_value = "Another body" |
200 | params[:article] = {:body => new_value} | 226 | params[:article] = {:body => new_value} |
@@ -653,7 +679,7 @@ class ArticlesTest < ActiveSupport::TestCase | @@ -653,7 +679,7 @@ class ArticlesTest < ActiveSupport::TestCase | ||
653 | assert_equal json['articles'].count, 2 | 679 | assert_equal json['articles'].count, 2 |
654 | end | 680 | end |
655 | 681 | ||
656 | - ARTICLE_ATTRIBUTES = %w(votes_count comments_count) | 682 | + ARTICLE_ATTRIBUTES = %w(followers_count votes_count comments_count) |
657 | 683 | ||
658 | ARTICLE_ATTRIBUTES.map do |attribute| | 684 | ARTICLE_ATTRIBUTES.map do |attribute| |
659 | 685 |
test/api/comments_test.rb
@@ -66,6 +66,15 @@ class CommentsTest < ActiveSupport::TestCase | @@ -66,6 +66,15 @@ class CommentsTest < ActiveSupport::TestCase | ||
66 | assert_equal body, json['comment']['body'] | 66 | assert_equal body, json['comment']['body'] |
67 | end | 67 | end |
68 | 68 | ||
69 | + should 'not comment an archived article' do | ||
70 | + article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing", :archived => true) | ||
71 | + body = 'My comment' | ||
72 | + params.merge!({:body => body}) | ||
73 | + | ||
74 | + post "/api/v1/articles/#{article.id}/comments?#{params.to_query}" | ||
75 | + assert_equal 400, last_response.status | ||
76 | + end | ||
77 | + | ||
69 | should 'comment creation define the source' do | 78 | should 'comment creation define the source' do |
70 | amount = Comment.count | 79 | amount = Comment.count |
71 | article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing") | 80 | article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing") |
test/api/helpers_test.rb
@@ -163,6 +163,10 @@ class APIHelpersTest < ActiveSupport::TestCase | @@ -163,6 +163,10 @@ class APIHelpersTest < ActiveSupport::TestCase | ||
163 | assert_nil make_conditions_with_parameter[:type] | 163 | assert_nil make_conditions_with_parameter[:type] |
164 | end | 164 | end |
165 | 165 | ||
166 | + should 'make_conditions_with_parameter return archived parameter if archived was defined' do | ||
167 | + assert_not_nil make_conditions_with_parameter('archived' => true)[:archived] | ||
168 | + end | ||
169 | + | ||
166 | #test_should_make_order_with_parameters_return_order_if attribute_is_found_at_object_association | 170 | #test_should_make_order_with_parameters_return_order_if attribute_is_found_at_object_association |
167 | should 'make_order_with_parameters return order if attribute is found at object association' do | 171 | should 'make_order_with_parameters return order if attribute is found at object association' do |
168 | environment = Environment.new | 172 | environment = Environment.new |
test/api/people_test.rb
@@ -240,7 +240,7 @@ class PeopleTest < ActiveSupport::TestCase | @@ -240,7 +240,7 @@ class PeopleTest < ActiveSupport::TestCase | ||
240 | assert_equal "www.blog.org", json['person']['additional_data']['Custom Blog'] | 240 | assert_equal "www.blog.org", json['person']['additional_data']['Custom Blog'] |
241 | end | 241 | end |
242 | 242 | ||
243 | - PERSON_ATTRIBUTES = %w(vote_count comments_count articles_count) | 243 | + PERSON_ATTRIBUTES = %w(vote_count comments_count articles_count following_articles_count) |
244 | 244 | ||
245 | PERSON_ATTRIBUTES.map do |attribute| | 245 | PERSON_ATTRIBUTES.map do |attribute| |
246 | define_method "test_should_not_expose_#{attribute}_attribute_in_person_enpoint_if_field_parameter_does_not_contain_the_attribute" do | 246 | define_method "test_should_not_expose_#{attribute}_attribute_in_person_enpoint_if_field_parameter_does_not_contain_the_attribute" do |
test/api/search_test.rb
@@ -147,4 +147,13 @@ class SearchTest < ActiveSupport::TestCase | @@ -147,4 +147,13 @@ class SearchTest < ActiveSupport::TestCase | ||
147 | assert_includes ids, json['articles'].last["id"] | 147 | assert_includes ids, json['articles'].last["id"] |
148 | end | 148 | end |
149 | 149 | ||
150 | + should 'list only articles that was archived' do | ||
151 | + article1 = fast_create(Article, :profile_id => person.id) | ||
152 | + article2 = fast_create(Article, :profile_id => person.id, archived: true) | ||
153 | + | ||
154 | + get "/api/v1/search/article?archived=true" | ||
155 | + json = JSON.parse(last_response.body) | ||
156 | + assert_equal [article2.id], json['articles'].map {|a| a['id']} | ||
157 | + end | ||
158 | + | ||
150 | end | 159 | end |