2015-10-11 10:41:23 +01:00
require 'rails_helper'
2013-03-25 18:04:28 -07:00
2013-11-11 10:50:48 +11:00
describe TopicsController do
before do
TopicUser . stubs ( :track_visit! )
end
let :topic do
Fabricate ( :post ) . topic
end
def set_referer ( ref )
request . env [ 'HTTP_REFERER' ] = ref
end
it " doesn't store an incoming link when there's no referer " do
2015-01-09 14:04:02 -03:00
expect {
2013-11-11 10:50:48 +11:00
get :show , id : topic . id
2015-01-09 14:04:02 -03:00
} . not_to change ( IncomingLink , :count )
2013-11-11 10:50:48 +11:00
end
it " doesn't raise an error on a very long link " do
set_referer ( " http:// #{ 'a' * 2000 } .com " )
2015-01-09 14:04:02 -03:00
expect { get :show , { id : topic . id } } . not_to raise_error
2013-11-11 10:50:48 +11:00
end
2014-02-20 17:02:26 -05:00
describe " has_escaped_fragment? " do
render_views
context " when the SiteSetting is disabled " do
before do
SiteSetting . stubs ( :enable_escaped_fragments? ) . returns ( false )
end
it " uses the application layout even with an escaped fragment param " do
2014-07-29 16:35:15 +10:00
get :show , { 'topic_id' = > topic . id , 'slug' = > topic . slug , '_escaped_fragment_' = > 'true' }
2015-01-09 14:04:02 -03:00
expect ( response ) . to render_template ( layout : 'application' )
2014-02-20 17:02:26 -05:00
assert_select " meta[name=fragment] " , false , " it doesn't have the meta tag "
end
end
context " when the SiteSetting is enabled " do
before do
SiteSetting . stubs ( :enable_escaped_fragments? ) . returns ( true )
end
it " uses the application layout when there's no param " do
2014-07-29 16:35:15 +10:00
get :show , topic_id : topic . id , slug : topic . slug
2015-01-09 14:04:02 -03:00
expect ( response ) . to render_template ( layout : 'application' )
2014-02-20 17:02:26 -05:00
assert_select " meta[name=fragment] " , true , " it has the meta tag "
end
it " uses the crawler layout when there's an _escaped_fragment_ param " do
2014-07-29 16:35:15 +10:00
get :show , topic_id : topic . id , slug : topic . slug , _escaped_fragment_ : 'true'
2015-01-09 14:04:02 -03:00
expect ( response ) . to render_template ( layout : 'crawler' )
2014-02-20 17:02:26 -05:00
assert_select " meta[name=fragment] " , false , " it doesn't have the meta tag "
end
end
end
describe " crawler " do
render_views
context " when not a crawler " do
before do
CrawlerDetection . expects ( :crawler? ) . returns ( false )
end
it " renders with the application layout " do
2014-07-29 16:35:15 +10:00
get :show , topic_id : topic . id , slug : topic . slug
2015-01-09 14:04:02 -03:00
expect ( response ) . to render_template ( layout : 'application' )
2014-02-20 17:02:26 -05:00
assert_select " meta[name=fragment] " , true , " it has the meta tag "
end
end
context " when a crawler " do
before do
CrawlerDetection . expects ( :crawler? ) . returns ( true )
end
it " renders with the crawler layout " do
2014-07-29 16:35:15 +10:00
get :show , topic_id : topic . id , slug : topic . slug
2015-01-09 14:04:02 -03:00
expect ( response ) . to render_template ( layout : 'crawler' )
2014-02-20 17:02:26 -05:00
assert_select " meta[name=fragment] " , false , " it doesn't have the meta tag "
end
end
end
2016-02-15 19:29:35 +11:00
describe 'clear_notifications' do
it 'correctly clears notifications if specified via cookie' do
notification = Fabricate ( :notification )
log_in_user ( notification . user )
request . cookies [ 'cn' ] = " 2828,100, #{ notification . id } "
get :show , { topic_id : 100 }
expect ( response . cookies [ 'cn' ] ) . to eq nil
notification . reload
expect ( notification . read ) . to eq true
end
it 'correctly clears notifications if specified via header' do
notification = Fabricate ( :notification )
log_in_user ( notification . user )
request . headers [ 'Discourse-Clear-Notifications' ] = " 2828,100, #{ notification . id } "
get :show , { topic_id : 100 }
notification . reload
expect ( notification . read ) . to eq true
end
end
2014-02-07 22:24:10 -05:00
describe 'set_locale' do
it 'sets the one the user prefers' do
SiteSetting . stubs ( :allow_user_locale ) . returns ( true )
user = Fabricate ( :user , locale : :fr )
log_in_user ( user )
get :show , { topic_id : topic . id }
2015-01-09 14:04:02 -03:00
expect ( I18n . locale ) . to eq ( :fr )
2014-02-07 22:24:10 -05:00
end
2014-02-08 20:35:46 -05:00
it 'is sets the default locale when the setting not enabled' do
user = Fabricate ( :user , locale : :fr )
log_in_user ( user )
get :show , { topic_id : topic . id }
2015-01-09 14:04:02 -03:00
expect ( I18n . locale ) . to eq ( :en )
2014-02-08 20:35:46 -05:00
end
2014-02-07 22:24:10 -05:00
end
2015-04-24 14:32:18 -04:00
describe " read only header " do
it " returns no read only header by default " do
get :show , { topic_id : topic . id }
expect ( response . headers [ 'Discourse-Readonly' ] ) . to eq ( nil )
end
it " returns a readonly header if the site is read only " do
2015-04-29 11:49:58 -04:00
Discourse . received_readonly!
2015-04-24 14:32:18 -04:00
get :show , { topic_id : topic . id }
expect ( response . headers [ 'Discourse-Readonly' ] ) . to eq ( 'true' )
end
end
2013-11-11 10:50:48 +11:00
end
2013-04-30 02:34:19 +02:00
describe 'api' do
2014-05-23 08:42:58 +10:00
before do
ActionController :: Base . allow_forgery_protection = true
end
after do
ActionController :: Base . allow_forgery_protection = false
end
2013-03-25 18:04:28 -07:00
describe PostsController do
let ( :user ) do
Fabricate ( :user )
end
2013-04-30 02:34:19 +02:00
let ( :post ) do
2013-03-25 18:04:28 -07:00
Fabricate ( :post )
end
2013-04-30 02:34:19 +02:00
2013-10-22 15:53:08 -04:00
let ( :api_key ) { user . generate_api_key ( user ) }
let ( :master_key ) { ApiKey . create_master_key }
2013-03-25 18:04:28 -07:00
# choosing an arbitrarily easy to mock trusted activity
it 'allows users with api key to bookmark posts' do
2013-04-30 02:34:19 +02:00
PostAction . expects ( :act ) . with ( user , post , PostActionType . types [ :bookmark ] ) . once
2013-10-22 15:53:08 -04:00
put :bookmark , bookmarked : " true " , post_id : post . id , api_key : api_key . key , format : :json
2015-01-09 14:04:02 -03:00
expect ( response ) . to be_success
2013-10-23 11:05:49 -04:00
end
it 'raises an error with a user key that does not match an optionally specified username' do
PostAction . expects ( :act ) . with ( user , post , PostActionType . types [ :bookmark ] ) . never
put :bookmark , bookmarked : " true " , post_id : post . id , api_key : api_key . key , api_username : 'made_up' , format : :json
2015-01-09 14:04:02 -03:00
expect ( response ) . not_to be_success
2013-10-22 15:53:08 -04:00
end
it 'allows users with a master api key to bookmark posts' do
PostAction . expects ( :act ) . with ( user , post , PostActionType . types [ :bookmark ] ) . once
put :bookmark , bookmarked : " true " , post_id : post . id , api_key : master_key . key , api_username : user . username , format : :json
2015-01-09 14:04:02 -03:00
expect ( response ) . to be_success
2013-03-25 18:04:28 -07:00
end
it 'disallows phonies to bookmark posts' do
2013-04-30 02:34:19 +02:00
PostAction . expects ( :act ) . with ( user , post , PostActionType . types [ :bookmark ] ) . never
2014-05-23 08:13:25 +10:00
put :bookmark , bookmarked : " true " , post_id : post . id , api_key : SecureRandom . hex ( 32 ) , api_username : user . username , format : :json
2015-01-09 14:04:02 -03:00
expect ( response . code . to_i ) . to eq ( 403 )
2013-03-25 18:04:28 -07:00
end
2013-04-30 02:34:19 +02:00
2013-03-25 18:04:28 -07:00
it 'disallows blank api' do
2013-04-30 02:34:19 +02:00
PostAction . expects ( :act ) . with ( user , post , PostActionType . types [ :bookmark ] ) . never
2014-05-23 08:13:25 +10:00
put :bookmark , bookmarked : " true " , post_id : post . id , api_key : " " , api_username : user . username , format : :json
2015-01-09 14:04:02 -03:00
expect ( response . code . to_i ) . to eq ( 403 )
2013-03-25 18:04:28 -07:00
end
end
end