44d0d0e6f9
Update the help controller to correctly handle relative links on the help pages when the relative link is before an external link on the same line in the markdown file. Test cases have been implement to check for - relative links before external link on same line, - HTTPS in query part of link, - URLs without '//' and - protocol-relative links.
157 lines
3.9 KiB
Ruby
157 lines
3.9 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe HelpController do
|
|
let(:user) { create(:user) }
|
|
|
|
before do
|
|
sign_in(user)
|
|
end
|
|
|
|
describe 'GET #index' do
|
|
context 'with absolute url' do
|
|
it 'keeps the URL absolute' do
|
|
stub_readme("[API](/api/README.md)")
|
|
|
|
get :index
|
|
|
|
expect(assigns[:help_index]).to eq '[API](/api/README.md)'
|
|
end
|
|
end
|
|
|
|
context 'with relative url' do
|
|
it 'prefixes it with /help/' do
|
|
stub_readme("[API](api/README.md)")
|
|
|
|
get :index
|
|
|
|
expect(assigns[:help_index]).to eq '[API](/help/api/README.md)'
|
|
end
|
|
end
|
|
|
|
context 'when url is an external link' do
|
|
it 'does not change it' do
|
|
stub_readme("[external](https://some.external.link)")
|
|
|
|
get :index
|
|
|
|
expect(assigns[:help_index]).to eq '[external](https://some.external.link)'
|
|
end
|
|
end
|
|
|
|
context 'when relative url with external on same line' do
|
|
it 'prefix it with /help/' do
|
|
stub_readme("[API](api/README.md) [external](https://some.external.link)")
|
|
|
|
get :index
|
|
|
|
expect(assigns[:help_index]).to eq '[API](/help/api/README.md) [external](https://some.external.link)'
|
|
end
|
|
end
|
|
|
|
context 'when relative url with http:// in query' do
|
|
it 'prefix it with /help/' do
|
|
stub_readme("[API](api/README.md?go=https://example.com/)")
|
|
|
|
get :index
|
|
|
|
expect(assigns[:help_index]).to eq '[API](/help/api/README.md?go=https://example.com/)'
|
|
end
|
|
end
|
|
|
|
context 'when mailto URL' do
|
|
it 'do not change it' do
|
|
stub_readme("[report bug](mailto:bugs@example.com)")
|
|
|
|
get :index
|
|
|
|
expect(assigns[:help_index]).to eq '[report bug](mailto:bugs@example.com)'
|
|
end
|
|
end
|
|
|
|
context 'when protocol-relative link' do
|
|
it 'do not change it' do
|
|
stub_readme("[protocol-relative](//example.com)")
|
|
|
|
get :index
|
|
|
|
expect(assigns[:help_index]).to eq '[protocol-relative](//example.com)'
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'GET #show' do
|
|
context 'for Markdown formats' do
|
|
context 'when requested file exists' do
|
|
before do
|
|
get :show, params: { path: 'ssh/README' }, format: :md
|
|
end
|
|
|
|
it 'assigns to @markdown' do
|
|
expect(assigns[:markdown]).not_to be_empty
|
|
end
|
|
|
|
it 'renders HTML' do
|
|
expect(response).to render_template('show.html.haml')
|
|
expect(response.content_type).to eq 'text/html'
|
|
end
|
|
end
|
|
|
|
context 'when requested file is missing' do
|
|
it 'renders not found' do
|
|
get :show, params: { path: 'foo/bar' }, format: :md
|
|
expect(response).to be_not_found
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'for image formats' do
|
|
context 'when requested file exists' do
|
|
it 'renders the raw file' do
|
|
get :show,
|
|
params: {
|
|
path: 'user/project/img/labels_default'
|
|
},
|
|
format: :png
|
|
expect(response).to be_success
|
|
expect(response.content_type).to eq 'image/png'
|
|
expect(response.headers['Content-Disposition']).to match(/^inline;/)
|
|
end
|
|
end
|
|
|
|
context 'when requested file is missing' do
|
|
it 'renders not found' do
|
|
get :show,
|
|
params: {
|
|
path: 'foo/bar'
|
|
},
|
|
format: :png
|
|
expect(response).to be_not_found
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'for other formats' do
|
|
it 'always renders not found' do
|
|
get :show,
|
|
params: {
|
|
path: 'ssh/README'
|
|
},
|
|
format: :foo
|
|
expect(response).to be_not_found
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'GET #ui' do
|
|
context 'for UI Development Kit' do
|
|
it 'renders found' do
|
|
get :ui
|
|
expect(response).to have_gitlab_http_status(200)
|
|
end
|
|
end
|
|
end
|
|
|
|
def stub_readme(content)
|
|
allow(File).to receive(:read).and_return(content)
|
|
end
|
|
end
|