request = new Request(); } /** * Test getting the primary key. * * @return void */ public function testPrimaryKey() { $context = new FormContext($this->request, ['entity' => new Form()]); $this->assertEquals([], $context->primaryKey()); } /** * Test isPrimaryKey. * * @return void */ public function testIsPrimaryKey() { $context = new FormContext($this->request, ['entity' => new Form()]); $this->assertFalse($context->isPrimaryKey('id')); } /** * Test the isCreate method. * * @return void */ public function testIsCreate() { $context = new FormContext($this->request, ['entity' => new Form()]); $this->assertTrue($context->isCreate()); } /** * Test reading values from the request & defaults. */ public function testValPresent() { $this->request->data = [ 'Articles' => [ 'title' => 'New title', 'body' => 'My copy', ] ]; $context = new FormContext($this->request, ['entity' => new Form()]); $this->assertEquals('New title', $context->val('Articles.title')); $this->assertEquals('My copy', $context->val('Articles.body')); $this->assertNull($context->val('Articles.nope')); } /** * Test getting values when the request and defaults are missing. * * @return void */ public function testValMissing() { $context = new FormContext($this->request, ['entity' => new Form()]); $this->assertNull($context->val('Comments.field')); } /** * Test getting default value * * @return void */ public function testValDefault() { $context = new FormContext($this->request, ['entity' => new Form()]); $result = $context->val('title', ['default' => 'default default']); $this->assertEquals('default default', $result); } /** * Test isRequired * * @return void */ public function testIsRequired() { $form = new Form(); $form->validator() ->requirePresence('name') ->add('email', 'format', ['rule' => 'email']); $context = new FormContext($this->request, [ 'entity' => $form ]); $this->assertTrue($context->isRequired('name')); $this->assertTrue($context->isRequired('email')); $this->assertFalse($context->isRequired('body')); $this->assertFalse($context->isRequired('Prefix.body')); } /** * Test the type method. * * @return void */ public function testType() { $form = new Form(); $form->schema() ->addField('email', 'string') ->addField('user_id', 'integer'); $context = new FormContext($this->request, [ 'entity' => $form ]); $this->assertNull($context->type('undefined')); $this->assertEquals('integer', $context->type('user_id')); $this->assertEquals('string', $context->type('email')); $this->assertNull($context->type('Prefix.email')); } /** * Test fetching attributes. * * @return void */ public function testAttributes() { $form = new Form(); $form->schema() ->addField('email', [ 'type' => 'string', 'length' => 10, ]) ->addField('amount', [ 'type' => 'decimal', 'length' => 5, 'precision' => 2, ]); $context = new FormContext($this->request, [ 'entity' => $form ]); $this->assertEquals([], $context->attributes('id')); $this->assertEquals(['length' => 10, 'precision' => null], $context->attributes('email')); $this->assertEquals(['precision' => 2, 'length' => 5], $context->attributes('amount')); } /** * Test fetching errors. * * @return void */ public function testError() { $nestedValidator = new Validator(); $nestedValidator ->add('password', 'length', ['rule' => ['minLength', 8]]) ->add('confirm', 'length', ['rule' => ['minLength', 8]]); $form = new Form(); $form->validator() ->add('email', 'format', ['rule' => 'email']) ->add('name', 'length', ['rule' => ['minLength', 10]]) ->addNested('pass', $nestedValidator); $form->validate([ 'email' => 'derp', 'name' => 'derp', 'pass' => [ 'password' => 'short', 'confirm' => 'long enough', ], ]); $context = new FormContext($this->request, ['entity' => $form]); $this->assertEquals([], $context->error('empty')); $this->assertEquals(['The provided value is invalid'], $context->error('email')); $this->assertEquals(['The provided value is invalid'], $context->error('name')); $this->assertEquals(['The provided value is invalid'], $context->error('pass.password')); $this->assertEquals([], $context->error('Alias.name')); $this->assertEquals([], $context->error('nope.nope')); $mock = $this->getMockBuilder('Cake\Validation\Validator') ->setMethods(['errors']) ->getMock(); $mock->expects($this->once()) ->method('errors') ->willReturn(['key' => 'should be an array, not a string']); $form->validator($mock); $form->validate([]); $context = new FormContext($this->request, ['entity' => $form]); $this->assertEquals( ['should be an array, not a string'], $context->error('key'), 'This test should not produce a PHP warning from array_values().' ); } /** * Test checking errors. * * @return void */ public function testHasError() { $nestedValidator = new Validator(); $nestedValidator ->add('password', 'length', ['rule' => ['minLength', 8]]) ->add('confirm', 'length', ['rule' => ['minLength', 8]]); $form = new Form(); $form->validator() ->add('email', 'format', ['rule' => 'email']) ->add('name', 'length', ['rule' => ['minLength', 10]]) ->addNested('pass', $nestedValidator); $form->validate([ 'email' => 'derp', 'name' => 'derp', 'pass' => [ 'password' => 'short', 'confirm' => 'long enough', ], ]); $context = new FormContext($this->request, ['entity' => $form]); $this->assertTrue($context->hasError('email')); $this->assertTrue($context->hasError('name')); $this->assertFalse($context->hasError('nope')); $this->assertFalse($context->hasError('nope.nope')); $this->assertTrue($context->hasError('pass.password')); } }