premailer-rails 1.9.7 → 1.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +4 -0
  3. data/.travis.yml +3 -2
  4. data/CHANGELOG.md +26 -0
  5. data/Gemfile +8 -4
  6. data/README.md +21 -29
  7. data/VERSION +1 -1
  8. data/lib/premailer/rails/css_helper.rb +30 -11
  9. data/lib/premailer/rails/css_loaders/asset_pipeline_loader.rb +12 -11
  10. data/lib/premailer/rails/css_loaders/network_loader.rb +1 -1
  11. data/lib/premailer/rails/css_loaders.rb +0 -1
  12. data/lib/premailer/rails/customized_premailer.rb +4 -4
  13. data/lib/premailer/rails/hook.rb +2 -6
  14. data/lib/premailer/rails.rb +2 -1
  15. data/premailer-rails.gemspec +1 -2
  16. data/spec/integration/css_helper_spec.rb +170 -139
  17. data/spec/integration/delivery_spec.rb +13 -0
  18. data/spec/integration/hook_spec.rb +36 -11
  19. data/spec/rails_app/app/assets/config/manifest.js +3 -0
  20. data/spec/rails_app/app/assets/stylesheets/application.css +3 -0
  21. data/spec/rails_app/app/mailers/application_mailer.rb +4 -0
  22. data/spec/rails_app/app/mailers/welcome_mailer.rb +6 -0
  23. data/spec/rails_app/app/views/layouts/mailer.html.erb +11 -0
  24. data/spec/rails_app/app/views/welcome_mailer/welcome_email.html.erb +1 -0
  25. data/spec/rails_app/config/application.rb +13 -0
  26. data/spec/rails_app/config/boot.rb +5 -0
  27. data/spec/rails_app/config/environment.rb +2 -0
  28. data/spec/rails_app/config/environments/test.rb +10 -0
  29. data/spec/rails_app/config/initializers/assets.rb +1 -0
  30. data/spec/rails_app/config/routes.rb +3 -0
  31. data/spec/rails_app/config.ru +5 -0
  32. data/spec/rails_app/log/.keep +0 -0
  33. data/spec/rails_app/tmp/.keep +0 -0
  34. data/spec/spec_helper.rb +3 -8
  35. data/spec/support/fixtures/message.rb +40 -0
  36. data/spec/unit/css_loaders/network_loader_spec.rb +1 -1
  37. data/spec/unit/customized_premailer_spec.rb +32 -40
  38. metadata +35 -31
  39. data/lib/premailer/rails/css_loaders/cache_loader.rb +0 -29
  40. data/spec/integration/hook_registration_spec.rb +0 -11
  41. data/spec/support/stubs/action_mailer.rb +0 -5
  42. data/spec/support/stubs/rails.rb +0 -51
@@ -1,186 +1,217 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Premailer::Rails::CSSHelper do
4
- [ :Nokogiri, :Hpricot ].each do |adapter|
5
- next if adapter == :Hpricot and RUBY_PLATFORM == 'java'
4
+ # Reset the CSS cache:
5
+ after do
6
+ Premailer::Rails::CSSHelper.cache = {}
7
+ end
6
8
 
7
- context "when adapter is #{adapter}" do
8
- # Reset the CSS cache:
9
- after do
10
- Premailer::Rails::CSSLoaders::CacheLoader.clear!
11
- end
9
+ def css_for_url(path)
10
+ Premailer::Rails::CSSHelper.css_for_url(path)
11
+ end
12
+
13
+ def css_for_doc(doc)
14
+ Premailer::Rails::CSSHelper.css_for_doc(doc)
15
+ end
16
+
17
+ def expect_file(path, content='file content')
18
+ path = "#{Rails.root}/#{path}"
19
+ allow(File).to receive(:file?).with(path).and_return(true)
20
+ expect(File).to receive(:read).with(path).and_return(content)
21
+ end
12
22
 
