2017-06-22 11:33:17 -04:00
|
|
|
require 'spec_helper'
|
|
|
|
|
|
|
|
describe Gitlab::UntrustedRegexp do
|
|
|
|
describe '#initialize' do
|
|
|
|
subject { described_class.new(pattern) }
|
|
|
|
|
|
|
|
context 'invalid regexp' do
|
|
|
|
let(:pattern) { '[' }
|
|
|
|
|
|
|
|
it { expect { subject }.to raise_error(RegexpError) }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#replace_all' do
|
|
|
|
it 'replaces all instances of the match in a string' do
|
|
|
|
result = described_class.new('foo').replace_all('foo bar foo', 'oof')
|
|
|
|
|
|
|
|
expect(result).to eq('oof bar oof')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#replace' do
|
|
|
|
it 'replaces the first instance of the match in a string' do
|
|
|
|
result = described_class.new('foo').replace('foo bar foo', 'oof')
|
|
|
|
|
|
|
|
expect(result).to eq('oof bar foo')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#===' do
|
|
|
|
it 'returns true for a match' do
|
|
|
|
result = described_class.new('foo') === 'a foo here'
|
|
|
|
|
|
|
|
expect(result).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false for no match' do
|
|
|
|
result = described_class.new('foo') === 'a bar here'
|
|
|
|
|
|
|
|
expect(result).to be_falsy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#scan' do
|
|
|
|
subject { described_class.new(regexp).scan(text) }
|
|
|
|
context 'malicious regexp' do
|
|
|
|
let(:text) { malicious_text }
|
|
|
|
let(:regexp) { malicious_regexp }
|
2017-07-20 09:16:00 -04:00
|
|
|
|
2017-06-22 11:33:17 -04:00
|
|
|
include_examples 'malicious regexp'
|
|
|
|
end
|
|
|
|
|
2017-07-20 09:16:00 -04:00
|
|
|
context 'empty regexp' do
|
|
|
|
let(:regexp) { '' }
|
|
|
|
let(:text) { 'foo' }
|
|
|
|
|
|
|
|
it 'returns an array of empty matches' do
|
2017-07-21 08:04:18 -04:00
|
|
|
is_expected.to eq([''])
|
2017-07-20 09:16:00 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'empty capture group regexp' do
|
|
|
|
let(:regexp) { '()' }
|
|
|
|
let(:text) { 'foo' }
|
|
|
|
|
2017-07-21 08:04:18 -04:00
|
|
|
it 'returns an array of empty matches in an array' do
|
|
|
|
is_expected.to eq([['']])
|
2017-07-20 09:16:00 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-06-22 11:33:17 -04:00
|
|
|
context 'no capture group' do
|
|
|
|
let(:regexp) { '.+' }
|
|
|
|
let(:text) { 'foo' }
|
|
|
|
|
|
|
|
it 'returns the whole match' do
|
|
|
|
is_expected.to eq(['foo'])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'one capture group' do
|
|
|
|
let(:regexp) { '(f).+' }
|
|
|
|
let(:text) { 'foo' }
|
|
|
|
|
|
|
|
it 'returns the captured part' do
|
|
|
|
is_expected.to eq([%w[f]])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'two capture groups' do
|
|
|
|
let(:regexp) { '(f).(o)' }
|
|
|
|
let(:text) { 'foo' }
|
|
|
|
|
|
|
|
it 'returns the captured parts' do
|
|
|
|
is_expected.to eq([%w[f o]])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|