2019-04-30 08:27:42 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2013-04-10 11:27:33 +08:00
|
|
|
require "nokogiri/xml/parse_options"
|
|
|
|
RSpec::Matchers.define :match_html do |expected|
|
2020-12-14 23:49:37 +08:00
|
|
|
match { |actual| make_canonical_html(expected).eql? make_canonical_html(actual) }
|
2013-04-10 11:27:33 +08:00
|
|
|
|
2015-04-25 23:47:20 +08:00
|
|
|
failure_message do |actual|
|
2013-06-13 17:09:11 +08:00
|
|
|
"after sanitizing for extra white space and compactness, expected:\n#{actual}\n to match:\n#{expected}"
|
2013-04-10 11:27:33 +08:00
|
|
|
end
|
|
|
|
|
2015-04-25 23:47:20 +08:00
|
|
|
failure_message_when_negated do |actual|
|
2013-06-13 17:09:11 +08:00
|
|
|
"after sanitizing for extra white space and compactness, expected:\n#{actual}\n not to match:\n#{expected}"
|
2013-04-10 11:27:33 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
def make_canonical_html(html)
|
2020-12-14 23:49:37 +08:00
|
|
|
doc =
|
|
|
|
Nokogiri.HTML5(html) do |config|
|
|
|
|
config[:options] = Nokogiri::XML::ParseOptions::NOBLANKS |
|
|
|
|
Nokogiri::XML::ParseOptions::COMPACT
|
|
|
|
end
|
|
|
|
|
|
|
|
doc.traverse do |node|
|
|
|
|
node.content = node.content.gsub(/\s+/, " ").strip if node.node_name&.downcase == "text"
|
|
|
|
end
|
|
|
|
|
|
|
|
doc.to_html
|
2013-04-10 11:27:33 +08:00
|
|
|
end
|
|
|
|
end
|