discourse/spec/requests/api/categories_spec.rb
Dan Ungureanu 333d4f9a98
FIX: Redirect user to the URL with the correct category slug (#10167)
This commit implements a category redirect similar to the one for topic
URLs with wrong slug.
2020-07-07 15:25:36 +03:00

424 lines
17 KiB
Ruby

# frozen_string_literal: true
require 'swagger_helper'
describe 'categories' do
let(:admin) { Fabricate(:admin) }
let!(:category) { Fabricate(:category, user: admin) }
before do
Jobs.run_immediately!
sign_in(admin)
end
path '/categories.json' do
post 'Creates a category' do
tags 'Categories'
consumes 'application/json'
parameter name: :category, in: :body, schema: {
type: :object,
properties: {
name: { type: :string },
color: { type: :string },
text_color: { type: :string },
},
required: [ 'name', 'color', 'text_color' ]
}
produces 'application/json'
response '200', 'category created' do
schema type: :object, properties: {
category: {
type: :object,
properties: {
id: { type: :integer },
name: { type: :string },
color: { type: :string },
text_color: { type: :string },
slug: { type: :string },
topic_count: { type: :integer },
post_count: { type: :integer },
position: { type: :integer },
description: { type: :string, nullable: true },
description_text: { type: :string, nullable: true },
topic_url: { type: :string },
read_restricted: { type: :boolean },
permission: { type: :integer, nullable: true },
notification_level: { type: :integer, nullable: true },
can_edit: { type: :boolean },
topic_template: { type: :string, nullable: true },
has_children: { type: :boolean, nullable: true },
sort_order: { type: :string, nullable: true },
show_subcategory_list: { type: :boolean },
num_featured_topics: { type: :integer },
default_view: { type: :string, nullable: true },
subcategory_list_style: { type: :string },
default_topic_period: { type: :string },
minimum_required_tags: { type: :integer },
navigate_to_first_post_after_read: { type: :boolean },
custom_fields: { type: :object },
min_tags_from_required_group: { type: :integer },
required_tag_group_name: { type: :string, nullable: true },
available_groups: { type: :array },
auto_close_hours: { type: :integer, nullable: true },
auto_close_based_on_last_post: { type: :boolean },
group_permissions: { type: :array },
email_in: { type: :boolean, nullable: true },
email_in_allow_strangers: { type: :boolean },
mailinglist_mirror: { type: :boolean },
all_topics_wiki: { type: :boolean },
can_delete: { type: :boolean },
cannot_delete_reason: { type: :string, nullable: true },
allow_badges: { type: :boolean },
topic_featured_link_allowed: { type: :boolean },
search_priority: { type: :integer },
uploaded_logo: { type: :string, nullable: true },
uploaded_background: { type: :string, nullable: true },
},
required: ["id"]
}
}, required: ["category"]
let(:category) { { name: 'todo', color: 'f94cb0', text_color: '412763' } }
run_test!
end
end
get 'Retreives a list of categories' do
tags 'Categories'
produces 'application/json'
response '200', 'categories response' do
schema type: :object, properties: {
category_list: {
type: :object,
properties: {
can_create_category: { type: :boolean },
can_create_topic: { type: :boolean },
draft: { type: :string, nullable: true },
draft_key: { type: :string },
draft_sequence: { type: :integer },
categories: {
type: :array,
items: {
type: :object,
properties: {
id: { type: :integer },
name: { type: :string },
color: { type: :string },
text_color: { type: :string },
slug: { type: :string },
topic_count: { type: :integer },
post_count: { type: :integer },
position: { type: :integer },
description: { type: :string, nullable: true },
description_text: { type: :string, nullable: true },
topic_url: { type: :string, nullable: true },
read_restricted: { type: :boolean },
permission: { type: :integer, nullable: true },
notification_level: { type: :integer, nullable: true },
can_edit: { type: :boolean },
topic_template: { type: :string, nullable: true },
has_children: { type: :boolean, nullable: true },
sort_order: { type: :string, nullable: true },
show_subcategory_list: { type: :boolean },
num_featured_topics: { type: :integer },
default_view: { type: :string, nullable: true },
subcategory_list_style: { type: :string },
default_topic_period: { type: :string },
minimum_required_tags: { type: :integer },
navigate_to_first_post_after_read: { type: :boolean },
topics_day: { type: :integer },
topics_week: { type: :integer },
topics_month: { type: :integer },
topics_year: { type: :integer },
topics_all_time: { type: :integer },
uploaded_logo: { type: :string, nullable: true },
uploaded_background: { type: :string, nullable: true },
}
}
},
}, required: ["categories"]
}
}, required: ["category_list"]
run_test!
end
end
end
path '/categories/{category_id}.json' do
put 'Updates a category' do
tags 'Categories'
consumes 'application/json'
parameter name: :category_id, in: :path, schema: { type: :string }
parameter name: :category, in: :body, schema: {
type: :object,
properties: {
name: { type: :string },
color: { type: :string },
text_color: { type: :string },
},
required: [ 'name', 'color', 'text_color' ]
}
produces 'application/json'
response '200', 'category created' do
schema type: :object, properties: {
success: { type: :string },
category: {
type: :object,
properties: {
id: { type: :integer },
name: { type: :string },
color: { type: :string },
text_color: { type: :string },
slug: { type: :string },
topic_count: { type: :integer },
post_count: { type: :integer },
position: { type: :integer },
description: { type: :string, nullable: true },
description_text: { type: :string, nullable: true },
description_excerpt: { type: :string, nullable: true },
topic_url: { type: :string, nullable: true },
read_restricted: { type: :boolean },
permission: { type: :string, nullable: true },
notification_level: { type: :integer, nullable: true },
can_edit: { type: :boolean },
topic_template: { type: :string, nullable: true },
has_children: { type: :string, nullable: true },
sort_order: { type: :string, nullable: true },
sort_ascending: { type: :string, nullable: true },
show_subcategory_list: { type: :boolean },
num_featured_topics: { type: :integer },
default_view: { type: :string, nullable: true },
subcategory_list_style: { type: :string },
default_top_period: { type: :string },
default_list_filter: { type: :string },
minimum_required_tags: { type: :integer },
navigate_to_first_post_after_read: { type: :boolean },
custom_fields: {
type: :object,
properties: {
}
},
min_tags_from_required_group: { type: :integer },
required_tag_group_name: { type: :string, nullable: true },
available_groups: {
type: :array,
items: {
},
},
auto_close_hours: { type: :string, nullable: true },
auto_close_based_on_last_post: { type: :boolean },
group_permissions: {
type: :array,
items: {
type: :object,
properties: {
permission_type: { type: :integer },
group_name: { type: :string },
}
},
},
email_in: { type: :string, nullable: true },
email_in_allow_strangers: { type: :boolean },
mailinglist_mirror: { type: :boolean },
all_topics_wiki: { type: :boolean },
can_delete: { type: :boolean },
cannot_delete_reason: { type: :string, nullable: true },
allow_badges: { type: :boolean },
topic_featured_link_allowed: { type: :boolean },
search_priority: { type: :integer },
uploaded_logo: { type: :string, nullable: true },
uploaded_background: { type: :string, nullable: true },
}
},
}
let(:category_id) { category.id }
run_test!
end
end
end
path '/c/{category_slug}/{category_id}.json' do
get 'List topics' do
tags 'Categories'
produces 'application/json'
parameter name: :category_slug, in: :path, schema: { type: :string }
parameter name: :category_id, in: :path, schema: { type: :integer }
response '200', 'response' do
schema type: :object, properties: {
users: {
type: :array,
items: {
type: :object,
properties: {
id: { type: :integer },
username: { type: :string },
name: { type: :string, nullable: true },
avatar_template: { type: :string },
}
}
},
primary_groups: {
type: :array
},
topic_list: {
type: :object,
properties: {
can_create_topic: { type: :boolean },
draft: { type: :string, nullable: true },
draft_key: { type: :string },
draft_sequence: { type: :integer },
per_page: { type: :integer },
topics: {
type: :array,
items: {
type: :object,
properties: {
id: { type: :integer },
title: { type: :string },
fancy_title: { type: :string },
slug: { type: :string },
posts_count: { type: :integer },
reply_count: { type: :integer },
highest_post_number: { type: :integer },
image_url: { type: :string, nullable: true },
created_at: { type: :string },
last_posted_at: { type: :string },
bumped: { type: :boolean },
bumped_at: { type: :string },
archetype: { type: :string },
unseen: { type: :boolean },
pinned: { type: :boolean },
unpinned: { type: :boolean, nullable: true },
excerpt: { type: :string },
visible: { type: :boolean },
closed: { type: :boolean },
archived: { type: :boolean },
bookmarked: { type: :boolean, nullable: true },
liked: { type: :boolean, nullable: true },
views: { type: :integer },
like_count: { type: :integer },
has_summary: { type: :boolean },
last_poster_username: { type: :string },
category_id: { type: :integer },
op_like_count: { type: :integer },
pinned_globally: { type: :boolean },
featured_link: { type: :string, nullable: true },
posters: {
type: :array,
items: {
type: :object,
properties: {
extras: { type: :string },
description: { type: :string },
user_id: { type: :integer },
primary_group_id: { type: :integer, nullable: true },
}
}
}
}
}
}
}
}
}
let(:category_id) { category.id }
let(:category_slug) { category.slug_path.join("/") }
run_test!
end
end
end
path '/c/{category_id}/show.json' do
get 'Show category' do
tags 'Categories'
produces 'application/json'
parameter name: :category_id, in: :path, schema: { type: :string }
response '200', 'response' do
schema type: :object, properties: {
category: {
type: :object,
properties: {
id: { type: :integer },
name: { type: :string },
color: { type: :string },
text_color: { type: :string },
slug: { type: :string },
topic_count: { type: :integer },
post_count: { type: :integer },
position: { type: :integer },
description: { type: :string, nullable: true },
description_text: { type: :string, nullable: true },
description_excerpt: { type: :string, nullable: true },
topic_url: { type: :string, nullable: true },
read_restricted: { type: :boolean },
permission: { type: :integer },
notification_level: { type: :integer, nullable: true },
can_edit: { type: :boolean },
topic_template: { type: :string, nullable: true },
has_children: { type: :string, nullable: true },
sort_order: { type: :string, nullable: true },
sort_ascending: { type: :string, nullable: true },
show_subcategory_list: { type: :boolean },
num_featured_topics: { type: :integer },
default_view: { type: :string, nullable: true },
subcategory_list_style: { type: :string },
default_top_period: { type: :string },
default_list_filter: { type: :string },
minimum_required_tags: { type: :integer },
navigate_to_first_post_after_read: { type: :boolean },
custom_fields: {
type: :object,
properties: {
}
},
min_tags_from_required_group: { type: :integer },
required_tag_group_name: { type: :string, nullable: true },
available_groups: {
type: :array,
items: {
},
},
auto_close_hours: { type: :string, nullable: true },
auto_close_based_on_last_post: { type: :boolean },
group_permissions: {
type: :array,
items: {
type: :object,
properties: {
permission_type: { type: :integer },
group_name: { type: :string },
}
},
},
email_in: { type: :string, nullable: true },
email_in_allow_strangers: { type: :boolean },
mailinglist_mirror: { type: :boolean },
all_topics_wiki: { type: :boolean },
can_delete: { type: :boolean },
cannot_delete_reason: { type: :string, nullable: true },
allow_badges: { type: :boolean },
topic_featured_link_allowed: { type: :boolean },
search_priority: { type: :integer },
uploaded_logo: { type: :string, nullable: true },
uploaded_background: { type: :string, nullable: true },
}
},
}
let(:category_id) { category.id }
run_test!
end
end
end
end