1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe WebIde::DefaultOauthApplication, feature_category: :web_ide do
let_it_be(:current_user) { create(:user) }
let_it_be(:oauth_application) { create(:oauth_application, owner: nil) }
describe '#feature_enabled?' do
where(:vscode_web_ide, :expectation) do
[
[ref(:current_user), true],
[false, false]
]
end
with_them do
it 'returns the expected value' do
stub_feature_flags(vscode_web_ide: vscode_web_ide)
expect(described_class.feature_enabled?(current_user)).to be(expectation)
end
end
end
describe '#oauth_application' do
it 'returns web_ide_oauth_application from application_settings' do
expect(described_class.oauth_application).to be_nil
stub_application_setting({ web_ide_oauth_application: oauth_application })
expect(described_class.oauth_application).to be(oauth_application)
end
end
describe '#oauth_callback_url' do
it 'returns route URL for oauth callback' do
expect(described_class.oauth_callback_url).to eq(Gitlab::Routing.url_helpers.ide_oauth_redirect_url)
end
end
describe '#oauth_application_callback_urls' do
it 'returns application callback URL' do
expected_result = [oauth_application.redirect_uri]
stub_application_setting({ web_ide_oauth_application: oauth_application })
expect(described_class.oauth_application_callback_urls).to match_array(expected_result)
end
context 'with multiple oauth callback URLs' do
let(:redirect_uri_1) { "http://example1.test/oauth-redirect" }
let(:redirect_uri_2) { "http://example2.test/oauth-redirect" }
it 'supports multiple OAuth callback URLs' do
oauth_application.redirect_uri = "#{redirect_uri_1}\n#{redirect_uri_2}"
expected_result = [redirect_uri_1, redirect_uri_2]
stub_application_setting({ web_ide_oauth_application: oauth_application })
expect(described_class.oauth_application_callback_urls).to match_array(expected_result)
end
it 'returns unique URL origins' do
oauth_application.redirect_uri = "#{redirect_uri_1}\n #{redirect_uri_1}"
expected_result = [redirect_uri_1]
stub_application_setting({ web_ide_oauth_application: oauth_application })
expect(described_class.oauth_application_callback_urls).to match_array(expected_result)
end
end
end
describe '#ensure_oauth_application!' do
it 'if web_ide_oauth_application already exists, does nothing' do
expect(application_settings).not_to receive(:lock!)
expect(::Doorkeeper::Application).not_to receive(:new)
stub_application_setting({ web_ide_oauth_application: oauth_application })
described_class.ensure_oauth_application!
end
it 'if web_ide_oauth_application created while locked, does nothing' do
expect(application_settings).to receive(:lock!) do
stub_application_setting({ web_ide_oauth_application: oauth_application })
end
expect(::Doorkeeper::Application).not_to receive(:new)
expect(::Gitlab::CurrentSettings).not_to receive(:expire_current_application_settings)
described_class.ensure_oauth_application!
end
it 'creates web_ide_oauth_application' do
expect(application_settings).to receive(:transaction).and_call_original
expect(::Doorkeeper::Application).to receive(:new).and_call_original
expect(::Gitlab::CurrentSettings).to receive(:expire_current_application_settings).and_call_original
expect(application_settings.web_ide_oauth_application).to be_nil
described_class.ensure_oauth_application!
result = application_settings.web_ide_oauth_application
expect(result).not_to be_nil
expect(result).to have_attributes(
name: 'GitLab Web IDE',
redirect_uri: described_class.oauth_callback_url,
scopes: ['api'],
trusted: true,
confidential: false
)
end
end
describe '#reset_oauth_application_settings' do
it 'resets oauth application settings to original' do
mock_bad_oauth_application = oauth_application
mock_bad_oauth_application["confidential"] = true
mock_bad_oauth_application["trusted"] = false
stub_application_setting({ web_ide_oauth_application: mock_bad_oauth_application })
described_class.reset_oauth_application_settings
expect(oauth_application).to have_attributes(
name: 'GitLab Web IDE',
redirect_uri: described_class.oauth_callback_url,
scopes: ['api'],
trusted: true,
confidential: false
)
end
end
def application_settings
::Gitlab::CurrentSettings.current_application_settings
end
end
|