Convert aaa_string_test to RSpec
This commit is contained in:
parent
2af6392172
commit
ffb64d65d3
7 changed files with 2021 additions and 54441 deletions
File diff suppressed because it is too large
Load diff
186
spec/lib/html_sanitizer_spec.rb
Normal file
186
spec/lib/html_sanitizer_spec.rb
Normal file
|
@ -0,0 +1,186 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe HtmlSanitizer do
|
||||||
|
describe '.replace_inline_images' do
|
||||||
|
let(:body) { HtmlSanitizer.replace_inline_images(html).first }
|
||||||
|
let(:inline_attachments) { HtmlSanitizer.replace_inline_images(html).last }
|
||||||
|
|
||||||
|
context 'for image at absolute path' do
|
||||||
|
let(:html) { '<img src="/some_one.png" style="width: 181px; height: 125px" alt="abc">' }
|
||||||
|
|
||||||
|
it 'keeps src attr as-is' do
|
||||||
|
expect(body).to match(%r{<img src="/some_one.png" style="width: 181px; height: 125px" alt="abc">})
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'extracts no attachments' do
|
||||||
|
expect(inline_attachments).to be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'for base64-encoded inline images' do
|
||||||
|
context 'with src attr last' do
|
||||||
|
let(:html) { '<img style="width: 181px; height: 125px" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/...">' }
|
||||||
|
|
||||||
|
it 'converts embedded image to cid' do
|
||||||
|
expect(body).to match(/<img style="width: 181px; height: 125px" src="cid:.+?">/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'extracts one attachment' do
|
||||||
|
expect(inline_attachments).to be_one
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets filename to image1.jpeg' do
|
||||||
|
expect(inline_attachments.first[:filename]).to eq('image1.jpeg')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets Content-Type to image/jpeg' do
|
||||||
|
expect(inline_attachments.first[:preferences]['Content-Type']).to eq('image/jpeg')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets Content-ID based on Zammad fqdn' do
|
||||||
|
expect(inline_attachments.first[:preferences]['Content-ID']).to match(/@#{Setting.get('fqdn')}/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets Content-Disposition to inline' do
|
||||||
|
expect(inline_attachments.first[:preferences]['Content-Disposition']).to eq('inline')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with src attr first' do
|
||||||
|
let(:html) { '<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/..." style="width: 181px; height: 125px" alt="abc">' }
|
||||||
|
|
||||||
|
it 'converts embedded image to cid' do
|
||||||
|
expect(body).to match(/<img src="cid:.+?" style="width: 181px; height: 125px" alt="abc">/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'extracts one attachment' do
|
||||||
|
expect(inline_attachments).to be_one
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets filename to image1.jpeg' do
|
||||||
|
expect(inline_attachments.first[:filename]).to eq('image1.jpeg')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets Content-Type to image/jpeg' do
|
||||||
|
expect(inline_attachments.first[:preferences]['Content-Type']).to eq('image/jpeg')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets Content-ID based on Zammad fqdn' do
|
||||||
|
expect(inline_attachments.first[:preferences]['Content-ID']).to match(/@#{Setting.get('fqdn')}/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets Content-Disposition to inline' do
|
||||||
|
expect(inline_attachments.first[:preferences]['Content-Disposition']).to eq('inline')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'followed by an incomplete/invalid HTML tag' do
|
||||||
|
let(:html) { '<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/..." style="width: 181px; height: 125px" alt="abc"><invalid what ever' }
|
||||||
|
|
||||||
|
it 'converts embedded image to cid' do
|
||||||
|
expect(body).to match(/<img src="cid:.+?" style="width: 181px; height: 125px" alt="abc">/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'extracts one attachment' do
|
||||||
|
expect(inline_attachments).to be_one
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets filename to image1.jpeg' do
|
||||||
|
expect(inline_attachments.first[:filename]).to eq('image1.jpeg')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets Content-Type to image/jpeg' do
|
||||||
|
expect(inline_attachments.first[:preferences]['Content-Type']).to eq('image/jpeg')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets Content-ID based on Zammad fqdn' do
|
||||||
|
expect(inline_attachments.first[:preferences]['Content-ID']).to match(/@#{Setting.get('fqdn')}/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets Content-Disposition to inline' do
|
||||||
|
expect(inline_attachments.first[:preferences]['Content-Disposition']).to eq('inline')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'nested in a <div>, mixed with other HTML elements' do
|
||||||
|
let(:html) { '<div><img style="width: 181px; height: 125px" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/..."><p>123</p><img style="width: 181px; height: 125px" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/..."></div>' }
|
||||||
|
|
||||||
|
it 'converts embedded image to cid' do
|
||||||
|
expect(body).to match(%r{<div>\s+<img style="width: 181px; height: 125px" src="cid:.+?"><p>123</p>\s+<img style="width: 181px; height: 125px" src="cid:.+?">\s+</div>})
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'extracts two attachments' do
|
||||||
|
expect(inline_attachments.length).to be(2)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets filenames sequentially (as imageN.jpeg)' do
|
||||||
|
expect(inline_attachments.first[:filename]).to eq('image1.jpeg')
|
||||||
|
expect(inline_attachments.second[:filename]).to eq('image2.jpeg')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets Content-Types to image/jpeg' do
|
||||||
|
expect(inline_attachments.first[:preferences]['Content-Type']).to eq('image/jpeg')
|
||||||
|
expect(inline_attachments.second[:preferences]['Content-Type']).to eq('image/jpeg')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets Content-IDs based on Zammad fqdn' do
|
||||||
|
expect(inline_attachments.first[:preferences]['Content-ID']).to match(/@#{Setting.get('fqdn')}/)
|
||||||
|
expect(inline_attachments.second[:preferences]['Content-ID']).to match(/@#{Setting.get('fqdn')}/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets Content-Dispositions to inline' do
|
||||||
|
expect(inline_attachments.first[:preferences]['Content-Disposition']).to eq('inline')
|
||||||
|
expect(inline_attachments.second[:preferences]['Content-Disposition']).to eq('inline')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '.dynamic_image_size' do
|
||||||
|
context 'for image at absolute path' do
|
||||||
|
context 'with src attr last' do
|
||||||
|
it 'add max-width: 100% rule to style attr' do
|
||||||
|
expect(HtmlSanitizer.dynamic_image_size(<<~HTML.chomp)).to match(Regexp.new(<<~REGEX.chomp))
|
||||||
|
<img style="width: 181px; height: 125px" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/...">
|
||||||
|
HTML
|
||||||
|
<img style="max-width:100%;width: 181px;max-height: 125px;" src="data:image.+?">
|
||||||
|
REGEX
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with src attr first' do
|
||||||
|
it 'add max-width: 100% rule to style attr' do
|
||||||
|
expect(HtmlSanitizer.dynamic_image_size(<<~HTML.chomp)).to match(Regexp.new(<<~REGEX.chomp))
|
||||||
|
<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/..." style="width: 181px; height: 125px" alt="abc">
|
||||||
|
HTML
|
||||||
|
<img src="data:image.+?" style="max-width:100%;width: 181px;max-height: 125px;" alt="abc">
|
||||||
|
REGEX
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'for base64-encoded inline images' do
|
||||||
|
context 'with src attr last' do
|
||||||
|
it 'add max-width: 100% rule to style attr' do
|
||||||
|
expect(HtmlSanitizer.dynamic_image_size(<<~HTML.chomp)).to match(Regexp.new(<<~REGEX.chomp))
|
||||||
|
<img src="/some_one.png" style="width: 181px; height: 125px" alt="abc">
|
||||||
|
HTML
|
||||||
|
<img src="/some_one.png" style="max-width:100%;width: 181px;max-height: 125px;" alt="abc">
|
||||||
|
REGEX
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with src attr first' do
|
||||||
|
it 'add max-width: 100% rule to style attr' do
|
||||||
|
expect(HtmlSanitizer.dynamic_image_size(<<~HTML.chomp)).to match(Regexp.new(<<~REGEX.chomp))
|
||||||
|
<img src="/some_one.png" alt="abc">
|
||||||
|
HTML
|
||||||
|
<img src="/some_one.png" alt="abc" style="max-width:100%;">
|
||||||
|
REGEX
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,20 +0,0 @@
|
||||||
<html>
|
|
||||||
<title>some title</title>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<div>hello</div>
|
|
||||||
|
|
||||||
<p>some word <a href="http://example.com?domain?example.com">some url</a> and the end.</p>
|
|
||||||
<p>some word <a href="http://example.com?domain?example.com">some url</a> and the end.</p>
|
|
||||||
<p>some word <a href="http://example.com?domain?example.com">some url</a> and the end.</p>
|
|
||||||
<p>some word <a href="http://example.com?domain?example.com">some url</a> and the end.</p>
|
|
||||||
<p>some word <a href="http://example.com?domain?example.com">some url</a> and the end.</p>
|
|
||||||
<p>some word <a href="http://example.com?domain?example.com">some url</a> and the end.</p>
|
|
||||||
<p>some word <a href="http://example.com?domain?example.com">some url</a> and the end.</p>
|
|
||||||
<p>some word <a href="http://example.com?domain?example.com">some url</a> and the end.</p>
|
|
||||||
<p>some word <a href="http://example.com?domain?example.com">some url</a> and the end.</p>
|
|
||||||
<p>some word <a href="http://example.com?domain?example.com">some url</a> and the end.</p>
|
|
||||||
<p>some word <a href="http://example.com?domain?example.com">some url</a> and the end.</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,26 +0,0 @@
|
||||||
some title
|
|
||||||
hello
|
|
||||||
|
|
||||||
some word [1] some url and the end.
|
|
||||||
some word [2] some url and the end.
|
|
||||||
some word [3] some url and the end.
|
|
||||||
some word [4] some url and the end.
|
|
||||||
some word [5] some url and the end.
|
|
||||||
some word [6] some url and the end.
|
|
||||||
some word [7] some url and the end.
|
|
||||||
some word [8] some url and the end.
|
|
||||||
some word [9] some url and the end.
|
|
||||||
some word [10] some url and the end.
|
|
||||||
some word [11] some url and the end.
|
|
||||||
|
|
||||||
[1] http://example.com?domain?example.com
|
|
||||||
[2] http://example.com?domain?example.com
|
|
||||||
[3] http://example.com?domain?example.com
|
|
||||||
[4] http://example.com?domain?example.com
|
|
||||||
[5] http://example.com?domain?example.com
|
|
||||||
[6] http://example.com?domain?example.com
|
|
||||||
[7] http://example.com?domain?example.com
|
|
||||||
[8] http://example.com?domain?example.com
|
|
||||||
[9] http://example.com?domain?example.com
|
|
||||||
[10] http://example.com?domain?example.com
|
|
||||||
[11] http://example.com?domain?example.com
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue