select use binding

This commit is contained in:
Yuri Kuznetsov
2021-04-15 18:13:03 +03:00
parent 93960dd1b8
commit b00dfb6135
8 changed files with 287 additions and 128 deletions
@@ -59,7 +59,7 @@ class Converter
public function __construct(
string $entityType,
User $user,
ItemGeneralConverter $itemConverter,
ItemConverter $itemConverter,
Scanner $scanner,
RandomStringGenerator $randomStringGenerator,
ORMDefs $ormDefs
@@ -72,7 +72,7 @@ class Converter
$this->ormDefs = $ormDefs;
}
public function convert(QueryBuilder $queryBuilder, Item $item) : WhereClause
public function convert(QueryBuilder $queryBuilder, Item $item): WhereClause
{
$whereClause = [];
@@ -93,7 +93,7 @@ class Converter
return WhereClause::fromRaw($whereClause);
}
protected function itemToList(Item $item) : array
protected function itemToList(Item $item): array
{
if ($item->getType() !== 'and') {
return [
@@ -110,7 +110,7 @@ class Converter
return $list;
}
protected function processItem(QueryBuilder $queryBuilder, Item $item) : ?array
protected function processItem(QueryBuilder $queryBuilder, Item $item): ?array
{
$type = $item->getType();
$attribute = $item->getAttribute();
@@ -135,7 +135,7 @@ class Converter
return $this->itemConverter->convert($queryBuilder, $item)->getRaw();
}
protected function applyInCategory(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function applyInCategory(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$link = $attribute;
@@ -196,7 +196,7 @@ class Converter
throw new Error("Not supported link '{$link}' in where item.");
}
protected function applyIsUserFromTeams(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function applyIsUserFromTeams(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$link = $attribute;
@@ -32,6 +32,9 @@ namespace Espo\Core\Select\Where;
use Espo\Core\{
Utils\Metadata,
InjectableFactory,
Binding\BindingContainer,
Binding\Binder,
Binding\BindingData,
};
use Espo\{
@@ -50,33 +53,86 @@ class ConverterFactory
$this->metadata = $metadata;
}
public function create(string $entityType, User $user) : Converter
public function create(string $entityType, User $user): Converter
{
$dateTimeItemTransformerClassName = $this->getDateTimeItemTransformerClassName($entityType);
$dateTimeItemTransformer = $this->createDateTimeItemTranformer($entityType, $user);
$dateTimeItemTransformer = $this->injectableFactory->createWith($dateTimeItemTransformerClassName, [
'entityType' => $entityType,
'user' => $user,
]);
$itemConverter = $this->createItemConverter($entityType, $user, $dateTimeItemTransformer);
$itemConverterClassName = $this->getItemConverterClassName($entityType);
$className = $this->getConverterClassName($entityType);
$itemConverter = $this->injectableFactory->createWith($itemConverterClassName, [
'entityType' => $entityType,
'user' => $user,
'dateTimeItemTransformer' => $dateTimeItemTransformer,
]);
$bindingData = new BindingData();
$converterClassName = $this->getConverterClassName($entityType);
$binder = new Binder($bindingData);
return $this->injectableFactory->createWith($converterClassName, [
'entityType' => $entityType,
'user' => $user,
'itemConverter' => $itemConverter,
]);
$binder
->bindInstance(User::class, $user);
$binder
->for($className)
->bindValue('$entityType', $entityType)
->bindInstance(ItemConverter::class, $itemConverter);
$bindingContainer = new BindingContainer($bindingData);
return $this->injectableFactory->createWithBinding($className, $bindingContainer);
}
private function getConverterClassName(string $entityType) : string
private function createDateTimeItemTranformer(string $entityType, User $user): DateTimeItemTransformer
{
$className = $this->getDateTimeItemTransformerClassName($entityType);
$bindingData = new BindingData();
$binder = new Binder($bindingData);
$binder
->bindInstance(User::class, $user);
$binder
->for($className)
->bindValue('$entityType', $entityType);
$binder
->for(DateTimeItemTransformer::class)
->bindValue('$entityType', $entityType);
$bindingContainer = new BindingContainer($bindingData);
return $this->injectableFactory->createWithBinding($className, $bindingContainer);
}
private function createItemConverter(
string $entityType,
User $user,
DateTimeItemTransformer $dateTimeItemTransformer
): ItemConverter {
$className = $this->getItemConverterClassName($entityType);
$bindingData = new BindingData();
$binder = new Binder($bindingData);
$binder
->bindInstance(User::class, $user);
$binder
->for($className)
->bindValue('$entityType', $entityType)
->bindInstance(DateTimeItemTransformer::class, $dateTimeItemTransformer);
$binder
->for(ItemGeneralConverter::class)
->bindValue('$entityType', $entityType)
->bindInstance(DateTimeItemTransformer::class, $dateTimeItemTransformer);
$bindingContainer = new BindingContainer($bindingData);
return $this->injectableFactory->createWithBinding($className, $bindingContainer);
}
private function getConverterClassName(string $entityType): string
{
$className = $this->metadata->get(['selectDefs', $entityType, 'whereConverterClassName']);
@@ -87,7 +143,7 @@ class ConverterFactory
return Converter::class;
}
private function getItemConverterClassName(string $entityType) : string
private function getItemConverterClassName(string $entityType): string
{
$className = $this->metadata->get(['selectDefs', $entityType, 'whereItemConverterClassName']);
@@ -98,9 +154,10 @@ class ConverterFactory
return ItemGeneralConverter::class;
}
private function getDateTimeItemTransformerClassName(string $entityType) : string
private function getDateTimeItemTransformerClassName(string $entityType): string
{
$className = $this->metadata->get(['selectDefs', $entityType, 'whereDateTimeItemTransformerClassName']);
$className = $this->metadata
->get(['selectDefs', $entityType, 'whereDateTimeItemTransformerClassName']);
if ($className) {
return $className;
@@ -39,5 +39,5 @@ use Espo\{
*/
interface ItemConverter
{
public function convert(QueryBuilder $queryBuilder, Item $item) : WhereClauseItem;
public function convert(QueryBuilder $queryBuilder, Item $item): WhereClauseItem;
}
@@ -33,6 +33,9 @@ use Espo\Core\{
Exceptions\Error,
InjectableFactory,
Utils\Metadata,
Binding\BindingContainer,
Binding\Binder,
Binding\BindingData,
};
use Espo\{
@@ -56,7 +59,7 @@ class ItemConverterFactory
return (bool) $this->getClassNameForType($type);
}
public function createForType(string $type, string $entityType, User $user) : ItemConverter
public function createForType(string $type, string $entityType, User $user): ItemConverter
{
$className = $this->getClassNameForType($type);
@@ -64,25 +67,35 @@ class ItemConverterFactory
throw new Error("Where item converter class name is not defined.");
}
return $this->injectableFactory->createWith($className, [
'entityType' => $entityType,
'user' => $user,
]);
$bindingData = new BindingData();
$binder = new Binder($bindingData);
$binder
->bindInstance(User::class, $user);
$binder
->for($className)
->bindValue('$entityType', $entityType);
$bindingContainer = new BindingContainer($bindingData);
return $this->injectableFactory->createWithBinding($className, $bindingContainer);
}
protected function getClassNameForType(string $type) : ?string
protected function getClassNameForType(string $type): ?string
{
return $this->metadata->get([
'app', 'select', 'whereItemConverterClassNameMap', $type
]);
}
public function has(string $entityType, string $attribute, string $type) : bool
public function has(string $entityType, string $attribute, string $type): bool
{
return (bool) $this->getClassName($entityType, $attribute, $type);
}
public function create(string $entityType, string $attribute, string $type, User $user) : ItemConverter
public function create(string $entityType, string $attribute, string $type, User $user): ItemConverter
{
$className = $this->getClassName($entityType, $attribute, $type);
@@ -90,13 +103,23 @@ class ItemConverterFactory
throw new Error("Where item converter class name is not defined.");
}
return $this->injectableFactory->createWith($className, [
'entityType' => $entityType,
'user' => $user,
]);
$bindingData = new BindingData();
$binder = new Binder($bindingData);
$binder
->bindInstance(User::class, $user);
$binder
->for($className)
->bindValue('$entityType', $entityType);
$bindingContainer = new BindingContainer($bindingData);
return $this->injectableFactory->createWithBinding($className, $bindingContainer);
}
protected function getClassName(string $entityType, string $attribute, string $type) : ?string
protected function getClassName(string $entityType, string $attribute, string $type): ?string
{
return $this->metadata->get([
'selectDefs', $entityType, 'whereItemConverterClassNameMap', $attribute . '_' . $type
@@ -48,7 +48,7 @@ use DateInterval;
/**
* Converts a where item to a where clause (for ORM).
*/
class ItemGeneralConverter
class ItemGeneralConverter implements ItemConverter
{
protected $entityType;
@@ -90,7 +90,7 @@ class ItemGeneralConverter
$this->config = $config;
}
public function convert(QueryBuilder $queryBuilder, Item $item) : WhereClauseItem
public function convert(QueryBuilder $queryBuilder, Item $item): WhereClauseItem
{
$type = $item->getType();
$value = $item->getValue();
@@ -187,8 +187,12 @@ class ItemGeneralConverter
}
protected function groupProcessAndOr(
QueryBuilder $queryBuilder, string $type, ?string $attribute, $value
) : array {
QueryBuilder $queryBuilder,
string $type,
?string $attribute,
$value
): array {
if (!is_array($value)) {
throw new Error("Bad where item.");
}
@@ -213,8 +217,12 @@ class ItemGeneralConverter
}
protected function groupProcessSubQuery(
QueryBuilder $queryBuilder, string $type, ?string $attribute, $value
) : array {
QueryBuilder $queryBuilder,
string $type,
?string $attribute,
$value
): array {
if (!is_array($value)) {
throw new Error("Bad where item.");
}
@@ -249,8 +257,12 @@ class ItemGeneralConverter
}
protected function groupProcessColumn(
QueryBuilder $queryBuilder, string $type, string $attribute, $value
) : array {
QueryBuilder $queryBuilder,
string $type,
string $attribute,
$value
): array {
$link = $this->metadata->get(['entityDefs', $this->entityType, 'fields', $attribute, 'link']);
$column = $this->metadata->get(['entityDefs', $this->entityType, 'fields', $attribute, 'column']);
@@ -309,8 +321,11 @@ class ItemGeneralConverter
}
protected function groupProcessArray(
QueryBuilder $queryBuilder, string $type, string $attribute, $value
) : array {
QueryBuilder $queryBuilder,
string $type,
string $attribute,
$value
): array {
$arrayValueAlias = 'arrayFilter' . $this->randomStringGenerator->generate();
@@ -469,7 +484,7 @@ class ItemGeneralConverter
/**
* A complex expression w/o a value.
*/
protected function processExpression(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processExpression(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$key = $attribute;
@@ -482,111 +497,111 @@ class ItemGeneralConverter
];
}
protected function processLike(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processLike(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '*' => $value,
];
}
protected function processNotLike(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processNotLike(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '!*' => $value,
];
}
protected function processEquals(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processEquals(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '=' => $value,
];
}
protected function processOn(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processOn(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return $this->processEquals($queryBuilder, $attribute, $value);
}
protected function processNotEquals(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processNotEquals(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '!=' => $value,
];
}
protected function processNotOn(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processNotOn(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return $this->processNotEquals($queryBuilder, $attribute, $value);
}
protected function processStartsWith(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processStartsWith(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '*' => $value . '%',
];
}
protected function processEndsWith(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processEndsWith(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '*' => '%' . $value,
];
}
protected function processContains(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processContains(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '*' => '%' . $value . '%',
];
}
protected function processNotContains(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processNotContains(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '!*' => '%' . $value . '%',
];
}
protected function processGreaterThan(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processGreaterThan(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '>' => $value,
];
}
protected function processAfter(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processAfter(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return $this->processGreaterThan($queryBuilder, $attribute, $value);
}
protected function processLessThan(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processLessThan(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '<' => $value,
];
}
protected function processBefore(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processBefore(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return $this->processLessThan($queryBuilder, $attribute, $value);
}
protected function processGreaterThanOrEquals(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processGreaterThanOrEquals(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '>=' => $value,
];
}
protected function processLessThanOrEquals(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processLessThanOrEquals(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '<=' => $value,
];
}
protected function processIn(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processIn(QueryBuilder $queryBuilder, string $attribute, $value): array
{
if (!is_array($value)) {
throw new Error("Bad where item 'in'.");
@@ -597,7 +612,7 @@ class ItemGeneralConverter
];
}
protected function processNotIn(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processNotIn(QueryBuilder $queryBuilder, string $attribute, $value): array
{
if (!is_array($value)) {
throw new Error("Bad where item 'notIn'.");
@@ -608,7 +623,7 @@ class ItemGeneralConverter
];
}
protected function processBetween(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processBetween(QueryBuilder $queryBuilder, string $attribute, $value): array
{
if (!is_array($value) || count($value) < 2) {
throw new Error("Bad where item 'between'.");
@@ -622,61 +637,61 @@ class ItemGeneralConverter
];
}
protected function processIsNull(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processIsNull(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '=' => null,
];
}
protected function processIsNotNull(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processIsNotNull(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '!=' => null,
];
}
protected function processEver(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processEver(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return $this->processIsNotNull($queryBuilder, $attribute, $value);
}
protected function processIsTrue(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processIsTrue(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '=' => true,
];
}
protected function processIsFalse(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processIsFalse(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '=' => false,
];
}
protected function processToday(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processToday(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '=' => date('Y-m-d'),
];
}
protected function processPast(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processPast(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '<' => date('Y-m-d'),
];
}
protected function processFuture(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processFuture(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
$attribute . '>' => date('Y-m-d'),
];
}
protected function processLastSevenDays(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processLastSevenDays(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dt1 = new DateTime();
@@ -692,7 +707,7 @@ class ItemGeneralConverter
];
}
protected function processLastXDays(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processLastXDays(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dt1 = new DateTime();
@@ -710,7 +725,7 @@ class ItemGeneralConverter
];
}
protected function processNextXDays(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processNextXDays(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dt1 = new DateTime();
@@ -728,7 +743,7 @@ class ItemGeneralConverter
];
}
protected function processOlderThanXDays(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processOlderThanXDays(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dt = new DateTime();
@@ -741,7 +756,7 @@ class ItemGeneralConverter
];
}
protected function processAfterXDays(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processAfterXDays(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dt = new DateTime();
@@ -754,7 +769,7 @@ class ItemGeneralConverter
];
}
protected function processCurrentMonth(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processCurrentMonth(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dt = new DateTime();
@@ -766,7 +781,7 @@ class ItemGeneralConverter
];
}
protected function processLastMonth(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processLastMonth(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dt = new DateTime();
@@ -778,7 +793,7 @@ class ItemGeneralConverter
];
}
protected function processNextMonth(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processNextMonth(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dt = new DateTime();
@@ -790,7 +805,7 @@ class ItemGeneralConverter
];
}
protected function processCurrentQuarter(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processCurrentQuarter(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dt = new DateTime();
@@ -806,7 +821,7 @@ class ItemGeneralConverter
];
}
protected function processLastQuarter(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processLastQuarter(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dt = new DateTime();
@@ -829,7 +844,7 @@ class ItemGeneralConverter
];
}
protected function processCurrentYear(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processCurrentYear(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dt = new DateTime();
@@ -841,7 +856,7 @@ class ItemGeneralConverter
];
}
protected function processLastYear(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processLastYear(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dt = new DateTime();
@@ -853,7 +868,7 @@ class ItemGeneralConverter
];
}
protected function processCurrentFiscalYear(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processCurrentFiscalYear(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dtToday = new DateTime();
$dt = new DateTime();
@@ -874,7 +889,7 @@ class ItemGeneralConverter
];
}
protected function processLastFiscalYear(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processLastFiscalYear(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dtToday = new DateTime();
$dt = new DateTime();
@@ -897,7 +912,7 @@ class ItemGeneralConverter
];
}
protected function processCurrentFiscalQuarter(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processCurrentFiscalQuarter(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dtToday = new DateTime();
$dt = new DateTime();
@@ -927,7 +942,7 @@ class ItemGeneralConverter
];
}
protected function processLastFiscalQuarter(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processLastFiscalQuarter(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$dtToday = new DateTime();
$dt = new DateTime();
@@ -959,7 +974,7 @@ class ItemGeneralConverter
];
}
protected function processIsNotLinked(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processIsNotLinked(QueryBuilder $queryBuilder, string $attribute, $value): array
{
return [
'id!=s' => [
@@ -970,7 +985,7 @@ class ItemGeneralConverter
];
}
protected function processIsLinked(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processIsLinked(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$link = $attribute;
@@ -985,7 +1000,7 @@ class ItemGeneralConverter
];
}
protected function processLinkedWith(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processLinkedWith(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$link = $attribute;
@@ -1047,7 +1062,7 @@ class ItemGeneralConverter
throw new Error("Bad where item. Not supported relation type.");
}
protected function processNotLinkedWith(QueryBuilder $queryBuilder, string $attribute, $value) : array
protected function processNotLinkedWith(QueryBuilder $queryBuilder, string $attribute, $value): array
{
$link = $attribute;
@@ -39,7 +39,7 @@ use Espo\Core\{
*/
class DateTimeItemTransformer extends DateTimeItemTransformerOriginal
{
public function transform(Item $item) : Item
public function transform(Item $item): Item
{
$type = $item->getType();
$value = $item->getValue();
@@ -34,8 +34,12 @@ use Espo\Core\{
Select\Where\Converter,
Select\Where\DateTimeItemTransformer,
Select\Where\ItemGeneralConverter,
Select\Where\ItemConverter,
Utils\Metadata,
InjectableFactory,
Binding\BindingContainer,
Binding\Binder,
Binding\BindingData,
};
use Espo\{
@@ -44,7 +48,7 @@ use Espo\{
class ConverterFactoryTest extends \PHPUnit\Framework\TestCase
{
protected function setUp() : void
protected function setUp(): void
{
$this->injectableFactory = $this->createMock(InjectableFactory::class);
$this->metadata = $this->createMock(Metadata::class);
@@ -88,32 +92,69 @@ class ConverterFactoryTest extends \PHPUnit\Framework\TestCase
$object = $this->createMock(Converter::class);
$bindingData1 = new BindingData();
$binder1 = new Binder($bindingData1);
$binder1
->bindInstance(User::class, $this->user);
$binder1
->for($className1)
->bindValue('$entityType', $entityType);
$binder1
->for(DateTimeItemTransformer::class)
->bindValue('$entityType', $entityType);
$bindingContainer1 = new BindingContainer($bindingData1);
$bindingData2 = new BindingData();
$binder2 = new Binder($bindingData2);
$binder2
->bindInstance(User::class, $this->user);
$binder2
->for($className2)
->bindValue('$entityType', $entityType)
->bindInstance(DateTimeItemTransformer::class, $this->dateTimeItemTransformer);
$binder2
->for(ItemGeneralConverter::class)
->bindValue('$entityType', $entityType)
->bindInstance(DateTimeItemTransformer::class, $this->dateTimeItemTransformer);
$bindingContainer2 = new BindingContainer($bindingData2);
$bindingData3 = new BindingData();
$binder3 = new Binder($bindingData3);
$binder3
->bindInstance(User::class, $this->user)
->for($className3)
->bindValue('$entityType', $entityType)
->bindInstance(ItemConverter::class, $this->itemConverter);
$bindingContainer = new BindingContainer($bindingData3);
$this->injectableFactory
->expects($this->exactly(3))
->method('createWith')
->method('createWithBinding')
->withConsecutive(
[
$className1,
[
'entityType' => $entityType,
'user' => $this->user,
]
$bindingContainer1,
],
[
$className2,
[
'entityType' => $entityType,
'user' => $this->user,
'dateTimeItemTransformer' => $this->dateTimeItemTransformer,
]
$bindingContainer2,
],
[
$className3,
[
'entityType' => $entityType,
'user' => $this->user,
'itemConverter' => $this->itemConverter,
]
$bindingContainer,
]
)
->willReturnOnConsecutiveCalls(
@@ -33,6 +33,9 @@ use Espo\Core\{
Select\Where\ItemConverterFactory,
Utils\Metadata,
InjectableFactory,
Binding\BindingContainer,
Binding\Binder,
Binding\BindingData,
};
use Espo\{
@@ -45,7 +48,7 @@ class ItemConverterFactoryTest extends \PHPUnit\Framework\TestCase
{
private $metadata;
protected function setUp() : void
protected function setUp(): void
{
$this->injectableFactory = $this->createMock(InjectableFactory::class);
$this->metadata = $this->createMock(Metadata::class);
@@ -108,15 +111,25 @@ class ItemConverterFactoryTest extends \PHPUnit\Framework\TestCase
$object = $this->createMock($className);
$bindingData = new BindingData();
$binder = new Binder($bindingData);
$binder
->bindInstance(User::class, $this->user);
$binder
->for($className)
->bindValue('$entityType', $entityType);
$bindingContainer = new BindingContainer($bindingData);
$this->injectableFactory
->expects($this->once())
->method('createWith')
->method('createWithBinding')
->with(
$className,
[
'entityType' => $entityType,
'user' => $this->user,
]
$bindingContainer
)
->willReturn($object);
@@ -159,15 +172,25 @@ class ItemConverterFactoryTest extends \PHPUnit\Framework\TestCase
$object = $this->createMock($className);
$bindingData = new BindingData();
$binder = new Binder($bindingData);
$binder
->bindInstance(User::class, $this->user);
$binder
->for($className)
->bindValue('$entityType', $entityType);
$bindingContainer = new BindingContainer($bindingData);
$this->injectableFactory
->expects($this->once())
->method('createWith')
->method('createWithBinding')
->with(
$className,
[
'entityType' => $entityType,
'user' => $this->user,
]
$bindingContainer
)
->willReturn($object);