Commit 518e6a90fa20bccb50e33739fc25c18c8d114de6

Authored by Leandro Santos
Committed by Rodrigo Souto
1 parent 1107cc69

adding tests for article api

lib/api/v1/articles.rb
@@ -3,6 +3,8 @@ module API @@ -3,6 +3,8 @@ module API
3 class Articles < Grape::API 3 class Articles < Grape::API
4 before { authenticate! } 4 before { authenticate! }
5 5
  6 + ARTICLE_TYPES = Article.descendants.map{|a| a.to_s}
  7 +
6 resource :articles do 8 resource :articles do
7 9
8 # Collect articles 10 # Collect articles
@@ -16,7 +18,7 @@ module API @@ -16,7 +18,7 @@ module API
16 # GET host/api/v1/articles?from=2013-04-04-14:41:43&until=2015-04-04-14:41:43&limit=10&private_token=e96fff37c2238fdab074d1dcea8e6317 18 # GET host/api/v1/articles?from=2013-04-04-14:41:43&until=2015-04-04-14:41:43&limit=10&private_token=e96fff37c2238fdab074d1dcea8e6317
17 get do 19 get do
18 articles = select_filtered_collection_of(environment, 'articles', params) 20 articles = select_filtered_collection_of(environment, 'articles', params)
19 - articles = articles.display_filter(current_user.person, nil) 21 + articles = articles.display_filter(current_person, nil)
20 present articles, :with => Entities::Article 22 present articles, :with => Entities::Article
21 end 23 end
22 24
@@ -29,7 +31,7 @@ module API @@ -29,7 +31,7 @@ module API
29 get ':id/children' do 31 get ':id/children' do
30 article = find_article(environment.articles, params[:id]) 32 article = find_article(environment.articles, params[:id])
31 articles = select_filtered_collection_of(article, 'children', params) 33 articles = select_filtered_collection_of(article, 'children', params)
32 - articles = articles.display_filter(current_user.person, nil) 34 + articles = articles.display_filter(current_person, nil)
33 present articles, :with => Entities::Article 35 present articles, :with => Entities::Article
34 end 36 end
35 37
@@ -46,11 +48,11 @@ module API @@ -46,11 +48,11 @@ module API
46 get do 48 get do
47 community = environment.communities.find(params[:community_id]) 49 community = environment.communities.find(params[:community_id])
48 articles = select_filtered_collection_of(community, 'articles', params) 50 articles = select_filtered_collection_of(community, 'articles', params)
49 - articles = articles.display_filter(current_user.person, community) 51 + articles = articles.display_filter(current_person, community)
50 present articles, :with => Entities::Article 52 present articles, :with => Entities::Article
51 end 53 end
52 54
53 - get '/:id' do 55 + get ':id' do
54 community = environment.communities.find(params[:community_id]) 56 community = environment.communities.find(params[:community_id])
55 article = find_article(community.articles, params[:id]) 57 article = find_article(community.articles, params[:id])
56 present article, :with => Entities::Article 58 present article, :with => Entities::Article
@@ -60,9 +62,11 @@ module API @@ -60,9 +62,11 @@ module API
60 # POST api/v1/communites/:community_id/articles?private_toke=234298743290432&article[name]=title&article[body]=body 62 # POST api/v1/communites/:community_id/articles?private_toke=234298743290432&article[name]=title&article[body]=body
61 post do 63 post do
62 community = environment.communities.find(params[:community_id]) 64 community = environment.communities.find(params[:community_id])
63 - return forbidden! unless current_user.person.can_post_content?(community) 65 + return forbidden! unless current_person.can_post_content?(community)
64 66
65 klass_type= params[:content_type].nil? ? 'TinyMceArticle' : params[:content_type] 67 klass_type= params[:content_type].nil? ? 'TinyMceArticle' : params[:content_type]
  68 + return forbidden! unless ARTICLE_TYPES.include?(klass_type)
  69 +
