2013-02-14 16:51:48 -05:00
# encoding: utf-8
2015-10-11 10:41:23 +01:00
require 'rails_helper'
2013-10-17 17:44:56 +11:00
require_dependency 'post_creator'
2013-02-05 14:16:51 -05:00
describe Category do
2014-12-31 11:55:03 -03:00
it { is_expected . to validate_presence_of :user_id }
it { is_expected . to validate_presence_of :name }
2013-02-05 14:16:51 -05:00
it 'validates uniqueness of name' do
Fabricate ( :category )
2014-12-31 11:55:03 -03:00
is_expected . to validate_uniqueness_of ( :name ) . scoped_to ( :parent_category_id )
2013-02-05 14:16:51 -05:00
end
2016-07-28 13:54:17 -04:00
context " url validation " do
let ( :user ) { Fabricate ( :user ) }
2016-09-22 11:29:44 +08:00
2016-07-28 13:54:17 -04:00
let ( :upload ) { Fabricate ( :upload ) }
it " ensures logo_url is valid " do
expect ( Fabricate . build ( :category , user : user , logo_url : " ---% " ) ) . not_to be_valid
expect ( Fabricate . build ( :category , user : user , logo_url : " http://example.com/made-up.jpg " ) ) . not_to be_valid
expect ( Fabricate . build ( :category , user : user , logo_url : upload . url ) ) . to be_valid
end
it " ensures background_url is valid " do
expect ( Fabricate . build ( :category , user : user , background_url : " ;test " ) ) . not_to be_valid
expect ( Fabricate . build ( :category , user : user , background_url : " http://example.com/no.jpg " ) ) . not_to be_valid
expect ( Fabricate . build ( :category , user : user , background_url : upload . url ) ) . to be_valid
end
end
2014-08-11 16:55:26 -04:00
it 'validates uniqueness in case insensitive way' do
Fabricate ( :category , name : " Cats " )
2014-12-31 11:55:03 -03:00
cats = Fabricate . build ( :category , name : " cats " )
expect ( cats ) . to_not be_valid
expect ( cats . errors [ :name ] ) . to be_present
2014-08-11 16:55:26 -04:00
end
2014-06-27 17:06:59 -04:00
describe " last_updated_at " do
it " returns a number value of when the category was last updated " do
last = Category . last_updated_at
2014-12-31 11:55:03 -03:00
expect ( last ) . to be_present
expect ( last . to_i ) . to eq ( last )
2014-06-27 17:06:59 -04:00
end
end
2013-07-14 11:24:16 +10:00
describe " resolve_permissions " do
it " can determine read_restricted " do
read_restricted , resolved = Category . resolve_permissions ( :everyone = > :full )
2014-12-31 11:55:03 -03:00
expect ( read_restricted ) . to be false
expect ( resolved ) . to be_blank
2013-07-14 11:24:16 +10:00
end
end
2015-09-17 15:51:32 +08:00
describe " permissions_params " do
it " returns the right group names and permission type " do
category = Fabricate ( :category )
group = Fabricate ( :group )
category_group = Fabricate ( :category_group , category : category , group : group )
expect ( category . permissions_params ) . to eq ( { " #{ group . name } " = > category_group . permission_type } )
end
end
2013-07-14 11:24:16 +10:00
describe " topic_create_allowed and post_create_allowed " do
it " works " do
2013-10-24 10:05:51 +11:00
# NOTE we also have the uncategorized category ... hence the increased count
2014-10-22 15:48:18 +11:00
_default_category = Fabricate ( :category )
2013-07-14 11:24:16 +10:00
full_category = Fabricate ( :category )
can_post_category = Fabricate ( :category )
can_read_category = Fabricate ( :category )
user = Fabricate ( :user )
group = Fabricate ( :group )
group . add ( user )
group . save
admin = Fabricate ( :admin )
full_category . set_permissions ( group = > :full )
full_category . save
can_post_category . set_permissions ( group = > :create_post )
can_post_category . save
can_read_category . set_permissions ( group = > :readonly )
can_read_category . save
guardian = Guardian . new ( admin )
2014-12-31 11:55:03 -03:00
expect ( Category . topic_create_allowed ( guardian ) . count ) . to be ( 5 )
expect ( Category . post_create_allowed ( guardian ) . count ) . to be ( 5 )
expect ( Category . secured ( guardian ) . count ) . to be ( 5 )
2013-07-14 11:24:16 +10:00
guardian = Guardian . new ( user )
2014-12-31 11:55:03 -03:00
expect ( Category . secured ( guardian ) . count ) . to be ( 5 )
expect ( Category . post_create_allowed ( guardian ) . count ) . to be ( 4 )
expect ( Category . topic_create_allowed ( guardian ) . count ) . to be ( 3 ) # explicitly allowed once, default allowed once
2013-07-16 15:44:07 +10:00
2015-05-14 12:19:22 +10:00
expect ( Category . scoped_to_permissions ( nil , [ :readonly ] ) . count ) . to be ( 2 )
2013-07-16 15:44:07 +10:00
# everyone has special semantics, test it as well
can_post_category . set_permissions ( :everyone = > :create_post )
can_post_category . save
2014-12-31 11:55:03 -03:00
expect ( Category . post_create_allowed ( guardian ) . count ) . to be ( 4 )
2013-07-14 11:24:16 +10:00
2013-10-13 09:54:48 +11:00
# anonymous has permission to create no topics
guardian = Guardian . new ( nil )
2014-12-31 11:55:03 -03:00
expect ( Category . post_create_allowed ( guardian ) . count ) . to be ( 0 )
2015-05-14 12:19:22 +10:00
expect ( Category . topic_create_allowed ( guardian ) . count ) . to be ( 0 )
expect ( Category . scoped_to_permissions ( guardian , [ :readonly ] ) . count ) . to be ( 3 )
2013-07-14 11:24:16 +10:00
2013-10-13 09:54:48 +11:00
end
2013-07-14 11:24:16 +10:00
end
2013-04-29 16:33:24 +10:00
describe " security " do
2013-05-15 22:45:52 +02:00
let ( :category ) { Fabricate ( :category ) }
let ( :category_2 ) { Fabricate ( :category ) }
let ( :user ) { Fabricate ( :user ) }
let ( :group ) { Fabricate ( :group ) }
2013-04-29 16:33:24 +10:00
2013-05-15 22:45:52 +02:00
it " secures categories correctly " do
2014-12-31 11:55:03 -03:00
expect ( category . read_restricted? ) . to be false
2013-04-29 16:33:24 +10:00
2013-07-14 11:24:16 +10:00
category . set_permissions ( { } )
2014-12-31 11:55:03 -03:00
expect ( category . read_restricted? ) . to be true
2013-04-29 16:33:24 +10:00
2013-07-14 11:24:16 +10:00
category . set_permissions ( :everyone = > :full )
2014-12-31 11:55:03 -03:00
expect ( category . read_restricted? ) . to be false
2013-04-29 16:33:24 +10:00
2014-12-31 11:55:03 -03:00
expect ( user . secure_categories ) . to be_empty
2013-04-29 16:33:24 +10:00
group . add ( user )
group . save
2013-07-14 11:24:16 +10:00
category . set_permissions ( group . id = > :full )
2013-04-29 16:33:24 +10:00
category . save
user . reload
2014-12-31 11:55:03 -03:00
expect ( user . secure_categories ) . to eq ( [ category ] )
2013-05-15 22:45:52 +02:00
end
it " lists all secured categories correctly " do
2014-07-15 15:19:17 -04:00
uncategorized = Category . find ( SiteSetting . uncategorized_category_id )
2013-10-24 10:05:51 +11:00
2013-05-15 22:45:52 +02:00
group . add ( user )
2013-07-14 11:24:16 +10:00
category . set_permissions ( group . id = > :full )
category . save
category_2 . set_permissions ( group . id = > :full )
category_2 . save
2013-04-29 16:33:24 +10:00
2014-12-31 11:55:03 -03:00
expect ( Category . secured ) . to match_array ( [ uncategorized ] )
expect ( Category . secured ( Guardian . new ( user ) ) ) . to match_array ( [ uncategorized , category , category_2 ] )
2013-02-05 14:16:51 -05:00
end
end
2013-07-30 16:48:19 -04:00
it " strips leading blanks " do
2014-12-31 11:55:03 -03:00
expect ( Fabricate ( :category , name : " music " ) . name ) . to eq ( " music " )
2013-07-30 16:48:19 -04:00
end
it " strips trailing blanks " do
2014-12-31 11:55:03 -03:00
expect ( Fabricate ( :category , name : " bugs " ) . name ) . to eq ( " bugs " )
2013-07-30 16:48:19 -04:00
end
it " strips leading and trailing blanks " do
2014-12-31 11:55:03 -03:00
expect ( Fabricate ( :category , name : " blanks " ) . name ) . to eq ( " blanks " )
2013-07-30 16:48:19 -04:00
end
2014-08-18 11:07:32 -04:00
it " sets name_lower " do
2014-12-31 11:55:03 -03:00
expect ( Fabricate ( :category , name : " Not MySQL " ) . name_lower ) . to eq ( " not mysql " )
2014-08-18 11:07:32 -04:00
end
2014-04-25 15:14:05 +02:00
it " has custom fields " do
category = Fabricate ( :category , name : " music " )
2014-12-31 11:55:03 -03:00
expect ( category . custom_fields [ " a " ] ) . to be_nil
2014-04-25 15:14:05 +02:00
category . custom_fields [ " bob " ] = " marley "
category . custom_fields [ " jack " ] = " black "
category . save
category = Category . find ( category . id )
2014-12-31 11:55:03 -03:00
expect ( category . custom_fields ) . to eq ( { " bob " = > " marley " , " jack " = > " black " } )
2014-04-25 15:14:05 +02:00
end
2013-02-05 14:16:51 -05:00
describe " short name " do
let! ( :category ) { Fabricate ( :category , name : 'xx' ) }
it " creates the category " do
2014-12-31 11:55:03 -03:00
expect ( category ) . to be_present
2013-02-05 14:16:51 -05:00
end
it 'has one topic' do
2014-12-31 11:55:03 -03:00
expect ( Topic . where ( category_id : category . id ) . count ) . to eq ( 1 )
2013-02-05 14:16:51 -05:00
end
end
2013-02-14 16:51:48 -05:00
describe 'non-english characters' do
2015-04-13 22:50:41 +08:00
context 'uses ascii slug generator' do
before do
SiteSetting . slug_generation_method = 'ascii'
@category = Fabricate ( :category , name : " 测试 " )
end
after { @category . destroy }
it " creates a blank slug " do
expect ( @category . slug ) . to be_blank
expect ( @category . slug_for_url ) . to eq ( " #{ @category . id } -category " )
end
end
2013-02-14 16:51:48 -05:00
2015-04-13 22:50:41 +08:00
context 'uses none slug generator' do
before do
SiteSetting . slug_generation_method = 'none'
@category = Fabricate ( :category , name : " 测试 " )
end
after do
SiteSetting . slug_generation_method = 'ascii'
@category . destroy
end
it " creates a blank slug " do
expect ( @category . slug ) . to be_blank
expect ( @category . slug_for_url ) . to eq ( " #{ @category . id } -category " )
end
2013-02-14 16:51:48 -05:00
end
2014-09-16 19:15:05 +08:00
2015-04-13 22:50:41 +08:00
context 'uses encoded slug generator' do
before do
SiteSetting . slug_generation_method = 'encoded'
@category = Fabricate ( :category , name : " 测试 " )
end
after do
SiteSetting . slug_generation_method = 'ascii'
@category . destroy
end
it " creates a slug " do
2015-05-04 19:48:37 +08:00
expect ( @category . slug ) . to eq ( " 测试 " )
expect ( @category . slug_for_url ) . to eq ( " 测试 " )
2015-04-13 22:50:41 +08:00
end
2014-09-16 19:15:05 +08:00
end
2013-02-14 16:51:48 -05:00
end
2013-05-30 11:09:09 -04:00
describe 'slug would be a number' do
2015-04-13 22:50:41 +08:00
let ( :category ) { Fabricate . build ( :category , name : " 2 " ) }
2013-05-30 11:09:09 -04:00
it 'creates a blank slug' do
2014-12-31 11:55:03 -03:00
expect ( category . slug ) . to be_blank
expect ( category . slug_for_url ) . to eq ( " #{ category . id } -category " )
2013-05-30 11:09:09 -04:00
end
end
2014-12-03 16:23:59 -08:00
describe 'custom slug can be provided' do
2015-04-13 22:50:41 +08:00
it 'can be sanitized' do
@c = Fabricate ( :category , name : " Fun Cats " , slug : " fun-cats " )
@cat = Fabricate ( :category , name : " love cats " , slug : " love-cats " )
2014-12-03 16:23:59 -08:00
2015-04-13 22:50:41 +08:00
@c . slug = ' invalid slug'
@c . save
expect ( @c . slug ) . to eq ( 'invalid-slug' )
c = Fabricate . build ( :category , name : " More Fun Cats " , slug : " love-cats " )
expect ( c ) . not_to be_valid
expect ( c . errors [ :slug ] ) . to be_present
@cat . slug = " #{ @c . id } -category "
expect ( @cat ) . not_to be_valid
expect ( @cat . errors [ :slug ] ) . to be_present
2014-12-20 22:07:29 +08:00
2015-04-13 22:50:41 +08:00
@cat . slug = " #{ @cat . id } -category "
expect ( @cat ) . to be_valid
expect ( @cat . errors [ :slug ] ) . not_to be_present
2014-12-03 16:23:59 -08:00
end
end
2014-10-22 15:48:18 +11:00
describe 'description_text' do
it 'correctly generates text description as needed' do
c = Category . new
2014-12-31 11:55:03 -03:00
expect ( c . description_text ) . to be_nil
2014-10-22 15:48:18 +11:00
c . description = " <hello <a>test</a>. "
2014-12-31 11:55:03 -03:00
expect ( c . description_text ) . to eq ( " <hello test. " )
2014-10-22 15:48:18 +11:00
end
end
2013-02-05 14:16:51 -05:00
describe 'after create' do
before do
2013-05-07 15:52:45 -04:00
@category = Fabricate ( :category , name : 'Amazing Category' )
2013-02-05 14:16:51 -05:00
@topic = @category . topic
end
2013-04-29 16:33:24 +10:00
it 'is created correctly' do
2014-12-31 11:55:03 -03:00
expect ( @category . slug ) . to eq ( 'amazing-category' )
expect ( @category . slug_for_url ) . to eq ( @category . slug )
2013-02-05 14:16:51 -05:00
2014-12-31 11:55:03 -03:00
expect ( @category . description ) . to be_blank
2013-02-21 18:09:56 -05:00
2014-12-31 11:55:03 -03:00
expect ( Topic . where ( category_id : @category ) . count ) . to eq ( 1 )
2013-02-05 14:16:51 -05:00
2014-12-31 11:55:03 -03:00
expect ( @topic ) . to be_present
2013-02-05 14:16:51 -05:00
2014-12-31 11:55:03 -03:00
expect ( @topic . category ) . to eq ( @category )
2013-02-05 14:16:51 -05:00
2014-12-31 11:55:03 -03:00
expect ( @topic ) . to be_visible
2013-03-07 12:45:49 -05:00
2014-12-31 11:55:03 -03:00
expect ( @topic . pinned_at ) . to be_present
2013-02-05 14:16:51 -05:00
2014-12-31 11:55:03 -03:00
expect ( Guardian . new ( @category . user ) . can_delete? ( @topic ) ) . to be false
2013-02-05 14:16:51 -05:00
2014-12-31 11:55:03 -03:00
expect ( @topic . posts . count ) . to eq ( 1 )
2013-02-05 14:16:51 -05:00
2014-12-31 11:55:03 -03:00
expect ( @category . topic_url ) . to be_present
Default values for posts/topics fields on Category
When creating categories (or, at least, subcategories), certain integer
values are set to a default of NULL: topics_week, topics_month,
topics_year, posts_week, posts_month, and posts_year. This causes
consistent exceptions when trying to visit `/categories`, with the
offending line being in
`CategoryDetailedSerializer#count_with_subcategories`. This attempts to
coerce nil into Fixnum.
A fix could be to convert to 0 in the code, but these attributes should
really never be NULL. If there are no posts or topics, they should be 0
to maintain data integrity.
Signed-off-by: David Celis <me@davidcel.is>
2014-02-06 11:56:39 -08:00
2014-12-31 11:55:03 -03:00
expect ( @category . posts_week ) . to eq ( 0 )
expect ( @category . posts_month ) . to eq ( 0 )
expect ( @category . posts_year ) . to eq ( 0 )
Default values for posts/topics fields on Category
When creating categories (or, at least, subcategories), certain integer
values are set to a default of NULL: topics_week, topics_month,
topics_year, posts_week, posts_month, and posts_year. This causes
consistent exceptions when trying to visit `/categories`, with the
offending line being in
`CategoryDetailedSerializer#count_with_subcategories`. This attempts to
coerce nil into Fixnum.
A fix could be to convert to 0 in the code, but these attributes should
really never be NULL. If there are no posts or topics, they should be 0
to maintain data integrity.
Signed-off-by: David Celis <me@davidcel.is>
2014-02-06 11:56:39 -08:00
2014-12-31 11:55:03 -03:00
expect ( @category . topics_week ) . to eq ( 0 )
expect ( @category . topics_month ) . to eq ( 0 )
expect ( @category . topics_year ) . to eq ( 0 )
2013-02-05 14:16:51 -05:00
end
2014-07-18 13:59:54 -04:00
it " renames the definition when renamed " do
@category . update_attributes ( name : 'Troutfishing' )
@topic . reload
2016-07-28 11:57:30 -04:00
expect ( @topic . title ) . to match ( / Troutfishing / )
2014-07-18 13:59:54 -04:00
end
2014-07-25 16:36:16 -04:00
it " doesn't raise an error if there is no definition topic to rename (uncategorized) " do
2014-12-31 11:55:03 -03:00
expect { @category . update_attributes ( name : 'Troutfishing' , topic_id : nil ) } . to_not raise_error
2014-07-25 16:36:16 -04:00
end
2016-04-27 16:34:44 +05:30
it " creates permalink when category slug is changed " do
@category . update_attributes ( slug : 'new-category' )
expect ( Permalink . count ) . to eq ( 1 )
end
it " creates permalink when sub category slug is changed " do
sub_category = Fabricate ( :category , slug : 'sub-category' , parent_category_id : @category . id )
sub_category . update_attributes ( slug : 'new-sub-category' )
expect ( Permalink . count ) . to eq ( 1 )
end
it " deletes permalink when category slug is reused " do
Fabricate ( :permalink , url : " /c/bikeshed-category " )
Fabricate ( :category , slug : 'bikeshed-category' )
expect ( Permalink . count ) . to eq ( 0 )
end
it " deletes permalink when sub category slug is reused " do
Fabricate ( :permalink , url : " /c/main-category/sub-category " )
main_category = Fabricate ( :category , slug : 'main-category' )
Fabricate ( :category , slug : 'sub-category' , parent_category_id : main_category . id )
expect ( Permalink . count ) . to eq ( 0 )
end
2013-12-03 18:53:40 -05:00
it " should not set its description topic to auto-close " do
2013-12-06 16:39:35 -05:00
category = Fabricate ( :category , name : 'Closing Topics' , auto_close_hours : 1 )
2014-12-31 11:55:03 -03:00
expect ( category . topic . auto_close_at ) . to be_nil
2013-12-03 18:53:40 -05:00
end
2013-04-01 12:26:51 -04:00
describe " creating a new category with the same slug " do
2014-08-13 14:45:25 -04:00
it " should have a blank slug if at the same level " do
2014-03-24 13:36:23 -04:00
category = Fabricate ( :category , name : " Amazing Categóry " )
2014-12-31 11:55:03 -03:00
expect ( category . slug ) . to be_blank
expect ( category . slug_for_url ) . to eq ( " #{ category . id } -category " )
2013-04-01 12:26:51 -04:00
end
2014-08-13 14:45:25 -04:00
it " doesn't have a blank slug if not at the same level " do
parent = Fabricate ( :category , name : 'Other parent' )
category = Fabricate ( :category , name : " Amazing Categóry " , parent_category_id : parent . id )
2014-12-31 11:55:03 -03:00
expect ( category . slug ) . to eq ( 'amazing-category' )
expect ( category . slug_for_url ) . to eq ( " amazing-category " )
2014-08-13 14:45:25 -04:00
end
2013-04-01 12:26:51 -04:00
end
2013-02-05 14:16:51 -05:00
describe " trying to change the category topic's category " do
before do
@new_cat = Fabricate ( :category , name : '2nd Category' , user : @category . user )
2014-07-16 15:39:39 -04:00
@topic . change_category_to_id ( @new_cat . id )
2013-02-05 14:16:51 -05:00
@topic . reload
@category . reload
end
2013-04-29 16:33:24 +10:00
it 'does not cause changes' do
2014-12-31 11:55:03 -03:00
expect ( @category . topic_count ) . to eq ( 0 )
expect ( @topic . category ) . to eq ( @category )
expect ( @category . topic ) . to eq ( @topic )
2013-02-05 14:16:51 -05:00
end
end
end
2014-12-03 16:23:59 -08:00
describe " update " do
it " should enforce uniqueness of slug " do
Fabricate ( :category , slug : " the-slug " )
c2 = Fabricate ( :category , slug : " different-slug " )
c2 . slug = " the-slug "
2014-12-31 11:55:03 -03:00
expect ( c2 ) . to_not be_valid
expect ( c2 . errors [ :slug ] ) . to be_present
2014-12-03 16:23:59 -08:00
end
end
2013-02-05 14:16:51 -05:00
describe 'destroy' do
before do
@category = Fabricate ( :category )
@category_id = @category . id
@topic_id = @category . topic_id
@category . destroy
end
2013-04-29 16:33:24 +10:00
it 'is deleted correctly' do
2014-12-31 11:55:03 -03:00
expect ( Category . exists? ( id : @category_id ) ) . to be false
expect ( Topic . exists? ( id : @topic_id ) ) . to be false
2013-02-05 14:16:51 -05:00
end
end
2013-10-17 17:44:56 +11:00
describe 'latest' do
it 'should be updated correctly' do
category = Fabricate ( :category )
post = create_post ( category : category . name )
category . reload
2014-12-31 11:55:03 -03:00
expect ( category . latest_post_id ) . to eq ( post . id )
expect ( category . latest_topic_id ) . to eq ( post . topic_id )
2013-10-17 17:44:56 +11:00
post2 = create_post ( category : category . name )
post3 = create_post ( topic_id : post . topic_id , category : category . name )
category . reload
2014-12-31 11:55:03 -03:00
expect ( category . latest_post_id ) . to eq ( post3 . id )
expect ( category . latest_topic_id ) . to eq ( post2 . topic_id )
2013-10-17 17:44:56 +11:00
2013-12-30 14:33:07 -08:00
post3 . reload
2013-10-17 17:44:56 +11:00
destroyer = PostDestroyer . new ( Fabricate ( :admin ) , post3 )
destroyer . destroy
category . reload
2014-12-31 11:55:03 -03:00
expect ( category . latest_post_id ) . to eq ( post2 . id )
2013-10-17 17:44:56 +11:00
end
end
2013-02-05 14:16:51 -05:00
describe 'update_stats' do
before do
@category = Fabricate ( :category )
2013-02-16 14:57:16 -06:00
end
2013-02-25 19:42:20 +03:00
2013-02-16 14:57:16 -06:00
context 'with regular topics' do
before do
2013-10-17 13:23:38 +11:00
create_post ( user : @category . user , category : @category . name )
2013-02-16 14:57:16 -06:00
Category . update_stats
@category . reload
end
2013-02-05 14:16:51 -05:00
2013-04-29 16:33:24 +10:00
it 'updates topic stats' do
2014-12-31 11:55:03 -03:00
expect ( @category . topics_week ) . to eq ( 1 )
expect ( @category . topics_month ) . to eq ( 1 )
expect ( @category . topics_year ) . to eq ( 1 )
expect ( @category . topic_count ) . to eq ( 1 )
expect ( @category . post_count ) . to eq ( 1 )
expect ( @category . posts_year ) . to eq ( 1 )
expect ( @category . posts_month ) . to eq ( 1 )
expect ( @category . posts_week ) . to eq ( 1 )
2013-03-31 13:22:05 +02:00
end
2013-04-29 16:33:24 +10:00
2013-02-05 14:16:51 -05:00
end
2013-02-25 19:42:20 +03:00
2013-02-16 14:57:16 -06:00
context 'with deleted topics' do
before do
2013-02-25 19:42:20 +03:00
@category . topics << Fabricate ( :deleted_topic ,
2013-02-16 14:57:16 -06:00
user : @category . user )
Category . update_stats
@category . reload
end
2013-04-29 16:33:24 +10:00
it 'does not count deleted topics' do
2014-12-31 11:55:03 -03:00
expect ( @category . topics_week ) . to eq ( 0 )
expect ( @category . topic_count ) . to eq ( 0 )
expect ( @category . topics_month ) . to eq ( 0 )
expect ( @category . topics_year ) . to eq ( 0 )
expect ( @category . post_count ) . to eq ( 0 )
expect ( @category . posts_year ) . to eq ( 0 )
expect ( @category . posts_month ) . to eq ( 0 )
expect ( @category . posts_week ) . to eq ( 0 )
2013-12-13 15:15:51 -05:00
end
end
context 'with revised post' do
before do
post = create_post ( user : @category . user , category : @category . name )
2015-11-24 14:28:42 -05:00
SiteSetting . stubs ( :editing_grace_period ) . returns ( 1 . minute . to_i )
2014-10-27 22:06:43 +01:00
post . revise ( post . user , { raw : 'updated body' } , revised_at : post . updated_at + 2 . minutes )
2013-12-13 15:15:51 -05:00
Category . update_stats
@category . reload
2013-02-16 14:57:16 -06:00
end
2013-03-31 13:22:05 +02:00
2013-12-13 15:15:51 -05:00
it " doesn't count each version of a post " do
2014-12-31 11:55:03 -03:00
expect ( @category . post_count ) . to eq ( 1 )
expect ( @category . posts_year ) . to eq ( 1 )
expect ( @category . posts_month ) . to eq ( 1 )
expect ( @category . posts_week ) . to eq ( 1 )
2013-12-13 15:15:51 -05:00
end
2013-02-05 14:16:51 -05:00
end
2014-08-27 15:58:05 -04:00
context 'for uncategorized category' do
before do
@uncategorized = Category . find ( SiteSetting . uncategorized_category_id )
create_post ( user : Fabricate ( :user ) , category : @uncategorized . name )
Category . update_stats
@uncategorized . reload
end
it 'updates topic stats' do
2014-12-31 11:55:03 -03:00
expect ( @uncategorized . topics_week ) . to eq ( 1 )
expect ( @uncategorized . topics_month ) . to eq ( 1 )
expect ( @uncategorized . topics_year ) . to eq ( 1 )
expect ( @uncategorized . topic_count ) . to eq ( 1 )
expect ( @uncategorized . post_count ) . to eq ( 1 )
expect ( @uncategorized . posts_year ) . to eq ( 1 )
expect ( @uncategorized . posts_month ) . to eq ( 1 )
expect ( @uncategorized . posts_week ) . to eq ( 1 )
2014-08-27 15:58:05 -04:00
end
end
2013-02-05 14:16:51 -05:00
end
2013-10-23 12:58:11 -04:00
2014-02-16 12:45:00 -05:00
describe " # url " do
it " builds a url for normal categories " do
category = Fabricate ( :category , name : " cats " )
2015-01-07 11:45:57 -05:00
expect ( category . url ) . to eq " /c/cats "
2014-02-16 12:45:00 -05:00
end
describe " for subcategories " do
it " includes the parent category " do
parent_category = Fabricate ( :category , name : " parent " )
subcategory = Fabricate ( :category , name : " child " ,
parent_category_id : parent_category . id )
2015-01-07 11:45:57 -05:00
expect ( subcategory . url ) . to eq " /c/parent/child "
2014-02-16 12:45:00 -05:00
end
end
end
2013-10-23 12:58:11 -04:00
2015-12-28 14:28:16 +08:00
describe " # url_with_id " do
let ( :category ) { Fabricate ( :category , name : 'cats' ) }
it " includes the id in the URL " do
expect ( category . url_with_id ) . to eq ( " /c/ #{ category . id } -cats " )
end
context " child category " do
let ( :child_category ) { Fabricate ( :category , parent_category_id : category . id , name : 'dogs' ) }
it " includes the id in the URL " do
expect ( child_category . url_with_id ) . to eq ( " /c/cats/dogs/ #{ child_category . id } " )
end
end
end
2014-07-15 15:19:17 -04:00
describe " uncategorized " do
let ( :cat ) { Category . where ( id : SiteSetting . uncategorized_category_id ) . first }
it " reports as `uncategorized?` " do
2014-12-31 11:55:03 -03:00
expect ( cat ) . to be_uncategorized
2014-07-15 15:19:17 -04:00
end
it " cannot have a parent category " do
cat . parent_category_id = Fabricate ( :category ) . id
2014-12-31 11:55:03 -03:00
expect ( cat ) . to_not be_valid
2014-07-15 15:19:17 -04:00
end
end
2013-10-23 12:58:11 -04:00
describe " parent categories " do
let ( :user ) { Fabricate ( :user ) }
let ( :parent_category ) { Fabricate ( :category , user : user ) }
it " can be associated with a parent category " do
sub_category = Fabricate . build ( :category , parent_category_id : parent_category . id , user : user )
2014-12-31 11:55:03 -03:00
expect ( sub_category ) . to be_valid
expect ( sub_category . parent_category ) . to eq ( parent_category )
2013-10-23 12:58:11 -04:00
end
it " cannot associate a category with itself " do
category = Fabricate ( :category , user : user )
category . parent_category_id = category . id
2014-12-31 11:55:03 -03:00
expect ( category ) . to_not be_valid
2013-10-23 12:58:11 -04:00
end
it " cannot have a category two levels deep " do
sub_category = Fabricate ( :category , parent_category_id : parent_category . id , user : user )
nested_sub_category = Fabricate . build ( :category , parent_category_id : sub_category . id , user : user )
2014-12-31 11:55:03 -03:00
expect ( nested_sub_category ) . to_not be_valid
2013-10-23 12:58:11 -04:00
end
2014-02-08 14:10:48 -08:00
describe " .query_parent_category " do
it " should return the parent category id given a parent slug " do
parent_category . name = " Amazing Category "
2014-12-31 11:55:03 -03:00
expect ( parent_category . id ) . to eq ( Category . query_parent_category ( parent_category . slug ) )
2014-02-08 14:10:48 -08:00
end
end
describe " .query_category " do
it " should return the category " do
category = Fabricate ( :category , name : " Amazing Category " , parent_category_id : parent_category . id , user : user )
parent_category . name = " Amazing Parent Category "
2014-12-31 11:55:03 -03:00
expect ( category ) . to eq ( Category . query_category ( category . slug , parent_category . id ) )
2014-02-08 14:10:48 -08:00
end
end
2013-10-23 12:58:11 -04:00
end
2014-07-14 10:16:24 -04:00
describe " find_by_email " do
it " is case insensitive " do
c1 = Fabricate ( :category , email_in : 'lower@example.com' )
c2 = Fabricate ( :category , email_in : 'UPPER@EXAMPLE.COM' )
c3 = Fabricate ( :category , email_in : 'Mixed.Case@Example.COM' )
2014-12-31 11:55:03 -03:00
expect ( Category . find_by_email ( 'LOWER@EXAMPLE.COM' ) ) . to eq ( c1 )
expect ( Category . find_by_email ( 'upper@example.com' ) ) . to eq ( c2 )
expect ( Category . find_by_email ( 'mixed.case@example.com' ) ) . to eq ( c3 )
expect ( Category . find_by_email ( 'MIXED.CASE@EXAMPLE.COM' ) ) . to eq ( c3 )
2014-07-14 10:16:24 -04:00
end
end
2016-03-14 22:08:29 +05:30
describe " find_by_slug " do
it " finds with category and sub category " do
category = Fabricate ( :category , slug : 'awesome-category' )
sub_category = Fabricate ( :category , parent_category_id : category . id , slug : 'awesome-sub-category' )
expect ( Category . find_by_slug ( 'awesome-category' ) ) . to eq ( category )
expect ( Category . find_by_slug ( 'awesome-sub-category' , 'awesome-category' ) ) . to eq ( sub_category )
end
end
2016-07-28 11:57:30 -04:00
describe " validate email_in " do
let ( :user ) { Fabricate ( :user ) }
it " works with a valid email " do
expect ( Category . new ( name : 'test' , user : user , email_in : 'test@example.com' ) . valid? ) . to eq ( true )
end
it " adds an error with an invalid email " do
category = Category . new ( name : 'test' , user : user , email_in : '<sup>test</sup>' )
expect ( category . valid? ) . to eq ( false )
expect ( category . errors . full_messages . join ) . not_to match ( / <sup> / )
end
context " with a duplicate email in a group " do
let ( :group ) { Fabricate ( :group , name : 'testgroup' , incoming_email : 'test@example.com' ) }
it " adds an error with an invalid email " do
category = Category . new ( name : 'test' , user : user , email_in : group . incoming_email )
expect ( category . valid? ) . to eq ( false )
end
end
context " with duplicate email in a category " do
let! ( :category ) { Fabricate ( :category , user : user , name : '<b>cool</b>' , email_in : 'test@example.com' ) }
it " adds an error with an invalid email " do
category = Category . new ( name : 'test' , user : user , email_in : " test@example.com " )
expect ( category . valid? ) . to eq ( false )
expect ( category . errors . full_messages . join ) . not_to match ( / <b> / )
end
end
end
2013-02-05 14:16:51 -05:00
end