app_sign_up_service_spec.rb 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. # frozen_string_literal: true
  2. require 'rails_helper'
  3. RSpec.describe AppSignUpService, type: :service do
  4. subject { described_class.new }
  5. let(:app) { Fabricate(:application, scopes: 'read write') }
  6. let(:good_params) { { username: 'alice', password: '12345678', email: 'good@email.com', agreement: true } }
  7. let(:remote_ip) { IPAddr.new('198.0.2.1') }
  8. describe '#call' do
  9. let(:params) { good_params }
  10. shared_examples 'successful registration' do
  11. it 'creates an unconfirmed user with access token and the app\'s scope', :aggregate_failures do
  12. access_token = subject.call(app, remote_ip, params)
  13. expect(access_token).to_not be_nil
  14. expect(access_token.scopes.to_s).to eq 'read write'
  15. user = User.find_by(id: access_token.resource_owner_id)
  16. expect(user).to_not be_nil
  17. expect(user.confirmed?).to be false
  18. expect(user.account).to_not be_nil
  19. expect(user.invite_request).to be_nil
  20. end
  21. end
  22. context 'when the email address requires approval' do
  23. before do
  24. Setting.registrations_mode = 'open'
  25. Fabricate(:email_domain_block, allow_with_approval: true, domain: 'email.com')
  26. end
  27. it 'creates an unapproved user', :aggregate_failures do
  28. access_token = subject.call(app, remote_ip, params)
  29. expect(access_token).to_not be_nil
  30. expect(access_token.scopes.to_s).to eq 'read write'
  31. user = User.find_by(id: access_token.resource_owner_id)
  32. expect(user).to_not be_nil
  33. expect(user.confirmed?).to be false
  34. expect(user.approved?).to be false
  35. expect(user.account).to_not be_nil
  36. expect(user.invite_request).to be_nil
  37. end
  38. end
  39. context 'when the email address requires approval through MX records' do
  40. before do
  41. Setting.registrations_mode = 'open'
  42. Fabricate(:email_domain_block, allow_with_approval: true, domain: 'smtp.email.com')
  43. allow(User).to receive(:skip_mx_check?).and_return(false)
  44. resolver = instance_double(Resolv::DNS, :timeouts= => nil)
  45. allow(resolver).to receive(:getresources)
  46. .with('email.com', Resolv::DNS::Resource::IN::MX)
  47. .and_return([instance_double(Resolv::DNS::Resource::MX, exchange: 'smtp.email.com')])
  48. allow(resolver).to receive(:getresources).with('email.com', Resolv::DNS::Resource::IN::A).and_return([])
  49. allow(resolver).to receive(:getresources).with('email.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
  50. allow(resolver).to receive(:getresources).with('smtp.email.com', Resolv::DNS::Resource::IN::A).and_return([instance_double(Resolv::DNS::Resource::IN::A, address: '2.3.4.5')])
  51. allow(resolver).to receive(:getresources).with('smtp.email.com', Resolv::DNS::Resource::IN::AAAA).and_return([instance_double(Resolv::DNS::Resource::IN::AAAA, address: 'fd00::2')])
  52. allow(Resolv::DNS).to receive(:open).and_yield(resolver)
  53. end
  54. it 'creates an unapproved user', :aggregate_failures do
  55. access_token = subject.call(app, remote_ip, params)
  56. expect(access_token).to_not be_nil
  57. expect(access_token.scopes.to_s).to eq 'read write'
  58. user = User.find_by(id: access_token.resource_owner_id)
  59. expect(user).to_not be_nil
  60. expect(user.confirmed?).to be false
  61. expect(user.approved?).to be false
  62. expect(user.account).to_not be_nil
  63. expect(user.invite_request).to be_nil
  64. end
  65. end
  66. context 'when registrations are closed' do
  67. before do
  68. Setting.registrations_mode = 'none'
  69. end
  70. it 'raises an error', :aggregate_failures do
  71. expect { subject.call(app, remote_ip, good_params) }.to raise_error Mastodon::NotPermittedError
  72. end
  73. context 'when using a valid invite' do
  74. let(:params) { good_params.merge({ invite_code: invite.code }) }
  75. let(:invite) { Fabricate(:invite) }
  76. before do
  77. invite.user.approve!
  78. end
  79. it_behaves_like 'successful registration'
  80. end
  81. context 'when using an invalid invite' do
  82. let(:params) { good_params.merge({ invite_code: invite.code }) }
  83. let(:invite) { Fabricate(:invite, uses: 1, max_uses: 1) }
  84. it 'raises an error', :aggregate_failures do
  85. expect { subject.call(app, remote_ip, params) }.to raise_error Mastodon::NotPermittedError
  86. end
  87. end
  88. end
  89. it 'raises an error when params are missing' do
  90. expect { subject.call(app, remote_ip, {}) }.to raise_error ActiveRecord::RecordInvalid
  91. end
  92. it_behaves_like 'successful registration'
  93. context 'when given an invite request text' do
  94. it 'creates an account with invite request text' do
  95. access_token = subject.call(app, remote_ip, good_params.merge(reason: 'Foo bar'))
  96. expect(access_token).to_not be_nil
  97. user = User.find_by(id: access_token.resource_owner_id)
  98. expect(user).to_not be_nil
  99. expect(user.invite_request&.text).to eq 'Foo bar'
  100. end
  101. end
  102. end
  103. end