13
- def css_for_url(path)
14
- Premailer::Rails::CSSHelper.css_for_url(path)
23
+ describe '#css_for_doc' do
24
+ let(:html) { Fixtures::HTML.with_css_links(*files) }
25
+ let(:doc) { Nokogiri(html) }
26
+
27
+ context 'when HTML contains linked CSS files' do
28
+ let(:files) { %w[ stylesheets/base.css stylesheets/font.css ] }
29
+
30
+ it 'returns the content of both files concatenated' do
31
+ allow(Premailer::Rails::CSSHelper).to \
32
+ receive(:css_for_url)
33
+ .with('http://example.com/stylesheets/base.css')
34
+ .and_return('content of base.css')
35
+ allow(Premailer::Rails::CSSHelper).to \
36
+ receive(:css_for_url)
37
+ .with('http://example.com/stylesheets/font.css')
38
+ .and_return('content of font.css')
39
+
40
+ expect(css_for_doc(doc)).to eq("content of base.css\ncontent of font.css")
15
41
  end
42
+ end
16
43
 
17
- def css_for_doc(doc)
18
- Premailer::Rails::CSSHelper.css_for_doc(doc)
44
+ context 'when HTML contains ignored links' do
45
+ let(:files) { ['ignore.css', 'data-premailer' => 'ignore'] }
46
+
47
+ it 'ignores links' do
48
+ expect(Premailer::Rails::CSSHelper).to_not receive(:css_for_url)
49
+ css_for_doc(doc)
19
50
  end
51
+ end
52
+ end
20
53
 
21
- def expect_file(path, content='file content')
22
- allow(File).to receive(:file?).with(path).and_return(true)
23
- expect(File).to receive(:read).with(path).and_return(content)
54
+ describe '#css_for_url' do
55
+ context 'when path is a url' do
56
+ it 'loads the CSS at the local path' do
57
+ expect_file('public/stylesheets/base.css')
58
+
59
+ css_for_url('http://example.com/stylesheets/base.css?test')
24
60
  end
61
+ end
25
62
 
26
- describe '#css_for_doc' do
27
- let(:html) { Fixtures::HTML.with_css_links(*files) }
28
- let(:doc) { send(adapter, html) }
63
+ context 'when path is a relative url' do
64
+ it 'loads the CSS at the local path' do
65
+ expect_file('public/stylesheets/base.css')
66
+ css_for_url('/stylesheets/base.css?test')
67
+ end
68
+ end
29
69
 
30
- context 'when HTML contains linked CSS files' do
31
- let(:files) { %w[ stylesheets/base.css stylesheets/font.css ] }
70
+ context 'when cache is enabled' do
71
+ before do
72
+ allow(Premailer::Rails::CSSHelper).to receive(:cache_enabled?).and_return(true)
73
+ end
32
74
 
33
- it 'returns the content of both files concatenated' do
34
- allow(Premailer::Rails::CSSHelper).to \
35
- receive(:css_for_url)
36
- .with('http://example.com/stylesheets/base.css')
37
- .and_return('content of base.css')
38
- allow(Premailer::Rails::CSSHelper).to \
39
- receive(:css_for_url)
40
- .with('http://example.com/stylesheets/font.css')
41
- .and_return('content of font.css')
75
+ context 'when file is cached' do
76
+ it 'returns the cached value' do
77
+ Premailer::Rails::CSSHelper.cache['http://example.com/stylesheets/base.css'] = 'content of base.css'
42
78
 
43
- expect(css_for_doc(doc)).to eq("content of base.css\ncontent of font.css")
44
- end
79
+ expect(css_for_url('http://example.com/stylesheets/base.css')).to \
80
+ eq('content of base.css')
45
81
  end
82
+ end
83
+ end
46
84
 
47
- context 'when HTML contains ignored links' do
48
- let(:files) { ['ignore.css', 'data-premailer' => 'ignore'] }
85
+ context 'when cache is disabled' do
86
+ before do
87
+ allow(Premailer::Rails::CSSHelper).to receive(:cache_enabled?).and_return(false)
88
+ end
49
89
 
