twitter-text 1.4.8 → 1.4.9

Sign up to get free protection for your applications and to get access to all the features.
data/lib/twitter-text.rb CHANGED
@@ -1,15 +1,18 @@
1
1
  major, minor, patch = RUBY_VERSION.split('.')
2
2
 
3
- if major.to_i == 1 && minor.to_i < 9
3
+ $RUBY_1_9 = if major.to_i == 1 && minor.to_i < 9
4
4
  # Ruby 1.8 KCODE check. Not needed on 1.9 and later.
5
5
  raise("twitter-text requires the $KCODE variable be set to 'UTF8' or 'u'") unless $KCODE[0].chr =~ /u/i
6
+ false
7
+ else
8
+ true
6
9
  end
7
10
 
8
- # External libraries required. (for gems, use: ruby -rubygems ...)
9
- require 'action_pack'
10
- require 'action_view'
11
+ require 'active_support'
12
+ require 'active_support/core_ext/string/multibyte.rb'
11
13
 
12
14
  require File.join(File.dirname(__FILE__), 'regex')
15
+ require File.join(File.dirname(__FILE__), 'rewriter')
13
16
  require File.join(File.dirname(__FILE__), 'autolink')
14
17
  require File.join(File.dirname(__FILE__), 'extractor')
15
18
  require File.join(File.dirname(__FILE__), 'unicode')
data/lib/validation.rb CHANGED
@@ -35,7 +35,7 @@ module Twitter
35
35
  # <tt>:empty</tt>:: if the <tt>text</tt> is nil or empty
36
36
  # <tt>:invalid_characters</tt>:: if the <tt>text</tt> contains non-Unicode or any of the disallowed Unicode characters
37
37
  def tweet_invalid?(text)
38
- return :empty if text.blank?
38
+ return :empty if !text || text.empty?
39
39
  begin
40
40
  return :too_long if tweet_length(text) > MAX_LENGTH
41
41
  return :invalid_characters if INVALID_CHARACTERS.any?{|invalid_char| text.include?(invalid_char) }
@@ -52,7 +52,7 @@ module Twitter
52
52
  end
53
53
 
54
54
  def valid_username?(username)
55
- return false if username.blank?
55
+ return false if !username || username.empty?
56
56
 
57
57
  extracted = Twitter::Extractor.extract_mentioned_screen_names(username)
58
58
  # Should extract the username minus the @ sign, hence the [1..-1]
@@ -63,11 +63,11 @@ module Twitter
63
63
  def valid_list?(username_list)
64
64
  match = username_list.match(VALID_LIST_RE)
65
65
  # Must have matched and had nothing before or after
66
- !!(match && match[1] == "" && !match[4].blank?)
66
+ !!(match && match[1] == "" && match[4] && !match[4].empty?)
67
67
  end
68
68
 
69
69
  def valid_hashtag?(hashtag)
70
- return false if hashtag.blank?
70
+ return false if !hashtag || hashtag.empty?
71
71
 
72
72
  extracted = Twitter::Extractor.extract_hashtags(hashtag)
73
73
  # Should extract the hashtag minus the # sign, hence the [1..-1]
@@ -75,7 +75,7 @@ module Twitter
75
75
  end
76
76
 
77
77
  def valid_url?(url, unicode_domains=true)
78
- return false if url.blank?
78
+ return false if !url || url.empty?
79
79
 
80
80
  url_parts = url.match(Twitter::Regex[:validate_url_unencoded])
81
81
  return false unless (url_parts && url_parts.to_s == url)
@@ -36,7 +36,7 @@ describe Twitter::Autolink do
36
36
  def original_text; "meet@the beach"; end
37
37
 
38
38
  it "should not be linked" do
39
- Nokogiri::HTML(@autolinked_text).search('a').should be_blank
39
+ Nokogiri::HTML(@autolinked_text).search('a').should be_empty
40
40
  end
41
41
  end
42
42
 
@@ -133,7 +133,7 @@ describe Twitter::Autolink do
133
133
  def original_text; "hello @/my-list"; end
