2015-10-11 10:41:23 +01:00
require 'rails_helper'
2014-03-05 18:22:20 +05:30
describe UserBadgesController do
let ( :user ) { Fabricate ( :user ) }
let ( :badge ) { Fabricate ( :badge ) }
2014-07-23 11:42:24 +10:00
context 'index' do
2015-02-26 00:55:17 +00:00
it 'does not leak private info' do
2014-07-23 11:42:24 +10:00
badge = Fabricate ( :badge , target_posts : true , show_posts : false )
p = create_post
UserBadge . create ( badge : badge , user : user , post_id : p . id , granted_by_id : - 1 , granted_at : Time . now )
xhr :get , :index , badge_id : badge . id
2015-01-09 14:04:02 -03:00
expect ( response . status ) . to eq ( 200 )
2016-01-18 17:59:07 +11:00
2014-07-23 11:42:24 +10:00
parsed = JSON . parse ( response . body )
2015-01-09 14:04:02 -03:00
expect ( parsed [ " topics " ] ) . to eq ( nil )
2016-01-18 17:59:07 +11:00
expect ( parsed [ " badges " ] . length ) . to eq ( 1 )
expect ( parsed [ " user_badge_info " ] [ " user_badges " ] [ 0 ] [ " post_id " ] ) . to eq ( nil )
2014-07-23 11:42:24 +10:00
end
end
2014-03-05 18:22:20 +05:30
context 'index' do
2014-04-16 16:04:27 +05:30
let! ( :user_badge ) { UserBadge . create ( badge : badge , user : user , granted_by : Discourse . system_user , granted_at : Time . now ) }
2014-03-05 18:22:20 +05:30
2014-04-16 20:26:11 +05:30
it 'requires username or badge_id to be specified' do
2016-05-30 11:38:04 +08:00
expect { xhr :get , :index } . to raise_error ( ActionController :: ParameterMissing )
2014-03-05 18:22:20 +05:30
end
2014-04-16 20:26:11 +05:30
it 'returns user_badges for a user' do
2014-08-25 13:07:22 -07:00
xhr :get , :username , username : user . username
2014-03-05 18:22:20 +05:30
2015-01-09 14:04:02 -03:00
expect ( response . status ) . to eq ( 200 )
2014-03-05 18:22:20 +05:30
parsed = JSON . parse ( response . body )
2015-01-09 14:04:02 -03:00
expect ( parsed [ " user_badges " ] . length ) . to eq ( 1 )
2014-03-05 18:22:20 +05:30
end
2014-04-16 20:26:11 +05:30
it 'returns user_badges for a badge' do
xhr :get , :index , badge_id : badge . id
2015-01-09 14:04:02 -03:00
expect ( response . status ) . to eq ( 200 )
2014-04-16 20:26:11 +05:30
parsed = JSON . parse ( response . body )
2016-01-18 17:59:07 +11:00
expect ( parsed [ " user_badge_info " ] [ " user_badges " ] . length ) . to eq ( 1 )
2014-04-16 20:26:11 +05:30
end
2014-05-21 12:52:42 +05:30
it 'includes counts when passed the aggregate argument' do
2014-08-25 13:07:22 -07:00
xhr :get , :username , username : user . username , grouped : true
2014-05-21 12:52:42 +05:30
2015-01-09 14:04:02 -03:00
expect ( response . status ) . to eq ( 200 )
2014-05-21 12:52:42 +05:30
parsed = JSON . parse ( response . body )
2015-01-09 14:04:02 -03:00
expect ( parsed [ " user_badges " ] . first . has_key? ( 'count' ) ) . to eq ( true )
2014-05-21 12:52:42 +05:30
end
2014-03-05 18:22:20 +05:30
end
context 'create' do
it 'requires username to be specified' do
2016-05-30 11:38:04 +08:00
expect { xhr :post , :create , badge_id : badge . id } . to raise_error ( ActionController :: ParameterMissing )
2014-03-05 18:22:20 +05:30
end
it 'does not allow regular users to grant badges' do
log_in_user Fabricate ( :user )
xhr :post , :create , badge_id : badge . id , username : user . username
2015-01-09 14:04:02 -03:00
expect ( response . status ) . to eq ( 403 )
2014-03-05 18:22:20 +05:30
end
it 'grants badges from staff' do
admin = Fabricate ( :admin )
2015-02-26 01:24:21 +00:00
post = create_post
2014-03-05 18:22:20 +05:30
log_in_user admin
2015-02-26 01:24:21 +00:00
2014-03-20 01:00:12 +05:30
StaffActionLogger . any_instance . expects ( :log_badge_grant ) . once
2015-02-26 01:24:21 +00:00
xhr :post , :create , badge_id : badge . id ,
username : user . username ,
reason : Discourse . base_url + post . url
2015-01-09 14:04:02 -03:00
expect ( response . status ) . to eq ( 200 )
2015-02-26 01:24:21 +00:00
2014-05-06 14:41:59 +01:00
user_badge = UserBadge . find_by ( user : user , badge : badge )
2015-02-26 01:24:21 +00:00
2015-01-09 14:04:02 -03:00
expect ( user_badge ) . to be_present
expect ( user_badge . granted_by ) . to eq ( admin )
2015-02-26 01:24:21 +00:00
expect ( user_badge . post_id ) . to eq ( post . id )
2014-03-05 18:22:20 +05:30
end
it 'does not grant badges from regular api calls' do
Fabricate ( :api_key , user : user )
xhr :post , :create , badge_id : badge . id , username : user . username , api_key : user . api_key . key
2015-01-09 14:04:02 -03:00
expect ( response . status ) . to eq ( 403 )
2014-03-05 18:22:20 +05:30
end
it 'grants badges from master api calls' do
api_key = Fabricate ( :api_key )
2014-03-20 01:00:12 +05:30
StaffActionLogger . any_instance . expects ( :log_badge_grant ) . never
2014-05-23 08:13:25 +10:00
xhr :post , :create , badge_id : badge . id , username : user . username , api_key : api_key . key , api_username : " system "
2015-01-09 14:04:02 -03:00
expect ( response . status ) . to eq ( 200 )
2014-05-06 14:41:59 +01:00
user_badge = UserBadge . find_by ( user : user , badge : badge )
2015-01-09 14:04:02 -03:00
expect ( user_badge ) . to be_present
expect ( user_badge . granted_by ) . to eq ( Discourse . system_user )
2014-03-05 18:22:20 +05:30
end
2015-02-26 00:55:17 +00:00
it 'will trigger :user_badge_granted' do
log_in :admin
DiscourseEvent . expects ( :trigger ) . with ( :user_badge_granted , anything , anything ) . once
xhr :post , :create , badge_id : badge . id , username : user . username
end
2014-03-05 18:22:20 +05:30
end
context 'destroy' do
2014-04-16 16:04:27 +05:30
let! ( :user_badge ) { UserBadge . create ( badge : badge , user : user , granted_by : Discourse . system_user , granted_at : Time . now ) }
2014-03-05 18:22:20 +05:30
it 'checks that the user is authorized to revoke a badge' do
2014-04-16 16:04:27 +05:30
xhr :delete , :destroy , id : user_badge . id
2015-01-09 14:04:02 -03:00
expect ( response . status ) . to eq ( 403 )
2014-03-05 18:22:20 +05:30
end
it 'revokes the badge' do
log_in :admin
2014-03-20 01:00:12 +05:30
StaffActionLogger . any_instance . expects ( :log_badge_revoke ) . once
2014-04-16 16:04:27 +05:30
xhr :delete , :destroy , id : user_badge . id
2015-01-09 14:04:02 -03:00
expect ( response . status ) . to eq ( 200 )
expect ( UserBadge . find_by ( id : user_badge . id ) ) . to eq ( nil )
2014-03-05 18:22:20 +05:30
end
2015-02-26 00:55:17 +00:00
it 'will trigger :user_badge_removed' do
log_in :admin
DiscourseEvent . expects ( :trigger ) . with ( :user_badge_removed , anything , anything ) . once
xhr :delete , :destroy , id : user_badge . id
end
2014-03-05 18:22:20 +05:30
end
end