<?php
declare(strict_types=1);
namespace ParagonIE\EasyDB\Tests;
use InvalidArgumentException;
use ParagonIE\EasyDB\Exception\MustBeOneDimensionalArray;
/**
* Class EasyDBTest
* @package ParagonIE\EasyDB\Tests
*/
class EscapeValueSetTest extends EasyDBTest
{
/**
* Remaps EasyDBWriteTest::goodFactoryCreateArgument2EasyDBProvider()
*/
public function goodFactoryCreateArgument2EasyDBEscapeValueSetProvider()
{
$cbArgsSets = $this->goodFactoryCreateArgument2EasyDBProvider();
$args = [
[
[],
'int',
[
'(SELECT 1 WHERE FALSE)',
],
],
[
[],
'float',
[
'(SELECT 1 WHERE FALSE)',
],
],
[
[],
'decimal',
[
'(SELECT 1 WHERE FALSE)',
],
],
[
[],
'number',
[
'(SELECT 1 WHERE FALSE)',
],
],
[
[],
'numeric',
[
'(SELECT 1 WHERE FALSE)',
],
],
[
[],
'string',
[
'(SELECT 1 WHERE FALSE)',
],
],
[
[1, 2, 3, 5],
'-this-does-not-exist-',
[
'(SELECT 1 WHERE FALSE)',
]
],
[
[1, 2, 3, 5],
'int',
[
'(1, 2, 3, 5)',
]
],
[
[1, 2, 3, 5],
'float',
[
'(1, 2, 3, 5)',
]
],
[
[1, 2, 3, 5],
'decimal',
[
'(1, 2, 3, 5)',
]
],
[
[1, 2, 3, 5],
'number',
[
'(1, 2, 3, 5)',
]
],
[
[1, 2, 3, 5],
'numeric',
[
'(1, 2, 3, 5)',
]
],
[
[1, 2, 3, 5],
'string',
[
"('1', '2', '3', '5')",
]
],
];
return array_reduce(
$args,
function (array $was, array $is) use ($cbArgsSets) {
foreach ($cbArgsSets as $cbArgs) {
$args = array_values($is);
foreach (array_reverse($cbArgs) as $cbArg) {
array_unshift($args, $cbArg);
}
$was[] = $args;
}
return $was;
},
[]
);
}
/**
* Remaps EasyDBWriteTest::goodFactoryCreateArgument2EasyDBProvider()
*/
public function badFactoryCreateArgument2EasyDBEscapeValueSetProvider()
{
$cbArgsSets = $this->goodFactoryCreateArgument2EasyDBProvider();
$buildArgs = [
[
[
'int',
],
[
['1', 2, 3, 5],
['1foo', 2, 3, 5],
[null, 2, 3, 5],
[true, 2, 3, 5],
[false, 2, 3, 5],
[(new \stdClass), 2, 3, 5],
]
],
[
[
'string',
],
[
[null, 2, 3, 5],
[true, 2, 3, 5],
[false, 2, 3, 5],
[(new \stdClass), 2, 3, 5],
]
],
[
[
'float',
'decimal',
'number',
'numeric',
],
[
['1foo', 2, 3, 5],
[null, 2, 3, 5],
[true, 2, 3, 5],
[false, 2, 3, 5],
[(new \stdClass), 2, 3, 5],
]
]
];
$args = array_reduce(
$buildArgs,
function (array $was, array $is) {
foreach ($is[0] as $type) {
$was = array_merge(
$was,
array_reduce(
$is[1],
function (array $innerWas, array $valueSet) use ($type) {
$innerWas[] = [
$valueSet,
$type
];
return $innerWas;
},
[]
)
);
}
return $was;
},
[]
);
return array_reduce(
$args,
function (array $was, array $is) use ($cbArgsSets) {
foreach ($cbArgsSets as $cbArgs) {
$args = array_values($is);
foreach (array_reverse($cbArgs) as $cbArg) {
array_unshift($args, $cbArg);
}
$was[] = $args;
}
return $was;
},
[]
);
}
/**
* @dataProvider goodFactoryCreateArgument2EasyDBProvider
* @depends ParagonIE\EasyDB\Tests\Is1DArrayTest::testIs1DArray
* @param callable $cb
*/
public function testEscapeValueSetFailsIs1DArray(callable $cb)
{
$db = $this->easyDBExpectedFromCallable($cb);
$this->expectException(MustBeOneDimensionalArray::class);
$db->escapeValueSet([[1]]);
}
/**
* @dataProvider badFactoryCreateArgument2EasyDBEscapeValueSetProvider
* @depends ParagonIE\EasyDB\Tests\EscapeIdentifierTest::testEscapeIdentifier
* @depends ParagonIE\EasyDB\Tests\EscapeIdentifierTest::testEscapeIdentifierThrowsSomething
* @param callable $cb
* @param array $escapeThis
* @param string $escapeThatAsType
*/
public function testEscapeValueSetThrowsException(callable $cb, array $escapeThis, string $escapeThatAsType)
{
$db = $this->easyDBExpectedFromCallable($cb);
$this->expectException(InvalidArgumentException::class);
$db->escapeValueSet($escapeThis, $escapeThatAsType);
}
/**
* @dataProvider goodFactoryCreateArgument2EasyDBEscapeValueSetProvider
* @depends testEscapeValueSetThrowsException
* @depends ParagonIE\EasyDB\Tests\EscapeIdentifierTest::testEscapeIdentifier
* @depends ParagonIE\EasyDB\Tests\EscapeIdentifierTest::testEscapeIdentifierThrowsSomething
* @param callable $cb
* @param array $escapeThis
* @param string $escapeThatAsType
* @param array $expectOneOfThese
*/
public function testEscapeValueSet(
callable $cb,
array $escapeThis,
string $escapeThatAsType,
array $expectOneOfThese
) {
$db = $this->easyDBExpectedFromCallable($cb);
$this->assertTrue(count($expectOneOfThese) > 0);
$matchedOneOfThose = false;
$quoted = $db->escapeValueSet($escapeThis, $escapeThatAsType);
foreach ($expectOneOfThese as $expectThis) {
if ($quoted === $expectThis) {
$this->assertSame($quoted, $expectThis);
$matchedOneOfThose = true;
}
}
if (!$matchedOneOfThose) {
$this->assertTrue(
false,
'Did not match ' . $quoted . ' against any of ' . implode('; ', $expectOneOfThese)
);
}
}
}
|