File: regular_spec.rb

package info (click to toggle)
ruby-mustermann 3.0.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,224 kB
  • sloc: ruby: 7,746; makefile: 6
file content (119 lines) | stat: -rw-r--r-- 6,195 bytes parent folder | download | duplicates (3)
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