CoderFunda
  • Home
  • About us
    • Contact Us
    • Disclaimer
    • Privacy Policy
    • About us
  • Home
  • Php
  • HTML
  • CSS
  • JavaScript
    • JavaScript
    • Jquery
    • JqueryUI
    • Stock
  • SQL
  • Vue.Js
  • Python
  • Wordpress
  • C++
    • C++
    • C
  • Laravel
    • Laravel
      • Overview
      • Namespaces
      • Middleware
      • Routing
      • Configuration
      • Application Structure
      • Installation
    • Overview
  • DBMS
    • DBMS
      • PL/SQL
      • SQLite
      • MongoDB
      • Cassandra
      • MySQL
      • Oracle
      • CouchDB
      • Neo4j
      • DB2
      • Quiz
    • Overview
  • Entertainment
    • TV Series Update
    • Movie Review
    • Movie Review
  • More
    • Vue. Js
    • Php Question
    • Php Interview Question
    • Laravel Interview Question
    • SQL Interview Question
    • IAS Interview Question
    • PCS Interview Question
    • Technology
    • Other

15 February, 2022

Conduct better email testing with Mail Intercept

 Programing Coderfunda     February 15, 2022     Laravel, Packages, php     No comments   

 

Conduct better email testing with Mail Intercept


Writing tests can be hard. Should I mock? Perhaps I should spy? Or maybe there is a built in fake() for this?

Writing tests for mail can be even harder. Enter Laravel’s Mail Fake. Use that at the beginning of your test, do your heavy lifting, then run some assertions against the fake. It is extremely helpful to verify that mail gets sent out and peek at the mail to ensure it got sent to the right person. As a sidenote, a little known plus with faking mail is that it will disable mail from sending accidentally during tests. You never want to be the one who sent out a few hundred emails accidentally… but back to the subject at hand.

But faking mail can only take you so far. How do you test the email body contains the correct string? What about that custom header? Or even the subject? Those kinds of details need to be tested, but can’t be faked. Right Harry?

Say hello to Mail Intercept!

Mail Intercept for Laravel is a new way of testing mail by intercepting, not faking, email so we can dissect it, turn it upside down, and inspect everything.

Under the hood, it is quite simple in that it forces the mail driver to be an array pushing all those emails into memory. We then grab those emails and run assertions on them! That’s it, pretty simple really!

But we didn’t want to stop there. We wanted it to be really easy to run assertions against those emails to check for specific things. Here are the assertions available to you as of this writing:

1$this->assertMailSentTo($to, $mail);
2$this->assertMailNotSentTo($to, $mail);
3$this->assertMailSentFrom($from, $mail);
4$this->assertMailNotSentFrom($from, $mail);
5$this->assertMailSubject($subject, $mail);
6$this->assertMailNotSubject($subject, $mail);
7$this->assertMailBodyContainsString($content, $mail);
8$this->assertMailBodyNotContainsString($content, $mail);
9$this->assertMailHasHeader($header, $mail);
10$this->assertMailMissingHeader($header, $mail);
11$this->assertMailHeaderIs($header, $value, $mail);
12$this->assertMailHeaderIsNot($header, $value, $mail);

You will notice that each assertion accepts, as the last parameter, a $mail object. Where does that come from you might ask? Let’s look at a simple test to answer that question.

1namespace Tests;
2 
3use App\Jobs\SomeJobThatSendsMail;
4use Illuminate\Foundation\Testing\WithFaker;
5use KirschbaumDevelopment\MailIntercept\WithMailInterceptor;
6 
7class MailTest extends TestCase
8{
9 use WithFaker;
10 use WithMailInterceptor;
11 
12 public function testMail()
13 {
14 $this->interceptMail();
15 
16 $email = $this->faker->email;
17 
18 SomeJobThatSendsMail::dispatchNow($email);
19 
20 $interceptedMail = $this->interceptedMail()->first();
21 
22 $this->assertMailSentTo($email, $interceptedMail);
23 }
24}

The first thing to notice is the use of the WithMailInterceptor trait. This pulls in the ability to intercept and makes available our mail assertions.

Just like faking mail, we must call the $this->interceptMail() before mail gets sent.

After the mail is sent we need to retrieve the freshly sent mail. We grab these with $this->interceptedMail(). This will return a collection of sent mail. And since it is a collection, we can use the first() method to grab the only email we sent.

Now we can run all the assertions against that mail object. If instead we need to run assertions against multple emails, we can use the each() method to loop through them.

We’ve included a good starting point for assertions. However, if there aren’t enough for your liking, the mail object is an just an instance of Swift_Message with all of its available methods. Head over to the Swift Mailer Docs for all available methods.

Interested in using this test suite in your project now? Head over to Mail Intercept on Github, pull it into your project with Composer and start intercepting and testing mail with confidence!

Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Automatically Sanitize Model Data

 Programing Coderfunda     February 15, 2022     Laravel, Packages, php     No comments   

