From 0449bfcbeafc77528c0e9f0a83ea38bebe686a3d Mon Sep 17 00:00:00 2001 From: brendt Date: Tue, 8 Apr 2025 10:35:28 +0200 Subject: [PATCH 1/4] wip --- src/Tempest/Validation/src/Rules/IsFloat.php | 4 ++++ .../Validation/src/Rules/IsInteger.php | 4 ++++ src/Tempest/Validation/src/Validator.php | 1 - .../{BooleanTest.php => IsBooleanTest.php} | 2 +- .../Validation/tests/Rules/IsFloatTest.php | 24 +++++++++++++++++++ .../Validation/tests/Rules/IsIntegerTest.php | 23 ++++++++++++++++++ .../Fixtures/RequestWithTypedQueryParam.php | 16 +++++++++++++ .../Route/RequestToObjectMapperTest.php | 17 +++++++++++++ 8 files changed, 89 insertions(+), 2 deletions(-) rename src/Tempest/Validation/tests/Rules/{BooleanTest.php => IsBooleanTest.php} (95%) create mode 100644 src/Tempest/Validation/tests/Rules/IsFloatTest.php create mode 100644 src/Tempest/Validation/tests/Rules/IsIntegerTest.php create mode 100644 tests/Integration/Route/Fixtures/RequestWithTypedQueryParam.php diff --git a/src/Tempest/Validation/src/Rules/IsFloat.php b/src/Tempest/Validation/src/Rules/IsFloat.php index c454af60b..26531d3a8 100644 --- a/src/Tempest/Validation/src/Rules/IsFloat.php +++ b/src/Tempest/Validation/src/Rules/IsFloat.php @@ -20,6 +20,10 @@ public function isValid(mixed $value): bool return true; } + if (floatval($value) == $value) { + return true; + } + return is_float($value); } diff --git a/src/Tempest/Validation/src/Rules/IsInteger.php b/src/Tempest/Validation/src/Rules/IsInteger.php index 5c2e6d3f6..67f3d3259 100644 --- a/src/Tempest/Validation/src/Rules/IsInteger.php +++ b/src/Tempest/Validation/src/Rules/IsInteger.php @@ -20,6 +20,10 @@ public function isValid(mixed $value): bool return true; } + if (intval($value) == $value) { + return true; + } + return is_int($value); } diff --git a/src/Tempest/Validation/src/Validator.php b/src/Tempest/Validation/src/Validator.php index 524448100..991764936 100644 --- a/src/Tempest/Validation/src/Validator.php +++ b/src/Tempest/Validation/src/Validator.php @@ -13,7 +13,6 @@ use Tempest\Validation\Rules\IsInteger; use Tempest\Validation\Rules\IsString; use Tempest\Validation\Rules\NotNull; -use TypeError; use function Tempest\Support\arr; diff --git a/src/Tempest/Validation/tests/Rules/BooleanTest.php b/src/Tempest/Validation/tests/Rules/IsBooleanTest.php similarity index 95% rename from src/Tempest/Validation/tests/Rules/BooleanTest.php rename to src/Tempest/Validation/tests/Rules/IsBooleanTest.php index 2e209b31c..87cc9b380 100644 --- a/src/Tempest/Validation/tests/Rules/BooleanTest.php +++ b/src/Tempest/Validation/tests/Rules/IsBooleanTest.php @@ -10,7 +10,7 @@ /** * @internal */ -final class BooleanTest extends TestCase +final class IsBooleanTest extends TestCase { public function test_boolean(): void { diff --git a/src/Tempest/Validation/tests/Rules/IsFloatTest.php b/src/Tempest/Validation/tests/Rules/IsFloatTest.php new file mode 100644 index 000000000..efacd226e --- /dev/null +++ b/src/Tempest/Validation/tests/Rules/IsFloatTest.php @@ -0,0 +1,24 @@ +assertTrue($rule->isValid(1)); + $this->assertTrue($rule->isValid(0.1)); + $this->assertTrue($rule->isValid('0.1')); + $this->assertFalse($rule->isValid('a')); + } +} diff --git a/src/Tempest/Validation/tests/Rules/IsIntegerTest.php b/src/Tempest/Validation/tests/Rules/IsIntegerTest.php new file mode 100644 index 000000000..1c9a2dd95 --- /dev/null +++ b/src/Tempest/Validation/tests/Rules/IsIntegerTest.php @@ -0,0 +1,23 @@ +assertTrue($rule->isValid(1)); + $this->assertTrue($rule->isValid('1')); + $this->assertFalse($rule->isValid('a')); + } +} diff --git a/tests/Integration/Route/Fixtures/RequestWithTypedQueryParam.php b/tests/Integration/Route/Fixtures/RequestWithTypedQueryParam.php new file mode 100644 index 000000000..046a96932 --- /dev/null +++ b/tests/Integration/Route/Fixtures/RequestWithTypedQueryParam.php @@ -0,0 +1,16 @@ +assertSame('hello', $request->queryParam); } + + public function test_query_params_with_types(): void + { + $request = map(new GenericRequest( + method: Method::GET, + uri: '/books?stringParam=a&intParam=1&floatParam=0.1&boolParam=1', + body: ['title' => 'Timeline Taxi'], + ))->with( + RequestToObjectMapper::class, + )->to(RequestWithTypedQueryParam::class); + + $this->assertSame(1, $request->intParam); + $this->assertSame('a', $request->stringParam); + $this->assertSame(true, $request->boolParam); + $this->assertSame(0.1, $request->floatParam); + } } From 7a1bd88c7fbcc47670f37153ba8e5c41d16b456b Mon Sep 17 00:00:00 2001 From: brendt Date: Tue, 8 Apr 2025 10:39:00 +0200 Subject: [PATCH 2/4] wip --- src/Tempest/Validation/src/Rules/IsInteger.php | 8 ++++++++ src/Tempest/Validation/tests/Rules/IsIntegerTest.php | 1 + .../Route/Fixtures/RequestWithTypedQueryParam.php | 5 ++++- tests/Integration/Route/RequestToObjectMapperTest.php | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Tempest/Validation/src/Rules/IsInteger.php b/src/Tempest/Validation/src/Rules/IsInteger.php index 67f3d3259..7872f19ac 100644 --- a/src/Tempest/Validation/src/Rules/IsInteger.php +++ b/src/Tempest/Validation/src/Rules/IsInteger.php @@ -20,6 +20,14 @@ public function isValid(mixed $value): bool return true; } + if ($value === null) { + return false; + } + + if ($value === '') { + return false; + } + if (intval($value) == $value) { return true; } diff --git a/src/Tempest/Validation/tests/Rules/IsIntegerTest.php b/src/Tempest/Validation/tests/Rules/IsIntegerTest.php index 1c9a2dd95..c74c6bf61 100644 --- a/src/Tempest/Validation/tests/Rules/IsIntegerTest.php +++ b/src/Tempest/Validation/tests/Rules/IsIntegerTest.php @@ -19,5 +19,6 @@ public function test_integer(): void $this->assertTrue($rule->isValid(1)); $this->assertTrue($rule->isValid('1')); $this->assertFalse($rule->isValid('a')); + $this->assertFalse($rule->isValid('')); } } diff --git a/tests/Integration/Route/Fixtures/RequestWithTypedQueryParam.php b/tests/Integration/Route/Fixtures/RequestWithTypedQueryParam.php index 046a96932..600ad52eb 100644 --- a/tests/Integration/Route/Fixtures/RequestWithTypedQueryParam.php +++ b/tests/Integration/Route/Fixtures/RequestWithTypedQueryParam.php @@ -10,7 +10,10 @@ final class RequestWithTypedQueryParam implements Request use IsRequest; public string $stringParam; + public float $floatParam; + public bool $boolParam; + public int $intParam; -} \ No newline at end of file +} diff --git a/tests/Integration/Route/RequestToObjectMapperTest.php b/tests/Integration/Route/RequestToObjectMapperTest.php index 37ad07b92..ca10a49b4 100644 --- a/tests/Integration/Route/RequestToObjectMapperTest.php +++ b/tests/Integration/Route/RequestToObjectMapperTest.php @@ -13,8 +13,8 @@ use Tests\Tempest\Fixtures\Modules\Books\Requests\CreateBookRequest; use Tests\Tempest\Integration\FrameworkIntegrationTestCase; use Tests\Tempest\Integration\Route\Fixtures\RequestObjectA; - use Tests\Tempest\Integration\Route\Fixtures\RequestWithTypedQueryParam; + use function Tempest\map; use function Tempest\Support\arr; From caa034f0a47ecdb2f5d8c1d171f3ec88494b5c3f Mon Sep 17 00:00:00 2001 From: brendt Date: Tue, 8 Apr 2025 10:39:51 +0200 Subject: [PATCH 3/4] wip --- src/Tempest/Validation/src/Rules/IsFloat.php | 4 ++++ src/Tempest/Validation/src/Rules/IsInteger.php | 6 +----- src/Tempest/Validation/tests/Rules/IsFloatTest.php | 3 +++ src/Tempest/Validation/tests/Rules/IsIntegerTest.php | 2 ++ 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Tempest/Validation/src/Rules/IsFloat.php b/src/Tempest/Validation/src/Rules/IsFloat.php index 26531d3a8..0e7c98b41 100644 --- a/src/Tempest/Validation/src/Rules/IsFloat.php +++ b/src/Tempest/Validation/src/Rules/IsFloat.php @@ -20,6 +20,10 @@ public function isValid(mixed $value): bool return true; } + if ($value === null || $value === false || $value === '') { + return false; + } + if (floatval($value) == $value) { return true; } diff --git a/src/Tempest/Validation/src/Rules/IsInteger.php b/src/Tempest/Validation/src/Rules/IsInteger.php index 7872f19ac..de3efb354 100644 --- a/src/Tempest/Validation/src/Rules/IsInteger.php +++ b/src/Tempest/Validation/src/Rules/IsInteger.php @@ -20,11 +20,7 @@ public function isValid(mixed $value): bool return true; } - if ($value === null) { - return false; - } - - if ($value === '') { + if ($value === null || $value === false || $value === '') { return false; } diff --git a/src/Tempest/Validation/tests/Rules/IsFloatTest.php b/src/Tempest/Validation/tests/Rules/IsFloatTest.php index efacd226e..e78e39eac 100644 --- a/src/Tempest/Validation/tests/Rules/IsFloatTest.php +++ b/src/Tempest/Validation/tests/Rules/IsFloatTest.php @@ -20,5 +20,8 @@ public function test_float(): void $this->assertTrue($rule->isValid(0.1)); $this->assertTrue($rule->isValid('0.1')); $this->assertFalse($rule->isValid('a')); + $this->assertFalse($rule->isValid('')); + $this->assertFalse($rule->isValid(null)); + $this->assertFalse($rule->isValid(false)); } } diff --git a/src/Tempest/Validation/tests/Rules/IsIntegerTest.php b/src/Tempest/Validation/tests/Rules/IsIntegerTest.php index c74c6bf61..bb482fe6c 100644 --- a/src/Tempest/Validation/tests/Rules/IsIntegerTest.php +++ b/src/Tempest/Validation/tests/Rules/IsIntegerTest.php @@ -20,5 +20,7 @@ public function test_integer(): void $this->assertTrue($rule->isValid('1')); $this->assertFalse($rule->isValid('a')); $this->assertFalse($rule->isValid('')); + $this->assertFalse($rule->isValid(null)); + $this->assertFalse($rule->isValid(false)); } } From cf2542575be58dde4a30f4c07cd1866fea13e309 Mon Sep 17 00:00:00 2001 From: brendt Date: Tue, 8 Apr 2025 10:42:51 +0200 Subject: [PATCH 4/4] wip --- src/Tempest/Validation/src/Rules/IsFloat.php | 9 +++------ src/Tempest/Validation/src/Rules/IsInteger.php | 9 +++------ src/Tempest/Validation/tests/Rules/IsFloatTest.php | 1 + src/Tempest/Validation/tests/Rules/IsIntegerTest.php | 1 + 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/Tempest/Validation/src/Rules/IsFloat.php b/src/Tempest/Validation/src/Rules/IsFloat.php index 0e7c98b41..49aa6b6b9 100644 --- a/src/Tempest/Validation/src/Rules/IsFloat.php +++ b/src/Tempest/Validation/src/Rules/IsFloat.php @@ -20,15 +20,12 @@ public function isValid(mixed $value): bool return true; } - if ($value === null || $value === false || $value === '') { + if ($value === null || $value === false || $value === '' || $value === []) { return false; } - if (floatval($value) == $value) { - return true; - } - - return is_float($value); + // @mago-expect strictness/require-identity-comparison + return is_float($value) || floatval($value) == $value; } public function message(): string diff --git a/src/Tempest/Validation/src/Rules/IsInteger.php b/src/Tempest/Validation/src/Rules/IsInteger.php index de3efb354..1a8fbfc64 100644 --- a/src/Tempest/Validation/src/Rules/IsInteger.php +++ b/src/Tempest/Validation/src/Rules/IsInteger.php @@ -20,15 +20,12 @@ public function isValid(mixed $value): bool return true; } - if ($value === null || $value === false || $value === '') { + if ($value === null || $value === false || $value === '' || $value === []) { return false; } - if (intval($value) == $value) { - return true; - } - - return is_int($value); + // @mago-expect strictness/require-identity-comparison + return is_int($value) || intval($value) == $value; } public function message(): string diff --git a/src/Tempest/Validation/tests/Rules/IsFloatTest.php b/src/Tempest/Validation/tests/Rules/IsFloatTest.php index e78e39eac..46ea03b37 100644 --- a/src/Tempest/Validation/tests/Rules/IsFloatTest.php +++ b/src/Tempest/Validation/tests/Rules/IsFloatTest.php @@ -23,5 +23,6 @@ public function test_float(): void $this->assertFalse($rule->isValid('')); $this->assertFalse($rule->isValid(null)); $this->assertFalse($rule->isValid(false)); + $this->assertFalse($rule->isValid([])); } } diff --git a/src/Tempest/Validation/tests/Rules/IsIntegerTest.php b/src/Tempest/Validation/tests/Rules/IsIntegerTest.php index bb482fe6c..d9be85ff8 100644 --- a/src/Tempest/Validation/tests/Rules/IsIntegerTest.php +++ b/src/Tempest/Validation/tests/Rules/IsIntegerTest.php @@ -22,5 +22,6 @@ public function test_integer(): void $this->assertFalse($rule->isValid('')); $this->assertFalse($rule->isValid(null)); $this->assertFalse($rule->isValid(false)); + $this->assertFalse($rule->isValid([])); } }