Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

381 lines
13 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Web.WebPages.Scope;
using System.Web.WebPages.TestUtils;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace System.Web.Helpers.Test
{
public class WebMailTest
{
const string FromAddress = "abc@123.com";
const string Server = "myserver.com";
const int Port = 100;
const string UserName = "My UserName";
const string Password = "My Password";
[Fact]
public void WebMailSmtpServerTests()
{
// All tests prior to setting smtp server go here
// Verify Send throws if no SmtpServer is set
Assert.Throws<InvalidOperationException>(
() => WebMail.Send(to: "test@test.com", subject: "test", body: "test body"),
"\"SmtpServer\" was not specified."
);
// Verify SmtpServer uses scope storage.
// Arrange
var value = "value";
// Act
WebMail.SmtpServer = value;
// Assert
Assert.Equal(WebMail.SmtpServer, value);
Assert.Equal(ScopeStorage.CurrentScope[WebMail.SmtpServerKey], value);
}
[Fact]
public void WebMailSendThrowsIfPriorityIsInvalid()
{
Assert.ThrowsArgument(
() => WebMail.Send(to: "test@test.com", subject: "test", body: "test body", priority: "foo"),
"priority",
"The \"priority\" value is invalid. Valid values are \"Low\", \"Normal\" and \"High\"."
);
}
[Fact]
public void WebMailUsesScopeStorageForSmtpPort()
{
// Arrange
var value = 4;
// Act
WebMail.SmtpPort = value;
// Assert
Assert.Equal(WebMail.SmtpPort, value);
Assert.Equal(ScopeStorage.CurrentScope[WebMail.SmtpPortKey], value);
}
[Fact]
public void WebMailUsesScopeStorageForEnableSsl()
{
// Arrange
var value = true;
// Act
WebMail.EnableSsl = value;
// Assert
Assert.Equal(WebMail.EnableSsl, value);
Assert.Equal(ScopeStorage.CurrentScope[WebMail.EnableSslKey], value);
}
[Fact]
public void WebMailUsesScopeStorageForDefaultCredentials()
{
// Arrange
var value = true;
// Act
WebMail.SmtpUseDefaultCredentials = value;
// Assert
Assert.Equal(WebMail.SmtpUseDefaultCredentials, value);
Assert.Equal(ScopeStorage.CurrentScope[WebMail.SmtpUseDefaultCredentialsKey], value);
}
[Fact]
public void WebMailUsesScopeStorageForUserName()
{
// Arrange
var value = "value";
// Act
WebMail.UserName = value;
// Assert
Assert.Equal(WebMail.UserName, value);
Assert.Equal(ScopeStorage.CurrentScope[WebMail.UserNameKey], value);
}
[Fact]
public void WebMailUsesScopeStorageForPassword()
{
// Arrange
var value = "value";
// Act
WebMail.Password = value;
// Assert
Assert.Equal(WebMail.Password, value);
Assert.Equal(ScopeStorage.CurrentScope[WebMail.PasswordKey], value);
}
[Fact]
public void WebMailUsesScopeStorageForFrom()
{
// Arrange
var value = "value";
// Act
WebMail.From = value;
// Assert
Assert.Equal(WebMail.From, value);
Assert.Equal(ScopeStorage.CurrentScope[WebMail.FromKey], value);
}
[Fact]
public void WebMailThrowsWhenSmtpServerValueIsNullOrEmpty()
{
// Act and Assert
Assert.ThrowsArgumentNullOrEmptyString(() => WebMail.SmtpServer = null, "SmtpServer");
Assert.ThrowsArgumentNullOrEmptyString(() => WebMail.SmtpServer = String.Empty, "SmtpServer");
}
[Fact]
public void ParseHeaderParsesStringInKeyValueFormat()
{
// Arrange
string header = "foo: bar";
// Act
string key, value;
// Assert
Assert.True(WebMail.TryParseHeader(header, out key, out value));
Assert.Equal("foo", key);
Assert.Equal("bar", value);
}
[Fact]
public void ParseHeaderReturnsFalseIfHeaderIsNotInCorrectFormat()
{
// Arrange
string header = "foo bar";
// Act
string key, value;
// Assert
Assert.False(WebMail.TryParseHeader(header, out key, out value));
Assert.Null(key);
Assert.Null(value);
}
[Fact]
public void SetPropertiesOnMessageTest_SetsAllInfoCorrectlyOnMailMessageTest()
{
// Arrange
MailMessage message = new MailMessage();
string to = "abc123@xyz.com";
string subject = "subject1";
string body = "body1";
string from = FromAddress;
string cc = "cc@xyz.com";
string attachmentName = "HiRes.jpg";
string bcc = "foo@bar.com";
string replyTo = "x@y.com,z@pqr.com";
string contentEncoding = "utf-8";
string headerEncoding = "utf-16";
var priority = MailPriority.Low;
// Act
string fileToAttach = Path.GetTempFileName();
try
{
TestFile.Create(attachmentName).Save(fileToAttach);
bool isBodyHtml = true;
var additionalHeaders = new[] { "header1:value1" };
WebMail.SetPropertiesOnMessage(message, to, subject, body, from, cc, bcc, replyTo, contentEncoding, headerEncoding, priority, new[] { fileToAttach }, isBodyHtml, additionalHeaders);
// Assert
Assert.Equal(body, message.Body);
Assert.Equal(subject, message.Subject);
Assert.Equal(to, message.To[0].Address);
Assert.Equal(cc, message.CC[0].Address);
Assert.Equal(from, message.From.Address);
Assert.Equal(bcc, message.Bcc[0].Address);
Assert.Equal("x@y.com", message.ReplyToList[0].Address);
Assert.Equal("z@pqr.com", message.ReplyToList[1].Address);
Assert.Equal(MailPriority.Low, message.Priority);
Assert.Equal(Encoding.UTF8, message.BodyEncoding);
Assert.Equal(Encoding.Unicode, message.HeadersEncoding);
Assert.True(message.Headers.AllKeys.Contains("header1"));
Assert.True(message.Attachments.Count == 1);
}
finally
{
try
{
File.Delete(fileToAttach);
}
catch (IOException)
{
} // Try our best to clean up after ourselves
}
}
[Fact]
public void MailSendWithNullInCollection_ThrowsArgumentException()
{
Assert.Throws<ArgumentException>(
() => WebMail.Send("foo@bar.com", "sub", "body", filesToAttach: new string[] { "c:\\foo.txt", null }),
"A string in the collection is null or empty.\r\nParameter name: filesToAttach"
);
Assert.Throws<ArgumentException>(
() => WebMail.Send("foo@bar.com", "sub", "body", additionalHeaders: new string[] { "foo:bar", null }),
"A string in the collection is null or empty.\r\nParameter name: additionalHeaders"
);
}
[Fact]
public void AssignHeaderValuesIgnoresMalformedHeaders()
{
// Arrange
var message = new MailMessage();
var headers = new[] { "foo1:bar1", "foo2", "foo3|bar3", "foo4 bar4" };
// Act
WebMail.AssignHeaderValues(message, headers);
// Assert
Assert.Equal(1, message.Headers.Count);
Assert.Equal("foo1", message.Headers.AllKeys[0]);
Assert.Equal("bar1", message.Headers[0]);
}
[Fact]
public void PropertiesDuplicatedAcrossHeaderAndArgumentDoesNotThrow()
{
// Arrange
var message = new MailMessage();
var headers = new[] { "to:to@test.com" };
// Act
WebMail.SetPropertiesOnMessage(message, "to@test.com", null, null, "from@test.com", null, null, null, null, null, MailPriority.Normal, null, false, headers);
// Assert
Assert.Equal(2, message.To.Count);
Assert.Equal("to@test.com", message.To.First().Address);
Assert.Equal("to@test.com", message.To.Last().Address);
}
[Fact]
public void AssignHeaderValuesSetsPropertiesForKnownHeaderValues()
{
// Arrange
var message = new MailMessage();
var headers = new[]
{
"cc:cc@test.com", "bcc:bcc@test.com,bcc2@test.com", "from:from@test.com", "priority:high", "reply-to:replyto1@test.com,replyto2@test.com",
"sender: sender@test.com", "to:to@test.com"
};
// Act
WebMail.AssignHeaderValues(message, headers);
// Assert
Assert.Equal("cc@test.com", message.CC.Single().Address);
Assert.Equal("bcc@test.com", message.Bcc.First().Address);
Assert.Equal("bcc2@test.com", message.Bcc.Last().Address);
Assert.Equal("from@test.com", message.From.Address);
Assert.Equal(MailPriority.High, message.Priority);
Assert.Equal("replyto1@test.com", message.ReplyToList.First().Address);
Assert.Equal("replyto2@test.com", message.ReplyToList.Last().Address);
Assert.Equal("sender@test.com", message.Sender.Address);
Assert.Equal("to@test.com", message.To.Single().Address);
// Assert we transparently set header values
Assert.Equal(headers.Count(), message.Headers.Count);
}
[Fact]
public void AssignHeaderDoesNotThrowIfPriorityValueIsInvalid()
{
// Arrange
var message = new MailMessage();
var headers = new[] { "priority:invalid-value" };
// Act
WebMail.AssignHeaderValues(message, headers);
// Assert
Assert.Equal(MailPriority.Normal, message.Priority);
// Assert we transparently set header values
Assert.Equal(1, message.Headers.Count);
Assert.Equal("Priority", message.Headers.Keys[0]);
Assert.Equal("invalid-value", message.Headers["Priority"]);
}
[Fact]
public void AssignHeaderDoesNotThrowIfMailAddressIsInvalid()
{
// Arrange
var message = new MailMessage();
var headers = new[] { "to:not-#-email@@" };
// Act
WebMail.AssignHeaderValues(message, headers);
// Assert
Assert.Equal(0, message.To.Count);
// Assert we transparently set header values
Assert.Equal(1, message.Headers.Count);
Assert.Equal("To", message.Headers.Keys[0]);
Assert.Equal("not-#-email@@", message.Headers["To"]);
}
[Fact]
public void AssignHeaderDoesNotThrowIfKnownHeaderValuesAreEmptyOrMalformed()
{
// Arrange
var message = new MailMessage();
var headers = new[] { "to:", ":reply-to", "priority:false" };
// Act
WebMail.AssignHeaderValues(message, headers);
// Assert
Assert.Equal(0, message.To.Count);
// Assert we transparently set header values
Assert.Equal(1, message.Headers.Count);
Assert.Equal("Priority", message.Headers.Keys[0]);
Assert.Equal("false", message.Headers["Priority"]);
}
[Fact]
public void ArgumentsToSendTakePriorityOverHeader()
{
// Arrange
var message = new MailMessage();
var headers = new[] { "from:header-from@test.com", "cc:header-cc@test.com", "priority:low" };
// Act
WebMail.SetPropertiesOnMessage(message, null, null, null, "direct-from@test.com", "direct-cc@test.com", null, null, null, null, MailPriority.High, null, false, headers);
// Assert
Assert.Equal("direct-from@test.com", message.From.Address);
Assert.Equal("header-cc@test.com", message.CC.First().Address);
Assert.Equal("direct-cc@test.com", message.CC.Last().Address);
Assert.Equal(MailPriority.High, message.Priority);
}
}
}