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
|
# frozen_string_literal: true
require 'support'
require 'timeout'
require 'mustermann/regular'
describe Mustermann::Regular do
extend Support::Pattern
pattern '' do
it { should match('') }
it { should_not match('/') }
it { should_not respond_to(:expand) }
it { should_not respond_to(:to_templates) }
end
pattern '/' do
it { should match('/') }
it { should_not match('/foo') }
end
pattern '/foo' do
it { should match('/foo') }
it { should_not match('/bar') }
it { should_not match('/foo.bar') }
end
pattern '/foo/bar' do
it { should match('/foo/bar') }
it { should_not match('/foo%2Fbar') }
it { should_not match('/foo%2fbar') }
end
pattern '/(?<foo>.*)' do
it { should match('/foo') .capturing foo: 'foo' }
it { should match('/bar') .capturing foo: 'bar' }
it { should match('/foo.bar') .capturing foo: 'foo.bar' }
it { should match('/%0Afoo') .capturing foo: '%0Afoo' }
it { should match('/foo%2Fbar') .capturing foo: 'foo%2Fbar' }
end
context 'with Regexp::EXTENDED' do
let(:pattern) {
%r{
\/compare\/ # match any URL beginning with \/compare\/
(.+) # extract the full path (including any directories)
\/ # match the final slash
([^.]+) # match the first SHA1
\.{2,3} # match .. or ...
(.+) # match the second SHA1
}x
}
example { expect { Timeout.timeout(1){ Mustermann::Regular.new(pattern) }}.not_to raise_error }
it { expect(Mustermann::Regular.new(pattern)).to match('/compare/foo/bar..baz') }
end
describe :check_achnors do
context 'raises on anchors' do
example { expect { Mustermann::Regular.new('^foo') }.to raise_error(Mustermann::CompileError) }
example { expect { Mustermann::Regular.new('foo$') }.to raise_error(Mustermann::CompileError) }
example { expect { Mustermann::Regular.new('\Afoo') }.to raise_error(Mustermann::CompileError) }
example { expect { Mustermann::Regular.new('foo\Z') }.to raise_error(Mustermann::CompileError) }
example { expect { Mustermann::Regular.new('foo\z') }.to raise_error(Mustermann::CompileError) }
example { expect { Mustermann::Regular.new(/^foo/) }.to raise_error(Mustermann::CompileError) }
example { expect { Mustermann::Regular.new(/foo$/) }.to raise_error(Mustermann::CompileError) }
example { expect { Mustermann::Regular.new(/\Afoo/) }.to raise_error(Mustermann::CompileError) }
example { expect { Mustermann::Regular.new(/foo\Z/) }.to raise_error(Mustermann::CompileError) }
example { expect { Mustermann::Regular.new(/foo\z/) }.to raise_error(Mustermann::CompileError) }
example { expect { Mustermann::Regular.new('[^f]') }.not_to raise_error }
example { expect { Mustermann::Regular.new('\\\A') }.not_to raise_error }
example { expect { Mustermann::Regular.new('[[:digit:]]') }.not_to raise_error }
example { expect { Mustermann::Regular.new(/[^f]/) }.not_to raise_error }
example { expect { Mustermann::Regular.new(/\\A/) }.not_to raise_error }
example { expect { Mustermann::Regular.new(/[[:digit:]]/) }.not_to raise_error }
end
context 'with check_anchors disabled' do
example { expect { Mustermann::Regular.new('^foo', check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new('foo$', check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new('\Afoo', check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new('foo\Z', check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new('foo\z', check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new(/^foo/, check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new(/foo$/, check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new(/\Afoo/, check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new(/foo\Z/, check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new(/foo\z/, check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new('[^f]', check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new('\\\A', check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new('[[:digit:]]', check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new(/[^f]/, check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new(/\\A/, check_anchors: false) }.not_to raise_error }
example { expect { Mustermann::Regular.new(/[[:digit:]]/, check_anchors: false) }.not_to raise_error }
end
end
context "peeking" do
subject(:pattern) { Mustermann::Regular.new("(?<name>[^/]+)") }
describe :peek_size do
example { pattern.peek_size("foo bar/blah") .should be == "foo bar".size }
example { pattern.peek_size("foo%20bar/blah") .should be == "foo%20bar".size }
example { pattern.peek_size("/foo bar") .should be_nil }
end
describe :peek_match do
example { pattern.peek_match("foo bar/blah") .to_s .should be == "foo bar" }
example { pattern.peek_match("foo%20bar/blah") .to_s .should be == "foo%20bar" }
example { pattern.peek_match("/foo bar") .should be_nil }
end
describe :peek_params do
example { pattern.peek_params("foo bar/blah") .should be == [{"name" => "foo bar"}, "foo bar".size] }
example { pattern.peek_params("foo%20bar/blah") .should be == [{"name" => "foo bar"}, "foo%20bar".size] }
example { pattern.peek_params("/foo bar") .should be_nil }
end
end
end
|