spec/lib/roadie/inliner_spec.rb in roadie-4.0.0 vs spec/lib/roadie/inliner_spec.rb in roadie-5.0.0
- old
+ new
@@ -1,72 +1,74 @@
# frozen_string_literal: true
-require 'spec_helper'
+require "spec_helper"
module Roadie
describe Inliner do
- before { @stylesheet = "".freeze }
- def use_css(css) @stylesheet = Stylesheet.new("example", css) end
+ before { @stylesheet = "" }
+ def use_css(css)
+ @stylesheet = Stylesheet.new("example", css)
+ end
def rendering(html, stylesheet = @stylesheet)
dom = Nokogiri::HTML.parse html
Inliner.new([stylesheet], dom).inline
dom
end
describe "inlining styles" do
it "inlines simple attributes" do
- use_css 'p { color: green }'
- expect(rendering('<p></p>')).to have_styling('color' => 'green')
+ use_css "p { color: green }"
+ expect(rendering("<p></p>")).to have_styling("color" => "green")
end
it "keeps multiple versions of the same property to support progressive enhancement" do
# https://github.com/premailer/css_parser/issues/44
pending "css_parser issue #44"
- use_css 'p { color: #eee; color: rgba(255, 255, 255, 0.9); }'
- expect(rendering('<p></p>')).to have_styling(
- [['color', 'green'], ['color', 'rgba(255, 255, 255, 0.9)']]
+ use_css "p { color: #eee; color: rgba(255, 255, 255, 0.9); }"
+ expect(rendering("<p></p>")).to have_styling(
+ [["color", "green"], ["color", "rgba(255, 255, 255, 0.9)"]]
)
end
it "de-duplicates identical styles" do
use_css '
p { color: green; }
.message { color: blue; }
.positive { color: green; }
'
expect(rendering('<p class="message positive"></p>')).to have_styling(
- [['color', 'blue'], ['color', 'green']]
+ [["color", "blue"], ["color", "green"]]
)
end
it "inlines browser-prefixed attributes" do
- use_css 'p { -vendor-color: green }'
- expect(rendering('<p></p>')).to have_styling('-vendor-color' => 'green')
+ use_css "p { -vendor-color: green }"
+ expect(rendering("<p></p>")).to have_styling("-vendor-color" => "green")
end
it "inlines CSS3 attributes" do
- use_css 'p { border-radius: 2px; }'
- expect(rendering('<p></p>')).to have_styling('border-radius' => '2px')
+ use_css "p { border-radius: 2px; }"
+ expect(rendering("<p></p>")).to have_styling("border-radius" => "2px")
end
it "keeps the order of the styles that are inlined" do
- use_css 'h1 { padding: 2px; margin: 5px; }'
- expect(rendering('<h1></h1>')).to have_styling([['padding', '2px'], ['margin', '5px']])
+ use_css "h1 { padding: 2px; margin: 5px; }"
+ expect(rendering("<h1></h1>")).to have_styling([["padding", "2px"], ["margin", "5px"]])
end
it "combines multiple selectors into one" do
use_css 'p { color: green; }
.tip { float: right; }'
- expect(rendering('<p class="tip"></p>')).to have_styling([['color', 'green'], ['float', 'right']])
+ expect(rendering('<p class="tip"></p>')).to have_styling([["color", "green"], ["float", "right"]])
end
it "uses the attributes with the highest specificity when conflicts arises" do
use_css ".safe { color: green; }
p { color: red; }"
- expect(rendering('<p class="safe"></p>')).to have_styling([['color', 'red'], ['color', 'green']])
+ expect(rendering('<p class="safe"></p>')).to have_styling([["color", "red"], ["color", "green"]])
end
it "sorts styles by specificity order" do
use_css 'p { important: no; }
#important { important: very; }
@@ -80,37 +82,37 @@
%w[important no], %w[important yes], %w[important very]
])
end
it "supports multiple selectors for the same rules" do
- use_css 'p, a { color: green; }'
- rendering('<p></p><a></a>').tap do |document|
- expect(document).to have_styling('color' => 'green').at_selector('p')
- expect(document).to have_styling('color' => 'green').at_selector('a')
+ use_css "p, a { color: green; }"
+ rendering("<p></p><a></a>").tap do |document|
+ expect(document).to have_styling("color" => "green").at_selector("p")
+ expect(document).to have_styling("color" => "green").at_selector("a")
end
end
it "keeps !important properties" do
use_css "a { text-decoration: underline !important; }
a.hard-to-spot { text-decoration: none; }"
expect(rendering('<a class="hard-to-spot"></a>')).to have_styling([
- ['text-decoration', 'none'], ['text-decoration', 'underline !important']
+ ["text-decoration", "none"], ["text-decoration", "underline !important"]
])
end
it "combines with already present inline styles" do
use_css "p { color: green }"
- expect(rendering('<p style="font-size: 1.1em"></p>')).to have_styling([['color', 'green'], ['font-size', '1.1em']])
+ expect(rendering('<p style="font-size: 1.1em"></p>')).to have_styling([["color", "green"], ["font-size", "1.1em"]])
end
it "does not override inline styles" do
use_css "p { text-transform: uppercase; color: red }"
# The two color properties are kept to make css fallbacks work correctly
expect(rendering('<p style="color: green"></p>')).to have_styling([
- ['text-transform', 'uppercase'],
- ['color', 'red'],
- ['color', 'green'],
+ ["text-transform", "uppercase"],
+ ["color", "red"],
+ ["color", "green"]
])
end
it "does not apply link and dynamic pseudo selectors" do
use_css "
@@ -121,28 +123,28 @@
p:target { color: red }
p:visited { color: red }
p.active { width: 100%; }
"
- expect(rendering('<p class="active"></p>')).to have_styling('width' => '100%')
+ expect(rendering('<p class="active"></p>')).to have_styling("width" => "100%")
end
it "does not crash on any pseudo element selectors" do
use_css "
p.some-element { width: 100%; }
p::some-element { color: red; }
"
- expect(rendering('<p class="some-element"></p>')).to have_styling('width' => '100%')
+ expect(rendering('<p class="some-element"></p>')).to have_styling("width" => "100%")
end
it "warns on selectors that crash Nokogiri" do
dom = Nokogiri::HTML.parse "<p></p>"
stylesheet = Stylesheet.new "foo.css", "p[%^=foo] { color: red; }"
inliner = Inliner.new([stylesheet], dom)
expect(Utils).to receive(:warn).with(
- %{Cannot inline "p[%^=foo]" from "foo.css" stylesheet. If this is valid CSS, please report a bug.}
+ %(Cannot inline "p[%^=foo]" from "foo.css" stylesheet. If this is valid CSS, please report a bug.)
)
inliner.inline
end
it "works with nth-child" do
@@ -150,21 +152,21 @@
p { color: red; }
p:nth-child(2n) { color: green; }
"
result = rendering("<p></p> <p></p>")
- expect(result).to have_styling([['color', 'red']]).at_selector('p:first')
- expect(result).to have_styling([['color', 'red'], ['color', 'green']]).at_selector('p:last')
+ expect(result).to have_styling([["color", "red"]]).at_selector("p:first")
+ expect(result).to have_styling([["color", "red"], ["color", "green"]]).at_selector("p:last")
end
context "with uninlinable selectors" do
before do
allow(Roadie::Utils).to receive(:warn)
end
it "puts them in a new <style> element in the <head>" do
- use_css 'a:hover { color: red; }'
+ use_css "a:hover { color: red; }"
result = rendering("
<html>
<head></head>
<body><a></a></body>
</html>
@@ -172,11 +174,11 @@
expect(result).to have_selector("head > style")
expect(result.at_css("head > style").text).to eq "a:hover{color:red}"
end
it "puts them in <head> on unexpected inlining problems" do
- use_css 'p:some-future-thing { color: red; }'
+ use_css "p:some-future-thing { color: red; }"
result = rendering("
<html>
<head></head>
<body><p></p></body>
</html>
@@ -196,19 +198,13 @@
background-position: 0 0;
}
}'
use_css css
- result = rendering('<p></p>')
+ result = rendering("<p></p>")
expect(result).to have_styling([]).at_selector("p")
-
- # css_parser actually sees an empty @keyframes on JRuby, and nothing
- # on the others
- if (style_element = result.at_css("head > style"))
- expect(style_element.text).to_not include "background-position"
- end
end
it "ignores them if told not to keep them" do
stylesheet = use_css "
p:hover { color: red; }
@@ -223,34 +219,34 @@
Inliner.new([stylesheet], dom).inline(keep_uninlinable_css: false)
expect(dom).to_not have_selector("head > style")
end
it "puts the <style> element at the root when told so" do
- stylesheet = use_css 'a:hover { color: red; }'
+ stylesheet = use_css "a:hover { color: red; }"
dom = Nokogiri::HTML.fragment("
<a></a>
")
Inliner.new([stylesheet], dom).inline(
keep_uninlinable_css: true,
- keep_uninlinable_in: :root,
+ keep_uninlinable_in: :root
)
expect(dom).to have_xpath("./a")
expect(dom).to have_xpath("./style")
end
it "raises error when told to save styles in an unknown place" do
- stylesheet = use_css 'a:hover { color: red; }'
+ stylesheet = use_css "a:hover { color: red; }"
dom = Nokogiri::HTML.fragment("
<a></a>
")
inliner = Inliner.new([stylesheet], dom)
expect {
inliner.inline(
keep_uninlinable_css: true,
- keep_uninlinable_in: :unknown_place,
+ keep_uninlinable_in: :unknown_place
)
}.to raise_error(ArgumentError, /:unknown_place/)
end
end
end