require 'url_regex' describe UrlRegex do describe '.get' do it 'should allow :parsing as mode values' do expect(UrlRegex.get(mode: :parsing)).to be end it 'should raise ArgumentError if mode neither :validation nor :parsing nor :javascript' do expect { UrlRegex.get(mode: nil) }.to raise_error ArgumentError expect { UrlRegex.get(mode: :hahaha) }.to raise_error ArgumentError end end describe 'Full validation regex' do [ 'http://foo.com/blah_blah', 'http://foo.com/blah_blah/', 'http://foo.com/blah_blah_(wikipedia)', 'http://foo.com/blah_blah_(wikipedia)_(again)', 'http://www.example.com/wpstyle/?p=364', 'https://www.example.com/foo/?bar=baz&inga=42&quux', 'http://✪df.ws/123', 'http://userid:password@example.com:8080', 'http://userid:password@example.com:8080/', 'http://userid@example.com', 'http://userid@example.com/', 'http://userid@example.com:8080', 'http://userid@example.com:8080/', 'http://userid:password@example.com', 'http://userid:password@example.com/', 'http://142.42.1.1/', 'http://142.42.1.1:8080/', 'http://➡.ws/䨹', 'http://⌘.ws', 'http://⌘.ws/', 'http://foo.com/blah_(wikipedia)#cite-1', 'http://foo.com/blah_(wikipedia)_blah#cite-1', 'http://foo.com/unicode_(✪)_in_parens', 'http://foo.com/(something)?after=parens', 'http://☺.damowmow.com/', 'http://code.google.com/events/#&product=browser', 'http://j.mp', 'ftp://foo.bar/baz', 'http://foo.bar/?q=Test%20URL-encoded%20stuff', 'http://مثال.إختبار', 'http://例子.测试', 'http://उदाहरण.परीक्षा', "http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com", 'http://1337.net', 'http://a.b-c.de', 'http://a.b--c.de/', 'http://www.foo.bar./', 'http://223.255.255.254', 'http://example.org?foo=bar' ].each do |valid_url| it "should match #{valid_url}" do expect(UrlRegex.get(scheme_required: true)).to match valid_url end it "should match #{valid_url} against Javascript regex" do expect(UrlRegex.get(scheme_required: true, mode: :javascript)).to match valid_url end end [ 'http://', 'http://.', 'http://..', 'http://../', 'http://?', 'http://??', 'http://??/', 'http://#', 'http://##', 'http://##/', 'http://foo.bar?q=Spaces should be encoded', '//', '//a', '///a', '///', 'http:///a', 'foo.com', 'rdar://1234', 'h://test', 'http:// shouldfail.com', ':// should fail', 'http://foo.bar/foo(bar)baz quux', 'ftps://foo.bar/', 'http://-error-.invalid/', 'http://-a.b.co', 'http://a.b-.co', 'http://0.0.0.0', 'http://10.1.1.0', 'http://10.1.1.255', 'http://224.1.1.1', 'http://1.1.1.1.1', 'http://123.123.123', 'http://3628126748', 'http://.www.foo.bar/', 'http://.www.foo.bar./', 'http://10.1.1.1', 'http://10.1.1.254' ].each do |invalid_url| it "should not match #{invalid_url}" do expect(UrlRegex.get(scheme_required: true)).to_not match invalid_url end it "should not match #{invalid_url} against Javascript regex" do expect(UrlRegex.get(scheme_required: true, mode: :javascript)).to_not match invalid_url end end end describe 'Optional scheme validation regex' do [ 'foo.com/blah_blah', 'foo.com/blah_blah/', 'foo.com/blah_blah_(wikipedia)', 'foo.com/blah_blah_(wikipedia)_(again)', 'www.example.com/wpstyle/?p=364', 'www.example.com/foo/?bar=baz&inga=42&quux', '✪df.ws/123', 'userid:password@example.com:8080', 'userid:password@example.com:8080/', 'userid@example.com', 'userid@example.com/', 'userid@example.com:8080', 'userid@example.com:8080/', 'userid:password@example.com', 'userid:password@example.com/', '142.42.1.1/', '142.42.1.1:8080/', '➡.ws/䨹', '⌘.ws', '⌘.ws/', 'foo.com/blah_(wikipedia)#cite-1', 'foo.com/blah_(wikipedia)_blah#cite-1', 'foo.com/unicode_(✪)_in_parens', 'foo.com/(something)?after=parens', '☺.damowmow.com/', 'code.google.com/events/#&product=browser', 'j.mp', 'foo.bar/baz', 'foo.bar/?q=Test%20URL-encoded%20stuff', 'مثال.إختبار', '例子.测试', 'उदाहरण.परीक्षा', "-.~_!$&'()*+,;=:%40:80%2f::::::@example.com", '1337.net', 'a.b-c.de', 'a.b--c.de/', 'www.foo.bar./', '223.255.255.254', 'example.org?foo=bar', 'google.com?t=2">Link' ].each do |valid_url| it "should match #{valid_url}" do expect(UrlRegex.get(scheme_required: false)).to match valid_url end it "should match #{valid_url} against Javascript regex" do expect(UrlRegex.get(scheme_required: false, mode: :javascript)).to match valid_url end end [ '', '.', '..', '../', '?', '??', '??/', '#', '##', '##/', 'foo.bar?q=Spaces should be encoded', '//', '//a', '///a', '///', '/a', 'rdar://1234', 'h://test', ' shouldfail.com', ':// should fail', 'foo.bar/foo(bar)baz quux', '-error-.invalid/', '-a.b.co', 'a.b-.co', '0.0.0.0', '10.1.1.0', '10.1.1.255', '224.1.1.1', '1.1.1.1.1', '123.123.123', '3628126748', '.www.foo.bar/', '.www.foo.bar./', '10.1.1.1', '10.1.1.254' ].each do |invalid_url| it "should not match #{invalid_url}" do expect(UrlRegex.get(scheme_required: false)).to_not match invalid_url end it "should not match #{invalid_url} against Javascript regex" do expect(UrlRegex.get(scheme_required: false, mode: :javascript)).to_not match invalid_url end end end describe 'Required scheme parsing regex' do let(:regex) { UrlRegex.get(scheme_required: true, mode: :parsing) } { 'See here: http://google.com?a=1&b=2' => ['http://google.com?a=1&b=2'], 'google.com - search engine' => [], 'Link' => [], 'This text has many links:www.go.com?mode#anchor and https://t.co' => ['https://t.co'] }.each do |text, valid_url| it "should parse '#{valid_url}' from '#{text}'" do expect(text.scan(regex)).to eq valid_url end end end describe 'Optional scheme parsing regex' do let(:regex) { UrlRegex.get(scheme_required: false, mode: :parsing) } { 'See here: http://google.com?a=1&b=2' => ['http://google.com?a=1&b=2'], 'google.com - search engine' => ['google.com'], 'Link' => ['google.com?t=2">Link'], 'This text has many links:www.go.com?mode#anchor and https://t.co' => ['www.go.com?mode#anchor', 'https://t.co'] }.each do |text, valid_url| it "should parse '#{valid_url}' from '#{text}'" do expect(text.scan(regex)).to eq valid_url end end end end