Skip to content

Commit 6a0c325

Browse files
authored
Merge pull request #2402 from flow-php/postgresql-default-values
fix: default values in ForeingKey and UniqueConstraint postgersql
2 parents c004467 + dcba79e commit 6a0c325

4 files changed

Lines changed: 106 additions & 5 deletions

File tree

src/lib/postgresql/src/Flow/PostgreSql/Schema/Constraint/ForeignKey.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use Flow\PostgreSql\QueryBuilder\Schema\ReferentialAction;
88

99
/**
10-
* @phpstan-type ForeignKeyShape = array{name: ?string, columns: non-empty-list<string>, reference_schema: string, reference_table: string, reference_columns: non-empty-list<string>, on_update: string, on_delete: string, deferrable: bool, initially_deferred: bool}
10+
* @phpstan-type ForeignKeyShape = array{name: ?string, columns: non-empty-list<string>, reference_schema: string, reference_table: string, reference_columns: non-empty-list<string>, on_update?: string, on_delete?: string, deferrable?: bool, initially_deferred?: bool}
1111
*/
1212
final readonly class ForeignKey
1313
{
@@ -44,8 +44,8 @@ public static function fromArray(array $data): self
4444
onDelete: array_key_exists('on_delete', $data)
4545
? ReferentialAction::from($data['on_delete'])
4646
: ReferentialAction::NO_ACTION,
47-
deferrable: $data['deferrable'],
48-
initiallyDeferred: $data['initially_deferred'],
47+
deferrable: $data['deferrable'] ?? false,
48+
initiallyDeferred: $data['initially_deferred'] ?? false,
4949
);
5050
}
5151

src/lib/postgresql/src/Flow/PostgreSql/Schema/Constraint/UniqueConstraint.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use function sort;
88

99
/**
10-
* @phpstan-type UniqueConstraintShape = array{columns: non-empty-list<string>, name: ?string, nulls_not_distinct: bool}
10+
* @phpstan-type UniqueConstraintShape = array{columns: non-empty-list<string>, name?: ?string, nulls_not_distinct?: bool}
1111
*/
1212
final readonly class UniqueConstraint
1313
{
@@ -28,7 +28,7 @@ public static function fromArray(array $data): self
2828
return new self(
2929
columns: $data['columns'],
3030
name: $data['name'] ?? null,
31-
nullsNotDistinct: $data['nulls_not_distinct'],
31+
nullsNotDistinct: $data['nulls_not_distinct'] ?? false,
3232
);
3333
}
3434

src/lib/postgresql/tests/Flow/PostgreSql/Tests/Unit/Schema/Constraint/ForeignKeyTest.php

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Flow\PostgreSql\Tests\Unit\Schema\Constraint;
66

77
use Flow\PostgreSql\QueryBuilder\Schema\ReferentialAction;
8+
use Flow\PostgreSql\Schema\Constraint\ForeignKey;
89
use PHPUnit\Framework\TestCase;
910

1011
use function Flow\PostgreSql\DSL\schema_foreign_key;
@@ -128,6 +129,63 @@ public function test_is_equal_structure_returns_false_when_reference_schema_diff
128129
static::assertFalse($a->isEqualStructure($b));
129130
}
130131

