Skip to content

Commit

Permalink
Add basic implementation of Form\Schema.
Browse files Browse the repository at this point in the history
Add the basic implementation and test cases for the schema class that
ORM-less forms will use.
  • Loading branch information
markstory committed Dec 14, 2014
1 parent 3a43fff commit ae69a80
Show file tree
Hide file tree
Showing 2 changed files with 123 additions and 0 deletions.
51 changes: 51 additions & 0 deletions src/Form/Schema.php
@@ -0,0 +1,51 @@
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since 3.0.0
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Form;

/**
* Contains the schema information for Form instances.
*/
class Schema {

protected $_fields = [];

protected $_fieldDefaults = [
'type' => null,
'length' => null,
'required' => false,
];

public function addField($name, $attrs) {
$attrs = array_intersect_key($attrs, $this->_fieldDefaults);
$this->_fields[$name] = $attrs + $this->_fieldDefaults;
return $this;
}

public function removeField($name) {
unset($this->_fields[$name]);
return $this;
}

public function fields() {
return array_keys($this->_fields);
}

public function field($name) {
if (!isset($this->_fields[$name])) {
return null;
}
return $this->_fields[$name];
}
}
72 changes: 72 additions & 0 deletions tests/TestCase/Form/SchemaTest.php
@@ -0,0 +1,72 @@
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since 3.0.0
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Test\TestCase\Form;

use Cake\Form\Schema;
use Cake\TestSuite\TestCase;

/**
* Form schema test case.
*/
class SchemaTest extends TestCase {

/**
* test adding fields.
*
* @return void
*/
public function testAddingFields() {
$schema = new Schema();

$res = $schema->addField('name', ['type' => 'string']);
$this->assertSame($schema, $res, 'Should be chainable');

$this->assertEquals(['name'], $schema->fields());
$res = $schema->field('name');
$expected = ['type' => 'string', 'length' => null, 'required' => false];
$this->assertEquals($expected, $res);
}

/**
* test adding field whitelist attrs
*
* @return void
*/
public function testAddingFieldsWhitelist() {
$schema = new Schema();

$schema->addField('name', ['derp' => 'derp', 'type' => 'string']);
$expected = ['type' => 'string', 'length' => null, 'required' => false];
$this->assertEquals($expected, $schema->field('name'));
}

/**
* Test removing fields.
*
* @return void
*/
public function testRemovingFields() {
$schema = new Schema();

$schema->addField('name', ['type' => 'string']);
$this->assertEquals(['name'], $schema->fields());

$res = $schema->removeField('name');
$this->assertSame($schema, $res, 'Should be chainable');
$this->assertEquals([], $schema->fields());
$this->assertNull($schema->field('name'));
}

}

0 comments on commit ae69a80

Please sign in to comment.