Skip to content

Commit ae66c32

Browse files
committed
Require context in Rules translator
1 parent ef9b6b3 commit ae66c32

File tree

3 files changed

+33
-49
lines changed

3 files changed

+33
-49
lines changed

src/Generators/Statements/FormRequestGenerator.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ private function validationRules(string $qualifier, string $column)
129129
if (!is_null($model) && $model->hasColumn($column)) {
130130
$column = $model->column($column);
131131

132-
return implode('|', Rules::fromColumn($column));
132+
return implode('|', Rules::fromColumn($model->tableName(), $column));
133133
}
134134

135135
return 'required';

src/Translators/Rules.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77

88
class Rules
99
{
10-
public static function fromColumn(Column $column, string $context = null)
10+
public static function fromColumn(string $context, Column $column)
1111
{
1212
$rules = ['required'];
1313

1414
// hack for tests...
1515
if (in_array($column->dataType(), ['string', 'char', 'text', 'longText'])) {
16-
$rules = array_merge($rules, [self::overrideStringRuleForSpecialNames($column->name())]);
16+
array_push($rules, self::overrideStringRuleForSpecialNames($column->name()));
1717
}
1818

1919
if ($column->dataType() === 'id' && Str::endsWith($column->name(), '_id')) {
@@ -38,10 +38,10 @@ public static function fromColumn(Column $column, string $context = null)
3838
'unsignedSmallInteger',
3939
'unsignedTinyInteger'
4040
])) {
41-
$rules = array_merge($rules, ['integer']);
41+
array_push($rules, 'integer');
4242

4343
if (Str::startsWith($column->dataType(), 'unsigned')) {
44-
$rules = array_merge($rules, ['gt:0']);
44+
array_push($rules, 'gt:0');
4545
}
4646
}
4747

@@ -51,29 +51,29 @@ public static function fromColumn(Column $column, string $context = null)
5151
'float',
5252
'unsignedDecimal',
5353
])) {
54-
$rules = array_merge($rules, ['numeric']);
54+
array_push($rules, 'numeric');
5555

5656
if (Str::startsWith($column->dataType(), 'unsigned')) {
57-
$rules = array_merge($rules, ['gt:0']);
57+
array_push($rules, 'gt:0');
5858
}
5959
}
6060

6161
if (in_array($column->dataType(), ['enum', 'set'])) {
62-
$rules = array_merge($rules, ['in:' . implode(',', $column->attributes())]);
62+
array_push($rules, 'in:' . implode(',', $column->attributes()));
6363
}
6464

6565
if (in_array($column->dataType(), ['date', 'datetime', 'datetimetz'])) {
66-
$rules = array_merge($rules, ['date']);
66+
array_push($rules, 'date');
6767
}
6868

6969
if ($column->attributes()) {
7070
if (in_array($column->dataType(), ['string', 'char'])) {
71-
$rules = array_merge($rules, ['max:' . implode($column->attributes())]);
71+
array_push($rules, 'max:' . implode($column->attributes()));
7272
}
7373
}
7474

