2012-03-06 22:48:09 +01:00
< ? php
2012-03-09 00:54:02 +01:00
class GridFieldDetailFormTest extends FunctionalTest {
static $fixture_file = 'GridFieldDetailFormTest.yml' ;
2012-03-06 22:48:09 +01:00
protected $extraDataObjects = array (
2012-03-09 00:54:02 +01:00
'GridFieldDetailFormTest_Person' ,
2012-03-09 02:37:32 +01:00
'GridFieldDetailFormTest_PeopleGroup' ,
'GridFieldDetailFormTest_Category' ,
2012-03-06 22:48:09 +01:00
);
function testAddForm () {
2012-03-08 01:58:53 +01:00
$this -> logInWithPermission ( 'ADMIN' );
2012-03-09 00:54:02 +01:00
$group = DataList :: create ( 'GridFieldDetailFormTest_PeopleGroup' )
2012-03-06 22:48:09 +01:00
-> filter ( 'Name' , 'My Group' )
-> First ();
$count = $group -> People () -> Count ();
2012-03-09 00:54:02 +01:00
$response = $this -> get ( 'GridFieldDetailFormTest_Controller' );
2012-03-06 22:48:09 +01:00
$this -> assertFalse ( $response -> isError ());
$parser = new CSSContentParser ( $response -> getBody ());
$addlinkitem = $parser -> getBySelector ( '.ss-gridfield .new-link' );
$addlink = ( string ) $addlinkitem [ 0 ][ 'href' ];
$response = $this -> get ( $addlink );
$this -> assertFalse ( $response -> isError ());
$parser = new CSSContentParser ( $response -> getBody ());
$addform = $parser -> getBySelector ( '#Form_ItemEditForm' );
$addformurl = ( string ) $addform [ 0 ][ 'action' ];
$response = $this -> post (
$addformurl ,
array (
'FirstName' => 'Jeremiah' ,
'Surname' => 'BullFrog' ,
'action_doSave' => 1
)
);
$this -> assertFalse ( $response -> isError ());
2012-03-09 00:54:02 +01:00
$group = DataList :: create ( 'GridFieldDetailFormTest_PeopleGroup' )
2012-03-06 22:48:09 +01:00
-> filter ( 'Name' , 'My Group' )
-> First ();
$this -> assertEquals ( $count + 1 , $group -> People () -> Count ());
}
function testEditForm () {
2012-03-08 01:58:53 +01:00
$this -> logInWithPermission ( 'ADMIN' );
2012-03-09 00:54:02 +01:00
$group = DataList :: create ( 'GridFieldDetailFormTest_PeopleGroup' )
2012-03-06 22:48:09 +01:00
-> filter ( 'Name' , 'My Group' )
-> First ();
$firstperson = $group -> People () -> First ();
$this -> assertTrue ( $firstperson -> Surname != 'Baggins' );
2012-03-09 00:54:02 +01:00
$response = $this -> get ( 'GridFieldDetailFormTest_Controller' );
2012-03-06 22:48:09 +01:00
$this -> assertFalse ( $response -> isError ());
$parser = new CSSContentParser ( $response -> getBody ());
$editlinkitem = $parser -> getBySelector ( '.ss-gridfield-items .first .edit-link' );
$editlink = ( string ) $editlinkitem [ 0 ][ 'href' ];
$response = $this -> get ( $editlink );
$this -> assertFalse ( $response -> isError ());
$parser = new CSSContentParser ( $response -> getBody ());
$editform = $parser -> getBySelector ( '#Form_ItemEditForm' );
$editformurl = ( string ) $editform [ 0 ][ 'action' ];
$response = $this -> post (
$editformurl ,
array (
'FirstName' => 'Bilbo' ,
'Surname' => 'Baggins' ,
'action_doSave' => 1
)
);
$this -> assertFalse ( $response -> isError ());
2012-03-09 00:54:02 +01:00
$group = DataList :: create ( 'GridFieldDetailFormTest_PeopleGroup' )
2012-03-06 22:48:09 +01:00
-> filter ( 'Name' , 'My Group' )
-> First ();
$firstperson = $group -> People () -> First ();
$this -> assertEquals ( $firstperson -> Surname , 'Baggins' );
}
2012-03-08 23:56:28 +01:00
function testNestedEditForm () {
$this -> logInWithPermission ( 'ADMIN' );
2012-03-09 02:37:32 +01:00
$group = $this -> objFromFixture ( 'GridFieldDetailFormTest_PeopleGroup' , 'group' );
2012-03-08 23:56:28 +01:00
$person = $group -> People () -> First ();
$category = $person -> Categories () -> First ();
// Get first form (GridField managing PeopleGroup)
2012-03-09 02:37:32 +01:00
$response = $this -> get ( 'GridFieldDetailFormTest_GroupController' );
2012-03-08 23:56:28 +01:00
$this -> assertFalse ( $response -> isError ());
$parser = new CSSContentParser ( $response -> getBody ());
$groupEditLink = $parser -> getByXpath ( '//tr[contains(@class, "ss-gridfield-item") and contains(@data-id, "' . $group -> ID . '")]//a' );
$this -> assertEquals (
2012-03-09 02:37:32 +01:00
'GridFieldDetailFormTest_GroupController/Form/field/testfield/item/1/edit' ,
2012-03-08 23:56:28 +01:00
( string ) $groupEditLink [ 0 ][ 'href' ]
);
// Get second level form (GridField managing Person)
$response = $this -> get (( string ) $groupEditLink [ 0 ][ 'href' ]);
$this -> assertFalse ( $response -> isError ());
$parser = new CSSContentParser ( $response -> getBody ());
$personEditLink = $parser -> getByXpath ( '//fieldset[@id="Form_ItemEditForm_People"]//tr[contains(@class, "ss-gridfield-item") and contains(@data-id, "' . $person -> ID . '")]//a' );
$this -> assertEquals (
2012-03-10 02:42:25 +01:00
'GridFieldDetailFormTest_GroupController/Form/field/testfield/item/1/ItemEditForm/field/People/item/' . $person -> ID . '/edit' ,
2012-03-08 23:56:28 +01:00
( string ) $personEditLink [ 0 ][ 'href' ]
);
// Get third level form (GridField managing Category)
$response = $this -> get (( string ) $personEditLink [ 0 ][ 'href' ]);
$this -> assertFalse ( $response -> isError ());
$parser = new CSSContentParser ( $response -> getBody ());
$categoryEditLink = $parser -> getByXpath ( '//fieldset[@id="Form_ItemEditForm_Categories"]//tr[contains(@class, "ss-gridfield-item") and contains(@data-id, "' . $category -> ID . '")]//a' );
// Get fourth level form (Category detail view)
$this -> assertEquals (
2012-03-10 02:42:25 +01:00
'GridFieldDetailFormTest_GroupController/Form/field/testfield/item/1/ItemEditForm/field/People/item/' . $person -> ID . '/ItemEditForm/field/Categories/item/1/edit' ,
2012-03-08 23:56:28 +01:00
( string ) $categoryEditLink [ 0 ][ 'href' ]
);
}
2012-03-06 22:48:09 +01:00
}
2012-03-09 00:54:02 +01:00
class GridFieldDetailFormTest_Person extends DataObject implements TestOnly {
2012-03-06 22:48:09 +01:00
static $db = array (
'FirstName' => 'Varchar' ,
'Surname' => 'Varchar'
);
static $has_one = array (
2012-03-09 00:54:02 +01:00
'Group' => 'GridFieldDetailFormTest_PeopleGroup'
2012-03-06 22:48:09 +01:00
);
2012-03-08 23:56:28 +01:00
static $many_many = array (
2012-03-09 02:37:32 +01:00
'Categories' => 'GridFieldDetailFormTest_Category'
2012-03-08 23:56:28 +01:00
);
function getCMSFields () {
$fields = parent :: getCMSFields ();
// TODO No longer necessary once FormScaffolder uses GridField
$fields -> replaceField ( 'Categories' ,
Object :: create ( 'GridField' , 'Categories' , 'Categories' ,
$this -> Categories (),
GridFieldConfig_RelationEditor :: create ()
)
);
return $fields ;
}
2012-03-06 22:48:09 +01:00
}
2012-03-09 00:54:02 +01:00
class GridFieldDetailFormTest_PeopleGroup extends DataObject implements TestOnly {
2012-03-06 22:48:09 +01:00
static $db = array (
'Name' => 'Varchar'
);
static $has_many = array (
2012-03-09 00:54:02 +01:00
'People' => 'GridFieldDetailFormTest_Person'
2012-03-06 22:48:09 +01:00
);
2012-03-08 23:56:28 +01:00
function getCMSFields () {
$fields = parent :: getCMSFields ();
// TODO No longer necessary once FormScaffolder uses GridField
$fields -> replaceField ( 'People' ,
Object :: create ( 'GridField' , 'People' , 'People' ,
$this -> People (),
GridFieldConfig_RelationEditor :: create ()
)
);
return $fields ;
}
}
2012-03-09 02:37:32 +01:00
class GridFieldDetailFormTest_Category extends DataObject implements TestOnly {
2012-03-08 23:56:28 +01:00
static $db = array (
'Name' => 'Varchar'
);
static $belongs_many_many = array (
2012-03-09 02:37:32 +01:00
'People' => 'GridFieldDetailFormTest_Person'
2012-03-08 23:56:28 +01:00
);
function getCMSFields () {
$fields = parent :: getCMSFields ();
// TODO No longer necessary once FormScaffolder uses GridField
$fields -> replaceField ( 'People' ,
Object :: create ( 'GridField' , 'People' , 'People' ,
$this -> People (),
GridFieldConfig_RelationEditor :: create ()
)
);
return $fields ;
}
2012-03-06 22:48:09 +01:00
}
2012-03-09 00:54:02 +01:00
class GridFieldDetailFormTest_Controller extends Controller implements TestOnly {
2012-03-06 22:48:09 +01:00
protected $template = 'BlankPage' ;
function Form () {
2012-03-09 00:54:02 +01:00
$group = DataList :: create ( 'GridFieldDetailFormTest_PeopleGroup' )
2012-03-06 22:48:09 +01:00
-> filter ( 'Name' , 'My Group' )
-> First ();
$field = new GridField ( 'testfield' , 'testfield' , $group -> People ());
2012-03-09 06:11:50 +01:00
$field -> getConfig () -> addComponent ( new GridFieldToolbarHeader ());
$field -> getConfig () -> addComponent ( new GridFieldAddNewButton ( 'toolbar-header-right' ));
$field -> getConfig () -> addComponent ( new GridFieldEditButton ());
2012-03-09 00:54:02 +01:00
$field -> getConfig () -> addComponent ( $gridFieldForm = new GridFieldDetailForm ( $this , 'Form' ));
$field -> getConfig () -> addComponent ( new GridFieldEditButton ());
2012-03-06 22:48:09 +01:00
return new Form ( $this , 'Form' , new FieldList ( $field ), new FieldList ());
}
}
2012-03-09 02:37:32 +01:00
class GridFieldDetailFormTest_GroupController extends Controller implements TestOnly {
2012-03-08 23:56:28 +01:00
protected $template = 'BlankPage' ;
function Form () {
2012-03-09 02:37:32 +01:00
$field = new GridField ( 'testfield' , 'testfield' , DataList :: create ( 'GridFieldDetailFormTest_PeopleGroup' ));
2012-03-09 04:37:25 +01:00
$field -> getConfig () -> addComponent ( $gridFieldForm = new GridFieldDetailForm ( $this , 'Form' ));
2012-03-09 06:11:50 +01:00
$field -> getConfig () -> addComponent ( new GridFieldToolbarHeader ());
$field -> getConfig () -> addComponent ( new GridFieldAddNewButton ( 'toolbar-header-right' ));
2012-03-09 04:37:25 +01:00
$field -> getConfig () -> addComponent ( new GridFieldEditButton ());
2012-03-08 23:56:28 +01:00
return new Form ( $this , 'Form' , new FieldList ( $field ), new FieldList ());
}
}