forked from laravel/dusk
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
laravel#152 Implement facades faking
- Loading branch information
1 parent
df63e33
commit ef4900e
Showing
11 changed files
with
459 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
<?php | ||
|
||
namespace Laravel\Dusk\Concerns; | ||
|
||
use Laravel\Dusk\Faking\FacadeFakeProxy; | ||
|
||
trait FakesFacades | ||
{ | ||
/** | ||
* Fake a facade and return the fake proxy. | ||
* | ||
* @param string $facade | ||
* @return \Laravel\Dusk\Faking\FacadeFakeProxy | ||
*/ | ||
public function fake(string $facade) | ||
{ | ||
$this->visit('/_dusk/fake/'.urlencode($facade)); | ||
|
||
return new FacadeFakeProxy($this, $facade); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
<?php | ||
|
||
namespace Laravel\Dusk\Facades; | ||
|
||
use Illuminate\Support\Facades\Facade; | ||
|
||
/** | ||
* @see \Laravel\Dusk\Faking\FakingManager | ||
* @see \Laravel\Dusk\Faking\Driver | ||
*/ | ||
class Faking extends Facade | ||
{ | ||
/** | ||
* Get the registered name of the component. | ||
* | ||
* @return string | ||
*/ | ||
protected static function getFacadeAccessor() | ||
{ | ||
return 'faking'; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
<?php | ||
|
||
namespace Laravel\Dusk\Faking; | ||
|
||
use Symfony\Component\HttpFoundation\Response; | ||
|
||
abstract class Driver | ||
{ | ||
/** | ||
* The array of active facade fakes. | ||
* | ||
* @var array | ||
*/ | ||
protected $fakes = []; | ||
|
||
/** | ||
* Start faking facades. | ||
* | ||
* @return void | ||
*/ | ||
public function start() | ||
{ | ||
$this->loadFakes(); | ||
|
||
foreach ($this->fakes as $facade => $fake) { | ||
$facade::swap($fake); | ||
} | ||
} | ||
|
||
/** | ||
* Save facades state. | ||
* | ||
* @param \Symfony\Component\HttpFoundation\Response $response | ||
* @return void | ||
*/ | ||
public function save(Response $response) | ||
{ | ||
$this->storeFakes($response); | ||
} | ||
|
||
/** | ||
* Replace facade instance with a fake. | ||
* | ||
* @param string $facade | ||
* @return void | ||
*/ | ||
public function fake(string $facade) | ||
{ | ||
if (!$this->has($facade)) { | ||
$fake = $this->createFake($facade); | ||
$facade::swap($fake); | ||
$this->fakes[$facade] = $fake; | ||
} | ||
} | ||
|
||
/** | ||
* Determine if a facade is being faked. | ||
* | ||
* @param string $facade | ||
* @return boolean | ||
*/ | ||
public function has(string $facade) | ||
{ | ||
return isset($this->fakes[$facade]); | ||
} | ||
|
||
/** | ||
* Serialize a facade fake. | ||
* | ||
* @param string $facade | ||
* @return string | ||
*/ | ||
public function serialize(string $facade) | ||
{ | ||
return serialize($this->fakes[$facade]); | ||
} | ||
|
||
/** | ||
* Deserialize a facade fake. | ||
* | ||
* @param string $serializedFake | ||
* @return mixed | ||
*/ | ||
public function unserialize(string $serializedFake) | ||
{ | ||
return unserialize($serializedFake); | ||
} | ||
|
||
/** | ||
* Create a facade fake. | ||
* | ||
* @param $facade string | ||
* @return mixed | ||
*/ | ||
protected function createFake(string $facade) | ||
{ | ||
$facade::fake(); | ||
|
||
return $facade::getFacadeRoot(); | ||
} | ||
|
||
/** | ||
* Load fakes from storage. | ||
* | ||
* @return void | ||
*/ | ||
protected abstract function loadFakes(); | ||
|
||
/** | ||
* Store fakes. | ||
* | ||
* @param \Symfony\Component\HttpFoundation\Response $response | ||
* @return void | ||
*/ | ||
protected abstract function storeFakes(Response $response); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
<?php | ||
|
||
namespace Laravel\Dusk\Faking\Drivers; | ||
|
||
use Cookie; | ||
use Laravel\Dusk\Faking\Driver; | ||
use Symfony\Component\HttpFoundation\Response; | ||
|
||
class CookiesDriver extends Driver | ||
{ | ||
/** | ||
* Name of the cookie used to serialize fakes. | ||
* | ||
* @var string | ||
*/ | ||
const COOKIE_NAME = 'Dusk-Facade-Fakes'; | ||
|
||
/** | ||
* Load fakes from storage. | ||
* | ||
* @return void | ||
*/ | ||
protected function loadFakes() | ||
{ | ||
$serializedFakes = Cookie::get(self::COOKIE_NAME, '{}'); | ||
$serializedFakes = json_decode($serializedFakes, true); | ||
|
||
foreach ($serializedFakes as $facade => $serializedFake) { | ||
$this->fakes[$facade] = $this->unserialize($serializedFake); | ||
} | ||
} | ||
|
||
/** | ||
* Store fakes. | ||
* | ||
* @param \Symfony\Component\HttpFoundation\Response $response | ||
* @return void | ||
*/ | ||
protected function storeFakes(Response $response) | ||
{ | ||
$serializedFakes = []; | ||
foreach (array_keys($this->fakes) as $facade) { | ||
$serializedFakes[$facade] = $this->serialize($facade); | ||
} | ||
|
||
$response->headers->setCookie( | ||
Cookie::forever( | ||
static::COOKIE_NAME, | ||
json_encode($serializedFakes), | ||
'/' | ||
) | ||
); | ||
} | ||
} |
Oops, something went wrong.