50
- it 'ignores links' do
51
- expect(Premailer::Rails::CSSHelper).to_not receive(:css_for_url)
52
- css_for_doc(doc)
53
- end
54
- end
90
+ it 'does not return cached values' do
91
+ Premailer::Rails::CSSHelper.cache['http://example.com/stylesheets/base.css'] = 'cached content'
92
+ content = 'new content of base.css'
93
+ expect_file('public/stylesheets/base.css', content)
94
+
95
+ expect(css_for_url('http://example.com/stylesheets/base.css')).to eq(content)
55
96
  end
97
+ end
56
98
 
57
- describe '#css_for_url' do
58
- context 'when path is a url' do
59
- it 'loads the CSS at the local path' do
60
- expect_file('public/stylesheets/base.css')
99
+ context 'when Rails asset pipeline is used' do
100
+ before do
101
+ allow(Rails.configuration)
102
+ .to receive(:assets).and_return(double(prefix: '/assets'))
103
+ allow(Rails.configuration)
104
+ .to receive(:relative_url_root).and_return(nil)
105
+ end
61
106
 
62
- css_for_url('http://example.com/stylesheets/base.css?test')
63
- end
107
+ context 'and a precompiled file exists' do
108
+ it 'returns that file' do
109
+ path = '/assets/email-digest.css'
110
+ content = 'read from file'
111
+ expect_file("public#{path}", content)
112
+ expect(css_for_url(path)).to eq(content)
64
113
  end
114
+ end
65
115
 
66
- context 'when path is a relative url' do
67
- it 'loads the CSS at the local path' do
68
- expect_file('public/stylesheets/base.css')
69
- css_for_url('/stylesheets/base.css?test')
70
- end
71
- end
116
+ context "when find_sources raises TypeError" do
117
+ let(:response) { 'content of base.css' }
118
+ let(:uri) { URI('http://example.com/assets/base.css') }
72
119
 
73
- context 'when file is cached' do
74
- it 'returns the cached value' do
75
- Premailer::Rails::CSSLoaders::CacheLoader.store(
76
- 'http://example.com/stylesheets/base.css',
77
- 'content of base.css'
78
- )
120
+ it "falls back to Net::HTTP" do
121
+ expect(Rails.application.assets_manifest).to \
122
+ receive(:find_sources)
123
+ .with('base.css')
124
+ .and_raise(TypeError)
79
125
 
80
- expect(css_for_url('http://example.com/stylesheets/base.css')).to \
81
- eq('content of base.css')
82
- end
126
+ allow(Net::HTTP).to \
127
+ receive(:get).with(uri).and_return(response)
128
+ expect(css_for_url('http://example.com/assets/base.css')).to \
129
+ eq(response)
83
130
  end
131
+ end
84
132
 
85
- context 'when in development mode' do
86
- it 'does not return cached values' do
87
- Premailer::Rails::CSSLoaders::CacheLoader.store(
88
- 'http://example.com/stylesheets/base.css',
89
- 'cached content of base.css'
90
- )
91
- content = 'new content of base.css'
92
- expect_file('public/stylesheets/base.css', content)
93
- allow(Rails.env).to receive(:development?).and_return(true)
94
-
95
- expect(css_for_url('http://example.com/stylesheets/base.css')).to eq(content)
96
- end
97
- end
133
+ context "when find_sources raises Errno::ENOENT" do
134
+ let(:response) { 'content of base.css' }
135
+ let(:uri) { URI('http://example.com/assets/base.css') }
98
136
 
99
- context 'when Rails asset pipeline is used' do
100
- before do
101
- allow(Rails.configuration)
102
- .to receive(:assets).and_return(double(prefix: '/assets'))
103
- allow(Rails.configuration)
104
- .to receive(:relative_url_root).and_return(nil)
105
- end
137
+ it "falls back to Net::HTTP" do
138
+ expect(Rails.application.assets_manifest).to \
139
+ receive(:find_sources)
140
+ .with('base.css')
141
+ .and_raise(Errno::ENOENT)
106
142
 
