2013-02-05 14:16:51 -05:00
require 'spec_helper'
describe TopicsController do
2013-06-28 13:55:34 -04:00
context 'wordpress' do
let! ( :user ) { log_in ( :moderator ) }
let ( :p1 ) { Fabricate ( :post , user : user ) }
let ( :topic ) { p1 . topic }
let! ( :p2 ) { Fabricate ( :post , topic : topic , user : user ) }
it " returns the JSON in the format our wordpress plugin needs " do
xhr :get , :wordpress , topic_id : topic . id , best : 3
response . should be_success
json = :: JSON . parse ( response . body )
json . should be_present
# The JSON has the data the wordpress plugin needs
json [ 'id' ] . should == topic . id
json [ 'posts_count' ] . should == 2
json [ 'filtered_posts_count' ] . should == 2
# Posts
json [ 'posts' ] . size . should == 1
post = json [ 'posts' ] [ 0 ]
post [ 'id' ] . should == p2 . id
post [ 'username' ] . should == user . username
2014-05-29 17:19:49 -04:00
post [ 'avatar_template' ] . should == " #{ Discourse . base_url_no_prefix } #{ user . avatar_template } "
2013-06-28 13:55:34 -04:00
post [ 'name' ] . should == user . name
post [ 'created_at' ] . should be_present
post [ 'cooked' ] . should == p2 . cooked
# Participants
json [ 'participants' ] . size . should == 1
participant = json [ 'participants' ] [ 0 ]
participant [ 'id' ] . should == user . id
participant [ 'username' ] . should == user . username
2014-05-29 17:19:49 -04:00
participant [ 'avatar_template' ] . should == " #{ Discourse . base_url_no_prefix } #{ user . avatar_template } "
2013-06-28 13:55:34 -04:00
end
end
2013-02-05 14:16:51 -05:00
context 'move_posts' do
it 'needs you to be logged in' do
lambda { xhr :post , :move_posts , topic_id : 111 , title : 'blah' , post_ids : [ 1 , 2 , 3 ] } . should raise_error ( Discourse :: NotLoggedIn )
end
2013-05-08 13:33:58 -04:00
describe 'moving to a new topic' do
2013-02-05 14:16:51 -05:00
let! ( :user ) { log_in ( :moderator ) }
let ( :p1 ) { Fabricate ( :post , user : user ) }
let ( :topic ) { p1 . topic }
it " raises an error without postIds " do
2013-06-06 14:41:27 -04:00
lambda { xhr :post , :move_posts , topic_id : topic . id , title : 'blah' } . should raise_error ( ActionController :: ParameterMissing )
2013-02-05 14:16:51 -05:00
end
it " raises an error when the user doesn't have permission to move the posts " do
Guardian . any_instance . expects ( :can_move_posts? ) . returns ( false )
xhr :post , :move_posts , topic_id : topic . id , title : 'blah' , post_ids : [ 1 , 2 , 3 ]
response . should be_forbidden
end
context 'success' do
let ( :p2 ) { Fabricate ( :post , user : user ) }
before do
2013-10-29 15:30:06 -04:00
Topic . any_instance . expects ( :move_posts ) . with ( user , [ p2 . id ] , title : 'blah' , category_id : 123 ) . returns ( topic )
xhr :post , :move_posts , topic_id : topic . id , title : 'blah' , post_ids : [ p2 . id ] , category_id : 123
2013-02-05 14:16:51 -05:00
end
it " returns success " do
response . should be_success
2013-05-08 13:33:58 -04:00
result = :: JSON . parse ( response . body )
2014-09-25 17:44:48 +02:00
result [ 'success' ] . should == true
2013-05-08 13:33:58 -04:00
result [ 'url' ] . should be_present
2013-02-05 14:16:51 -05:00
end
2013-05-08 13:33:58 -04:00
end
2013-02-05 14:16:51 -05:00
2013-05-08 13:33:58 -04:00
context 'failure' do
let ( :p2 ) { Fabricate ( :post , user : user ) }
before do
Topic . any_instance . expects ( :move_posts ) . with ( user , [ p2 . id ] , title : 'blah' ) . returns ( nil )
xhr :post , :move_posts , topic_id : topic . id , title : 'blah' , post_ids : [ p2 . id ]
2013-02-05 14:16:51 -05:00
end
2013-05-08 13:33:58 -04:00
it " returns JSON with a false success " do
response . should be_success
result = :: JSON . parse ( response . body )
2014-09-25 17:44:48 +02:00
result [ 'success' ] . should == false
2013-05-08 13:33:58 -04:00
result [ 'url' ] . should be_blank
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
2013-05-08 13:33:58 -04:00
end
2013-02-05 14:16:51 -05:00
2013-09-04 11:53:00 -04:00
describe " moving replied posts " do
let! ( :user ) { log_in ( :moderator ) }
let! ( :p1 ) { Fabricate ( :post , user : user ) }
let! ( :topic ) { p1 . topic }
let! ( :p2 ) { Fabricate ( :post , topic : topic , user : user , reply_to_post_number : p1 . post_number ) }
context 'success' do
before do
PostReply . create ( post_id : p1 . id , reply_id : p2 . id )
end
it " moves the child posts too " do
Topic . any_instance . expects ( :move_posts ) . with ( user , [ p1 . id , p2 . id ] , title : 'blah' ) . returns ( topic )
xhr :post , :move_posts , topic_id : topic . id , title : 'blah' , post_ids : [ p1 . id ] , reply_post_ids : [ p1 . id ]
end
end
end
2013-05-08 13:33:58 -04:00
describe 'moving to an existing topic' do
let! ( :user ) { log_in ( :moderator ) }
let ( :p1 ) { Fabricate ( :post , user : user ) }
let ( :topic ) { p1 . topic }
let ( :dest_topic ) { Fabricate ( :topic ) }
context 'success' do
2013-02-05 14:16:51 -05:00
let ( :p2 ) { Fabricate ( :post , user : user ) }
before do
2013-05-08 13:33:58 -04:00
Topic . any_instance . expects ( :move_posts ) . with ( user , [ p2 . id ] , destination_topic_id : dest_topic . id ) . returns ( topic )
xhr :post , :move_posts , topic_id : topic . id , post_ids : [ p2 . id ] , destination_topic_id : dest_topic . id
2013-02-05 14:16:51 -05:00
end
it " returns success " do
response . should be_success
2013-05-08 13:33:58 -04:00
result = :: JSON . parse ( response . body )
2014-09-25 17:44:48 +02:00
result [ 'success' ] . should == true
2013-05-08 13:33:58 -04:00
result [ 'url' ] . should be_present
2013-02-05 14:16:51 -05:00
end
2013-05-08 13:33:58 -04:00
end
2013-02-05 14:16:51 -05:00
2013-05-08 13:33:58 -04:00
context 'failure' do
let ( :p2 ) { Fabricate ( :post , user : user ) }
2013-02-05 14:16:51 -05:00
2013-05-08 13:33:58 -04:00
before do
Topic . any_instance . expects ( :move_posts ) . with ( user , [ p2 . id ] , destination_topic_id : dest_topic . id ) . returns ( nil )
xhr :post , :move_posts , topic_id : topic . id , destination_topic_id : dest_topic . id , post_ids : [ p2 . id ]
2013-02-05 14:16:51 -05:00
end
2013-05-08 13:33:58 -04:00
it " returns JSON with a false success " do
response . should be_success
result = :: JSON . parse ( response . body )
2014-09-25 17:44:48 +02:00
result [ 'success' ] . should == false
2013-05-08 13:33:58 -04:00
result [ 'url' ] . should be_blank
end
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
2013-03-14 14:45:29 -04:00
end
2013-05-16 15:55:14 -04:00
context " merge_topic " do
it 'needs you to be logged in' do
lambda { xhr :post , :merge_topic , topic_id : 111 , destination_topic_id : 345 } . should raise_error ( Discourse :: NotLoggedIn )
end
describe 'moving to a new topic' do
let! ( :user ) { log_in ( :moderator ) }
let ( :p1 ) { Fabricate ( :post , user : user ) }
let ( :topic ) { p1 . topic }
it " raises an error without destination_topic_id " do
2013-06-06 14:41:27 -04:00
lambda { xhr :post , :merge_topic , topic_id : topic . id } . should raise_error ( ActionController :: ParameterMissing )
2013-05-16 15:55:14 -04:00
end
it " raises an error when the user doesn't have permission to merge " do
Guardian . any_instance . expects ( :can_move_posts? ) . returns ( false )
xhr :post , :merge_topic , topic_id : 111 , destination_topic_id : 345
response . should be_forbidden
end
let ( :dest_topic ) { Fabricate ( :topic ) }
context 'moves all the posts to the destination topic' do
let ( :p2 ) { Fabricate ( :post , user : user ) }
before do
Topic . any_instance . expects ( :move_posts ) . with ( user , [ p1 . id ] , destination_topic_id : dest_topic . id ) . returns ( topic )
xhr :post , :merge_topic , topic_id : topic . id , destination_topic_id : dest_topic . id
end
it " returns success " do
response . should be_success
result = :: JSON . parse ( response . body )
2014-09-25 17:44:48 +02:00
result [ 'success' ] . should == true
2013-05-16 15:55:14 -04:00
result [ 'url' ] . should be_present
end
end
end
end
2014-03-27 18:28:14 -07:00
context 'change_post_owners' do
it 'needs you to be logged in' do
lambda { xhr :post , :change_post_owners , topic_id : 111 , username : 'user_a' , post_ids : [ 1 , 2 , 3 ] } . should raise_error ( Discourse :: NotLoggedIn )
end
describe 'forbidden to moderators' do
let! ( :moderator ) { log_in ( :moderator ) }
it 'correctly denies' do
xhr :post , :change_post_owners , topic_id : 111 , username : 'user_a' , post_ids : [ 1 , 2 , 3 ]
response . should be_forbidden
end
end
2014-09-05 16:52:40 +10:00
describe 'forbidden to trust_level_4s' do
let! ( :trust_level_4 ) { log_in ( :trust_level_4 ) }
2014-03-27 18:28:14 -07:00
it 'correctly denies' do
xhr :post , :change_post_owners , topic_id : 111 , username : 'user_a' , post_ids : [ 1 , 2 , 3 ]
response . should be_forbidden
end
end
describe 'changing ownership' do
let! ( :editor ) { log_in ( :admin ) }
let ( :topic ) { Fabricate ( :topic ) }
let ( :user_a ) { Fabricate ( :user ) }
let ( :p1 ) { Fabricate ( :post , topic_id : topic . id ) }
it " raises an error with a parameter missing " do
lambda { xhr :post , :change_post_owners , topic_id : 111 , post_ids : [ 1 , 2 , 3 ] } . should raise_error ( ActionController :: ParameterMissing )
lambda { xhr :post , :change_post_owners , topic_id : 111 , username : 'user_a' } . should raise_error ( ActionController :: ParameterMissing )
end
it " calls PostRevisor " do
PostRevisor . any_instance . expects ( :revise! )
xhr :post , :change_post_owners , topic_id : topic . id , username : user_a . username_lower , post_ids : [ p1 . id ]
response . should be_success
end
it " changes the user " do
old_user = p1 . user
xhr :post , :change_post_owners , topic_id : topic . id , username : user_a . username_lower , post_ids : [ p1 . id ]
p1 . reload
old_user . should_not == p1 . user
end
# Make sure that p1.reload isn't changing the user for us
it " is not an artifact of the framework " do
old_user = p1 . user
# xhr :post, :change_post_owners, topic_id: topic.id, username: user_a.username_lower, post_ids: [p1.id]
p1 . reload
p1 . user . should_not == nil
old_user . should == p1 . user
end
let ( :p2 ) { Fabricate ( :post , topic_id : topic . id ) }
it " changes multiple posts " do
xhr :post , :change_post_owners , topic_id : topic . id , username : user_a . username_lower , post_ids : [ p1 . id , p2 . id ]
p1 . reload
p2 . reload
p1 . user . should_not == nil
p1 . user . should == p2 . user
end
end
end
2013-03-14 14:45:29 -04:00
context 'similar_to' do
2013-02-05 14:16:51 -05:00
2013-03-14 14:45:29 -04:00
let ( :title ) { 'this title is long enough to search for' }
let ( :raw ) { 'this body is long enough to search for' }
it " requires a title " do
2013-06-06 00:14:32 -07:00
- > { xhr :get , :similar_to , raw : raw } . should raise_error ( ActionController :: ParameterMissing )
2013-03-14 14:45:29 -04:00
end
it " requires a raw body " do
2013-06-06 00:14:32 -07:00
- > { xhr :get , :similar_to , title : title } . should raise_error ( ActionController :: ParameterMissing )
2013-03-14 14:45:29 -04:00
end
it " raises an error if the title length is below the minimum " do
SiteSetting . stubs ( :min_title_similar_length ) . returns ( 100 )
- > { xhr :get , :similar_to , title : title , raw : raw } . should raise_error ( Discourse :: InvalidParameters )
end
it " raises an error if the body length is below the minimum " do
SiteSetting . stubs ( :min_body_similar_length ) . returns ( 100 )
- > { xhr :get , :similar_to , title : title , raw : raw } . should raise_error ( Discourse :: InvalidParameters )
end
2013-06-19 13:13:12 -04:00
describe " minimum_topics_similar " do
2013-02-05 14:16:51 -05:00
2013-06-19 13:13:12 -04:00
before do
SiteSetting . stubs ( :minimum_topics_similar ) . returns ( 30 )
end
2013-06-12 13:43:59 -04:00
2013-06-19 13:13:12 -04:00
after do
2013-06-12 13:43:59 -04:00
xhr :get , :similar_to , title : title , raw : raw
end
2013-06-19 13:13:12 -04:00
describe " With enough topics " do
before do
Topic . stubs ( :count ) . returns ( 50 )
end
it " deletes to Topic.similar_to if there are more topics than `minimum_topics_similar` " do
Topic . expects ( :similar_to ) . with ( title , raw , nil ) . returns ( [ Fabricate ( :topic ) ] )
end
describe " with a logged in user " do
let ( :user ) { log_in }
it " passes a user through if logged in " do
Topic . expects ( :similar_to ) . with ( title , raw , user ) . returns ( [ Fabricate ( :topic ) ] )
end
end
end
it " does not call Topic.similar_to if there are fewer topics than `minimum_topics_similar` " do
Topic . stubs ( :count ) . returns ( 10 )
Topic . expects ( :similar_to ) . never
end
2013-06-12 13:43:59 -04:00
end
2013-02-05 14:16:51 -05:00
end
2013-03-14 14:45:29 -04:00
2013-03-06 15:17:07 -05:00
context 'clear_pin' do
it 'needs you to be logged in' do
lambda { xhr :put , :clear_pin , topic_id : 1 } . should raise_error ( Discourse :: NotLoggedIn )
end
context 'when logged in' do
let ( :topic ) { Fabricate ( :topic ) }
let! ( :user ) { log_in }
it " fails when the user can't see the topic " do
Guardian . any_instance . expects ( :can_see? ) . with ( topic ) . returns ( false )
xhr :put , :clear_pin , topic_id : topic . id
response . should_not be_success
end
describe 'when the user can see the topic' do
it " calls clear_pin_for if the user can see the topic " do
Topic . any_instance . expects ( :clear_pin_for ) . with ( user ) . once
xhr :put , :clear_pin , topic_id : topic . id
end
it " succeeds " do
xhr :put , :clear_pin , topic_id : topic . id
response . should be_success
end
end
end
end
2013-02-05 14:16:51 -05:00
context 'status' do
it 'needs you to be logged in' do
lambda { xhr :put , :status , topic_id : 1 , status : 'visible' , enabled : true } . should raise_error ( Discourse :: NotLoggedIn )
end
describe 'when logged in' do
before do
@user = log_in ( :moderator )
@topic = Fabricate ( :topic , user : @user )
end
it " raises an exception if you can't change it " do
Guardian . any_instance . expects ( :can_moderate? ) . with ( @topic ) . returns ( false )
xhr :put , :status , topic_id : @topic . id , status : 'visible' , enabled : 'true'
response . should be_forbidden
end
it 'requires the status parameter' do
2013-06-06 14:41:27 -04:00
lambda { xhr :put , :status , topic_id : @topic . id , enabled : true } . should raise_error ( ActionController :: ParameterMissing )
2013-02-05 14:16:51 -05:00
end
it 'requires the enabled parameter' do
2013-06-06 14:41:27 -04:00
lambda { xhr :put , :status , topic_id : @topic . id , status : 'visible' } . should raise_error ( ActionController :: ParameterMissing )
2013-02-05 14:16:51 -05:00
end
it 'raises an error with a status not in the whitelist' do
lambda { xhr :put , :status , topic_id : @topic . id , status : 'title' , enabled : 'true' } . should raise_error ( Discourse :: InvalidParameters )
end
it 'calls update_status on the forum topic with false' do
Topic . any_instance . expects ( :update_status ) . with ( 'closed' , false , @user )
xhr :put , :status , topic_id : @topic . id , status : 'closed' , enabled : 'false'
end
it 'calls update_status on the forum topic with true' do
Topic . any_instance . expects ( :update_status ) . with ( 'closed' , true , @user )
xhr :put , :status , topic_id : @topic . id , status : 'closed' , enabled : 'true'
end
end
end
context 'delete_timings' do
it 'needs you to be logged in' do
lambda { xhr :delete , :destroy_timings , topic_id : 1 } . should raise_error ( Discourse :: NotLoggedIn )
end
context 'when logged in' do
before do
@user = log_in
@topic = Fabricate ( :topic , user : @user )
@topic_user = TopicUser . get ( @topic , @topic . user )
end
it 'deletes the forum topic user record' do
2014-02-21 13:03:50 -05:00
PostTiming . expects ( :destroy_for ) . with ( @user . id , [ @topic . id ] )
2013-02-25 19:42:20 +03:00
xhr :delete , :destroy_timings , topic_id : @topic . id
2013-02-05 14:16:51 -05:00
end
end
end
2013-02-25 19:42:20 +03:00
describe 'mute/unmute' do
2013-02-05 14:16:51 -05:00
it 'needs you to be logged in' do
lambda { xhr :put , :mute , topic_id : 99 } . should raise_error ( Discourse :: NotLoggedIn )
end
it 'needs you to be logged in' do
lambda { xhr :put , :unmute , topic_id : 99 } . should raise_error ( Discourse :: NotLoggedIn )
end
2013-02-25 19:42:20 +03:00
describe 'when logged in' do
2013-02-05 14:16:51 -05:00
before do
@topic = Fabricate ( :topic , user : log_in )
end
it " changes the user's starred flag when the parameter is present " do
2013-05-23 23:06:38 -07:00
Topic . any_instance . expects ( :toggle_mute ) . with ( @topic . user )
2013-02-05 14:16:51 -05:00
xhr :put , :mute , topic_id : @topic . id , starred : 'true'
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
it " removes the user's starred flag when the parameter is not true " do
2013-05-23 23:06:38 -07:00
Topic . any_instance . expects ( :toggle_mute ) . with ( @topic . user )
2013-02-05 14:16:51 -05:00
xhr :put , :unmute , topic_id : @topic . id , starred : 'false'
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
end
describe 'star' do
it 'needs you to be logged in' do
lambda { xhr :put , :star , topic_id : 1 , starred : true } . should raise_error ( Discourse :: NotLoggedIn )
end
describe 'when logged in' do
before do
@topic = Fabricate ( :topic , user : log_in )
end
it " ensures the user can see the topic " do
Guardian . any_instance . expects ( :can_see? ) . with ( @topic ) . returns ( false )
2013-02-25 19:42:20 +03:00
xhr :put , :star , topic_id : @topic . id , starred : 'true'
2013-02-05 14:16:51 -05:00
response . should be_forbidden
end
it " changes the user's starred flag when the parameter is present " do
Topic . any_instance . expects ( :toggle_star ) . with ( @topic . user , true )
xhr :put , :star , topic_id : @topic . id , starred : 'true'
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
it " removes the user's starred flag when the parameter is not true " do
Topic . any_instance . expects ( :toggle_star ) . with ( @topic . user , false )
xhr :put , :star , topic_id : @topic . id , starred : 'false'
2013-02-25 19:42:20 +03:00
end
end
2013-02-05 14:16:51 -05:00
end
2013-07-12 12:08:23 -04:00
describe 'recover' do
it " won't allow us to recover a topic when we're not logged in " do
lambda { xhr :put , :recover , topic_id : 1 } . should raise_error ( Discourse :: NotLoggedIn )
end
describe 'when logged in' do
let ( :topic ) { Fabricate ( :topic , user : log_in , deleted_at : Time . now , deleted_by : log_in ) }
describe 'without access' do
it " raises an exception when the user doesn't have permission to delete the topic " do
Guardian . any_instance . expects ( :can_recover_topic? ) . with ( topic ) . returns ( false )
xhr :put , :recover , topic_id : topic . id
response . should be_forbidden
end
end
context 'with permission' do
before do
Guardian . any_instance . expects ( :can_recover_topic? ) . with ( topic ) . returns ( true )
end
it 'succeeds' do
2014-08-07 19:12:35 +02:00
PostDestroyer . any_instance . expects ( :recover )
2013-07-12 12:08:23 -04:00
xhr :put , :recover , topic_id : topic . id
response . should be_success
end
end
end
end
2013-02-05 14:16:51 -05:00
describe 'delete' do
it " won't allow us to delete a topic when we're not logged in " do
lambda { xhr :delete , :destroy , id : 1 } . should raise_error ( Discourse :: NotLoggedIn )
end
describe 'when logged in' do
2014-08-07 19:12:35 +02:00
let ( :topic ) { Fabricate ( :topic , user : log_in ) }
2013-02-05 14:16:51 -05:00
describe 'without access' do
it " raises an exception when the user doesn't have permission to delete the topic " do
2014-08-07 19:12:35 +02:00
Guardian . any_instance . expects ( :can_delete? ) . with ( topic ) . returns ( false )
xhr :delete , :destroy , id : topic . id
2013-02-05 14:16:51 -05:00
response . should be_forbidden
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
describe 'with permission' do
before do
2014-08-07 19:12:35 +02:00
Guardian . any_instance . expects ( :can_delete? ) . with ( topic ) . returns ( true )
2013-02-05 14:16:51 -05:00
end
it 'succeeds' do
2014-08-07 19:12:35 +02:00
PostDestroyer . any_instance . expects ( :destroy )
xhr :delete , :destroy , id : topic . id
2013-02-05 14:16:51 -05:00
response . should be_success
end
end
end
end
2014-09-17 11:18:41 -04:00
describe 'id_for_slug' do
let ( :topic ) { Fabricate ( :post ) . topic }
it " returns JSON for the slug " do
xhr :get , :id_for_slug , slug : topic . slug
response . should be_success
json = :: JSON . parse ( response . body )
json . should be_present
json [ 'topic_id' ] . should == topic . id
json [ 'url' ] . should == topic . url
json [ 'slug' ] . should == topic . slug
end
it " returns invalid access if the user can't see the topic " do
Guardian . any_instance . expects ( :can_see? ) . with ( topic ) . returns ( false )
xhr :get , :id_for_slug , slug : topic . slug
response . should_not be_success
end
end
2013-02-25 19:42:20 +03:00
describe 'show' do
2013-02-05 14:16:51 -05:00
let ( :topic ) { Fabricate ( :post ) . topic }
let! ( :p1 ) { Fabricate ( :post , user : topic . user ) }
let! ( :p2 ) { Fabricate ( :post , user : topic . user ) }
it 'shows a topic correctly' do
2013-05-29 18:01:25 -04:00
xhr :get , :show , topic_id : topic . id , slug : topic . slug
2013-02-05 14:16:51 -05:00
response . should be_success
end
2014-09-22 17:08:11 +10:00
it 'return 404 for an invalid page' do
xhr :get , :show , topic_id : topic . id , slug : topic . slug , page : 2
response . code . should == " 404 "
end
2013-06-06 14:41:27 -04:00
it 'can find a topic given a slug in the id param' do
xhr :get , :show , id : topic . slug
expect ( response ) . to redirect_to ( topic . relative_url )
end
2014-08-13 22:12:44 +02:00
it 'keeps the post_number parameter around when redirecting' do
xhr :get , :show , id : topic . slug , post_number : 42
expect ( response ) . to redirect_to ( topic . relative_url + " /42 " )
end
2013-06-06 14:41:27 -04:00
it 'returns 404 when an invalid slug is given and no id' do
xhr :get , :show , id : 'nope-nope'
expect ( response . status ) . to eq ( 404 )
end
2013-06-07 14:17:12 -04:00
it 'returns a 404 when slug and topic id do not match a topic' do
xhr :get , :show , topic_id : 123123 , slug : 'topic-that-is-made-up'
expect ( response . status ) . to eq ( 404 )
end
context 'a topic with nil slug exists' do
before do
@nil_slug_topic = Fabricate ( :topic )
Topic . connection . execute ( " update topics set slug=null where id = #{ @nil_slug_topic . id } " ) # can't find a way to set slug column to null using the model
end
it 'returns a 404 when slug and topic id do not match a topic' do
xhr :get , :show , topic_id : 123123 , slug : 'topic-that-is-made-up'
expect ( response . status ) . to eq ( 404 )
end
end
2013-02-05 14:16:51 -05:00
it 'records a view' do
2014-08-04 19:07:55 +10:00
lambda { xhr :get , :show , topic_id : topic . id , slug : topic . slug } . should change ( TopicViewItem , :count ) . by ( 1 )
2013-02-05 14:16:51 -05:00
end
2014-08-04 11:06:06 +10:00
it 'records incoming links' do
user = Fabricate ( :user )
get :show , topic_id : topic . id , slug : topic . slug , u : user . username
IncomingLink . count . should == 1
end
it 'records redirects' do
@request . env [ 'HTTP_REFERER' ] = 'http://twitter.com'
get :show , { id : topic . id }
@request . env [ 'HTTP_REFERER' ] = nil
get :show , topic_id : topic . id , slug : topic . slug
link = IncomingLink . first
link . referer . should == 'http://twitter.com'
end
2013-02-25 19:42:20 +03:00
it 'tracks a visit for all html requests' do
2013-02-05 14:16:51 -05:00
current_user = log_in ( :coding_horror )
2013-10-04 17:00:23 +10:00
TopicUser . expects ( :track_visit! ) . with ( topic . id , current_user . id )
2013-05-29 18:01:25 -04:00
get :show , topic_id : topic . id , slug : topic . slug
2013-02-05 14:16:51 -05:00
end
context 'consider for a promotion' do
let! ( :user ) { log_in ( :coding_horror ) }
let ( :promotion ) do
result = mock
Promotion . stubs ( :new ) . with ( user ) . returns ( result )
result
end
it " reviews the user for a promotion if they're new " do
2014-09-05 15:20:39 +10:00
user . update_column ( :trust_level , TrustLevel [ 0 ] )
2013-02-10 13:50:26 -05:00
Promotion . any_instance . expects ( :review )
2013-05-29 18:01:25 -04:00
get :show , topic_id : topic . id , slug : topic . slug
2013-02-05 14:16:51 -05:00
end
end
context 'filters' do
2013-04-04 00:12:27 +02:00
it 'grabs first page when no filter is provided' do
2013-07-05 14:45:54 -04:00
TopicView . any_instance . expects ( :filter_posts_in_range ) . with ( 0 , 19 )
2013-05-29 18:01:25 -04:00
xhr :get , :show , topic_id : topic . id , slug : topic . slug
2013-02-05 14:16:51 -05:00
end
2013-04-04 00:12:27 +02:00
it 'grabs first page when first page is provided' do
2013-07-05 14:45:54 -04:00
TopicView . any_instance . expects ( :filter_posts_in_range ) . with ( 0 , 19 )
2013-05-29 18:01:25 -04:00
xhr :get , :show , topic_id : topic . id , slug : topic . slug , page : 1
2013-04-04 00:12:27 +02:00
end
it 'grabs correct range when a page number is provided' do
2013-07-05 14:45:54 -04:00
TopicView . any_instance . expects ( :filter_posts_in_range ) . with ( 20 , 39 )
2013-05-29 18:01:25 -04:00
xhr :get , :show , topic_id : topic . id , slug : topic . slug , page : 2
2013-04-04 00:12:27 +02:00
end
2013-02-05 14:16:51 -05:00
it 'delegates a post_number param to TopicView#filter_posts_near' do
TopicView . any_instance . expects ( :filter_posts_near ) . with ( p2 . post_number )
2013-05-29 18:01:25 -04:00
xhr :get , :show , topic_id : topic . id , slug : topic . slug , post_number : p2 . post_number
2013-02-05 14:16:51 -05:00
end
end
2013-06-04 15:32:36 -07:00
context " when 'login required' site setting has been enabled " do
2014-05-23 08:13:25 +10:00
before { SiteSetting . login_required = true }
2013-06-04 15:32:36 -07:00
context 'and the user is logged in' do
before { log_in ( :coding_horror ) }
it 'shows the topic' do
get :show , topic_id : topic . id , slug : topic . slug
expect ( response ) . to be_successful
end
end
context 'and the user is not logged in' do
2014-01-24 13:47:35 +01:00
let ( :api_key ) { topic . user . generate_api_key ( topic . user ) }
2013-06-04 15:32:36 -07:00
it 'redirects to the login page' do
get :show , topic_id : topic . id , slug : topic . slug
expect ( response ) . to redirect_to login_path
end
2014-01-24 13:47:35 +01:00
it 'shows the topic if valid api key is provided' do
get :show , topic_id : topic . id , slug : topic . slug , api_key : api_key . key
expect ( response ) . to be_successful
2014-06-12 11:29:29 +10:00
topic . reload
# free test, only costs a reload
topic . views . should == 1
2014-01-24 13:47:35 +01:00
end
2014-05-23 08:13:25 +10:00
it 'returns 403 for an invalid key' do
2014-01-24 13:47:35 +01:00
get :show , topic_id : topic . id , slug : topic . slug , api_key : " bad "
2014-05-23 08:13:25 +10:00
expect ( response . code . to_i ) . to be ( 403 )
2014-01-24 13:47:35 +01:00
end
2013-06-04 15:32:36 -07:00
end
end
2013-02-05 14:16:51 -05:00
end
2013-02-21 10:20:00 -08:00
describe '#feed' do
let ( :topic ) { Fabricate ( :post ) . topic }
it 'renders rss of the topic' do
get :feed , topic_id : topic . id , slug : 'foo' , format : :rss
response . should be_success
response . content_type . should == 'application/rss+xml'
end
end
2013-02-05 14:16:51 -05:00
describe 'update' do
it " won't allow us to update a topic when we're not logged in " do
lambda { xhr :put , :update , topic_id : 1 , slug : 'xyz' } . should raise_error ( Discourse :: NotLoggedIn )
end
describe 'when logged in' do
before do
@topic = Fabricate ( :topic , user : log_in )
2014-10-27 22:06:43 +01:00
Fabricate ( :post , topic : @topic )
2013-02-05 14:16:51 -05:00
end
describe 'without permission' do
it " raises an exception when the user doesn't have permission to update the topic " do
Guardian . any_instance . expects ( :can_edit? ) . with ( @topic ) . returns ( false )
xhr :put , :update , topic_id : @topic . id , slug : @topic . title
response . should be_forbidden
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
describe 'with permission' do
before do
Guardian . any_instance . expects ( :can_edit? ) . with ( @topic ) . returns ( true )
end
it 'succeeds' do
xhr :put , :update , topic_id : @topic . id , slug : @topic . title
response . should be_success
2013-04-10 11:00:50 +02:00
:: JSON . parse ( response . body ) [ 'basic_topic' ] . should be_present
2013-02-05 14:16:51 -05:00
end
it 'allows a change of title' do
2013-04-10 11:00:50 +02:00
xhr :put , :update , topic_id : @topic . id , slug : @topic . title , title : 'This is a new title for the topic'
2013-02-05 14:16:51 -05:00
@topic . reload
2013-04-10 11:00:50 +02:00
@topic . title . should == 'This is a new title for the topic'
2013-02-05 14:16:51 -05:00
end
it 'triggers a change of category' do
2014-07-16 15:39:39 -04:00
Topic . any_instance . expects ( :change_category_to_id ) . with ( 123 ) . returns ( true )
xhr :put , :update , topic_id : @topic . id , slug : @topic . title , category_id : 123
2013-02-05 14:16:51 -05:00
end
2013-05-31 15:22:34 -04:00
it " returns errors with invalid titles " do
xhr :put , :update , topic_id : @topic . id , slug : @topic . title , title : 'asdf'
expect ( response ) . not_to be_success
end
2014-10-07 16:46:01 -04:00
it " returns errors when the rate limit is exceeded " do
EditRateLimiter . any_instance . expects ( :performed! ) . raises ( RateLimiter :: LimitExceeded . new ( 60 ) )
xhr :put , :update , topic_id : @topic . id , slug : @topic . title , title : 'This is a new title for the topic'
response . should_not be_success
end
2013-10-08 14:40:31 -04:00
it " returns errors with invalid categories " do
2014-07-16 15:39:39 -04:00
Topic . any_instance . expects ( :change_category_to_id ) . returns ( false )
2014-10-27 22:06:43 +01:00
xhr :put , :update , topic_id : @topic . id , slug : @topic . title , category_id : - 1
2013-10-08 14:40:31 -04:00
expect ( response ) . not_to be_success
end
2014-12-02 02:16:30 +01:00
it " doesn't call the PostRevisor when there is no changes " do
PostRevisor . any_instance . expects ( :revise! ) . never
xhr :put , :update , topic_id : @topic . id , slug : @topic . title , title : @topic . title , category_id : @topic . category_id
expect ( response ) . to be_success
end
2013-10-08 14:40:31 -04:00
context " allow_uncategorized_topics is false " do
before do
SiteSetting . stubs ( :allow_uncategorized_topics ) . returns ( false )
end
it " can add a category to an uncategorized topic " do
2014-07-16 15:39:39 -04:00
Topic . any_instance . expects ( :change_category_to_id ) . with ( 456 ) . returns ( true )
xhr :put , :update , topic_id : @topic . id , slug : @topic . title , category_id : 456
2013-10-08 14:40:31 -04:00
response . should be_success
end
end
2013-02-05 14:16:51 -05:00
end
end
end
describe 'invite' do
2014-05-09 11:45:18 +10:00
describe " group invites " do
it " works correctly " do
group = Fabricate ( :group )
topic = Fabricate ( :topic )
admin = log_in ( :admin )
xhr :post , :invite , topic_id : topic . id , email : 'hiro@from.heros' , group_ids : " #{ group . id } "
response . should be_success
invite = Invite . find_by ( email : 'hiro@from.heros' )
groups = invite . groups . to_a
groups . count . should == 1
groups [ 0 ] . id . should == group . id
end
end
2013-02-05 14:16:51 -05:00
it " won't allow us to invite toa topic when we're not logged in " do
lambda { xhr :post , :invite , topic_id : 1 , email : 'jake@adventuretime.ooo' } . should raise_error ( Discourse :: NotLoggedIn )
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
describe 'when logged in' do
before do
@topic = Fabricate ( :topic , user : log_in )
end
it 'requires an email parameter' do
2013-06-06 14:41:27 -04:00
lambda { xhr :post , :invite , topic_id : @topic . id } . should raise_error ( ActionController :: ParameterMissing )
2013-02-05 14:16:51 -05:00
end
describe 'without permission' do
it " raises an exception when the user doesn't have permission to invite to the topic " do
xhr :post , :invite , topic_id : @topic . id , user : 'jake@adventuretime.ooo'
response . should be_forbidden
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
describe 'with permission' do
2014-05-09 11:45:18 +10:00
let! ( :admin ) do
log_in :admin
2013-02-05 14:16:51 -05:00
end
2014-05-09 11:45:18 +10:00
it 'should work as expected' do
xhr :post , :invite , topic_id : @topic . id , user : 'jake@adventuretime.ooo'
response . should be_success
:: JSON . parse ( response . body ) . should == { 'success' = > 'OK' }
Invite . where ( invited_by_id : admin . id ) . count . should == 1
2013-02-05 14:16:51 -05:00
end
2014-05-09 11:45:18 +10:00
it 'should fail on shoddy email' do
xhr :post , :invite , topic_id : @topic . id , user : 'i_am_not_an_email'
response . should_not be_success
:: JSON . parse ( response . body ) . should == { 'failed' = > 'FAILED' }
2013-02-05 14:16:51 -05:00
end
end
end
end
2013-05-07 14:25:41 -04:00
describe 'autoclose' do
it 'needs you to be logged in' do
2014-10-10 18:21:44 +02:00
- > {
xhr :put , :autoclose , topic_id : 99 , auto_close_time : '24' , auto_close_based_on_last_post : false
} . should raise_error ( Discourse :: NotLoggedIn )
2013-05-07 14:25:41 -04:00
end
it 'needs you to be an admin or mod' do
user = log_in
2014-10-10 18:21:44 +02:00
xhr :put , :autoclose , topic_id : 99 , auto_close_time : '24' , auto_close_based_on_last_post : false
2013-05-07 14:25:41 -04:00
response . should be_forbidden
end
describe 'when logged in' do
before do
@admin = log_in ( :admin )
@topic = Fabricate ( :topic , user : @admin )
end
2014-10-10 18:21:44 +02:00
it " can set a topic's auto close time and 'based on last post' property " do
2013-11-26 19:06:20 -05:00
Topic . any_instance . expects ( :set_auto_close ) . with ( " 24 " , @admin )
2014-10-10 18:21:44 +02:00
xhr :put , :autoclose , topic_id : @topic . id , auto_close_time : '24' , auto_close_based_on_last_post : true
2013-11-26 19:06:20 -05:00
json = :: JSON . parse ( response . body )
json . should have_key ( 'auto_close_at' )
2014-10-10 18:21:44 +02:00
json . should have_key ( 'auto_close_hours' )
2013-05-07 14:25:41 -04:00
end
it " can remove a topic's auto close time " do
2013-06-06 17:04:10 -04:00
Topic . any_instance . expects ( :set_auto_close ) . with ( nil , anything )
2014-10-10 18:21:44 +02:00
xhr :put , :autoclose , topic_id : @topic . id , auto_close_time : nil , auto_close_based_on_last_post : false
2013-05-07 14:25:41 -04:00
end
end
end
2014-06-16 18:28:07 +02:00
describe 'make_banner' do
it 'needs you to be a staff member' do
log_in
xhr :put , :make_banner , topic_id : 99
response . should be_forbidden
end
describe 'when logged in' do
it " changes the topic archetype to 'banner' " do
2014-06-16 19:21:21 +02:00
topic = Fabricate ( :topic , user : log_in ( :admin ) )
Topic . any_instance . expects ( :make_banner! )
xhr :put , :make_banner , topic_id : topic . id
2014-06-16 18:28:07 +02:00
response . should be_success
end
end
end
describe 'remove_banner' do
it 'needs you to be a staff member' do
log_in
xhr :put , :remove_banner , topic_id : 99
response . should be_forbidden
end
describe 'when logged in' do
it " resets the topic archetype " do
2014-06-16 19:21:21 +02:00
topic = Fabricate ( :topic , user : log_in ( :admin ) )
Topic . any_instance . expects ( :remove_banner! )
xhr :put , :remove_banner , topic_id : topic . id
2014-06-16 18:28:07 +02:00
response . should be_success
end
end
end
2014-01-30 11:15:49 -05:00
describe " bulk " do
it 'needs you to be logged in' do
lambda { xhr :put , :bulk } . should raise_error ( Discourse :: NotLoggedIn )
end
describe " when logged in " do
let! ( :user ) { log_in }
let ( :operation ) { { type : 'change_category' , category_id : '1' } }
let ( :topic_ids ) { [ 1 , 2 , 3 ] }
2014-02-21 14:17:45 -05:00
it " requires a list of topic_ids or filter " do
2014-01-30 11:15:49 -05:00
lambda { xhr :put , :bulk , operation : operation } . should raise_error ( ActionController :: ParameterMissing )
end
it " requires an operation param " do
lambda { xhr :put , :bulk , topic_ids : topic_ids } . should raise_error ( ActionController :: ParameterMissing )
end
it " requires a type field for the operation param " do
lambda { xhr :put , :bulk , topic_ids : topic_ids , operation : { } } . should raise_error ( ActionController :: ParameterMissing )
end
it " delegates work to `TopicsBulkAction` " do
topics_bulk_action = mock
TopicsBulkAction . expects ( :new ) . with ( user , topic_ids , operation ) . returns ( topics_bulk_action )
topics_bulk_action . expects ( :perform! )
xhr :put , :bulk , topic_ids : topic_ids , operation : operation
end
end
end
2014-03-03 15:46:38 -05:00
describe 'reset_new' do
it 'needs you to be logged in' do
lambda { xhr :put , :reset_new } . should raise_error ( Discourse :: NotLoggedIn )
end
let ( :user ) { log_in ( :user ) }
it " updates the `new_since` date " do
old_date = 2 . years . ago
user . user_stat . update_column ( :new_since , old_date )
xhr :put , :reset_new
user . reload
user . user_stat . new_since . to_date . should_not == old_date . to_date
end
end
2013-02-05 14:16:51 -05:00
end