Commit 4ca9a146282dbf46c914796d9838a373f1987f67
1 parent
0a4f86dd
Exists in
master
and in
29 other branches
api: optionally lists parent and children when listing categories
Always show parent and children when getting a specific category with id
Showing
3 changed files
with
80 additions
and
4 deletions
Show diff stats
lib/noosfero/api/entities.rb
| ... | ... | @@ -47,9 +47,19 @@ module Noosfero |
| 47 | 47 | expose :description |
| 48 | 48 | end |
| 49 | 49 | |
| 50 | - class Category < Entity | |
| 50 | + class CategoryBase < Entity | |
| 51 | 51 | root 'categories', 'category' |
| 52 | - expose :name, :id, :slug | |
| 52 | + expose :name, :id | |
| 53 | + end | |
| 54 | + | |
| 55 | + class Category < CategoryBase | |
| 56 | + root 'categories', 'category' | |
| 57 | + expose :slug | |
| 58 | + expose :full_name do |category, options| | |
| 59 | + category.full_name | |
| 60 | + end | |
| 61 | + expose :parent, :using => CategoryBase, if: { parent: true } | |
| 62 | + expose :children, :using => CategoryBase, if: { children: true } | |
| 53 | 63 | expose :image, :using => Image |
| 54 | 64 | end |
| 55 | 65 | ... | ... |
lib/noosfero/api/v1/categories.rb
| ... | ... | @@ -8,13 +8,16 @@ module Noosfero |
| 8 | 8 | |
| 9 | 9 | get do |
| 10 | 10 | type = params[:category_type] |
| 11 | + include_parent = params[:include_parent] == 'true' | |
| 12 | + include_children = params[:include_children] == 'true' | |
| 13 | + | |
| 11 | 14 | categories = type.nil? ? environment.categories : environment.categories.find(:all, :conditions => {:type => type}) |
| 12 | - present categories, :with => Entities::Category | |
| 15 | + present categories, :with => Entities::Category, parent: include_parent, children: include_children | |
| 13 | 16 | end |
| 14 | 17 | |
| 15 | 18 | desc "Return the category by id" |
| 16 | 19 | get ':id' do |
| 17 | - present environment.categories.find(params[:id]), :with => Entities::Category | |
| 20 | + present environment.categories.find(params[:id]), :with => Entities::Category, parent: true, children: true | |
| 18 | 21 | end |
| 19 | 22 | |
| 20 | 23 | end | ... | ... |
test/unit/api/categories_test.rb
| ... | ... | @@ -20,4 +20,67 @@ class CategoriesTest < ActiveSupport::TestCase |
| 20 | 20 | assert_equal category.name, json["category"]["name"] |
| 21 | 21 | end |
| 22 | 22 | |
| 23 | + should 'list parent and children when get category by id' do | |
| 24 | + parent = fast_create(Category) | |
| 25 | + child_1 = fast_create(Category) | |
| 26 | + child_2 = fast_create(Category) | |
| 27 | + | |
| 28 | + category = fast_create(Category) | |
| 29 | + category.parent = parent | |
| 30 | + category.children << child_1 | |
| 31 | + category.children << child_2 | |
| 32 | + category.save | |
| 33 | + | |
| 34 | + get "/api/v1/categories/#{category.id}/?#{params.to_query}" | |
| 35 | + json = JSON.parse(last_response.body) | |
| 36 | + assert_equal({'id' => parent.id, 'name' => parent.name}, json['category']['parent']) | |
| 37 | + assert_equivalent [child_1.id, child_2.id], json['category']['children'].map { |c| c['id'] } | |
| 38 | + end | |
| 39 | + | |
| 40 | + should 'include parent in categories list if params is true' do | |
| 41 | + parent_1 = fast_create(Category) # parent_1 has no parent category | |
| 42 | + child_1 = fast_create(Category) | |
| 43 | + child_2 = fast_create(Category) | |
| 44 | + | |
| 45 | + parent_2 = fast_create(Category) | |
| 46 | + parent_2.parent = parent_1 | |
| 47 | + parent_2.children << child_1 | |
| 48 | + parent_2.children << child_2 | |
| 49 | + parent_2.save | |
| 50 | + | |
| 51 | + get "/api/v1/categories/?#{params.to_query}" | |
| 52 | + json = JSON.parse(last_response.body) | |
| 53 | + assert_equal [nil], json['categories'].map { |c| c['parent'] }.uniq | |
| 54 | + | |
| 55 | + params[:include_parent] = true | |
| 56 | + get "/api/v1/categories/?#{params.to_query}" | |
| 57 | + json = JSON.parse(last_response.body) | |
| 58 | + assert_equivalent [parent_1.parent, parent_2.parent.id, child_1.parent.id, child_2.parent.id], | |
| 59 | + json["categories"].map { |c| c['parent'] && c['parent']['id'] } | |
| 60 | + end | |
| 61 | + | |
| 62 | + should 'include children in categories list if params is true' do | |
| 63 | + category = fast_create(Category) | |
| 64 | + child_1 = fast_create(Category) | |
| 65 | + child_2 = fast_create(Category) | |
| 66 | + child_3 = fast_create(Category) | |
| 67 | + | |
| 68 | + category.children << child_1 | |
| 69 | + category.children << child_2 | |
| 70 | + category.save | |
| 71 | + | |
| 72 | + child_1.children << child_3 | |
| 73 | + child_1.save | |
| 74 | + | |
| 75 | + get "/api/v1/categories/?#{params.to_query}" | |
| 76 | + json = JSON.parse(last_response.body) | |
| 77 | + assert_equal [nil], json['categories'].map { |c| c['children'] }.uniq | |
| 78 | + | |
| 79 | + params[:include_children] = true | |
| 80 | + get "/api/v1/categories/?#{params.to_query}" | |
| 81 | + json = JSON.parse(last_response.body) | |
| 82 | + assert_equivalent [category.children.map(&:id).sort, child_1.children.map(&:id).sort, child_2.children.map(&:id).sort, child_3.children.map(&:id).sort], | |
| 83 | + json["categories"].map{ |c| c['children'].map{ |child| child['id'] }.sort } | |
| 84 | + end | |
| 85 | + | |
| 23 | 86 | end | ... | ... |