mirror of
https://github.com/discourse/discourse.git
synced 2025-06-03 19:39:30 +08:00
DEV: Move spec/components to spec/lib (#15987)
Lib specs were inexplicably split into two directories (`lib` and `components`) This moves them all into `lib`.
This commit is contained in:
192
spec/lib/email_cook_spec.rb
Normal file
192
spec/lib/email_cook_spec.rb
Normal file
@ -0,0 +1,192 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
require 'email_cook'
|
||||
require 'pretty_text'
|
||||
|
||||
describe EmailCook do
|
||||
it "uses to PrettyText when there is no [plaintext] in raw" do
|
||||
raw = "**Hello world!**"
|
||||
expect(cook(raw)).to eq(PrettyText.cook(raw))
|
||||
end
|
||||
|
||||
it "adds linebreaks to short lines" do
|
||||
raw = plaintext("hello\nworld\n")
|
||||
expect(cook(raw)).to eq("hello\n<br>world\n<br>")
|
||||
end
|
||||
|
||||
it "doesn't add linebreaks to long lines" do
|
||||
long = plaintext(<<~LONG_EMAIL)
|
||||
Hello,
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc convallis volutpat
|
||||
risus. Nulla ac faucibus quam, quis cursus lorem. Sed rutrum eget nunc sed accumsan.
|
||||
Vestibulum feugiat mi vitae turpis tempor dignissim.
|
||||
LONG_EMAIL
|
||||
|
||||
long_cooked = (+<<~LONG_COOKED).strip!
|
||||
Hello,
|
||||
<br>
|
||||
<br>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc convallis volutpat
|
||||
risus. Nulla ac faucibus quam, quis cursus lorem. Sed rutrum eget nunc sed accumsan.
|
||||
Vestibulum feugiat mi vitae turpis tempor dignissim.
|
||||
<br>
|
||||
LONG_COOKED
|
||||
|
||||
expect(cook(long)).to eq(long_cooked)
|
||||
end
|
||||
|
||||
it "replaces a blank line with 2 linebreaks" do
|
||||
long = plaintext(<<~LONG_EMAIL)
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc convallis volutpat
|
||||
risus.
|
||||
Nulla ac faucibus quam, quis cursus lorem. Sed rutrum eget nunc sed accumsan.
|
||||
|
||||
Vestibulum feugiat mi vitae turpis tempor dignissim.
|
||||
|
||||
Stet clita kasd gubergren.
|
||||
LONG_EMAIL
|
||||
|
||||
long_cooked = (+<<~LONG_COOKED).strip!
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc convallis volutpat
|
||||
risus.
|
||||
<br>Nulla ac faucibus quam, quis cursus lorem. Sed rutrum eget nunc sed accumsan.
|
||||
<br>
|
||||
<br>Vestibulum feugiat mi vitae turpis tempor dignissim.
|
||||
<br>
|
||||
<br>Stet clita kasd gubergren.
|
||||
<br>
|
||||
LONG_COOKED
|
||||
|
||||
expect(cook(long)).to eq(long_cooked)
|
||||
end
|
||||
|
||||
it "escapes HTML" do
|
||||
long = plaintext(<<~LONG_EMAIL)
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||
|
||||
<form name="f1" method="post" action="test.html" onsubmit="javascript:showAlert()">
|
||||
<input type="submit" name="submit" value="Click this button" />
|
||||
</form>
|
||||
|
||||
Nunc convallis volutpat risus.
|
||||
LONG_EMAIL
|
||||
|
||||
long_cooked = (+<<~LONG_COOKED).strip!
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||
<br>
|
||||
<br><form name="f1" method="post" action="test.html" onsubmit="javascript:showAlert()">
|
||||
<input type="submit" name="submit" value="Click this button" />
|
||||
</form>
|
||||
<br>
|
||||
<br>Nunc convallis volutpat risus.
|
||||
<br>
|
||||
LONG_COOKED
|
||||
|
||||
expect(cook(long)).to eq(long_cooked)
|
||||
end
|
||||
|
||||
it "replaces indentation of more than 2 spaces with corresponding amount of non-breaking spaces" do
|
||||
nbsp = "\u00A0"
|
||||
long = plaintext(<<~LONG_EMAIL)
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||
|
||||
this is intended by 4 spaces
|
||||
this is intended by 1 space
|
||||
no indentation, but lots of spaces
|
||||
LONG_EMAIL
|
||||
|
||||
long_cooked = (+<<~LONG_COOKED).strip!
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||
<br>
|
||||
<br>#{nbsp}#{nbsp}#{nbsp}#{nbsp}this is intended by 4 spaces
|
||||
<br> this is intended by 1 space
|
||||
<br>no indentation, but lots of spaces
|
||||
<br>
|
||||
LONG_COOKED
|
||||
|
||||
expect(cook(long)).to eq(long_cooked)
|
||||
end
|
||||
|
||||
it "creates oneboxed link when the line contains only a link" do
|
||||
raw = plaintext("https://www.eviltrout.com")
|
||||
expect(cook(raw)).to eq('<a href="https://www.eviltrout.com" class="onebox" target="_blank">https://www.eviltrout.com</a><br>')
|
||||
end
|
||||
|
||||
it "autolinks without the beginning of a line" do
|
||||
raw = plaintext("my site: https://www.eviltrout.com")
|
||||
expect(cook(raw)).to eq('my site: <a href="https://www.eviltrout.com">https://www.eviltrout.com</a><br>')
|
||||
end
|
||||
|
||||
it "autolinks without the end of a line" do
|
||||
raw = plaintext("https://www.eviltrout.com is my site")
|
||||
expect(cook(raw)).to eq('<a href="https://www.eviltrout.com">https://www.eviltrout.com</a> is my site<br>')
|
||||
end
|
||||
|
||||
it "links even within a quote" do
|
||||
raw = plaintext("> https://www.eviltrout.com is my site")
|
||||
expect(cook(raw)).to eq('<blockquote><a href="https://www.eviltrout.com">https://www.eviltrout.com</a> is my site<br></blockquote>')
|
||||
end
|
||||
|
||||
it "it works and does not interpret Markdown in plaintext and elided" do
|
||||
long = <<~LONG_EMAIL
|
||||
[plaintext]
|
||||
*Lorem ipsum* dolor sit amet, consectetur adipiscing elit.
|
||||
[/plaintext]
|
||||
[attachments]
|
||||
<img src='some_image.png' width='100' height='100'>
|
||||
[/attachments]
|
||||
[elided]
|
||||
At vero eos *et accusam* et justo duo dolores et ea rebum.
|
||||
[/elided]
|
||||
LONG_EMAIL
|
||||
|
||||
long_cooked = <<~LONG_COOKED
|
||||
*Lorem ipsum* dolor sit amet, consectetur adipiscing elit.<br>
|
||||
<br><img src='some_image.png' width='100' height='100'>
|
||||
<br><br>
|
||||
|
||||
<details class='elided'>
|
||||
<summary title='Show trimmed content'>···</summary>
|
||||
|
||||
At vero eos *et accusam* et justo duo dolores et ea rebum.<br>
|
||||
|
||||
</details>
|
||||
LONG_COOKED
|
||||
|
||||
expect(cook(long)).to eq(long_cooked)
|
||||
end
|
||||
|
||||
it "works without attachments" do
|
||||
long = <<~LONG_EMAIL
|
||||
[plaintext]
|
||||
*Lorem ipsum* dolor sit amet, consectetur adipiscing elit.
|
||||
[/plaintext]
|
||||
[elided]
|
||||
At vero eos *et accusam* et justo duo dolores et ea rebum.
|
||||
[/elided]
|
||||
LONG_EMAIL
|
||||
|
||||
long_cooked = <<~LONG_COOKED
|
||||
*Lorem ipsum* dolor sit amet, consectetur adipiscing elit.<br>
|
||||
<br><br>
|
||||
|
||||
<details class='elided'>
|
||||
<summary title='Show trimmed content'>···</summary>
|
||||
|
||||
At vero eos *et accusam* et justo duo dolores et ea rebum.<br>
|
||||
|
||||
</details>
|
||||
LONG_COOKED
|
||||
|
||||
expect(cook(long)).to eq(long_cooked)
|
||||
end
|
||||
|
||||
def cook(raw)
|
||||
EmailCook.new(raw).cook
|
||||
end
|
||||
|
||||
def plaintext(text)
|
||||
"[plaintext]\n#{text}\n[/plaintext]"
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user