75-
if (in_array('unique', $column->modifiers()) && $context) {
76-
$rules = array_merge($rules, ['unique:' . $context]);
75+
if (in_array('unique', $column->modifiers())) {
76+
array_push($rules, 'unique:' . $context . ',' . $column->name());
7777
}
7878

7979
return $rules;

tests/Feature/Translators/RulesTest.php

Lines changed: 21 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public function forColumn_returns_required_rule_by_default()
1818
{
1919
$column = new Column('test', 'unknown');
2020

21-
$this->assertEquals(['required'], Rules::fromColumn($column));
21+
$this->assertEquals(['required'], Rules::fromColumn('context', $column));
2222
}
2323

2424
/**
@@ -29,7 +29,7 @@ public function forColumn_returns_string_rule_for_string_data_types($data_type)
2929
{
3030
$column = new Column('test', $data_type);
3131

32-
$this->assertContains('string', Rules::fromColumn($column));
32+
$this->assertContains('string', Rules::fromColumn('context', $column));
3333
}
3434

3535
/**
@@ -39,11 +39,11 @@ public function forColumn_returns_max_rule_for_string_attributes()
3939
{
4040
$column = new Column('test', 'string', [], [1000]);
4141

42-
$this->assertContains('max:1000', Rules::fromColumn($column));
42+
$this->assertContains('max:1000', Rules::fromColumn('context', $column));
4343

4444
$column = new Column('test', 'char', [], [10]);
4545

46-
$this->assertContains('max:10', Rules::fromColumn($column));
46+
$this->assertContains('max:10', Rules::fromColumn('context', $column));
4747
}
4848

4949
/**
@@ -54,13 +54,13 @@ public function forColumn_uses_email_rule_for_columns_named_email_or_email_addre
5454
{
5555
$column = new Column('email', $data_type);
5656

57-
$this->assertContains('email', Rules::fromColumn($column));
58-
$this->assertNotContains('string', Rules::fromColumn($column));
57+
$this->assertContains('email', Rules::fromColumn('context', $column));
58+
$this->assertNotContains('string', Rules::fromColumn('context', $column));
5959

6060
$column = new Column('email_address', $data_type);
6161

62-
$this->assertContains('email', Rules::fromColumn($column));
63-
$this->assertNotContains('string', Rules::fromColumn($column));
62+
$this->assertContains('email', Rules::fromColumn('context', $column));
63+
$this->assertNotContains('string', Rules::fromColumn('context', $column));
6464
}
6565

6666
/**
@@ -71,8 +71,8 @@ public function forColumn_uses_password_rule_for_columns_named_password($data_ty
7171
{
7272
$column = new Column('password', $data_type);
7373

74-
$this->assertContains('password', Rules::fromColumn($column));
75-
$this->assertNotContains('string', Rules::fromColumn($column));
74+
$this->assertContains('password', Rules::fromColumn('context', $column));
75+
$this->assertNotContains('string', Rules::fromColumn('context', $column));
7676
}
7777

7878
/**
@@ -83,7 +83,7 @@ public function forColumn_returns_numeric_rule_for_numeric_types($data_type)
8383
{
8484
$column = new Column('test', $data_type);
8585

86-
$this->assertContains('numeric', Rules::fromColumn($column));
86+
$this->assertContains('numeric', Rules::fromColumn('context', $column));
8787
}
8888

8989
/**
@@ -93,7 +93,7 @@ public function forColumn_returns_numeric_rule_for_numeric_types($data_type)
9393
public function forColumn_returns_integer_rule_for_integer_types($data_type)
9494
{
9595
$column = new Column('test', $data_type);
96-
$this->assertContains('integer', Rules::fromColumn($column));
96+
$this->assertContains('integer', Rules::fromColumn('context', $column));
9797
}
9898

9999
/**
@@ -104,7 +104,7 @@ public function forColumn_returns_exists_rule_for_foreign_keys($name, $table)
104104
{
105105
$column = new Column($name, 'id');
106106

107-
$actual = Rules::fromColumn($column);
107+
$actual = Rules::fromColumn('context', $column);
108108

109109
$this->assertContains('integer', $actual);
110110
$this->assertContains("exists:{$table},id", $actual);
@@ -117,11 +117,11 @@ public function forColumn_returns_gt0_rule_for_unsigned_numeric_types()
117117
{
118118
$column = new Column('test', 'integer');
119119

120-
$this->assertNotContains('gt:0', Rules::fromColumn($column));
120+
$this->assertNotContains('gt:0', Rules::fromColumn('context', $column));
121121

122122
$column = new Column('test', 'unsignedInteger');
123123

124-
$this->assertContains('gt:0', Rules::fromColumn($column));
124+
$this->assertContains('gt:0', Rules::fromColumn('context', $column));
125125
}
126126

127127
/**
@@ -130,11 +130,11 @@ public function forColumn_returns_gt0_rule_for_unsigned_numeric_types()
130130
public function forColumn_returns_in_rule_for_enums_and_sets()
131131
{
132132
$column = new Column('test', 'enum', [], ['alpha', 'bravo', 'charlie']);
133-
$this->assertContains('in:alpha,bravo,charlie', Rules::fromColumn($column));
133+
$this->assertContains('in:alpha,bravo,charlie', Rules::fromColumn('context', $column));
134134

135135
$column = new Column('test', 'set', [], [2, 4, 6]);
136136

137-
$this->assertContains('in:2,4,6', Rules::fromColumn($column));
137+
$this->assertContains('in:2,4,6', Rules::fromColumn('context', $column));
138138
}
139139

140140
/**
@@ -145,33 +145,17 @@ public function forColumn_returns_date_rule_for_date_types($data_type)
145145
{
146146
$column = new Column('test', $data_type);
147147

148-
$this->assertContains('date', Rules::fromColumn($column));
148+
$this->assertContains('date', Rules::fromColumn('context', $column));
149149
}
150150

151151
/**
152152
* @test
153-
* @dataProvider stringDataTypesProvider
154153
*/
155-
public function forColumn_does_not_return_unique_rule_for_the_unique_modifier_without_context($data_type)
154+
public function forColumn_return_exists_rule_for_the_unique_modifier()
156155
{
157-
$this->markTestIncomplete();
158-
$column = new Column('test', $data_type, ['unique', 'nullable']);
159-
160-
$this->assertNotContains('unique:', Rules::fromColumn($column));
161-
}
162-
163-
/**
164-
* @test
165-
*/
166-
public function forColumn_returns_unique_rule_for_the_unique_modifier()
167-
{
168-
$this->markTestIncomplete();
169-
$column = new Column('test', 'string', ['unique'], [100]);
170-
171-
$actual = Rules::fromColumn($column, 'connection.table');
156+
$column = new Column('column', 'string', ['unique']);
172157

173-
$this->assertContains('unique:connection.table', $actual);
174-
$this->assertContains('max:100', $actual);
158+
$this->assertContains('unique:connection.table,column', Rules::fromColumn('connection.table', $column));
175159
}
176160

177161
public function stringDataTypesProvider()

0 commit comments

Comments
 (0)