Laravel Model Sanitize is a package by Touhidur Rahman to handle the sanitization process of model data when creating and updating records.

Given the following call to User::create(), the Sanitize package will remove non-fillable data automatically:

1// Using the package's Sanitizable triat
2use Touhidurabir\ModelSanitize\Sanitizable;
3use Illuminate\Database\Eloquent\Model;
4 
5class User extends Model {
6 use Sanitizable;
7}
8 
9// The trait removes the `data` key, which is not a fillable field
10$data = [
11 'email' => 'somemail@test.com',
12 'password' => 'password',
13 'data' => 'some data' // Invalid field
14];
15 
16User::create($data);

The Sanitizable trait will automatically work for the various create and update model methods (i.e., updateOrCreate, firstOrCreate, etc.).

If you are using $fillable on models, this package will not be necessary, however, if you use $guarded = [], this package will discard columns not found on the table.

The package also has two static methods for separating data with corresponding fields to get valid/invalid data:

1$data = [
2 'email' => 'somemail@test.com',
3 'password' => 'password',
4 'data' => 'some data',
5 'name' => 'Test User'
6];
7 
8// Get only valid fields
9User::sanitize($data);
10/*
11[
12 'email' => 'somemail@test.com',
13 'password' => 'password',
14 'name' => 'Test User'
15]
16*/
17 
18// Get invalid attributes from data
19User::gibberish($data);
20/*
21[
22 'data' => 'some data',
23]
24*/

You can learn more about this package, get full installation instructions, and view the source code on GitHub.

Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg
Newer Posts Older Posts Home

Meta

Popular Posts

  • How to monitor process status during process lifetime
    I need to track the process status ps axf during executable lifetime. Let's say I have executable main.exec and want to store into a fi...
  • How to use Filament 3 with Laravel 11 | Beginner Course
    How to install filament 3 from scratch with Laravel 11. submitted by /u/Tilly-w-e [link] [comments]
  • How to Run a Python File on a Specific Virtual Desktop Only?
    I want to run a Python script on a specific virtual desktop without affecting other desktops. Currently, when I execute my Python file us...
  • How to create a responsive circle with two lines of text in HTML and CSS?
    body { display: flex; justify-content: center; align-items: center; gap: 15px; } .circle { display: flex; flex-direction: col...
  • Clang not generating debug info on -g flag
      1 Answer Active     Oldest  Votes 5 On Windows, Clang is not self-sufficient (at least not the official binaries). You need to have either...

Categories

  • Ajax (26)
  • Bootstrap (30)
  • DBMS (42)
  • HTML (12)
  • HTML5 (45)
  • JavaScript (10)
  • Jquery (34)
  • Jquery UI (2)
  • JqueryUI (32)
  • Laravel (1017)
  • Laravel Tutorials (23)
  • Laravel-Question (6)
  • Magento (9)
  • Magento 2 (95)
  • MariaDB (1)
  • MySql Tutorial (2)
  • PHP-Interview-Questions (3)
  • Php Question (13)
  • Python (36)
  • RDBMS (13)
  • SQL Tutorial (79)
  • Vue.js Tutorial (69)
  • Wordpress (150)
  • Wordpress Theme (3)
  • codeigniter (108)
  • oops (4)
  • php (853)

Social Media Links

  • Follow on Twitter
  • Like on Facebook
  • Subscribe on Youtube
  • Follow on Instagram

Pages

  • Home
  • Contact Us
  • Privacy Policy
  • About us

Blog Archive

  • July (4)
  • September (100)
  • August (50)
  • July (56)
  • June (46)
  • May (59)
  • April (50)
  • March (60)
  • February (42)
  • January (53)
  • December (58)
  • November (61)
  • October (39)
  • September (36)
  • August (36)
  • July (34)
  • June (34)
  • May (36)
  • April (29)
  • March (82)
  • February (1)
  • January (8)
  • December (14)
  • November (41)
  • October (13)
  • September (5)
  • August (48)
  • July (9)
  • June (6)
  • May (119)
  • April (259)
  • March (122)
  • February (368)
  • January (33)
  • October (2)
  • July (11)
  • June (29)
  • May (25)
  • April (168)
  • March (93)
  • February (60)
  • January (28)
  • December (195)
  • November (24)
  • October (40)
  • September (55)
  • August (6)
  • July (48)
  • May (2)
  • January (2)
  • July (6)
  • June (6)
  • February (17)
  • January (69)
  • December (122)
  • November (56)
  • October (92)
  • September (76)
  • August (6)

Loading...

Laravel News

Loading...

Copyright © CoderFunda | Powered by Blogger
Design by Coderfunda | Blogger Theme by Coderfunda | Distributed By Coderfunda