Skip to content

Commit 4431590

Browse files
committed
Test download of CSS from link tags
Wraps up #72
1 parent 69c7704 commit 4431590

File tree

4 files changed

+79
-7
lines changed

4 files changed

+79
-7
lines changed

PreMailer.Net/PreMailer.Net.Tests/LinkTagCssSourceTests.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ public class LinkTagCssSourceTests
1212
{
1313
private readonly Mock<IWebDownloader> _webDownloader = new Mock<IWebDownloader>();
1414

15+
public LinkTagCssSourceTests()
16+
{
17+
WebDownloader.SharedDownloader = _webDownloader.Object;
18+
}
19+
1520
[TestMethod]
1621
public void ImplementsInterface()
1722
{
@@ -56,7 +61,7 @@ public void GetCSS_AbsoluteUrlInHref_CallsWebDownloader_WithSpecifiedPath()
5661
private LinkTagCssSource CreateSUT(string baseUrl = "http://a.com", string path = "a.css")
5762
{
5863
var node = CQ.CreateFragment(String.Format("<link href=\"{0}\" />", path));
59-
var sut = new LinkTagCssSource(node.FirstElement(), new Uri(baseUrl), webDownloader: _webDownloader.Object);
64+
var sut = new LinkTagCssSource(node.FirstElement(), new Uri(baseUrl));
6065

6166
return sut;
6267
}

PreMailer.Net/PreMailer.Net.Tests/PreMailerTests.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
22
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
using PreMailer.Net.Downloaders;
4+
using Moq;
35

46
namespace PreMailer.Net.Tests
57
{
@@ -281,5 +283,54 @@ public void AddAnalyticsTags_AddsTagsAndExcludesDomain()
281283
.MoveCssInline();
282284
Assert.IsTrue(expected == premailedOutput.Html);
283285
}
286+
287+
[TestMethod]
288+
public void ContainsLinkCssElement_DownloadsCss()
289+
{
290+
var mockDownloader = new Mock<IWebDownloader>();
291+
mockDownloader.Setup(d => d.DownloadString(It.IsAny<Uri>())).Returns(".a { display: block; }");
292+
WebDownloader.SharedDownloader = mockDownloader.Object;
293+
294+
Uri baseUri = new Uri("http://a.com");
295+
Uri fullUrl = new Uri(baseUri, "b.css");
296+
string input = String.Format("<html><head><link href=\"{0}\"></link></head><body><div id=\"high-imp\" class=\"test\">test</div></body></html>", fullUrl);
297+
298+
PreMailer sut = new PreMailer(input, baseUri);
299+
sut.MoveCssInline();
300+
301+
mockDownloader.Verify(d => d.DownloadString(fullUrl));
302+
}
303+
304+
[TestMethod]
305+
public void ContainsLinkCssElement_NotCssFile_DoNotDownload()
306+
{
307+
var mockDownloader = new Mock<IWebDownloader>();
308+
mockDownloader.Setup(d => d.DownloadString(It.IsAny<Uri>())).Returns(".a { display: block; }");
309+
WebDownloader.SharedDownloader = mockDownloader.Object;
310+
311+
Uri baseUri = new Uri("http://a.com");
312+
Uri fullUrl = new Uri(baseUri, "b.bs");
313+
string input = String.Format("<html><head><link href=\"{0}\"></link></head><body><div id=\"high-imp\" class=\"test\">test</div></body></html>", fullUrl);
314+
315+
PreMailer sut = new PreMailer(input, baseUri);
316+
sut.MoveCssInline();
317+
318+
mockDownloader.Verify(d => d.DownloadString(It.IsAny<Uri>()), Times.Never());
319+
}
320+
321+
[TestMethod]
322+
public void ContainsLinkCssElement_DownloadsCss_InlinesContent()
323+
{
324+
var mockDownloader = new Mock<IWebDownloader>();
325+
mockDownloader.Setup(d => d.DownloadString(It.IsAny<Uri>())).Returns(".test { width: 150px; }");
326+
WebDownloader.SharedDownloader = mockDownloader.Object;
327+
328+
string input = "<html><head><link href=\"http://a.com/b.css\"></link></head><body><div class=\"test\">test</div></body></html>";
329+
330+
PreMailer sut = new PreMailer(input, new Uri("http://a.com"));
331+
var premailedOutput = sut.MoveCssInline();
332+
333+
Assert.IsTrue(premailedOutput.Html.Contains("<div class=\"test\" style=\"width: 150px\">"));
334+
}
284335
}
285336
}

PreMailer.Net/PreMailer.Net/Downloaders/WebDownloader.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,27 @@
44

55
namespace PreMailer.Net.Downloaders
66
{
7-
internal class WebDownloader : IWebDownloader
7+
public class WebDownloader : IWebDownloader
88
{
9+
private static IWebDownloader _sharedDownloader;
10+
11+
public static IWebDownloader SharedDownloader
12+
{
13+
get
14+
{
15+
if (_sharedDownloader == null)
16+
{
17+
_sharedDownloader = new WebDownloader();
18+
}
19+
20+
return _sharedDownloader;
21+
}
22+
set
23+
{
24+
_sharedDownloader = value;
25+
}
26+
}
27+
928
public string DownloadString(Uri uri)
1029
{
1130
var request = WebRequest.Create(uri);

PreMailer.Net/PreMailer.Net/Sources/LinkTagCssSource.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,11 @@ namespace PreMailer.Net.Sources
77
{
88
public class LinkTagCssSource : ICssSource
99
{
10-
private readonly IWebDownloader _webDownloader;
1110
private Uri _downloadUri;
1211
private string _cssContents;
1312

14-
public LinkTagCssSource(IDomObject node, Uri baseUri, IWebDownloader webDownloader = null)
13+
public LinkTagCssSource(IDomObject node, Uri baseUri)
1514
{
16-
_webDownloader = webDownloader ?? new WebDownloader();
17-
1815
// There must be an href
1916
var href = node.Attributes.First(a => a.Key.Equals("href", StringComparison.OrdinalIgnoreCase)).Value;
2017

@@ -28,7 +25,7 @@ public string GetCss()
2825
{
2926
if (_cssContents == null)
3027
{
31-
_cssContents = _webDownloader.DownloadString(_downloadUri);
28+
_cssContents = WebDownloader.SharedDownloader.DownloadString(_downloadUri);
3229
}
3330

3431
return _cssContents;

0 commit comments

Comments
 (0)