Skip to content

Commit 0a40e6a

Browse files
committed
Tweaks from code review
1 parent 97d70e3 commit 0a40e6a

File tree

2 files changed

+29
-21
lines changed

2 files changed

+29
-21
lines changed

src/Translators/Rules.php

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,18 @@ class Rules
99
{
1010
public static function fromColumn(Column $column, string $context = null)
1111
{
12-
// TODO: what about nullable?
1312
$rules = ['required'];
1413

15-
// TODO: handle translation for...
16-
// common names (email)
17-
// relationship (user_id = exists:users,id)
18-
// dataType (integer,digit,date,etc)
19-
// attributes (lengths,precisions,enums|set)
20-
// modifiers (unsigned, nullable, unique)
21-
2214
// hack for tests...
2315
if (in_array($column->dataType(), ['string', 'char', 'text', 'longText'])) {
2416
$rules = array_merge($rules, [self::overrideStringRuleForSpecialNames($column->name())]);
2517
}
2618

19+
if ($column->dataType() === 'id' && Str::endsWith($column->name(), '_id')) {
20+
[$prefix, $field] = explode('_', $column->name());
21+
$rules = array_merge($rules, ['integer', 'exists:' . Str::plural($prefix) . ',' . $field]);
22+
}
23+
2724
if (in_array($column->dataType(), [
2825
'integer',
2926
'tinyInteger',
@@ -46,11 +43,6 @@ public static function fromColumn(Column $column, string $context = null)
4643
if (Str::startsWith($column->dataType(), 'unsigned')) {
4744
$rules = array_merge($rules, ['gt:0']);
4845
}
49-
50-
if (Str::endsWith($column->name(), '_id')) {
51-
[$table, $field] = explode('_', $column->name());
52-
$rules = array_merge($rules, ['exists:' . Str::plural($table) . ',' . $field]);
53-
}
5446
}
5547

5648
if (in_array($column->dataType(), [

tests/Feature/Translators/RulesTest.php

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
use Blueprint\Translators\Rules;
77
use Tests\TestCase;
88

9+
/**
10+
* @see Rules
11+
*/
912
class RulesTest extends TestCase
1013
{
1114
/**
@@ -47,7 +50,7 @@ public function forColumn_returns_max_rule_for_string_attributes()
4750
* @test
4851
* @dataProvider stringDataTypesProvider
4952
*/
50-
public function forColumn_overrides_string_rule_with_email_rule_for_attributes_named_email_or_email_address($data_type)
53+
public function forColumn_uses_email_rule_for_columns_named_email_or_email_address($data_type)
5154
{
5255
$column = new Column('email', $data_type);
5356

@@ -64,7 +67,7 @@ public function forColumn_overrides_string_rule_with_email_rule_for_attributes_n
6467
* @test
6568
* @dataProvider stringDataTypesProvider
6669
*/
67-
public function forColumn_overrides_string_rule_with_password_rule_for_attributes_named_password($data_type)
70+
public function forColumn_uses_password_rule_for_columns_named_password($data_type)
6871
{
6972
$column = new Column('password', $data_type);
7073

@@ -95,14 +98,16 @@ public function forColumn_returns_integer_rule_for_integer_types($data_type)
9598

9699
/**
97100
* @test
98-
* @dataProvider integerDataTypesProvider
101+
* @dataProvider relationshipColumnProvider
99102
*/
100-
public function forColumn_returns_exists_rule_for_foreign_keys($data_type)
103+
public function forColumn_returns_exists_rule_for_foreign_keys($name, $table)
101104
{
102-
$column = new Column('test_id', $data_type);
105+
$column = new Column($name, 'id');
103106

104-
$this->assertContains('integer', Rules::fromColumn($column));
105-
$this->assertContains('exists:tests,id', Rules::fromColumn($column));
107+
$actual = Rules::fromColumn($column);
108+
109+
$this->assertContains('integer', $actual);
110+
$this->assertContains("exists:{$table},id", $actual);
106111
}
107112

108113
/**
@@ -127,7 +132,7 @@ public function forColumn_returns_in_rule_for_enums_and_sets()
127132
$column = new Column('test', 'enum', [], ['alpha', 'bravo', 'charlie']);
128133
$this->assertContains('in:alpha,bravo,charlie', Rules::fromColumn($column));
129134

130-
$column = new Column('test', 'set', [], [2,4,6]);
135+
$column = new Column('test', 'set', [], [2, 4, 6]);
131136

132137
$this->assertContains('in:2,4,6', Rules::fromColumn($column));
133138
}
@@ -149,6 +154,7 @@ public function forColumn_returns_date_rule_for_date_types($data_type)
149154
*/
150155
public function forColumn_does_not_return_unique_rule_for_the_unique_modifier_without_context($data_type)
151156
{
157+
$this->markTestIncomplete();
152158
$column = new Column('test', $data_type, ['unique', 'nullable']);
153159

154160
$this->assertNotContains('unique:', Rules::fromColumn($column));
@@ -159,6 +165,7 @@ public function forColumn_does_not_return_unique_rule_for_the_unique_modifier_wi
159165
*/
160166
public function forColumn_returns_unique_rule_for_the_unique_modifier()
161167
{
168+
$this->markTestIncomplete();
162169
$column = new Column('test', 'string', ['unique'], [100]);
163170

164171
$actual = Rules::fromColumn($column, 'connection.table');
@@ -215,4 +222,13 @@ public function dateDataTypesProvider()
215222
['datetimetz'],
216223
];
217224
}
225+
226+
public function relationshipColumnProvider()
227+
{
228+
return [
229+
['test_id', 'tests'],
230+
['user_id', 'users'],
231+
['sheep_id', 'sheep']
232+
];
233+
}
218234
}

0 commit comments

Comments
 (0)