107
- context 'and a precompiled file exists' do
108
- it 'returns that file' do
109
- path = '/assets/email-digest.css'
110
- content = 'read from file'
111
- expect_file("public#{path}", content)
112
- expect(css_for_url(path)).to eq(content)
113
- end
114
- end
143
+ allow(Net::HTTP).to \
144
+ receive(:get).with(uri).and_return(response)
145
+ expect(css_for_url('http://example.com/assets/base.css')).to \
146
+ eq(response)
147
+ end
148
+ end
115
149
 
116
- it 'returns the content of the file compiled by Rails' do
117
- expect(Rails.application.assets).to \
118
- receive(:find_asset)
119
- .with('base.css')
120
- .and_return(double(to_s: 'content of base.css'))
150
+ it 'returns the content of the file compiled by Rails' do
151
+ expect(Rails.application.assets_manifest).to \
152
+ receive(:find_sources)
153
+ .with('base.css')
154
+ .and_return(['content of base.css'])
121
155
 
122
- expect(css_for_url('http://example.com/assets/base.css')).to \
123
- eq('content of base.css')
124
- end
156
+ expect(css_for_url('http://example.com/assets/base.css')).to \
157
+ eq('content of base.css')
158
+ end
125
159
 
126
- it 'returns same file when path contains file fingerprint' do
127
- expect(Rails.application.assets).to \
128
- receive(:find_asset)
129
- .with('base.css')
130
- .and_return(double(to_s: 'content of base.css'))
160
+ it 'returns same file when path contains file fingerprint' do
161
+ expect(Rails.application.assets_manifest).to \
162
+ receive(:find_sources)
163
+ .with('base.css')
164
+ .and_return(['content of base.css'])
131
165
 
132
- expect(css_for_url(
133
- 'http://example.com/assets/base-089e35bd5d84297b8d31ad552e433275.css'
134
- )).to eq('content of base.css')
135
- end
166
+ expect(css_for_url(
167
+ 'http://example.com/assets/base-089e35bd5d84297b8d31ad552e433275.css'
168
+ )).to eq('content of base.css')
169
+ end
136
170
 
137
- context 'when asset can not be found' do
138
- let(:response) { 'content of base.css' }
139
- let(:path) { '/assets/base-089e35bd5d84297b8d31ad552e433275.css' }
140
- let(:url) { "http://assets.example.com#{path}" }
141
- let(:asset_host) { 'http://assets.example.com' }
171
+ context 'when asset can not be found' do
172
+ let(:response) { 'content of base.css' }
173
+ let(:path) { '/assets/base-089e35bd5d84297b8d31ad552e433275.css' }
174
+ let(:url) { "http://assets.example.com#{path}" }
175
+ let(:asset_host) { 'http://assets.example.com' }
142
176
 
143
- before do
144
- allow(Rails.application.assets).to \
145
- receive(:find_asset).and_return(nil)
177
+ before do
178
+ allow(Rails.application.assets_manifest).to \
179
+ receive(:find_sources).and_return([])
146
180
 
147
- config = double(asset_host: asset_host)
148
- allow(Rails.configuration).to \
149
- receive(:action_controller).and_return(config)
181
+ config = double(asset_host: asset_host)
182
+ allow(Rails.configuration).to \
183
+ receive(:action_controller).and_return(config)
150
184
 
151
- uri_satisfaction = satisfy { |uri| uri.to_s == url }
152
- allow(Net::HTTP).to \
153
- receive(:get).with(uri_satisfaction).and_return(response)
154
- end
185
+ allow(Net::HTTP).to \
186
+ receive(:get).with(URI(url)).and_return(response)
187
+ end
155
188
 
