truncate();
Model::unguard();
$this->now = Carbon::now();
$this->modelData = [
'string' => 'abcdefghijklmnop',
'email' => 'tj@tjshafer.com',
'address' => [
'street' => 'abcde st'
],
'array' => [1, 2, 3,],
'transform_key' => 'testing testing',
'created_at' => $this->now,
'updated_at' => $this->now,
];
$this->urlGenerator = new UrlGenerator(new RouteCollection(), Request::create('/foo', 'GET'));
$this->viewFactory = m::mock(Factory::class);
$this->htmlBuilder = new HtmlBuilder($this->urlGenerator, $this->viewFactory);
$this->formBuilder = new FormBuilder($this->htmlBuilder, $this->urlGenerator, $this->viewFactory, 'abc');
}
public function testItCanMutateValuesForForms()
{
$model = new ModelThatUsesForms($this->modelData);
$user = new User(['name' => 'Anton']);
$model->setRelation('user', $user);
$this->formBuilder->setModel($model);
$this->assertEquals($model->getFormValue('string'), 'ponmlkjihgfedcba');
$this->assertEquals($model->getFormValue('created_at'), $this->now->timestamp);
$this->assertEquals($user, $model->getFormValue('user'));
$this->assertEquals('Get name: Anton', $model->getFormValue('user')->name);
$this->assertEquals('Get name for form: Anton', $model->getFormValue('user.name'));
}
public function testItCanMutateRelatedValuesForForms()
{
$model = new ModelThatUsesForms($this->modelData);
$relatedModel = new ModelThatUsesForms($this->modelData);
$relatedModel->address = [
'street' => '123 Evergreen Terrace'
];
$model->setRelation('related', $relatedModel);
$this->formBuilder->setModel($model);
$this->assertEquals($this->formBuilder->getValueAttribute('related[string]'), 'ponmlkjihgfedcba');
$this->assertEquals($this->formBuilder->getValueAttribute('related[address][street]'), '123 Evergreen Terrace');
}
public function testItCanGetRelatedValueForForms()
{
$model = new ModelThatUsesForms($this->modelData);
$this->assertEquals($model->getFormValue('address.street'), 'abcde st');
}
public function testItCanUseGetAccessorValuesWhenThereAreNoFormAccessors()
{
$model = new ModelThatUsesForms($this->modelData);
$this->formBuilder->setModel($model);
$this->assertEquals($this->formBuilder->getValueAttribute('email'), 'mutated@tjshafer.com');
}
public function testItReturnsSameResultWithAndWithoutThisFeature()
{
$modelWithAccessor = new ModelThatUsesForms($this->modelData);
$modelWithoutAccessor = new ModelThatDoesntUseForms($this->modelData);
$this->formBuilder->setModel($modelWithAccessor);
$valuesWithAccessor[] = $this->formBuilder->getValueAttribute('array');
$valuesWithAccessor[] = $this->formBuilder->getValueAttribute('array[0]');
$valuesWithAccessor[] = $this->formBuilder->getValueAttribute('transform.key');
$this->formBuilder->setModel($modelWithoutAccessor);
$valuesWithoutAccessor[] = $this->formBuilder->getValueAttribute('array');
$valuesWithoutAccessor[] = $this->formBuilder->getValueAttribute('array[0]');
$valuesWithoutAccessor[] = $this->formBuilder->getValueAttribute('transform.key');
$this->assertEquals($valuesWithAccessor, $valuesWithoutAccessor);
}
public function testItCanStillMutateValuesForViews()
{
$model = new ModelThatUsesForms($this->modelData);
$this->formBuilder->setModel($model);
$this->assertEquals($model->string, 'ABCDEFGHIJKLMNOP');
$this->assertEquals($model->created_at, '1 second ago');
}
public function testItDoesntRequireTheUseOfThisFeature()
{
$model = new ModelThatDoesntUseForms($this->modelData);
$this->formBuilder->setModel($model);
$this->assertEquals($model->string, 'ABCDEFGHIJKLMNOP');
$this->assertEquals($model->created_at, '1 second ago');
}
}
class ModelThatUsesForms extends Model
{
use FormAccessible;
protected $table = 'models';
public function formStringAttribute($value)
{
return strrev($value);
}
public function getStringAttribute($value)
{
return strtoupper($value);
}
public function formCreatedAtAttribute(Carbon $value)
{
return $value->timestamp;
}
public function getCreatedAtAttribute($value)
{
return '1 second ago';
}
public function getEmailAttribute($value)
{
return 'mutated@tjshafer.com';
}
}
class ModelThatDoesntUseForms extends Model
{
protected $table = 'models';
public function getStringAttribute($value)
{
return strtoupper($value);
}
public function getCreatedAtAttribute($value)
{
return '1 second ago';
}
}
class User extends Model
{
use FormAccessible;
public function formNameAttribute($value)
{
return 'Get name for form: ' . $value;
}
public function getNameAttribute($value)
{
return 'Get name: ' . $value;
}
}