66 article = klass_type.constantize.new(params[:article]) 70 article = klass_type.constantize.new(params[:article])
67 article.last_changed_by = current_person 71 article.last_changed_by = current_person
68 article.created_by= current_person 72 article.created_by= current_person
test/unit/api/articles_test.rb
@@ -39,33 +39,6 @@ class ArticlesTest &lt; ActiveSupport::TestCase @@ -39,33 +39,6 @@ class ArticlesTest &lt; ActiveSupport::TestCase
39 assert_equal 403, last_response.status 39 assert_equal 403, last_response.status
40 end 40 end
41 41
42 - should 'return article by community' do  
43 - community = fast_create(Community)  
44 - article = fast_create(Article, :profile_id => community.id, :name => "Some thing")  
45 - get "/api/v1/communities/#{community.id}/articles/#{article.id}?#{params.to_query}"  
46 - json = JSON.parse(last_response.body)  
47 - assert_equal article.id, json["article"]["id"]  
48 - end  
49 -  
50 - should 'not return article by community if user has no permission to view it' do  
51 - community = fast_create(Community)  
52 - article = fast_create(Article, :profile_id => community.id, :name => "Some thing", :published => false)  
53 - assert !article.published?  
54 -  
55 - get "/api/v1/communities/#{community.id}/articles/#{article.id}?#{params.to_query}"  
56 - assert_equal 403, last_response.status  
57 - end  
58 -  
59 - should 'not list forbidden article when listing articles by community' do  
60 - community = fast_create(Community)  
61 - article = fast_create(Article, :profile_id => community.id, :name => "Some thing", :published => false)  
62 - assert !article.published?  
63 -  
64 - get "/api/v1/communities/#{community.id}/articles?#{params.to_query}"  
65 - json = JSON.parse(last_response.body)  
66 - assert_not_includes json['articles'].map {|a| a['id']}, article.id  
67 - end  
68 -  
69 should 'list article children' do 42 should 'list article children' do
70 article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing") 43 article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing")
71 child1 = fast_create(Article, :parent_id => article.id, :profile_id => user.person.id, :name => "Some thing") 44 child1 = fast_create(Article, :parent_id => article.id, :profile_id => user.person.id, :name => "Some thing")
@@ -109,6 +82,33 @@ class ArticlesTest &lt; ActiveSupport::TestCase @@ -109,6 +82,33 @@ class ArticlesTest &lt; ActiveSupport::TestCase
109 assert_not_includes json['articles'].map {|a| a['id']}, child.id 82 assert_not_includes json['articles'].map {|a| a['id']}, child.id
110 end 83 end
111 84
  85 + should 'return article by community' do
  86 + community = fast_create(Community)
  87 + article = fast_create(Article, :profile_id => community.id, :name => "Some thing")
  88 + get "/api/v1/communities/#{community.id}/articles/#{article.id}?#{params.to_query}"
  89 + json = JSON.parse(last_response.body)
  90 + assert_equal article.id, json["article"]["id"]
  91 + end
  92 +
  93 + should 'not return article by community if user has no permission to view it' do
  94 + community = fast_create(Community)
  95 + article = fast_create(Article, :profile_id => community.id, :name => "Some thing", :published => false)
  96 + assert !article.published?
  97 +
  98 + get "/api/v1/communities/#{community.id}/articles/#{article.id}?#{params.to_query}"
  99 + assert_equal 403, last_response.status
  100 + end
  101 +
  102 + should 'not list forbidden article when listing articles by community' do
  103 + community = fast_create(Community)
  104 + article = fast_create(Article, :profile_id => community.id, :name => "Some thing", :published => false)
  105 + assert !article.published?
  106 +
  107 + get "/api/v1/communities/#{community.id}/articles?#{params.to_query}"
  108 + json = JSON.parse(last_response.body)
  109 + assert_not_includes json['articles'].map {|a| a['id']}, article.id
  110 + end
  111 +
112 should 'create article in a community' do 112 should 'create article in a community' do
113 community = fast_create(Community) 113 community = fast_create(Community)
114 give_permission(user.person, 'post_content', community) 114 give_permission(user.person, 'post_content', community)
@@ -137,4 +137,73 @@ class ArticlesTest &lt; ActiveSupport::TestCase @@ -137,4 +137,73 @@ class ArticlesTest &lt; ActiveSupport::TestCase
137 assert_equal article.id, json["article"]["parent"]["id"] 137 assert_equal article.id, json["article"]["parent"]["id"]
138 end 138 end
139 139
  140 + should 'create article with content type passed as parameter' do
  141 + community = fast_create(Community)
  142 + community.add_member(user.person)
  143 +
  144 + Article.delete_all
  145 + params[:article] = {:name => "Title"}
  146 + params[:content_type] = 'TextArticle'
  147 + post "/api/v1/communities/#{community.id}/articles?#{params.to_query}"
  148 + json = JSON.parse(last_response.body)
  149 +
  150 + assert_kind_of TextArticle, Article.last
  151 + end
  152 +
  153 + should 'create article of TinyMceArticle type if no content type is passed as parameter' do
  154 + community = fast_create(Community)
  155 + community.add_member(user.person)
  156 +
  157 + params[:article] = {:name => "Title"}
  158 + post "/api/v1/communities/#{community.id}/articles?#{params.to_query}"
  159 + json = JSON.parse(last_response.body)
  160 +
  161 + assert_kind_of TinyMceArticle, Article.last
  162 + end
  163 +
  164 + should 'not create article with invalid article content type' do
  165 + community = fast_create(Community)
  166 + community.add_member(user.person)
  167 +
  168 + params[:article] = {:name => "Title"}
  169 + params[:content_type] = 'Person'
  170 + post "/api/v1/communities/#{community.id}/articles?#{params.to_query}"
  171 + json = JSON.parse(last_response.body)
  172 +
  173 + assert_equal 403, last_response.status
  174 + end
  175 +
  176 + should 'create article defining the correct profile' do
  177 + community = fast_create(Community)
  178 + community.add_member(user.person)
  179 +
  180 + params[:article] = {:name => "Title"}
  181 + post "/api/v1/communities/#{community.id}/articles?#{params.to_query}"
  182 + json = JSON.parse(last_response.body)
  183 +
  184 + assert_equal community, Article.last.profile
  185 + end
  186 +
  187 + should 'create article defining the created_by' do
  188 + community = fast_create(Community)
  189 + community.add_member(user.person)
  190 +
  191 + params[:article] = {:name => "Title"}
  192 + post "/api/v1/communities/#{community.id}/articles?#{params.to_query}"
  193 + json = JSON.parse(last_response.body)
  194 +
  195 + assert_equal user.person, Article.last.created_by
  196 + end
  197 +
  198 + should 'create article defining the last_changed_by' do
  199 + community = fast_create(Community)
  200 + community.add_member(user.person)
  201 +
  202 + params[:article] = {:name => "Title"}
  203 + post "/api/v1/communities/#{community.id}/articles?#{params.to_query}"
  204 + json = JSON.parse(last_response.body)
  205 +
  206 + assert_equal user.person, Article.last.last_changed_by
  207 + end
  208 +
140 end 209 end