156
- it 'requests the file' do
157
- expect(css_for_url(url)).to eq('content of base.css')
158
- end
189
+ it 'requests the file' do
190
+ expect(css_for_url(url)).to eq('content of base.css')
191
+ end
159
192
 
160
- context 'when file url does not include the host' do
161
- it 'requests the file using the asset host as host' do
162
- expect(css_for_url(path)).to eq('content of base.css')
163
- end
193
+ context 'when file url does not include the host' do
194
+ it 'requests the file using the asset host as host' do
195
+ expect(css_for_url(path)).to eq('content of base.css')
196
+ end
164
197
 
165
- context 'and the asset host uses protocol relative scheme' do
166
- let(:asset_host) { '//assets.example.com' }
198
+ context 'and the asset host uses protocol relative scheme' do
199
+ let(:asset_host) { '//assets.example.com' }
167
200
 
168
- it 'requests the file using http as the scheme' do
169
- expect(css_for_url(path)).to eq('content of base.css')
170
- end
171
- end
201
+ it 'requests the file using http as the scheme' do
202
+ expect(css_for_url(path)).to eq('content of base.css')
172
203
  end
173
204
  end
174
205
  end
206
+ end
207
+ end
175
208
 
176
- context 'when static stylesheets are used' do
177
- it 'returns the content of the static file' do
178
- content = 'content of base.css'
179
- expect_file('public/stylesheets/base.css', content)
180
- loaded_content = css_for_url('http://example.com/stylesheets/base.css')
181
- expect(loaded_content).to eq(content)
182
- end
183
- end
209
+ context 'when static stylesheets are used' do
210
+ it 'returns the content of the static file' do
211
+ content = 'content of base.css'
212
+ expect_file('public/stylesheets/base.css', content)
213
+ loaded_content = css_for_url('http://example.com/stylesheets/base.css')
214
+ expect(loaded_content).to eq(content)
184
215
  end
185
216
  end
186
217
  end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'ActionMailer::Base delivery' do
4
+ it 'delivers email with inlined CSS' do
5
+ WelcomeMailer.welcome_email("world").deliver_now
6
+
7
+ mail = ActionMailer::Base.deliveries.last
8
+ expect(mail).to be_present
9
+ body = mail.html_part.body.to_s
10
+ expect(body).to be_present
11
+ expect(body).to include(%{<p style="font-size: 12px;">Hello world</p>})
12
+ end
13
+ end
@@ -6,7 +6,7 @@ describe Premailer::Rails::Hook do
6
6
  end
7
7
 
8
8
  def body_content(message)
9
- Nokogiri::HTML(message.html_string).at('body').content
9
+ Nokogiri::HTML(message.html_string).at('body').content.gsub("\r\n", "\n")
10
10
  end
11
11
 
12
12
  class Mail::Message
@@ -47,18 +47,31 @@ describe Premailer::Rails::Hook do
47
47
  expect(processed_message.parts).to match_array(expected_parts)
48
48
  end
49
49
 
50
- describe 'when the content-transfer-encoding is set' do
51
- before { message.content_transfer_encoding = 'quoted-printable' }
50
+ it 'does not screw up the text by maintaining the original body encoding' do
51
+ raw_msg = Fixtures::Message.latin_message
52
+ processed_msg = Fixtures::Message.latin_message
53
+ run_hook(processed_msg)
54
+ expect(body_content(processed_msg)).to eq(body_content(raw_msg))
52
55
 