134
134
 
135
135
  it "should NOT be linked" do
136
- Nokogiri::HTML(@autolinked_text).search('a').should be_blank
136
+ Nokogiri::HTML(@autolinked_text).search('a').should be_empty
137
137
  end
138
138
  end
139
139
 
@@ -149,7 +149,7 @@ describe Twitter::Autolink do
149
149
  def original_text; "meet@the/beach"; end
150
150
 
151
151
  it "should not be linked" do
152
- Nokogiri::HTML(@autolinked_text).search('a').should be_blank
152
+ Nokogiri::HTML(@autolinked_text).search('a').should be_empty
153
153
  end
154
154
  end
155
155
 
@@ -505,6 +505,24 @@ describe Twitter::Autolink do
505
505
  end
506
506
  end
507
507
 
508
+ context "regex engine quirks" do
509
+ context "does not spiral out of control on repeated periods" do
510
+ def original_text; "Test a ton of periods http://example.com/path.........................................."; end
511
+
512
+ it "should autolink" do
513
+ @autolinked_text.should have_autolinked_url('http://example.com/path')
514
+ end
515
+ end
516
+
517
+ context "does not spiral out of control on repeated dashes" do
518
+ def original_text; "Single char file ext http://www.bestbuy.com/site/Currie+Technologies+-+Ezip+400+Scooter/9885188.p?id=1218189013070&skuId=9885188"; end
519
+
520
+ it "should autolink" do
521
+ @autolinked_text.should have_autolinked_url('http://www.bestbuy.com/site/Currie+Technologies+-+Ezip+400+Scooter/9885188.p?id=1218189013070&skuId=9885188')
522
+ end
523
+ end
524
+ end
525
+
508
526
  end
509
527
 
510
528
  describe "Autolink all" do
@@ -558,6 +576,26 @@ describe Twitter::Autolink do
558
576
  linked.should have_autolinked_url('http://example.com/')
559
577
  linked.should match(/target="mywindow"/)
560
578
  end
579
+
580
+ it "should customize href by username_url_block option" do
581
+ linked = TestAutolink.new.auto_link("@test", :username_url_block => lambda{|a| "dummy"})
582
+ linked.should have_autolinked_url('dummy', 'test')
583
+ end
584
+
585
+ it "should customize href by list_url_block option" do
586
+ linked = TestAutolink.new.auto_link("@test/list", :list_url_block => lambda{|a| "dummy"})
587
+ linked.should have_autolinked_url('dummy', 'test/list')
588
+ end
589
+
590
+ it "should customize href by hashtag_url_block option" do
591
+ linked = TestAutolink.new.auto_link("#hashtag", :hashtag_url_block => lambda{|a| "dummy"})
592
+ linked.should have_autolinked_url('dummy', '#hashtag')
593
+ end
594
+
595
+ it "should customize href by link_url_block option" do
596
+ linked = TestAutolink.new.auto_link("http://example.com/", :link_url_block => lambda{|a| "dummy"})
597
+ linked.should have_autolinked_url('dummy', 'http://example.com/')
598
+ end
561
599
  end
562
600
 
563
601
  describe "html_escape" do
@@ -228,11 +228,11 @@ describe Twitter::Extractor do
228
228
  end
229
229
 
230
230
  it "should not allow the multiplication character" do
231
- @extractor.extract_hashtags("#pre#{[0xd7].pack('U')}post").should == []
231
+ @extractor.extract_hashtags("#pre#{Twitter::Unicode::U00D7}post").should == []
232
232
  end
233
233
 
234
234
  it "should not allow the division character" do
235
- @extractor.extract_hashtags("#pre#{[0xf7].pack('U')}post").should == []
235
+ @extractor.extract_hashtags("#pre#{Twitter::Unicode::U00F7}post").should == []
236
236
  end
237
237
  end
238
238
 
