Skip to content

Commit

Permalink
feat(testing): Add TestingContainer and TestingApplicationRoutes
Browse files Browse the repository at this point in the history
  • Loading branch information
pionl committed Sep 27, 2022
1 parent d9a6287 commit 2765d84
Show file tree
Hide file tree
Showing 4 changed files with 211 additions and 141 deletions.
5 changes: 4 additions & 1 deletion rector.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@

// SKIP laravel
$config->skip([
UnSpreadOperatorRector::class => [__DIR__ . '/src/Testing/Laravel/TestingApplication.php'],
UnSpreadOperatorRector::class => [
__DIR__ . '/src/Testing/Laravel/TestingApplication.php',
__DIR__ . '/src/Testing/Laravel/TestingContainer.php',
],
VarConstantCommentRector::class,
// We want to leave the relative constant path usage
__DIR__ . '/tests/Feature/Testing/Commands/MakeExpectationCommand/*.php',
Expand Down
145 changes: 5 additions & 140 deletions src/Testing/Laravel/TestingApplication.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,15 @@
namespace LaraStrict\Testing\Laravel;

use Closure;
use Illuminate\Container\ContextualBindingBuilder;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Contracts\Foundation\Application;

/**
* A testing application class that helps you to not use mocks.
*/
class TestingApplication implements Application
class TestingApplication extends TestingContainer implements Application
{
/**
* @param array<string, Closure(array):(object|null)> $makeBindings A map of closures that will create.
* @param array<string, object|Closure(array):(object|null)> $makeBindings A map of closures that will create.
* Receives make $parameters and $abstract
* string
* @param Closure(array,string):(object|null)|null $makeAlwaysBinding If makeBindings has no entry, it will call
Expand All @@ -27,9 +25,10 @@ public function __construct(
public bool $runningInConsole = false,
public bool $isDownForMaintenance = false,
public MaintenanceMode $maintenanceMode = new MaintenanceMode(),
private array $makeBindings = [],
private Closure|null $makeAlwaysBinding = null,
array $makeBindings = [],
Closure|null $makeAlwaysBinding = null,
) {
parent::__construct($makeBindings, $makeAlwaysBinding);
}

public function version()
Expand Down Expand Up @@ -167,138 +166,4 @@ public function terminating($callback)
public function terminate()
{
}

public function bound($abstract)
{
return false;
}

public function alias($abstract, $alias)
{
}

public function tag($abstracts, $tags)
{
}

public function tagged($tag)
{
return [];
}

public function bind($abstract, $concrete = null, $shared = false)
{
}

public function bindIf($abstract, $concrete = null, $shared = false)
{
}

public function singleton($abstract, $concrete = null)
{
}

public function singletonIf($abstract, $concrete = null)
{
}

public function scoped($abstract, $concrete = null)
{
}

public function scopedIf($abstract, $concrete = null)
{
}

public function extend($abstract, Closure $closure)
{
}

public function instance($abstract, $instance)
{
}

public function addContextualBinding($concrete, $abstract, $implementation)
{
}

public function when($concrete)
{
return new ContextualBindingBuilder($this, $concrete);
}

public function factory($abstract)
{
return static function () {
};
}

public function flush()
{
}

public function make($abstract, array $parameters = [])
{
$make = $this->makeBindings[$abstract] ?? null;

if ($make === null && $this->makeAlwaysBinding !== null) {
$make = $this->makeAlwaysBinding;
}

if ($make === null) {
throw new BindingResolutionException('Binding not set ' . $abstract);
}

$result = $make($parameters, $abstract);

if ($result === null) {
throw new BindingResolutionException('Failed to resolve ' . $abstract);
}

return $result;
}

/**
* @param Closure(array):?object $make Closure that will receive make parameters and should return an object.
*/
public function makeReturns(string $abstract, Closure $make): void
{
$this->makeBindings[$abstract] = $make;
}

public function makeAlwaysReturn(Closure $make): void
{
$this->makeAlwaysBinding = $make;
}

public function call($callback, array $parameters = [], $defaultMethod = null)
{
}

public function resolved($abstract)
{
return false;
}

public function beforeResolving($abstract, Closure $callback = null)
{
}

public function resolving($abstract, Closure $callback = null)
{
}

public function afterResolving($abstract, Closure $callback = null)
{
}

public function get(string $id)
{
return null;
}

public function has(string $id): bool
{
return false;
}
}
33 changes: 33 additions & 0 deletions src/Testing/Laravel/TestingApplicationRoutes.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

declare(strict_types=1);

namespace LaraStrict\Testing\Laravel;

use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Foundation\CachesRoutes;

/**
* A testing application class that helps you to not use mocks.
*/
class TestingApplicationRoutes extends TestingApplication implements CachesRoutes
{
private bool $routesAreCached = false;

public function setRoutesAreCached(bool $routesAreCached = true): self
{
$this->routesAreCached = $routesAreCached;

return $this;
}

public function routesAreCached()
{
return $this->routesAreCached;
}

public function getCachedRoutesPath()
{
return 'routes-path';
}
}
169 changes: 169 additions & 0 deletions src/Testing/Laravel/TestingContainer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
<?php

declare(strict_types=1);

namespace LaraStrict\Testing\Laravel;

use Closure;
use Illuminate\Container\ContextualBindingBuilder;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\Foundation\Application;

/**
* A testing application class that helps you to not use mocks.
*/
class TestingContainer implements Container
{
/**
* @param array<string, object|Closure(array):(object|null)> $makeBindings A map of closures that will create.
* Receives make $parameters and $abstract
* string
* @param Closure(array,string):(object|null)|null $makeAlwaysBinding If makeBindings has no entry, it will call
* make on this closure. Receives make
* $parameters and $abstract string
*/
public function __construct(
private array $makeBindings = [],
private Closure|null $makeAlwaysBinding = null,
) {
}

public function bound($abstract)
{
return false;
}

public function alias($abstract, $alias)
{
}

public function tag($abstracts, $tags)
{
}

public function tagged($tag)
{
return [];
}

public function bind($abstract, $concrete = null, $shared = false)
{
}

public function bindIf($abstract, $concrete = null, $shared = false)
{
}

public function singleton($abstract, $concrete = null)
{
}

public function singletonIf($abstract, $concrete = null)
{
}

public function scoped($abstract, $concrete = null)
{
}

public function scopedIf($abstract, $concrete = null)
{
}

public function extend($abstract, Closure $closure)
{
}

public function instance($abstract, $instance)
{
}

public function addContextualBinding($concrete, $abstract, $implementation)
{
}

public function when($concrete)
{
return new ContextualBindingBuilder($this, $concrete);
}

public function factory($abstract)
{
return static function () {
};
}

public function flush()
{
}

public function make($abstract, array $parameters = [])
{
$make = $this->makeBindings[$abstract] ?? null;

if (is_object($make)) {
return $make;
}

if ($make === null && $this->makeAlwaysBinding !== null) {
$make = $this->makeAlwaysBinding;
}

if ($make === null) {
throw new BindingResolutionException('Binding not set ' . $abstract);
}

$result = $make($parameters, $abstract);

if ($result === null) {
throw new BindingResolutionException('Failed to resolve ' . $abstract);
}

return $result;
}

/**
* @param Closure(array):?object $make Closure that will receive make parameters and should return an object.
*/
public function makeReturns(string $abstract, Closure $make): void
{
$this->makeBindings[$abstract] = $make;
}

public function makeAlwaysReturn(Closure $make): void
{
$this->makeAlwaysBinding = $make;
}

public function call($callback, array $parameters = [], $defaultMethod = null)
{
}

public function resolved($abstract)
{
return false;
}

public function beforeResolving($abstract, Closure $callback = null)
{
}

public function resolving($abstract, Closure $callback = null)
{
}

public function afterResolving($abstract, Closure $callback = null)
{
}

public function get(string $id)
{
return null;
}

public function has(string $id): bool
{
return false;
}
}

0 comments on commit 2765d84

Please sign in to comment.