Wormhole.php
TLDR
The Wormhole
class in the Illuminate\Foundation\Testing
namespace is used for time travel testing. It allows you to simulate the passage of time in your tests by advancing the current time. It provides methods to travel forward in time by a specific duration (in milliseconds, seconds, minutes, hours, days, weeks, months, or years), as well as a method to travel back to the current time.
Methods
millisecond
Travel forward the given number of milliseconds.
milliseconds
Travel forward the given number of milliseconds.
second
Travel forward the given number of seconds.
seconds
Travel forward the given number of seconds.
minute
Travel forward the given number of minutes.
minutes
Travel forward the given number of minutes.
hour
Travel forward the given number of hours.
hours
Travel forward the given number of hours.
day
Travel forward the given number of days.
days
Travel forward the given number of days.
week
Travel forward the given number of weeks.
weeks
Travel forward the given number of weeks.
month
Travel forward the given number of months.
months
Travel forward the given number of months.
year
Travel forward the given number of years.
years
Travel forward the given number of years.
back
Travel back to the current time.
Classes
Wormhole
The Wormhole
class is a time travel testing class that allows you to simulate the passage of time in your tests. It provides methods to travel forward in time by a specific duration and a method to travel back to the current time.
<?php
namespace Illuminate\Foundation\Testing;
use Illuminate\Support\Carbon;
class Wormhole
{
/**
* The amount of time to travel.
*
* @var int
*/
public $value;
/**
* Create a new wormhole instance.
*
* @param int $value
* @return void
*/
public function __construct($value)
{
$this->value = $value;
}
/**
* Travel forward the given number of milliseconds.
*
* @param callable|null $callback
* @return mixed
*/
public function millisecond($callback = null)
{
return $this->milliseconds($callback);
}
/**
* Travel forward the given number of milliseconds.
*
* @param callable|null $callback
* @return mixed
*/
public function milliseconds($callback = null)
{
Carbon::setTestNow(Carbon::now()->addMilliseconds($this->value));
return $this->handleCallback($callback);
}
/**
* Travel forward the given number of seconds.
*
* @param callable|null $callback
* @return mixed
*/
public function second($callback = null)
{
return $this->seconds($callback);
}
/**
* Travel forward the given number of seconds.
*
* @param callable|null $callback
* @return mixed
*/
public function seconds($callback = null)
{
Carbon::setTestNow(Carbon::now()->addSeconds($this->value));
return $this->handleCallback($callback);
}
/**
* Travel forward the given number of minutes.
*
* @param callable|null $callback
* @return mixed
*/
public function minute($callback = null)
{
return $this->minutes($callback);
}
/**
* Travel forward the given number of minutes.
*
* @param callable|null $callback
* @return mixed
*/
public function minutes($callback = null)
{
Carbon::setTestNow(Carbon::now()->addMinutes($this->value));
return $this->handleCallback($callback);
}
/**
* Travel forward the given number of hours.
*
* @param callable|null $callback
* @return mixed
*/
public function hour($callback = null)
{
return $this->hours($callback);
}
/**
* Travel forward the given number of hours.
*
* @param callable|null $callback
* @return mixed
*/
public function hours($callback = null)
{
Carbon::setTestNow(Carbon::now()->addHours($this->value));
return $this->handleCallback($callback);
}
/**
* Travel forward the given number of days.
*
* @param callable|null $callback
* @return mixed
*/
public function day($callback = null)
{
return $this->days($callback);
}
/**
* Travel forward the given number of days.
*
* @param callable|null $callback
* @return mixed
*/
public function days($callback = null)
{
Carbon::setTestNow(Carbon::now()->addDays($this->value));
return $this->handleCallback($callback);
}
/**
* Travel forward the given number of weeks.
*
* @param callable|null $callback
* @return mixed
*/
public function week($callback = null)
{
return $this->weeks($callback);
}
/**
* Travel forward the given number of weeks.
*
* @param callable|null $callback
* @return mixed
*/
public function weeks($callback = null)
{
Carbon::setTestNow(Carbon::now()->addWeeks($this->value));
return $this->handleCallback($callback);
}
/**
* Travel forward the given number of months.
*
* @param callable|null $callback
* @return mixed
*/
public function month($callback = null)
{
return $this->months($callback);
}
/**
* Travel forward the given number of months.
*
* @param callable|null $callback
* @return mixed
*/
public function months($callback = null)
{
Carbon::setTestNow(Carbon::now()->addMonths($this->value));
return $this->handleCallback($callback);
}
/**
* Travel forward the given number of years.
*
* @param callable|null $callback
* @return mixed
*/
public function year($callback = null)
{
return $this->years($callback);
}
/**
* Travel forward the given number of years.
*
* @param callable|null $callback
* @return mixed
*/
public function years($callback = null)
{
Carbon::setTestNow(Carbon::now()->addYears($this->value));
return $this->handleCallback($callback);
}
/**
* Travel back to the current time.
*
* @return \DateTimeInterface
*/
public static function back()
{
Carbon::setTestNow();
return Carbon::now();
}
/**
* Handle the given optional execution callback.
*
* @param callable|null $callback
* @return mixed
*/
protected function handleCallback($callback)
{
if ($callback) {
return tap($callback(), function () {
Carbon::setTestNow();
});
}
}
}