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
);
2012-09-19 12:07:39 +02:00
public function testAddForm () {
2012-03-08 01:58:53 +01:00
$this -> logInWithPermission ( 'ADMIN' );
2012-05-28 11:13:42 +02:00
$group = GridFieldDetailFormTest_PeopleGroup :: get ()
2012-04-10 07:05:29 +02:00
-> filter ( 'Name' , 'My Group' )
-> sort ( 'Name' )
-> First ();
2012-03-06 22:48:09 +01:00
$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-05-28 11:13:42 +02:00
$group = GridFieldDetailFormTest_PeopleGroup :: get ()
2012-04-10 07:05:29 +02:00
-> filter ( 'Name' , 'My Group' )
-> sort ( 'Name' )
-> First ();
$this -> assertEquals ( $count + 1 , $group -> People () -> Count ());
2012-03-06 22:48:09 +01:00
}
2012-05-11 09:44:39 +02:00
public function testViewForm () {
$this -> logInWithPermission ( 'ADMIN' );
$response = $this -> get ( 'GridFieldDetailFormTest_Controller' );
$parser = new CSSContentParser ( $response -> getBody ());
$viewLink = $parser -> getBySelector ( '.ss-gridfield-items .first .view-link' );
$viewLink = ( string ) $viewLink [ 0 ][ 'href' ];
$response = $this -> get ( $viewLink );
$parser = new CSSContentParser ( $response -> getBody ());
$firstName = $parser -> getBySelector ( '#Form_ItemEditForm_FirstName' );
$surname = $parser -> getBySelector ( '#Form_ItemEditForm_Surname' );
$this -> assertFalse ( $response -> isError ());
2012-07-06 12:42:04 +02:00
$this -> assertEquals ( 'Jane' , ( string ) $firstName [ 0 ]);
$this -> assertEquals ( 'Doe' , ( string ) $surname [ 0 ]);
2012-05-11 09:44:39 +02:00
}
2012-09-19 12:07:39 +02:00
public function testEditForm () {
2012-03-08 01:58:53 +01:00
$this -> logInWithPermission ( 'ADMIN' );
2012-05-28 11:13:42 +02:00
$group = GridFieldDetailFormTest_PeopleGroup :: get ()
2012-04-10 07:05:29 +02:00
-> filter ( 'Name' , 'My Group' )
-> sort ( 'Name' )
-> First ();
2012-03-06 22:48:09 +01:00
$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-05-28 11:13:42 +02:00
$group = GridFieldDetailFormTest_PeopleGroup :: get ()
2012-04-10 07:05:29 +02:00
-> filter ( 'Name' , 'My Group' )
-> sort ( 'Name' )
-> First ();
2012-04-16 04:30:13 +02:00
$this -> assertDOSContains ( array ( array ( 'Surname' => 'Baggins' )), $group -> People ());
2012-03-06 22:48:09 +01:00
}
2012-03-08 23:56:28 +01:00
2012-09-19 12:07:39 +02:00
public function testNestedEditForm () {
2012-03-08 23:56:28 +01:00
$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-12 11:15:06 +01:00
'GridFieldDetailFormTest_GroupController/Form/field/testfield/item/' . $group -> ID . '/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-04-10 07:05:29 +02:00
sprintf ( 'GridFieldDetailFormTest_GroupController/Form/field/testfield/item/%d/ItemEditForm/field/People/item/%d/edit' , $group -> ID , $person -> ID ),
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' );
$this -> assertEquals (
2012-04-10 07:05:29 +02:00
sprintf ( 'GridFieldDetailFormTest_GroupController/Form/field/testfield/item/%d/ItemEditForm/field/People/item/%d/ItemEditForm/field/Categories/item/%d/edit' , $group -> ID , $person -> ID , $category -> ID ),
2012-03-08 23:56:28 +01:00
( string ) $categoryEditLink [ 0 ][ 'href' ]
);
2012-03-12 11:15:06 +01:00
// Fourth level form would be a Category detail view
2012-03-08 23:56:28 +01:00
}
2012-04-30 12:31:17 +02:00
2012-09-19 12:07:39 +02:00
public function testCustomItemRequestClass () {
2012-04-30 12:31:17 +02:00
$component = new GridFieldDetailForm ();
$this -> assertEquals ( 'GridFieldDetailForm_ItemRequest' , $component -> getItemRequestClass ());
$component -> setItemRequestClass ( 'GridFieldDetailFormTest_ItemRequest' );
$this -> assertEquals ( 'GridFieldDetailFormTest_ItemRequest' , $component -> getItemRequestClass ());
}
2012-04-30 13:46:51 +02:00
2012-09-19 12:07:39 +02:00
public function testItemEditFormCallback () {
2012-04-30 13:46:51 +02:00
$category = new GridFieldDetailFormTest_Category ();
$component = new GridFieldDetailForm ();
$component -> setItemEditFormCallback ( function ( $form , $component ) {
$form -> Fields () -> push ( new HiddenField ( 'Callback' ));
});
// Note: A lot of scaffolding to execute the tested logic,
// due to the coupling of form creation with request handling (and its context)
$request = new GridFieldDetailForm_ItemRequest (
GridField :: create ( 'Categories' , 'Categories' ),
$component ,
$category ,
new Controller (),
'Form'
);
$form = $request -> ItemEditForm ();
$this -> assertNotNull ( $form -> Fields () -> fieldByName ( 'Callback' ));
}
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
);
2012-07-06 12:42:04 +02:00
static $default_sort = 'FirstName' ;
2012-09-19 12:07:39 +02:00
public function getCMSFields () {
2012-04-13 15:46:47 +02:00
$fields = parent :: getCMSFields ();
2012-03-08 23:56:28 +01:00
// TODO No longer necessary once FormScaffolder uses GridField
$fields -> replaceField ( 'Categories' ,
2012-04-04 16:59:30 +02:00
GridField :: create ( 'Categories' , 'Categories' ,
2012-03-08 23:56:28 +01:00
$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-07-06 12:42:04 +02:00
static $default_sort = 'Name' ;
2012-09-19 12:07:39 +02:00
public function getCMSFields () {
2012-04-13 15:46:47 +02:00
$fields = parent :: getCMSFields ();
2012-03-08 23:56:28 +01:00
// TODO No longer necessary once FormScaffolder uses GridField
$fields -> replaceField ( 'People' ,
2012-04-04 16:59:30 +02:00
GridField :: create ( 'People' , 'People' ,
2012-03-08 23:56:28 +01:00
$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
);
2012-07-06 12:42:04 +02:00
static $default_sort = 'Name' ;
2012-09-19 12:07:39 +02:00
public function getCMSFields () {
2012-04-13 15:46:47 +02:00
$fields = parent :: getCMSFields ();
2012-03-08 23:56:28 +01:00
// TODO No longer necessary once FormScaffolder uses GridField
$fields -> replaceField ( 'People' ,
2012-04-04 16:59:30 +02:00
GridField :: create ( 'People' , 'People' ,
2012-03-08 23:56:28 +01:00
$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' ;
2012-09-19 12:07:39 +02:00
public function Form () {
2012-05-28 11:13:42 +02:00
$group = GridFieldDetailFormTest_PeopleGroup :: get ()
2012-04-10 07:05:29 +02:00
-> filter ( 'Name' , 'My Group' )
-> sort ( 'Name' )
-> First ();
2012-03-06 22:48:09 +01:00
$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' ));
2012-05-11 09:44:39 +02:00
$field -> getConfig () -> addComponent ( new GridFieldViewButton ());
2012-03-09 06:11:50 +01:00
$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' ;
2012-09-19 12:07:39 +02:00
public function Form () {
2012-05-28 11:13:42 +02:00
$field = new GridField ( 'testfield' , 'testfield' , GridFieldDetailFormTest_PeopleGroup :: get () -> sort ( 'Name' ));
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 ());
}
}
2012-04-30 12:31:17 +02:00
class GridFieldDetailFormTest_ItemRequest extends GridFieldDetailForm_ItemRequest implements TestOnly {
2012-05-28 11:13:42 +02:00
}