From 55153697cdbe51393b669a4291aa58900b16ad77 Mon Sep 17 00:00:00 2001 From: Daniel Heath Date: Tue, 30 Apr 2019 11:25:41 +1000 Subject: [PATCH] Add spec for middleware --- lib/html-proofer/middleware.rb | 24 +++++++++++++++----- spec/html-proofer/middleware_spec.rb | 33 ++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 spec/html-proofer/middleware_spec.rb diff --git a/lib/html-proofer/middleware.rb b/lib/html-proofer/middleware.rb index 7d979829..273d4b04 100644 --- a/lib/html-proofer/middleware.rb +++ b/lib/html-proofer/middleware.rb @@ -3,6 +3,16 @@ module HTMLProofer class Middleware + class InvalidHtmlError < StandardError + def initialize(failures) + @failures = failures + end + + def message + "HTML Validation errors (skip by adding ?SKIP_VALIDATION to URL): \n#{@failures.join("\n")}" + end + end + def self.options @options ||= { type: :file, @@ -43,12 +53,16 @@ def call(env) return result if env['REQUEST_METHOD'] != 'GET' return result if env['QUERY_STRING'] =~ /SKIP_VALIDATION/ return result if result.first != 200 - - # [@status, @headers, @response] body = [] result.last.each { |e| body << e } - html = body.join('').lstrip - if HTML_SIGNATURE.any? { |sig| html.downcase.starts_with? sig.downcase } + + body = body.join('') + begin + html = body.lstrip + rescue + return result # Invalid encoding; it's not gonna be html. + end + if HTML_SIGNATURE.any? { |sig| html.upcase.starts_with? sig } parsed = HTMLProofer::Runner.new( 'response', Middleware.options @@ -57,7 +71,7 @@ def call(env) ) if parsed[:failures].length > 0 - raise "HTML Validation errors (skip by adding ?SKIP_VALIDATION to URL): \n#{parsed[:failures].join("\n")}" + raise InvalidHtmlError.new(parsed[:failures]) end end result diff --git a/spec/html-proofer/middleware_spec.rb b/spec/html-proofer/middleware_spec.rb new file mode 100644 index 00000000..6828170f --- /dev/null +++ b/spec/html-proofer/middleware_spec.rb @@ -0,0 +1,33 @@ +require 'spec_helper' + +describe 'Middleware test' do + let(:request) {{"REQUEST_METHOD" => "GET"}} + let(:response) { File.open(response_fixture) } + let(:app) { Proc.new {|*args| [200, {}, response] }} + let(:middleware) { HTMLProofer::Middleware.new(app) } + subject { middleware.call(request) } + + context 'with invalid HTML' do + let(:response_fixture) { File.join(FIXTURES_DIR, 'html', 'missing_closing_quotes.html') } + it 'raises an error' do + expect { + subject + }.to raise_error(HTMLProofer::Middleware::InvalidHtmlError) + end + end + + context 'with valid HTML' do + let(:response_fixture) { File.join(FIXTURES_DIR, 'html', 'html5_tags.html') } + it 'does not raise an error' do + subject + end + end + + context 'with non-HTML content' do + let(:response_fixture) { File.join(FIXTURES_DIR, 'images', 'gpl.png') } + it 'does not raise an error' do + subject + end + end + +end