blob: 2f2e55fc47c4e47fcaabd578fae3b1362f1faf5c [file] [log] [blame]
<?php
/**
* Copyright 2007 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Tests for Mail API on App Engine.
*
*/
use google\appengine\base\VoidProto;
use google\appengine\api\mail\Message;
use google\appengine\MailMessage;
use google\appengine\MailServiceError\ErrorCode;
use google\appengine\runtime\ApplicationError;
use google\appengine\testing\ApiProxyTestBase;
class MessageTest extends ApiProxyTestBase {
public function testConstructorBadValues() {
$options = array("fakeSet" => "test");
$this->setExpectedException(
"InvalidArgumentException",
"Message received an invalid option: fakeSet");
$message = new Message($options);
}
public function testConstructNonString() {
$options = "test";
$this->setExpectedException(
"InvalidArgumentException", "Message expects an array, not string");
$message = new Message($options);
}
public function testAddAttachmentError() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException", "'exe' is a blacklisted file extension.");
$message->addAttachment("file.exe", "data");
}
public function testAddAttachmentFilenameTypeError() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException",
"Filename must be a string but was type integer");
$message->addAttachment(7, "data");
}
private function setupAttachmentTest($input) {
$message = new Message();
$error_message = "";
try {
$message->addAttachmentArray($input);
} catch(InvalidArgumentException $e) {
$error_message = $e->getMessage();
}
return $error_message;
}
public function testAddAttachmentArrayError() {
$this->assertEquals(
$this->setupAttachmentTest("string"),
"Input is not an array (Actual type: string).");
$attach_arr = array("data.gif" => "data",
"data.exe" => "data");
$this->assertEquals(
$this->setupAttachmentTest($attach_arr),
"'exe' is a blacklisted file extension.");
}
private function setupValidEmailTest($email_input) {
$message = new Message();
$error_message = "";
try {
$message->addTo($email_input);
} catch(InvalidArgumentException $e) {
$error_message = $e->getMessage();
}
return $error_message;
}
public function testCheckValidEmails() {
$invalid_email = "invalid.email <script>alert('wello')</script>";
$converted_invalid_email = htmlspecialchars($invalid_email);
$this->assertEquals(
$this->setupValidEmailTest(
$invalid_email),
"Invalid 'to' recipient: " .$converted_invalid_email);
$array_emails = array("test@test.com", $invalid_email);
$this->assertEquals($this->setupValidEmailTest($array_emails),
"Invalid 'to' recipient: " . $converted_invalid_email);
}
public function testAddHeaderNonWhitelisted() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException",
"Input header 'invalid-header: data' is not whitelisted for use with" .
" the Google App Engine Mail Service.");
$message->addHeader("invalid-header", "data");
}
public function testAddHeaderWrongKeyType() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException",
"Header key is not a string (Actual type: array).");
$message->addHeader(array("not-string"), "data");
}
public function testAddHeaderArray() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException",
"Input is not an array (Actual type: string).");
$message->addHeaderArray("string");
}
public function testSetHtmlBody() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException",
"HTML text given is not a string (Actual type: array).");
$message->setHtmlBody(array("text"));
}
public function testSetReplyTo() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException", "Invalid reply-to: invalid.email");
$message->setReplyTo("invalid.email");
}
public function testSetSender() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException", "Invalid sender: invalid.email");
$message->setSender("invalid.email");
}
public function testSetSubject() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException",
"Subject given is not a string (Actual type: array).");
$message->setSubject(array("test"));
}
public function testSetTextBody() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException",
"Plain text given is not a string (Actual type: array).");
$message->setTextBody(array("text"));
}
public function testSendNoSender() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException", "Required field sender is not provided.");
$message->send();
}
public function testSendNoRecipient() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException",
"Neither to, cc or bcc is set - at least one is required.");
$message->setSender("test@example.com");
$message->send();
}
public function testSendNoSubject() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException",
"Required field subject is not provided.");
$message->setSender("test@example.com");
$message->addTo("example@test.com");
$message->send();
}
public function testSendNoBody() {
$message = new Message();
$this->setExpectedException(
"InvalidArgumentException",
"Neither a plain-text nor HTML body is provided - at least one is " .
"required.");
$message->setSender("test@example.com");
$message->addTo("example@test.com");
$message->setSubject("test");
$message->send();
}
/**
* Setup a basic message and message proto with:
* - sender
* - to
* - subject
* - text body
*/
private function setupMessageSimple($message, $message_proto) {
$message->setSender("test@example.com");
$message_proto->setSender("test@example.com");
$message->addTo("example@test.com");
$message_proto->addTo("example@test.com");
$message->setSubject("test");
$message_proto->setSubject("test");
$message->setTextBody("text body");
$message_proto->setTextbody("text body");
}
/**
* Tests various message elements:
* - everything in setupMessageSimple()
* - to (array)
* - bcc, bcc (array)
* - cc, cc (array)
* - html body
* - reply to
*/
public function testSucceedFields() {
$message = new Message();
$message_proto = new MailMessage();
$this->setupMessageSimple($message, $message_proto);
$message->addTo(array("b@test.com", "c@test.com"));
$message_proto->addTo("b@test.com");
$message_proto->addTo("c@test.com");
$message->addBcc("a@example.com");
$message_proto->addBcc("a@example.com");
$message->addBcc(array("b@example.com", "c@example.com"));
$message_proto->addBcc("b@example.com");
$message_proto->addBcc("c@example.com");
$message->addCc("d@example.com");
$message_proto->addCc("d@example.com");
$message->addCc(array("e@example.com", "f@example.com"));
$message_proto->addCc("e@example.com");
$message_proto->addCc("f@example.com");
$message->setHtmlBody("text body");
$message_proto->setHtmlbody("text body");
$message->setReplyTo("reply@example.com");
$message_proto->setReplyto("reply@example.com");
$response = new VoidProto();
$this->apiProxyMock->expectCall('mail', 'Send', $message_proto, $response);
$message->send();
$this->apiProxyMock->verify();
}
public function testSucceedWithOptionsArray() {
$headers = array('in-reply-to' => 'data',
'list-id' => 'data2',
'references' => 'data3');
$attachments = array('test.gif' => 'data',
't.jpg' => 'data2',
'z.png' => 'data3');
$options = array('sender' => 'test@example.com',
'replyto' => 'test@example.com',
'to' => array('b@test.com', 'c@test.com'),
'cc' => array('d@test.com', 'e@test.com'),
'bcc' => array('f@test.com', 'g@test.com'),
'subject' => 'test',
'textBody' => 'text body',
'htmlBody' => 'html body',
'header' => $headers,
'attachment' => $attachments);
$message = new Message($options);
$message_proto = new MailMessage();
$message_proto->setSender("test@example.com");
$message_proto->setReplyto("test@example.com");
$message_proto->addTo("b@test.com");
$message_proto->addTo("c@test.com");
$message_proto->addCc("d@test.com");
$message_proto->addCc("e@test.com");
$message_proto->addBcc("f@test.com");
$message_proto->addBcc("g@test.com");
$message_proto->setSubject("test");
$message_proto->setTextbody("text body");
$message_proto->setHtmlbody("html body");
$header = $message_proto->addHeader();
$header->setName("in-reply-to");
$header->setValue("data");
$header = $message_proto->addHeader();
$header->setName("list-id");
$header->setValue("data2");
$header = $message_proto->addHeader();
$header->setName("references");
$header->setValue("data3");
$attach = $message_proto->addAttachment();
$attach->setFilename("test.gif");
$attach->setData("data");
$attach = $message_proto->addAttachment();
$attach->setFilename("t.jpg");
$attach->setData("data2");
$attach = $message_proto->addAttachment();
$attach->setFilename("z.png");
$attach->setData("data3");
$response = new VoidProto();
$this->apiProxyMock->expectCall('mail', 'Send', $message_proto, $response);
$message->send();
$this->apiProxyMock->verify();
}
public function testSucceedWithAttachments() {
$message = new Message();
$message_proto = new MailMessage();
$this->setupMessageSimple($message, $message_proto);
$message->addAttachment("test.gif", "data");
$attach = $message_proto->addAttachment();
$attach->setFilename("test.gif");
$attach->setData("data");
$multi_attach = array("t" => "data2",
"z." => "data3");
$message->addAttachmentArray($multi_attach);
$attach = $message_proto->addAttachment();
$attach->setFilename("t");
$attach->setData("data2");
$attach = $message_proto->addAttachment();
$attach->setFilename("z.");
$attach->setData("data3");
$response = new VoidProto();
$this->apiProxyMock->expectCall('mail', 'Send', $message_proto, $response);
$message->send();
$this->apiProxyMock->verify();
}
public function testSucceedWithHeaders() {
$message = new Message();
$message_proto = new MailMessage();
$this->setupMessageSimple($message, $message_proto);
$message->addHeader("in-reply-to", "data");
$header = $message_proto->addHeader();
$header->setName("in-reply-to");
$header->setValue("data");
$multi_header = array("list-id" => "data2", "references" => "data3");
$message->addHeaderArray($multi_header);
$header = $message_proto->addHeader();
$header->setName("list-id");
$header->setValue("data2");
$header = $message_proto->addHeader();
$header->setName("references");
$header->setValue("data3");
$response = new VoidProto();
$this->apiProxyMock->expectCall('mail', 'Send', $message_proto, $response);
$message->send();
$this->apiProxyMock->verify();
}
public function testRpcApplicationErrorInternalError() {
$message = new Message();
$message_proto = new MailMessage();
$this->setupMessageSimple($message, $message_proto);
$exception = new ApplicationError(ErrorCode::INTERNAL_ERROR, "test");
$this->setExpectedException("RuntimeException", "test");
$this->apiProxyMock->expectCall('mail', 'Send', $message_proto, $exception);
$message->send();
$this->apiProxyMock->verify();
}
public function testRpcApplicationErrorBadRequest() {
$message = new Message();
$message_proto = new MailMessage();
$this->setupMessageSimple($message, $message_proto);
$exception = new ApplicationError(ErrorCode::BAD_REQUEST, "test");
$this->setExpectedException("RuntimeException", "test");
$this->apiProxyMock->expectCall('mail', 'Send', $message_proto, $exception);
$message->send();
$this->apiProxyMock->verify();
}
public function testRpcApplicationErrorUnauthorizedSender() {
$message = new Message();
$message_proto = new MailMessage();
$this->setupMessageSimple($message, $message_proto);
$exception = new ApplicationError(ErrorCode::UNAUTHORIZED_SENDER, "test");
$this->setExpectedException(
"InvalidArgumentException",
"Mail Service Error: Sender (test@example.com) is not an ".
"authorized email address.");
$this->apiProxyMock->expectCall('mail', 'Send', $message_proto, $exception);
$message->send();
$this->apiProxyMock->verify();
}
public function testRpcApplicationErrorInvalidAttachmentType() {
$message = new Message();
$message_proto = new MailMessage();
$this->setupMessageSimple($message, $message_proto);
$exception = new ApplicationError(ErrorCode::INVALID_ATTACHMENT_TYPE,
"test");
$this->setExpectedException(
"InvalidArgumentException",
"Mail Service Error: Invalid attachment type.");
$this->apiProxyMock->expectCall('mail', 'Send', $message_proto, $exception);
$message->send();
$this->apiProxyMock->verify();
}
public function testRpcApplicationErrorInvalidHeaderName() {
$message = new Message();
$message_proto = new MailMessage();
$this->setupMessageSimple($message, $message_proto);
$exception = new ApplicationError(ErrorCode::INVALID_HEADER_NAME, "test");
$this->setExpectedException(
"InvalidArgumentException",
"Mail Service Error: Invalid header name.");
$this->apiProxyMock->expectCall('mail', 'Send', $message_proto, $exception);
$message->send();
$this->apiProxyMock->verify();
}
}