# PHP Email Test Plugins: send and receive email in PHPUnit (example code).

Sending and receiving emails from test email accounts in PHP integration tests.

# About

phpunit email plugin

PHPUnit is a popular PHP test library. It is used with many popular PHP frameworks such as Laravel. When used with the free MailSlurp PHP SDK you can create test email accounts then send and receive emails in code.

# Why?

Many modern web applications rely on email: for user sign-up, password reset, newsletters, contact forms and more. To test these end to end you need programmable email accounts. MailSlurp is a free API that let's you create these on demand.

# Getting started

You can install the official PHP library from packagist using composer:

First create a composer.json in your project root like so:

{
  "repositories": [
    {
      "type": "git",
      "url": "https://github.com/mailslurp/swagger-sdk-php.git"
    }
  ],
  "require": {
    "mailslurp/mailslurp-client-php": "dev-master",
    "phpunit/phpunit": "^8"
  }
}

Next run:

composer install

# Write a test using real email addresses

Next, to demonstrate how to send and receive email in PHP using MailSlurp let's write a test that create two email addresses on demand and then sends an email between them. We will also use MailSlurp to extract email contents for a make-believe confirmation code.

<?php
require_once(__DIR__ . '/vendor/autoload.php');
use PHPUnit\Framework\TestCase;
/**
 * This testsuite demonstrates how to use MailSlurp Email API Client in PHP
 *
 * MailSlurp let's you create real email addresses in PHP. You can then send and receive emails
 * and attachments in PHP applications and tests.
 *
 * See https://www.mailslurp.com/docs/ for more information.
 *
 */
final class EmailTest extends TestCase
{
    private function getConfig()
    {
        // create a mailslurp configuration with API_KEY environment variable
        // get your own free API KEY at https://app.mailslurp.com/sign-up/
        return MailSlurp\Configuration::getDefaultConfiguration()
            ->setApiKey('x-api-key', getenv("API_KEY"));
    }
    public function test_CanCreateAnInbox_ThenSendAndReceiveEmails()
    {
        // create an inbox controller
        $inboxController = new MailSlurp\Apis\InboxControllerApi(null, $this->getConfig());
        // create an inbox
        $inbox = $inboxController->createInbox();
        // verify inbox has an email address ending in @mailslurp.com
        $this->assertStringContainsString(
            "mailslurp.com",
            $inbox->getEmailAddress()
        );
    }
    public function test_CanSendAndReceiveEmail_BetweenTwoInboxes()
    {
        // create inbox and waitFor controllers
        $inbox_controller = new MailSlurp\Apis\InboxControllerApi(null, $this->getConfig());
        $wait_for_controller = new MailSlurp\Apis\WaitForControllerApi(null, $this->getConfig());
        // create two inboxes
        $inbox_1 = $inbox_controller->createInbox();
        $inbox_2 = $inbox_controller->createInbox();
        // send a confirmation code from inbox1 to inbox2 (sends an actual email)
        $send_options = new MailSlurp\Models\SendEmailOptions();
        $send_options->setTo([$inbox_2->getEmailAddress()]);
        $send_options->setSubject("Test");
        $send_options->setBody("Confirmation code = abc123");
        $inbox_controller->sendEmail($inbox_1->getId(), $send_options);
        // receive email for inbox2
        $timeout_ms = 30000;
        $unread_only = true;
        $email = $wait_for_controller->waitForLatestEmail($inbox_2->getId(), $timeout_ms, $unread_only);
        // verify emails content
        $this->assertEquals($inbox_1->getEmailAddress(), $email->getFrom());
        $this->assertEquals($inbox_2->getEmailAddress(), $email->getTo()[0]);
        $this->assertEquals("Test", $email->getSubject());
        $this->assertStringContainsString("Confirmation code = ", $email->getBody());
        // extract part of an email using regex (could be used in further test steps)
        $matches = array();
        preg_match('/.+code = (.+)/', $email->getBody(), $matches);
        $confirmation_code = $matches[1];
        $this->assertEquals($confirmation_code, "abc123");
    }
}