require 'spec_helper' shared_examples 'an external link with rel attribute' do it 'adds rel="nofollow" to external links' do expect(doc.at_css('a')).to have_attribute('rel') expect(doc.at_css('a')['rel']).to include 'nofollow' end it 'adds rel="noreferrer" to external links' do expect(doc.at_css('a')).to have_attribute('rel') expect(doc.at_css('a')['rel']).to include 'noreferrer' end it 'adds rel="noopener" to external links' do expect(doc.at_css('a')).to have_attribute('rel') expect(doc.at_css('a')['rel']).to include 'noopener' end end describe Banzai::Filter::ExternalLinkFilter do include FilterSpecHelper it 'ignores elements without an href attribute' do exp = act = %q(Ignore Me) expect(filter(act).to_html).to eq exp end it 'ignores non-HTTP(S) links' do exp = act = %q(IRC) expect(filter(act).to_html).to eq exp end it 'skips internal links' do internal = Gitlab.config.gitlab.url exp = act = %Q(Login) expect(filter(act).to_html).to eq exp end context 'for root links on document' do let(:doc) { filter %q(Google) } it_behaves_like 'an external link with rel attribute' end context 'for nested links on document' do let(:doc) { filter %q(

Google

) } it_behaves_like 'an external link with rel attribute' end context 'for invalid urls' do it 'skips broken hrefs' do doc = filter %q(

Google

) expected = %q(

Google

) expect(doc.to_html).to eq(expected) end it 'skips improperly formatted mailtos' do doc = filter %q(

Email

) expected = %q(

Email

) expect(doc.to_html).to eq(expected) end end context 'for links with a username' do context 'with a valid username' do let(:doc) { filter %q(Google) } it_behaves_like 'an external link with rel attribute' end context 'with an impersonated username' do let(:internal) { Gitlab.config.gitlab.url } let(:doc) { filter %Q(Reverse Tabnabbing) } it_behaves_like 'an external link with rel attribute' end end context 'for non-lowercase scheme links' do context 'with http' do let(:doc) { filter %q(

Google

) } it_behaves_like 'an external link with rel attribute' end context 'with https' do let(:doc) { filter %q(

Google

) } it_behaves_like 'an external link with rel attribute' end it 'skips internal links' do internal_link = Gitlab.config.gitlab.url + "/sign_in" url = internal_link.gsub(/\Ahttp/, 'HtTp') act = %Q(Login) exp = %Q(Login) expect(filter(act).to_html).to eq(exp) end it 'skips relative links' do exp = act = %q(Relative URL) expect(filter(act).to_html).to eq(exp) end end context 'for protocol-relative links' do let(:doc) { filter %q(

Google

) } it_behaves_like 'an external link with rel attribute' end end