@ -4,95 +4,134 @@ describe WellKnown::WebfingerController, type: :controller do
render_views
describe 'GET #show' do
let ( :alice ) do
Fabricate ( :account , username : 'alice' )
let ( :alternate_domains ) { [ ] }
let ( :alice ) { Fabricate ( :account , username : 'alice' ) }
let ( :resource ) { nil }
around ( :each ) do | example |
tmp = Rails . configuration . x . alternate_domains
Rails . configuration . x . alternate_domains = alternate_domains
example . run
Rails . configuration . x . alternate_domains = tmp
end
before do
alice . private_key = << - PEM
- - - - - BEGIN RSA PRIVATE KEY - - - - -
MIICXQIBAAKBgQDHgPoPJlrfMZrVcuF39UbVssa8r4ObLP3dYl9Y17Mgp5K4mSYD
R / Y2ag58tSi6ar2zM3Ze3QYsNfTq0NqN1g89eAu0MbSjWqpOsgntRPJiFuj3hai2
X2Im8TBrkiM / UyfTRgn8q8WvMoKbXk8Lu6nqv420eyqhhLxfUoCpxuem1QIDAQAB
AoGBAIKsOh2eM7spVI8mdgQKheEG / iEsnPkQ2R8ehfE9JzjmSbXbqghQJDaz9NU +
G3Uu4R31QT0VbCudE9SSA / UPFl82GeQG4QLjrSE + PSjSkuslgSXelJHfAJ + ycGax
ajtPyiQD0e4c2loagHNHPjqK9OhHx9mFnZWmoagjlZ + mQGEpAkEA8GtqfS65IaRQ
uVhMzpp25rF1RWOwaaa + vBPkd7pGdJEQGFWkaR / a9UkU + 2 C4ZxGBkJDP9FApKVQI
RANEwN3 / hwJBANRuw5 + es6BgBv4PD387IJvuruW2oUtYP + Lb2Z5k77J13hZTr0db
Oo9j1UbbR0 / 4 g + vAcsDl4JD9c / 9 LrGYEpcMCQBon9Yvs + 2 M3lziy7JhFoc3zXIjS
Ea1M4M9hcqe78lJYPeIH3z04o / + vlcLLgQRlmSz7NESmO / QtGkEcAezhuh0CQHji
pzO4LeO / gXslut3eGcpiYuiZquOjToecMBRwv + 5 AIKd367Che4uJdh6iPcyGURvh
IewfZFFdyZqnx20ui90CQQC1W2rK5Y30wAunOtSLVA30TLK / tKrTppMC3corjKlB
FTX8IvYBNTbpEttc1VCf / 0 ccnNpfb0CrFNSPWxRj7t7D
- - - - - END RSA PRIVATE KEY - - - - -
PEM
alice . public_key = << - PEM
- - - - - BEGIN PUBLIC KEY - - - - -
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHgPoPJlrfMZrVcuF39UbVssa8
r4ObLP3dYl9Y17Mgp5K4mSYDR / Y2ag58tSi6ar2zM3Ze3QYsNfTq0NqN1g89eAu0
MbSjWqpOsgntRPJiFuj3hai2X2Im8TBrkiM / UyfTRgn8q8WvMoKbXk8Lu6nqv420
eyqhhLxfUoCpxuem1QIDAQAB
- - - - - END PUBLIC KEY - - - - -
PEM
alice . save!
subject do
get :show , params : { resource : resource } , format : :json
end
around ( :each ) do | example |
before = Rails . configuration . x . alternate_domains
example . run
Rails . configuration . x . alternate_domains = before
shared_examples 'a successful response' do
it 'returns http success' do
expect ( response ) . to have_http_status ( 200 )
end
it 'returns application/jrd+json' do
expect ( response . content_type ) . to eq 'application/jrd+json'
end
it 'returns links for the account' do
json = body_as_json
expect ( json [ :subject ] ) . to eq 'acct:alice@cb6e6126.ngrok.io'
expect ( json [ :aliases ] ) . to include ( 'https://cb6e6126.ngrok.io/@alice' , 'https://cb6e6126.ngrok.io/users/alice' )
end
end
it 'returns JSON when account can be found' do
get :show , params : { resource : alice . to_webfinger_s } , format : :json
context 'when an account exists' do
let ( :resource ) { alice . to_webfinger_s }
json = body_as_json
before do
subject
end
expect ( response ) . to have_http_status ( 200 )
expect ( response . content_type ) . to eq 'application/jrd+json'
expect ( json [ :subject ] ) . to eq 'acct:alice@cb6e6126.ngrok.io'
expect ( json [ :aliases ] ) . to include ( 'https://cb6e6126.ngrok.io/@alice' , 'https://cb6e6126.ngrok.io/users/alice' )
it_behaves_like 'a successful response'
end
it 'returns http not found when account cannot be foun d' do
get :show , params : { resource : 'acct:not@existing.com' } , format : :json
context 'when an account is temporarily suspended' do
let( :resource ) { alice . to_webfinger_s }
expect ( response ) . to have_http_status ( :not_found )
before do
alice . suspend!
subject
end
it_behaves_like 'a successful response'
end
it 'returns JSON when account can be found with alternate domains' do
Rails . configuration . x . alternate_domains = [ 'foo.org' ]
username , = alice . to_webfinger_s . split ( '@' )
context 'when an account is permanently suspended or deleted' do
let ( :resource ) { alice . to_webfinger_s }
before do
alice . suspend!
alice . deletion_request . destroy
subject
end
get :show , params : { resource : " #{ username } @foo.org " } , format : :json
it 'returns http gone' do
expect ( response ) . to have_http_status ( 410 )
end
end
context 'when an account is not found' do
let ( :resource ) { 'acct:not@existing.com' }
json = body_as_json
before do
subject
end
expect ( response ) . to have_http_status ( 200 )
expect ( response . content_type ) . to eq 'application/jrd+json'
expect ( json [ :subject ] ) . to eq 'acct:alice@cb6e6126.ngrok.io'
expect ( json [ :aliases ] ) . to include ( 'https://cb6e6126.ngrok.io/@alice' , 'https://cb6e6126.ngrok.io/users/alice' )
it 'returns http not found' do
expect ( response ) . to have_http_status ( 404 )
end
end
it 'returns http not found when account can not be found with alternate domains' do
Rails . configuration . x . alternate_domains = [ 'foo.org' ]
username , = alice . to_webfinger_s . split ( '@' )
context 'with an alternate domain' do
let ( :alternate_domains ) { [ 'foo.org' ] }
before do
subject
end
context 'when an account exists' do
let ( :resource ) do
username , = alice . to_webfinger_s . split ( '@' )
" #{ username } @foo.org "
end
it_behaves_like 'a successful response'
end
get :show , params : { resource : " #{ username } @bar.org " } , format : :json
context 'when the domain is wrong' do
let ( :resource ) do
username , = alice . to_webfinger_s . split ( '@' )
" #{ username } @bar.org "
end
expect ( response ) . to have_http_status ( :not_found )
it 'returns http not found' do
expect ( response ) . to have_http_status ( 404 )
end
end
end
it 'returns http bad request when not given a resource parameter' do
get :show , params : { } , format : :json
expect ( response ) . to have_http_status ( :bad_request )
context 'with no resource parameter' do
let ( :resource ) { nil }
before do
subject
end
it 'returns http bad request' do
expect ( response ) . to have_http_status ( 400 )
end
end
it 'returns http bad request when given a nonsense parameter' do
get :show , params : { resource : 'df/:dfkj' }
expect ( response ) . to have_http_status ( :bad_request )
context 'with a nonsense parameter' do
let ( :resource ) { 'df/:dfkj' }
before do
subject
end
it 'returns http bad request' do
expect ( response ) . to have_http_status ( 400 )
end
end
end
end