use Data namespace

This commit is contained in:
icefox 2026-03-07 11:27:12 -03:00
parent 71d49def6b
commit a5b80681c9
No known key found for this signature in database
21 changed files with 283 additions and 68 deletions

View file

@ -2,9 +2,9 @@
namespace Tests\DataObject;
use Icefox\DTO\Attributes\FromInput;
use Icefox\DTO\Attributes\FromRouteParameter;
use Icefox\DTO\Factories\DataObjectFactory;
use Icefox\Data\Attributes\FromInput;
use Icefox\Data\Attributes\FromRouteParameter;
use Icefox\Data\Factories\DataObjectFactory;
use Illuminate\Support\Collection;
use Psr\Log\NullLogger;
@ -193,3 +193,208 @@ test('route parameter with nested object', function () {
expect($result['userId'])->toBe(123)
->and($result['address']['street'])->toBe('Main St');
});
readonly class SimpleWithDefaults
{
public function __construct(
public string $name,
public int $age,
public string $city = 'Unknown',
) {}
/**
* @return array<string,mixed>
*/
public static function defaults(): array
{
return [
'city' => 'New York',
'age' => 25,
];
}
}
test('defaults with fromArray - basic usage', function () {
$object = DataObjectFactory::fromArray(
SimpleWithDefaults::class,
['name' => 'John'],
[],
);
expect($object->name)->toBe('John')
->and($object->age)->toBe(25)
->and($object->city)->toBe('New York');
});
readonly class NestedWithDefaults
{
public function __construct(
public string $title,
public SimpleWithDefaults $user,
) {}
/**
* @return array<string,array<string,mixed>>
*/
public static function defaults(): array
{
return [
'user' => [
'name' => 'Default User',
'age' => 30,
],
];
}
}
test('defaults with nested objects', function () {
$object = DataObjectFactory::fromArray(
NestedWithDefaults::class,
['title' => 'Admin Dashboard'],
[],
);
expect($object->title)->toBe('Admin Dashboard')
->and($object->user->name)->toBe('Default User')
->and($object->user->age)->toBe(30)
->and($object->user->city)->toBe('Unknown');
});
test('defaults merged with input - input overrides defaults', function () {
$object = DataObjectFactory::fromArray(
SimpleWithDefaults::class,
['name' => 'Alice', 'age' => 40, 'city' => 'Los Angeles'],
[],
);
expect($object->name)->toBe('Alice')
->and($object->age)->toBe(40)
->and($object->city)->toBe('Los Angeles');
});
test('defaults with simple nested structures', function () {
$object = DataObjectFactory::fromArray(
NestedWithDefaults::class,
['title' => 'Simple Project'],
[],
);
expect($object->title)->toBe('Simple Project')
->and($object->user->name)->toBe('Default User')
->and($object->user->age)->toBe(30);
});
readonly class ArrayWithDefaults
{
/**
* @param array<string,mixed> $settings
*/
public function __construct(
public string $projectName,
public array $settings,
) {}
/**
* @return array<string,array<string,mixed>>
*/
public static function defaults(): array
{
return [
'settings' => [
'theme' => 'dark',
'notifications' => true,
'language' => 'en',
],
];
}
}
test('defaults with array structures', function () {
$object = DataObjectFactory::fromArray(
ArrayWithDefaults::class,
['projectName' => 'New Project'],
[],
);
expect($object->projectName)->toBe('New Project')
->and($object->settings)->toBe([
'theme' => 'dark',
'notifications' => true,
'language' => 'en',
]);
});
test('defaults partially overridden by input', function () {
$object = DataObjectFactory::fromArray(
ArrayWithDefaults::class,
[
'projectName' => 'Custom Project',
'settings' => [
'theme' => 'light',
'language' => 'fr',
],
],
[],
);
expect($object->projectName)->toBe('Custom Project')
->and($object->settings)->toBe([
'theme' => 'light',
'notifications' => true, // From defaults
'language' => 'fr',
]);
});
readonly class WithInputMappingAndDefaults
{
public function __construct(
#[FromInput('full_name')]
public string $name,
#[FromInput('user_age')]
public int $age,
public string $role = 'user',
) {}
/**
* @return array<string,mixed>
*/
public static function defaults(): array
{
return [
'name' => 'Default Name',
'role' => 'admin',
'age' => 18,
];
}
}
test('defaults work with FromInput attribute mapping', function () {
$object = DataObjectFactory::fromArray(
WithInputMappingAndDefaults::class,
['full_name' => 'John Doe'],
[],
);
expect($object->name)->toBe('John Doe') // From input mapping
->and($object->age)->toBe(18) // From defaults
->and($object->role)->toBe('admin'); // From defaults
});
test('array_merge_recursive behavior with nested arrays', function () {
$object = DataObjectFactory::fromArray(
ArrayWithDefaults::class,
[
'projectName' => 'Test Project',
'settings' => [
'new_setting' => 'custom_value',
],
],
[],
);
expect($object->settings)->toBe([
'theme' => 'dark', // From defaults
'notifications' => true, // From defaults
'language' => 'en', // From defaults
'new_setting' => 'custom_value', // From input
]);
});

View file

@ -2,13 +2,13 @@
namespace Tests\Http;
use Icefox\DTO\IDataObject;
use Icefox\Data\IData;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Validator as ValidatorFacade;
use Illuminate\Validation\Validator;
readonly class Basic implements IDataObject
readonly class Basic implements IData
{
public string $reply;
public function __construct(string $message)
@ -35,7 +35,7 @@ test('fails on validation error', function () {
]);
});
readonly class WithCustomValidator implements IDataObject
readonly class WithCustomValidator implements IData
{
public string $reply;
public function __construct(string $message)
@ -66,7 +66,7 @@ test('replies with custom validator', function () {
]);
});
readonly class WithCustomFailure implements IDataObject
readonly class WithCustomFailure implements IData
{
public function __construct(public bool $flag) {}
@ -87,7 +87,7 @@ test('uses custom response', function () {
->assertJson(['result' => 'invalid, but that is ok']);
});
readonly class WithDefaultObjectOnFailure implements IDataObject
readonly class WithDefaultObjectOnFailure implements IData
{
public function __construct(public bool $flag) {}

View file

@ -4,9 +4,9 @@ declare(strict_types=1);
namespace Tests\Rules;
use Icefox\DTO\Attributes\Flat;
use Icefox\DTO\Attributes\Overwrite;
use Icefox\DTO\Factories\RuleFactory;
use Icefox\Data\Attributes\Flat;
use Icefox\Data\Attributes\Overwrite;
use Icefox\Data\Factories\RuleFactory;
use Illuminate\Support\Collection;
readonly class BasicPrimitives

View file

@ -5,8 +5,8 @@ declare(strict_types=1);
namespace Tests\Values;
use Carbon\CarbonPeriod;
use Icefox\DTO\Attributes\CastWith;
use Icefox\DTO\Factories\ValueFactory;
use Icefox\Data\Attributes\CastWith;
use Icefox\Data\Factories\ValueFactory;
use Illuminate\Support\Carbon;
use Illuminate\Support\Collection;