@@ -0,0 +1,558 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Twitter::Rewriter do
6
+ def original_text; end
7
+ def url; end
8
+
9
+ def block(*args)
10
+ if Array === @block_args
11
+ unless Array === @block_args.first
12
+ @block_args = [@block_args]
13
+ end
14
+ @block_args << args
15
+ else
16
+ @block_args = args
17
+ end
18
+ "[rewritten]"
19
+ end
20
+
21
+ describe "rewrite usernames" do #{{{
22
+ before do
23
+ @rewritten_text = Twitter::Rewriter.rewrite_usernames_or_lists(original_text, &method(:block))
24
+ end
25
+
26
+ context "username preceded by a space" do
27
+ def original_text; "hello @jacob"; end
28
+
29
+ it "should be rewritten" do
30
+ @block_args.should == ["@", "jacob", nil]
31
+ @rewritten_text.should == "hello [rewritten]"
32
+ end
33
+ end
34
+
35
+ context "username at beginning of line" do
36
+ def original_text; "@jacob you're cool"; end
37
+
38
+ it "should be rewritten" do
39
+ @block_args.should == ["@", "jacob", nil]
40
+ @rewritten_text.should == "[rewritten] you're cool"
41
+ end
42
+ end
43
+
44
+ context "username preceded by word character" do
45
+ def original_text; "meet@the beach"; end
46
+
47
+ it "should not be rewritten" do
48
+ @block_args.should be_nil
49
+ @rewritten_text.should == "meet@the beach"
50
+ end
51
+ end
52
+
53
+ context "username preceded by non-word character" do
54
+ def original_text; "great.@jacob"; end
55
+
56
+ it "should be rewritten" do
57
+ @block_args.should == ["@", "jacob", nil]
58
+ @rewritten_text.should == "great.[rewritten]"
59
+ end
60
+ end
61
+
62
+ context "username containing non-word characters" do
63
+ def original_text; "@jacob&^$%^"; end
64
+
65
+ it "should be rewritten" do
66
+ @block_args.should == ["@", "jacob", nil]
67
+ @rewritten_text.should == "[rewritten]&^$%^"
68
+ end
69
+ end
70
+
71
+ context "username over twenty characters" do
72
+ def original_text
73
+ @twenty_character_username = "zach" * 5
74
+ "@" + @twenty_character_username + "1"
75
+ end
76
+
77
+ it "should be rewritten" do
78
+ @block_args.should == ["@", @twenty_character_username, nil]
79
+ @rewritten_text.should == "[rewritten]1"
80
+ end
81
+ end
82
+
83
+ context "username followed by japanese" do
84
+ def original_text; "@jacobの"; end
85
+
86
+ it "should be rewritten" do
87
+ @block_args.should == ["@", "jacob", nil]
88
+ @rewritten_text.should == "[rewritten]の"
89
+ end
90
+ end
91
+
92
+ context "username preceded by japanese" do
93
+ def original_text; "あ@jacob"; end
94
+
95
+ it "should be rewritten" do
96
+ @block_args.should == ["@", "jacob", nil]
97
+ @rewritten_text.should == "あ[rewritten]"
98
+ end
99
+ end
100
+
101
+ context "username surrounded by japanese" do
102
+ def original_text; "あ@jacobの"; end
103
+
104
+ it "should be rewritten" do
105
+ @block_args.should == ["@", "jacob", nil]
106
+ @rewritten_text.should == "あ[rewritten]の"
107
+ end
108
+ end
109
+
110
+ context "username using full-width at-sign" do
111
+ def original_text
112
+ "#{[0xFF20].pack('U')}jacob"
113
+ end
114
+
115
+ it "should be rewritten" do
116
+ @block_args.should == ["@", "jacob", nil]
117
+ @rewritten_text.should == "[rewritten]"
118
+ end
119
+ end
120
+ end #}}}
121
+
122
+ describe "rewrite lists" do #{{{
123
+ before do
124
+ @rewritten_text = Twitter::Rewriter.rewrite_usernames_or_lists(original_text, &method(:block))
125
+ end
126
+
127
+ context "slug preceded by a space" do
128
+ def original_text; "hello @jacob/my-list"; end
129
+
130
+ it "should be rewritten" do
131
+ @block_args.should == ["@", "jacob", "/my-list"]
132
+ @rewritten_text.should == "hello [rewritten]"
133
+ end
134
+ end
135
+
136
+ context "username followed by a slash but no list" do
137
+ def original_text; "hello @jacob/ my-list"; end
138
+
139
+ it "should not be rewritten" do
140
+ @block_args.should == ["@", "jacob", nil]
141
+ @rewritten_text.should == "hello [rewritten]/ my-list"
142
+ end
143
+ end
144
+
145
+ context "empty username followed by a list" do
146
+ def original_text; "hello @/my-list"; end
147
+
148
+ it "should not be rewritten" do
149
+ @block_args.should be_nil
150
+ @rewritten_text.should == "hello @/my-list"
151
+ end
152
+ end
153
+
154
+ context "list slug at beginning of line" do
155
+ def original_text; "@jacob/my-list"; end
156
+
157
+ it "should be rewritten" do
158
+ @block_args.should == ["@", "jacob", "/my-list"]
159
+ @rewritten_text.should == "[rewritten]"
160
+ end
161
+ end
162
+
163
+ context "username preceded by alpha-numeric character" do
164
+ def original_text; "meet@jacob/my-list"; end
165
+
166
+ it "should not be rewritten" do
167
+ @block_args.should be_nil
168
+ @rewritten_text.should == "meet@jacob/my-list"
169
+ end
170
+ end
171
+
172
+ context "username preceded by non-word character" do
173
+ def original_text; "great.@jacob/my-list"; end
174
+
175
+ it "should be rewritten" do
176
+ @block_args.should == ["@", "jacob", "/my-list"]
177
+ @rewritten_text.should == "great.[rewritten]"
178
+ end
179
+ end
180
+
181
+ context "username containing non-word characters" do
182
+ def original_text; "@jacob/my-list&^$%^"; end
183
+
184
+ it "should be rewritten" do
185
+ @block_args.should == ["@", "jacob", "/my-list"]
186
+ @rewritten_text.should == "[rewritten]&^$%^"
187
+ end
188
+ end
189
+
190
+ context "username over twenty characters" do
191
+ def original_text
192
+ @twentyfive_character_list = "a" * 25
193
+ "@jacob/#{@twentyfive_character_list}12345"
194
+ end
195
+
196
+ it "should be rewritten" do
197
+ @block_args.should == ["@", "jacob", "/#{@twentyfive_character_list}"]
198
+ @rewritten_text.should == "[rewritten]12345"
199
+ end
200
+ end
201
+ end #}}}
202
+
203
+ describe "rewrite hashtags" do #{{{
204
+ before do
205
+ @rewritten_text = Twitter::Rewriter.rewrite_hashtags(original_text, &method(:block))
206
+ end
207
+
208
+ context "with an all numeric hashtag" do
209
+ def original_text; "#123"; end
210
+
211
+ it "should not be rewritten" do
212
+ @block_args.should be_nil
213
+ @rewritten_text.should == "#123"
214
+ end
215
+ end
216
+
217
+ context "with a hashtag with alphanumeric characters" do
218
+ def original_text; "#ab1d"; end
219
+
220
+ it "should be rewritten" do
221
+ @block_args.should == ["#", "ab1d"]
222
+ @rewritten_text.should == "[rewritten]"
223
+ end
224
+ end
225
+
226
+ context "with a hashtag with underscores" do
227
+ def original_text; "#a_b_c_d"; end
228
+
229
+ it "should be rewritten" do
230
+ @block_args.should == ["#", "a_b_c_d"]
231
+ @rewritten_text.should == "[rewritten]"
232
+ end
233
+ end
234
+
235
+ context "with a hashtag that is preceded by a word character" do
236
+ def original_text; "ab#cd"; end
237
+
238
+ it "should not be rewritten" do
239
+ @block_args.should be_nil
240
+ @rewritten_text.should == "ab#cd"
241
+ end
242
+ end
243
+
244
+ context "with a page anchor in a url" do
245
+ def original_text; "Here's my url: http://foobar.com/#home"; end
246
+
247
+ it "should not link the hashtag" do
248
+ @block_args.should be_nil
249
+ @rewritten_text.should == "Here's my url: http://foobar.com/#home"
250
+ end
251
+ end
252
+
253
+ context "with a hashtag that starts with a number but has word characters" do
254
+ def original_text; "#2ab"; end
255
+
256
+ it "should be rewritten" do
257
+ @block_args.should == ["#", "2ab"]
258
+ @rewritten_text.should == "[rewritten]"
259
+ end
260
+ end
261
+
262
+ context "with multiple valid hashtags" do
263
+ def original_text; "I'm frickin' awesome #ab #cd #ef"; end
264
+
265
+ it "rewrites each hashtag" do
266
+ @block_args.should == [["#", "ab"], ["#", "cd"], ["#", "ef"]]
267
+ @rewritten_text.should == "I'm frickin' awesome [rewritten] [rewritten] [rewritten]"
268
+ end
269
+ end
270
+
271
+ context "with a hashtag preceded by a ." do
272
+ def original_text; "ok, great.#abc"; end
273
+
274
+ it "should be rewritten" do
275
+ @block_args.should == ["#", "abc"]
276
+ @rewritten_text.should == "ok, great.[rewritten]"
277
+ end
278
+ end
279
+
280
+ context "with a hashtag preceded by a &" do
281
+ def original_text; "&#nbsp;"; end
282
+
283
+ it "should not be rewritten" do
284
+ @block_args.should be_nil
285
+ @rewritten_text.should == "&#nbsp;"
286
+ end
287
+ end
288
+
289
+ context "with a hashtag that ends in an !" do
290
+ def original_text; "#great!"; end
291
+
292
+ it "should be rewritten, but should not include the !" do
293
+ @block_args.should == ["#", "great"];
294
+ @rewritten_text.should == "[rewritten]!"
295
+ end
296
+ end
297
+
298
+ context "with a hashtag followed by Japanese" do
299
+ def original_text; "#twj_devの"; end
300
+
301
+ it "should be rewritten" do
302
+ @block_args.should == ["#", "twj_devの"];
303
+ @rewritten_text.should == "[rewritten]"
304
+ end
305
+ end
306
+
307
+ context "with a hashtag preceded by a full-width space" do
308
+ def original_text; "#{[0x3000].pack('U')}#twj_dev"; end
309
+
310
+ it "should be rewritten" do
311
+ @block_args.should == ["#", "twj_dev"];
312
+ @rewritten_text.should == " [rewritten]"
313
+ end
314
+ end
315
+
316
+ context "with a hashtag followed by a full-width space" do
317
+ def original_text; "#twj_dev#{[0x3000].pack('U')}"; end
318
+
319
+ it "should be rewritten" do
320
+ @block_args.should == ["#", "twj_dev"];
321
+ @rewritten_text.should == "[rewritten] "
322
+ end
323
+ end
324
+
325
+ context "with a hashtag using full-width hash" do
326
+ def original_text; "#{[0xFF03].pack('U')}twj_dev"; end
327
+
328
+ it "should be rewritten" do
329
+ @block_args.should == ["#", "twj_dev"];
330
+ @rewritten_text.should == "[rewritten]"
331
+ end
332
+ end
333
+
334
+ context "with a hashtag containing an accented latin character" do
335
+ def original_text
336
+ # the hashtag is #éhashtag
337
+ "##{[0x00e9].pack('U')}hashtag"
338
+ end
339
+
340
+ it "should be rewritten" do
341
+ @block_args.should == ["#", "éhashtag"];
342
+ @rewritten_text.should == "[rewritten]"
343
+ end
344
+ end
345
+ end #}}}
346
+
347
+ describe "rewrite urls" do #{{{
348
+ def url; "http://www.google.com"; end
349
+
350
+ before do
351
+ @rewritten_text = Twitter::Rewriter.rewrite_urls(original_text, &method(:block))
352
+ end
353
+
354
+ context "when embedded in plain text" do
355
+ def original_text; "On my search engine #{url} I found good links."; end
356
+
357
+ it "should be rewritten" do
358
+ @block_args.should == [url];
359
+ @rewritten_text.should == "On my search engine [rewritten] I found good links."
360
+ end
361
+ end
362
+
363
+ context "when surrounded by Japanese;" do
364
+ def original_text; "いまなにしてる#{url}いまなにしてる"; end
365
+
366
+ it "should be rewritten" do
367
+ @block_args.should == [url];
368
+ @rewritten_text.should == "いまなにしてる[rewritten]いまなにしてる"
369
+ end
370
+ end
371
+
372
+ context "with a path surrounded by parentheses;" do
373
+ def original_text; "I found a neatness (#{url})"; end
374
+
375
+ it "should be rewritten" do
376
+ @block_args.should == [url];
377
+ @rewritten_text.should == "I found a neatness ([rewritten])"
378
+ end
379
+
380
+ context "when the URL ends with a slash;" do
381
+ def url; "http://www.google.com/"; end
382
+
383
+ it "should be rewritten" do
384
+ @block_args.should == [url];
385
+ @rewritten_text.should == "I found a neatness ([rewritten])"
386
+ end
387
+ end
388
+
389
+ context "when the URL has a path;" do
390
+ def url; "http://www.google.com/fsdfasdf"; end
391
+
392
+ it "should be rewritten" do
393
+ @block_args.should == [url];
394
+ @rewritten_text.should == "I found a neatness ([rewritten])"
395
+ end
396
+ end
397
+ end
398
+
399
+ context "when path contains parens" do
400
+ def original_text; "I found a neatness (#{url})"; end
401
+
402
+ it "should be rewritten" do
403
+ @block_args.should == [url];
404
+ @rewritten_text.should == "I found a neatness ([rewritten])"
405
+ end
406
+
407
+ context "wikipedia" do
408
+ def url; "http://en.wikipedia.org/wiki/Madonna_(artist)"; end
409
+
410
+ it "should be rewritten" do
411
+ @block_args.should == [url];
412
+ @rewritten_text.should == "I found a neatness ([rewritten])"
413
+ end
414
+ end
415
+
416
+ context "IIS session" do
417
+ def url; "http://msdn.com/S(deadbeef)/page.htm"; end
418
+
419
+ it "should be rewritten" do
420
+ @block_args.should == [url];
421
+ @rewritten_text.should == "I found a neatness ([rewritten])"
422
+ end
423
+ end
424
+
425
+ context "unbalanced parens" do
426
+ def url; "http://example.com/i_has_a_("; end
427
+
428
+ it "should be rewritten" do
429
+ @block_args.should == ["http://example.com/i_has_a_"];
430
+ @rewritten_text.should == "I found a neatness ([rewritten]()"
431
+ end
432
+ end
433
+
434
+ context "balanced parens with a double quote inside" do
435
+ def url; "http://foo.bar/foo_(\")_bar" end
436
+
437
+ it "should be rewritten" do
438
+ @block_args.should == ["http://foo.bar/foo_"];
439
+ @rewritten_text.should == "I found a neatness ([rewritten](\")_bar)"
440
+ end
441
+ end
442
+
443
+ context "balanced parens hiding XSS" do
444
+ def url; 'http://x.xx/("style="color:red"onmouseover="alert(1)' end
445
+
446
+ it "should be rewritten" do
447
+ @block_args.should == ["http://x.xx/"];
448
+ @rewritten_text.should == 'I found a neatness ([rewritten]("style="color:red"onmouseover="alert(1))'
449
+ end
450
+ end
451
+ end
452
+
453
+ context "when preceded by a :" do
454
+ def original_text; "Check this out @hoverbird:#{url}"; end
455
+
456
+ it "should be rewritten" do
457
+ @block_args.should == [url];
458
+ @rewritten_text.should == "Check this out @hoverbird:[rewritten]"
459
+ end
460
+ end
461
+
462
+ context "with a URL ending in allowed punctuation" do
463
+ it "does not consume ending punctuation" do
464
+ %w| ? ! , . : ; ] ) } = \ ' |.each do |char|
465
+ Twitter::Rewriter.rewrite_urls("#{url}#{char}") do |url|
466
+ url.should == url; "[rewritten]"
467
+ end.should == "[rewritten]#{char}"
468
+ end
469
+ end
470
+ end
471
+
472
+ context "with a URL preceded in forbidden characters" do
473
+ it "should not be rewritten" do
474
+ %w| \ ' / ! = |.each do |char|
475
+ Twitter::Rewriter.rewrite_urls("#{char}#{url}") do |url|
476
+ "[rewritten]" # should not be called here.
477
+ end.should == "#{char}#{url}"
478
+ end
479
+ end
480
+ end
481
+
482
+ context "when embedded in a link tag" do
483
+ def original_text; "<link rel='true'>#{url}</link>"; end
484
+
485
+ it "should be rewritten" do
486
+ @block_args.should == [url];
487
+ @rewritten_text.should == "<link rel='true'>[rewritten]</link>"
488
+ end
489
+ end
490
+
491
+ context "with multiple URLs" do
492
+ def original_text; "http://www.links.org link at start of page, link at end http://www.foo.org"; end
493
+
494
+ it "should autolink each one" do
495
+ @block_args.should == [["http://www.links.org"], ["http://www.foo.org"]];
496
+ @rewritten_text.should == "[rewritten] link at start of page, link at end [rewritten]"
497
+ end
498
+ end
499
+
500
+ context "with multiple URLs in different formats" do
501
+ def original_text; "http://foo.com https://bar.com http://mail.foobar.org"; end
502
+
503
+ it "should autolink each one, in the proper order" do
504
+ @block_args.should == [["http://foo.com"], ["https://bar.com"], ["http://mail.foobar.org"]];
505
+ @rewritten_text.should == "[rewritten] [rewritten] [rewritten]"
506
+ end
507
+ end
508
+
509
+ context "with a URL having a long TLD" do
510
+ def original_text; "Yahoo integriert Facebook http://golem.mobi/0912/71607.html"; end
511
+
512
+ it "should autolink it" do
513
+ @block_args.should == ["http://golem.mobi/0912/71607.html"]
514
+ @rewritten_text.should == "Yahoo integriert Facebook [rewritten]"
515
+ end
516
+ end
517
+
518
+ context "with a url lacking the protocol" do
519
+ def original_text; "I like www.foobar.com dudes"; end
520
+
521
+ it "does not link at all" do
522
+ @block_args.should be_nil
523
+ @rewritten_text.should == "I like www.foobar.com dudes"
524
+ end
525
+ end
526
+
527
+ context "with a @ in a URL" do
528
+ context "with XSS attack" do
529
+ def original_text; 'http://x.xx/@"style="color:pink"onmouseover=alert(1)//'; end
530
+
531
+ it "should not allow XSS follwing @" do
532
+ @block_args.should == ["http://x.xx/"]
533
+ @rewritten_text.should == '[rewritten]@"style="color:pink"onmouseover=alert(1)//'
534
+ end
535
+ end
536
+
537
+ context "with a username not followed by a /" do
538
+ def original_text; "http://example.com/@foobar"; end
539
+
540
+ it "should link small url and username" do
541
+ @block_args.should == ["http://example.com/"]
542
+ @rewritten_text.should == "[rewritten]@foobar"
543
+ end
544
+ end
545
+
546
+ context "with a username followed by a /" do
547
+ def original_text; "http://example.com/@foobar/"; end
548
+
549
+ it "should not link the username but link full url" do
550
+ @block_args.should == ["http://example.com/@foobar/"]
551
+ @rewritten_text.should == "[rewritten]"
552
+ end
553
+ end
554
+ end
555
+ end #}}}
556
+ end
557
+
558
+ # vim: foldmethod=marker