132+
public function test_from_array_defaults_optional_keys_when_absent(): void
133+
{
134+
$fk = ForeignKey::fromArray([
135+
'name' => 'fk_orders_user',
136+
'columns' => ['user_id'],
137+
'reference_schema' => 'public',
138+
'reference_table' => 'users',
139+
'reference_columns' => ['id'],
140+
]);
141+
142+
static::assertSame('fk_orders_user', $fk->name);
143+
static::assertSame(['user_id'], $fk->columns);
144+
static::assertSame('public', $fk->referenceSchema);
145+
static::assertSame('users', $fk->referenceTable);
146+
static::assertSame(['id'], $fk->referenceColumns);
147+
static::assertSame(ReferentialAction::NO_ACTION, $fk->onUpdate);
148+
static::assertSame(ReferentialAction::NO_ACTION, $fk->onDelete);
149+
static::assertFalse($fk->deferrable);
150+
static::assertFalse($fk->initiallyDeferred);
151+
}
152+
153+
public function test_from_array_with_all_keys(): void
154+
{
155+
$fk = ForeignKey::fromArray([
156+
'name' => 'fk_orders_user',
157+
'columns' => ['user_id'],
158+
'reference_schema' => 'public',
159+
'reference_table' => 'users',
160+
'reference_columns' => ['id'],
161+
'on_update' => ReferentialAction::CASCADE->value,
162+
'on_delete' => ReferentialAction::RESTRICT->value,
163+
'deferrable' => true,
164+
'initially_deferred' => true,
165+
]);
166+
167+
static::assertSame(ReferentialAction::CASCADE, $fk->onUpdate);
168+
static::assertSame(ReferentialAction::RESTRICT, $fk->onDelete);
169+
static::assertTrue($fk->deferrable);
170+
static::assertTrue($fk->initiallyDeferred);
171+
}
172+
173+
public function test_normalize_and_from_array_round_trip(): void
174+
{
175+
$fk = schema_foreign_key(
176+
['user_id'],
177+
'users',
178+
['id'],
179+
name: 'fk_orders_user',
180+
onDelete: ReferentialAction::CASCADE,
181+
onUpdate: ReferentialAction::SET_NULL,
182+
deferrable: true,
183+
initiallyDeferred: true,
184+
);
185+
186+
static::assertTrue($fk->isEqual(ForeignKey::fromArray($fk->normalize())));
187+
}
188+
131189
public function test_is_equal_structure_returns_true_when_only_name_differs(): void
132190
{
133191
$a = schema_foreign_key(

src/lib/postgresql/tests/Flow/PostgreSql/Tests/Unit/Schema/Constraint/UniqueConstraintTest.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Flow\PostgreSql\Tests\Unit\Schema\Constraint;
66

7+
use Flow\PostgreSql\Schema\Constraint\UniqueConstraint;
78
use PHPUnit\Framework\TestCase;
89

910
use function Flow\PostgreSql\DSL\schema_unique;
@@ -18,6 +19,48 @@ public function test_is_equal_for_identical_constraints(): void
1819
static::assertTrue($a->isEqual($b));
1920
}
2021

22+
public function test_from_array_defaults_nulls_not_distinct_when_absent(): void
23+
{
24+
$unique = UniqueConstraint::fromArray([
25+
'columns' => ['email'],
26+
'name' => 'uq_email',
27+
]);
28+
29+
static::assertSame(['email'], $unique->columns);
30+
static::assertSame('uq_email', $unique->name);
31+
static::assertFalse($unique->nullsNotDistinct);
32+
}
33+
34+
public function test_from_array_defaults_name_when_absent(): void
35+
{
36+
$unique = UniqueConstraint::fromArray([
37+
'columns' => ['email'],
38+
]);
39+
40+
static::assertNull($unique->name);
41+
static::assertFalse($unique->nullsNotDistinct);
42+
}
43+
44+
public function test_from_array_with_all_keys(): void
45+
{
46+
$unique = UniqueConstraint::fromArray([
47+
'columns' => ['email', 'tenant_id'],
48+
'name' => 'uq_email_tenant',
49+
'nulls_not_distinct' => true,
50+
]);
51+
52+
static::assertSame(['email', 'tenant_id'], $unique->columns);
53+
static::assertSame('uq_email_tenant', $unique->name);
54+
static::assertTrue($unique->nullsNotDistinct);
55+
}
56+
57+
public function test_normalize_and_from_array_round_trip(): void
58+
{
59+
$unique = schema_unique(['email', 'tenant_id'], 'uq_email_tenant', nullsNotDistinct: true);
60+
61+
static::assertTrue($unique->isEqual(UniqueConstraint::fromArray($unique->normalize())));
62+
}
63+
2164
public function test_is_equal_returns_false_when_columns_differ(): void
2265
{
2366
$a = schema_unique(['email'], 'uq_users');

0 commit comments

Comments
 (0)