View source
<?php
class EntityReferenceOgContextTestCase extends DrupalWebTestCase {
public static function getInfo() {
return array(
'name' => 'OG-context integration',
'description' => 'Test the OG-context integration, which allows prepopulating by the group context.',
'group' => 'Entity reference prepopulate',
'dependencies' => array(
'og',
),
);
}
function setUp() {
parent::setUp('og_context', 'entityreference_prepopulate_test');
$this->user1 = $this
->drupalCreateUser();
$this->user2 = $this
->drupalCreateUser(array(
'bypass node access',
'administer group',
));
$type = $this
->drupalCreateContentType();
$this->group_type = $type->type;
og_create_field(OG_GROUP_FIELD, 'node', $this->group_type);
$type = $this
->drupalCreateContentType();
$this->group_content_type = $type->type;
$og_field = og_fields_info(OG_AUDIENCE_FIELD);
$og_field['instance']['settings']['behaviors']['prepopulate'] = array(
'status' => TRUE,
'action' => 'none',
'fallback' => 'none',
'skip_perm' => FALSE,
'providers' => array(
'url' => TRUE,
'og_context' => TRUE,
),
);
og_create_field(OG_AUDIENCE_FIELD, 'node', $this->group_content_type, $og_field);
}
function testPrepopulate() {
$settings = array(
'type' => $this->group_type,
'uid' => $this->user1->uid,
);
$settings[OG_GROUP_FIELD][LANGUAGE_NONE][0]['value'] = 1;
$group1 = $this
->drupalCreateNode($settings);
og_group('node', $group1, array(
'entity_type' => 'user',
'entity' => $this->user2,
));
$this
->drupalLogin($this->user2);
$this
->drupalGet('node/add/' . str_replace('_', '-', $this->group_content_type));
$this
->assertNoOptionSelected('edit-og-group-ref-und-0-default', 1, 'Group-audience fields is not selected.');
$options = array(
'query' => array(
'gid' => $group1->nid,
),
);
$this
->drupalGet('node/add/' . str_replace('_', '-', $this->group_content_type), $options);
$this
->assertOptionSelected('edit-og-group-ref-und-0-default', 1, 'Group-audience fields is selected.');
}
}
class EntityReferenceReferenceRemain extends DrupalWebTestCase {
public $user;
public $node1;
public $node2;
public static function getInfo() {
return array(
'name' => 'Prepopulate settings',
'description' => 'Verify the reference between entity is remaining when saving the node.',
'group' => 'Entity reference prepopulate',
);
}
public function setUp() {
parent::setUp(array(
'entityreference',
'entityreference_prepopulate',
));
$content_type = $this
->drupalCreateContentType();
$field = array(
'field_name' => 'node_ref',
'type' => 'entityreference',
'cardinality' => 1,
);
field_create_field($field);
$instance = array(
'field_name' => 'node_ref',
'entity_type' => 'node',
'label' => 'Node ref',
'bundle' => $content_type->type,
'settings' => array(
'behaviors' => array(
'prepopulate' => array(
'status' => TRUE,
'action' => 'none',
'fallback' => 'none',
),
),
),
);
field_create_instance($instance);
$this->user = $this
->drupalCreateUser(array(
'bypass node access',
));
$this->node1 = $this
->drupalCreateNode(array(
'title' => 'Referencing node',
'type' => $content_type->type,
));
$this->node2 = $this
->drupalCreateNode(array(
'title' => 'Referenced node',
'type' => $content_type->type,
));
$wrapper = entity_metadata_wrapper('node', $this->node1->nid);
$wrapper->node_ref
->set($this->node2->nid);
$wrapper
->save();
}
function testScenarioReference() {
$this
->drupalLogin($this->user);
$options = array(
'query' => array(
'node_ref' => $this->node2->nid,
),
);
$edit = array(
'title' => 'Referencing node',
);
$this
->drupalPost('node/add/' . $this->node1->type, $edit, t('Save'), $options);
$this
->assertText('Referenced node', 'The reference has been created');
$this
->changeInstanceSettings(array(
'identifier' => 'friendly-ref',
));
$options = array(
'query' => array(
'friendly-ref' => $this->node2->nid,
),
);
$this
->drupalPost('node/add/' . $this->node1->type, $edit, t('Save'), $options);
$this
->assertText('Referenced node', 'The reference has been created');
$this
->changeInstanceSettings(array(
'action' => 'disable',
));
$this
->drupalGet('node/add/' . $this->node1->type, $options);
$xpath = $this
->xpath('//input[@id="edit-node-ref-und-0-target-id" and @disabled="disabled" and @value="Referenced node (' . $this->node2->nid . ')"]');
$this
->assertTrue(!empty($xpath), 'The field is disabled and default value is set to the node 2.');
$this
->drupalPost('node/add/' . $this->node1->type, $edit, t('Save'), $options);
$this
->assertText('Referenced node', 'The reference has been created');
$this
->changeInstanceSettings(array(
'action' => 'hide',
));
$xpath = $this
->xpath('//input[@id="edit-node-ref-und-0-target-id"]');
$this
->assertTrue(empty($xpath), 'The field is not visible to the user.');
$this
->drupalPost('node/add/' . $this->node1->type, $edit, t('Save'), $options);
$this
->assertText('Referenced node', 'The reference has been created');
$this
->changeInstanceSettings(array(
'fallback' => 'form_error',
));
$this
->drupalGet('node/add/' . $this->node1->type);
$this
->assertText('Field Node ref must be populated via URL.', 'The error of the missing prepopulated value has been set.');
$this
->changeInstanceSettings(array(
'fallback' => 'redirect',
));
$this
->drupalGet('node/add/' . $this->node1->type);
$this
->assertTrue($this
->getUrl() == url('<front>', array(
'absolute' => TRUE,
)), 'The redirect of due to non prepoulated value.');
$this
->changeInstanceSettings(array(
'action' => 'hide',
'action_on_edit' => FALSE,
));
$this
->drupalGet('node/' . $this->node1->nid . '/edit');
$xpath = $this
->xpath('//input[@id="edit-node-ref-und-0-target-id"]');
$this
->assertTrue(!empty($xpath), "The node reference is visible to the user.");
$this
->drupalPost('node/' . $this->node1->nid . '/edit', array(
'title' => 'Referencing node',
), t('Save'));
$this
->verifyReferenceRemain();
$this
->changeInstanceSettings(array(
'action' => 'hide',
'action_on_edit' => TRUE,
));
$this
->drupalGet('node/' . $this->node1->nid . '/edit');
$xpath = $this
->xpath('//input[@id="edit-node-ref-und-0-target-id"]');
$this
->assertTrue(empty($xpath), "The node reference is invisible to the user.");
$this
->drupalPost('node/' . $this->node1->nid . '/edit', array(
'title' => 'Referencing node',
), t('Save'), $options);
$this
->verifyReferenceRemain();
$this
->changeInstanceSettings(array(
'action' => 'disable',
));
$this
->drupalGet('node/' . $this->node1->nid . '/edit');
$xpath = $this
->xpath('//input[@id="edit-node-ref-und-0-target-id" and @disabled="disabled" and @value="Referenced node (' . $this->node2->nid . ')"]');
$this
->assertTrue(!empty($xpath), 'The field is disabled and default value is set to the node 2.');
$this
->drupalPost('node/' . $this->node1->nid . '/edit', array(
'title' => 'Referencing node',
), t('Save'));
$this
->verifyReferenceRemain();
}
private function changeInstanceSettings($settings) {
$instance = field_info_instance('node', 'node_ref', $this->node1->type);
$old_settings = $instance['settings']['behaviors']['prepopulate'];
$instance['settings']['behaviors']['prepopulate'] = $settings + $old_settings;
field_update_instance($instance);
}
private function verifyReferenceRemain() {
$node = node_load($this->node1->nid, NULL, TRUE);
$wrapper = entity_metadata_wrapper('node', $node);
$this
->assertTrue($wrapper->node_ref
->getIdentifier() == $this->node2->nid, 'The reference from node 1 to node 2 remained.');
}
}
class EntityReferenceProvidersTestCase extends DrupalWebTestCase {
public static function getInfo() {
return array(
'name' => 'Providers',
'description' => 'Test the providers functionality.',
'group' => 'Entity reference prepopulate',
'dependencies' => array(
'og',
),
);
}
function setUp() {
parent::setUp('og_context', 'entityreference_prepopulate_test');
$this->user1 = $this
->drupalCreateUser(array(
'bypass node access',
'administer group',
));
$this
->drupalLogin($this->user1);
$type = $this
->drupalCreateContentType();
$this->group_type = $type->type;
og_create_field(OG_GROUP_FIELD, 'node', $this->group_type);
$type = $this
->drupalCreateContentType();
$this->group_content_type = $type->type;
$og_field = og_fields_info(OG_AUDIENCE_FIELD);
$og_field['instance']['settings']['behaviors']['prepopulate'] = array(
'status' => TRUE,
'action' => 'none',
'fallback' => 'none',
'skip_perm' => FALSE,
);
og_create_field(OG_AUDIENCE_FIELD, 'node', $this->group_content_type, $og_field);
$settings = array(
'type' => $this->group_type,
'uid' => $this->user1->uid,
'title' => $this
->randomName(),
);
$settings[OG_GROUP_FIELD][LANGUAGE_NONE][0]['value'] = 1;
$this->group1 = $this
->drupalCreateNode($settings);
$settings['title'] = $this
->randomName();
$this->group2 = $this
->drupalCreateNode($settings);
}
function testProvidres() {
$nid1 = $this->group1->nid;
$nid2 = $this->group2->nid;
$path = 'node/add/' . str_replace('_', '-', $this->group_content_type);
$options = array(
'query' => array(
OG_AUDIENCE_FIELD => $nid1,
'gid' => $nid2,
),
);
$instance = field_info_instance('node', OG_AUDIENCE_FIELD, $this->group_content_type);
$scenarios = array(
array(
'message' => 'No providers set - defaults to URL.',
'providers' => array(),
'result' => $nid1,
),
array(
'message' => 'URL provider only.',
'providers' => array(
'url' => TRUE,
),
'result' => $nid1,
),
array(
'message' => 'OG Context provider only.',
'providers' => array(
'og_context' => TRUE,
),
'result' => $nid2,
),
array(
'message' => 'URL provider, and then OG Context provider.',
'providers' => array(
'url' => TRUE,
'og_context' => TRUE,
),
'result' => $nid1,
),
array(
'message' => 'OG Context provider, and then URL provider.',
'providers' => array(
'og_context' => TRUE,
'url' => TRUE,
),
'result' => $nid2,
),
array(
'message' => 'Invalid provider.',
'providers' => array(
'invalid' => TRUE,
),
'result' => FALSE,
),
);
foreach ($scenarios as $scenario) {
$instance['settings']['behaviors']['prepopulate']['providers'] = $scenario['providers'];
field_update_instance($instance);
$this
->drupalGet($path, $options);
if ($scenario['result']) {
$this
->assertOptionSelected('edit-og-group-ref-und-0-default', $scenario['result'], $scenario['message']);
}
else {
$this
->assertNoOptionSelected('edit-og-group-ref-und-0-default', $nid1, $scenario['message']);
$this
->assertNoOptionSelected('edit-og-group-ref-und-0-default', $nid2, $scenario['message']);
}
}
}
}