53
- it 'should maintain the value' do
54
- expect(processed_message.parts.first.content_transfer_encoding).to \
55
- eq 'quoted-printable'
56
- expect(processed_message.parts.last.content_transfer_encoding).to \
57
- eq 'quoted-printable'
58
- end
56
+ raw_msg = Fixtures::Message.non_latin_message
57
+ processed_msg = Fixtures::Message.non_latin_message
58
+ run_hook(processed_msg)
59
+ expect(body_content(processed_msg)).to eq(body_content(raw_msg))
60
+
61
+ raw_msg = Fixtures::Message.greek_message
62
+ processed_msg = Fixtures::Message.greek_message
63
+ run_hook(processed_msg)
64
+ expect(body_content(processed_msg)).to eq(body_content(raw_msg))
65
+
66
+ raw_msg = Fixtures::Message.dash_message
67
+ processed_msg = Fixtures::Message.dash_message
68
+ run_hook(processed_msg)
69
+ expect(body_content(processed_msg)).to eq(body_content(raw_msg))
59
70
  end
60
71
 
61
- it 'does not screw up the text by maintaining the original body encoding' do
72
+ it 'supports US-ASCII output' do
73
+ Premailer::Rails.config.merge!(output_encoding: 'US-ASCII')
74
+
62
75
  raw_msg = Fixtures::Message.latin_message
63
76
  processed_msg = Fixtures::Message.latin_message
64
77
  run_hook(processed_msg)
@@ -68,6 +81,18 @@ describe Premailer::Rails::Hook do
68
81
  processed_msg = Fixtures::Message.non_latin_message
69
82
  run_hook(processed_msg)
70
83
  expect(body_content(processed_msg)).to eq(body_content(raw_msg))
84
+
85
+ raw_msg = Fixtures::Message.greek_message
86
+ processed_msg = Fixtures::Message.greek_message
87
+ run_hook(processed_msg)
88
+ expect(body_content(processed_msg)).to eq(body_content(raw_msg))
89
+
90
+ raw_msg = Fixtures::Message.dash_message
91
+ processed_msg = Fixtures::Message.dash_message
92
+ run_hook(processed_msg)
93
+ expect(body_content(processed_msg)).to eq(body_content(raw_msg))
94
+ ensure
95
+ Premailer::Rails.config.delete(:output_encoding)
71
96
  end
72
97
 
73
98
  it 'generates a text part from the html' do
@@ -91,7 +116,7 @@ describe Premailer::Rails::Hook do
91
116
 
92
117
  it 'does not replace any message part' do
93
118
  expect { run_hook(message) }.to_not \
94
- change { message.all_parts.map(&:content_type) }
119
+ change { message.all_parts.map(&:content_type).sort }
95
120
  end
96
121
  end
97
122
 
@@ -0,0 +1,3 @@
1
+ //= link_tree ../images
2
+ //= link_directory ../javascripts .js
3
+ //= link_directory ../stylesheets .css
@@ -0,0 +1,3 @@
1
+ p {
2
+ font-size: 12px;
3
+ }
@@ -0,0 +1,4 @@
1
+ class ApplicationMailer < ActionMailer::Base
2
+ default from: 'from@example.com'
3
+ layout 'mailer'
4
+ end
@@ -0,0 +1,6 @@
1
+ class WelcomeMailer < ApplicationMailer
2
+ def welcome_email(greeting)
3
+ @greeting = greeting
4
+ mail to: "example@example.com"
5
+ end
6
+ end
@@ -0,0 +1,11 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <link rel="stylesheet" href="/assets/application.css"/>
6
+ </head>
7
+
8
+ <body>
9
+ <%= yield %>
10
+ </body>
11
+ </html>
@@ -0,0 +1 @@
1
+ <p>Hello <%= @greeting %></p>
@@ -0,0 +1,13 @@
1
+ require_relative 'boot'
2
+
3
+ require "action_mailer/railtie"
4
+ require "action_view/railtie"
5
+ require "sprockets/railtie"
6
+ require "rails/test_unit/railtie"
7
+
8
+ Bundler.require(*Rails.groups)
9
+
10
+ module Dummy
11
+ class Application < Rails::Application
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ # Set up gems listed in the Gemfile.
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../Gemfile', __dir__)
3
+
4
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
5
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __dir__)
@@ -0,0 +1,2 @@
1
+ require_relative 'application'
2
+ Rails.application.initialize!
@@ -0,0 +1,10 @@
1
+ Rails.application.configure do
2
+ config.cache_classes = true
3
+ config.eager_load = false
4
+ config.consider_all_requests_local = true
5
+ config.action_controller.perform_caching = false
6
+ config.action_dispatch.show_exceptions = false
7
+ config.action_controller.allow_forgery_protection = false
8
+ config.action_mailer.delivery_method = :test
9
+ config.active_support.deprecation = :stderr
10
+ end
@@ -0,0 +1 @@
1
+ Rails.application.config.assets.version = '1.0'
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ root 'application#main'
3
+ end
@@ -0,0 +1,5 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require_relative 'config/environment'
4
+
5
+ run Rails.application
File without changes
File without changes
data/spec/spec_helper.rb CHANGED
@@ -11,16 +11,11 @@ if RUBY_ENGINE == 'ruby'
11
11
  end
12
12
  end
13
13
 
14
- # Temporary fix for missing require. See
15
- # https://github.com/rails/rails/pull/28835
16
- require 'active_support/rescuable'
14
+ # Configure Rails Environment
15
+ ENV["RAILS_ENV"] = "test"
16
+ require File.expand_path("../../spec/rails_app/config/environment.rb", __FILE__)
17
17
 
18
- require 'premailer/rails'
19
-
20
- require 'support/stubs/action_mailer'
21
- require 'support/stubs/rails'
22
18
  require 'support/fixtures/message'
23
19
  require 'support/fixtures/html'
24
20
 
25
- require 'hpricot' unless RUBY_PLATFORM == 'java'
26
21
  require 'nokogiri'
@@ -35,6 +35,30 @@ module Fixtures
35
35
  </html>
36
36
  HTML
37
37
 
38
+ HTML_PART_IN_GREEK = <<-HTML.encode(Encoding::ISO_8859_7)
39
+ <html>
40
+ <head>
41
+ </head>
42
+ <body>
43
+ <p>
44
+ Αα Ββ Γγ Δδ Εε Ζζ Ηη Θθ Ιι Κκ Λλ Μμ Νν Ξξ Οο Ππ Ρρ Σσ Ττ Υυ Φφ Χχ Ψψ Ωω
45
+ </p>
46
+ </body>
47
+ </html>
48
+ HTML
49
+
50
+ HTML_PART_WITH_DASHES = <<-HTML
51
+ <html>
52
+ <head>
53
+ </head>
54
+ <body>
55
+ <p>
56
+ Hello there—yes you! What's up with – pardon the interrupion – dashes? I can also do &ndash; and &mdash;.
57
+ </p>
58
+ </body>
59
+ </html>
60
+ HTML
61
+
38
62
  HTML_PART_WITH_CSS = <<-HTML
39
63
  <html>
40
64
  <head>
@@ -130,6 +154,22 @@ nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
130
154
  end
131
155
  end
132
156
 
157
+ def greek_message
158
+ base_message.tap do |message|
159
+ message.body = HTML_PART_IN_GREEK
160
+ message.content_type 'text/html; charset=ISO-8859-7'
161
+ message.ready_to_send!
162
+ end
163
+ end
164
+
165
+ def dash_message
166
+ base_message.tap do |message|
167
+ message.body = HTML_PART_WITH_DASHES
168
+ message.content_type 'text/html; charset=UTF-8'
169
+ message.ready_to_send!
170
+ end
171
+ end
172
+
133
173
  private
134
174
 
135
175
  def base_message
@@ -18,7 +18,7 @@ describe Premailer::Rails::CSSLoaders::NetworkLoader do
18
18
 
19
19
  context 'with a protocol relative URL' do
20
20
  let(:url) { '//example.com/test.css' }
21
- it { is_expected.to eq(URI("http://#{url}")) }
21
+ it { is_expected.to eq(URI("http:#{url}")) }
22
22
  end
23
23
 
24
24
  context 'with a file path' do