View source
<?php
module_load_include('test', 'salesforce', 'tests/salesforce');
abstract class SalesforceMappingTestCase extends DrupalWebTestCase {
protected $adminPath = 'admin/structure/salesforce/mappings';
protected $addMapPath = 'admin/structure/salesforce/mappings/add';
protected $manageMapPrefix = 'admin/structure/salesforce/mappings/manage/';
public function setUp($modules = array(), $permissions = array()) {
$modules = array_merge($modules, array(
'entity',
'salesforce',
'salesforce_mapping',
));
parent::setUp($modules);
$permissions = array_merge($permissions, array(
'administer salesforce',
'administer salesforce mapping',
'view salesforce mapping object',
));
$this->admin_user = $this
->drupalCreateUser($permissions);
$this
->drupalLogin($this->admin_user);
}
public function tearDown() {
user_cancel(array(), $this->admin_user->uid, 'user_cancel_delete');
parent::tearDown();
}
protected function createSalesforceMapping($label, $machine_name = NULL, $config = array()) {
if (empty($config)) {
$config = array(
'drupal_entity_type' => 'user',
'drupal_bundle' => 'user',
'salesforce_object_type' => 'Contact',
'key' => 1,
'mapping' => array(
array(
'fieldmap_type' => 'property',
'fieldmap_value' => 'name',
'salesforce_field' => 'Name',
'direction' => 'drupal_sf',
),
array(
'fieldmap_type' => 'property',
'fieldmap_value' => 'mail',
'salesforce_field' => 'Email',
'direction' => 'sync',
),
array(
'fieldmap_type' => 'property',
'fieldmap_value' => 'name',
'salesforce_field' => 'LastName',
'direction' => 'sf_drupal',
),
),
'sync_triggers' => array(
'1' => TRUE,
'2' => TRUE,
'4' => TRUE,
'8' => TRUE,
'16' => TRUE,
'32' => TRUE,
),
'push_async' => TRUE,
);
}
$edit = array();
$machine_name = is_null($machine_name) ? str_replace(' ', '_', strtolower($label)) : $machine_name;
$this
->drupalGet($this->addMapPath);
$this
->assertNoText('You are not authorized to access this page.', 'Able to access the create map page.');
$edit['drupal_entity_type'] = $config['drupal_entity_type'];
$this
->drupalPostAjax(NULL, $edit, 'drupal_entity_type');
unset($config['drupal_entity_type']);
$edit['drupal_bundle'] = $config['drupal_bundle'];
$this
->drupalPostAjax(NULL, $edit, 'drupal_bundle');
unset($config['drupal_bundle']);
$edit['salesforce_object_type'] = $config['salesforce_object_type'];
$this
->drupalPostAjax(NULL, $edit, 'salesforce_object_type');
unset($config['salesforce_object_type']);
foreach ($config['mapping'] as $delta => $map) {
$edit['salesforce_field_mappings[' . $delta . '][drupal_field][fieldmap_type]'] = $map['fieldmap_type'];
$this
->drupalPostAjax(NULL, $edit, 'salesforce_field_mappings[' . $delta . '][drupal_field][fieldmap_type]');
$this
->drupalPostAjax(NULL, $edit, array(
'salesforce_add_field' => 'Add another field mapping',
));
unset($config['mapping'][$delta]['fieldmap_type']);
}
$edit['label'] = $label;
$edit['name'] = $machine_name;
foreach ($config as $key => $data) {
switch ($key) {
case 'mapping':
foreach ($data as $delta => $fields) {
foreach ($fields as $field => $value) {
if ($field == 'fieldmap_value') {
$edit['salesforce_field_mappings[' . $delta . '][drupal_field][fieldmap_value]'] = $value;
}
else {
$edit['salesforce_field_mappings[' . $delta . '][' . $field . ']'] = $value;
}
}
}
break;
case 'sync_triggers':
foreach ($data as $value => $flag) {
$edit['sync_triggers[' . $value . ']'] = $flag;
}
break;
default:
$edit[$key] = $data;
}
}
$this
->drupalPost(NULL, $edit, 'Save mapping');
$this
->assertText('Salesforce field Email is not configured as an external id.', 'Invalid key not allowed');
unset($edit['key']);
$this
->drupalPost(NULL, $edit, 'Save mapping');
$this
->assertText('Salesforce field mapping saved.', 'Form posted as expected.');
$this
->assertRaw('id="salesforce-mapping-overview-form"', 'Redirected to the mappings overview table.');
$this
->assertRaw('(Machine name: ' . $machine_name . ')', 'New map successfully appears on overview page.');
$this
->assertLink($label, 0, 'Link to edit new map appears.');
}
protected function drupalPostAJAX($path, $edit, $triggering_element, $ajax_path = NULL, array $options = array(), array $headers = array(), $form_html_id = NULL, $ajax_settings = NULL) {
if (isset($path)) {
$this
->drupalGet($path, $options);
}
$content = $this->content;
$drupal_settings = $this->drupalSettings;
if (!isset($ajax_settings)) {
if (is_array($triggering_element)) {
$xpath = '//*[@name="' . key($triggering_element) . '" and @value="' . current($triggering_element) . '"]';
}
else {
$xpath = '//*[@name="' . $triggering_element . '"]';
}
if (isset($form_html_id)) {
$xpath = '//form[@id="' . $form_html_id . '"]' . $xpath;
}
$element = $this
->xpath($xpath);
$element_id = (string) $element[0]['id'];
$ajax_settings = $drupal_settings['ajax'][$element_id];
}
$extra_post = '';
if (isset($ajax_settings['submit'])) {
foreach ($ajax_settings['submit'] as $key => $value) {
$extra_post .= '&' . urlencode($key) . '=' . urlencode($value);
}
}
foreach ($this
->xpath('//*[@id]') as $element) {
$id = (string) $element['id'];
$extra_post .= '&' . urlencode('ajax_html_ids[]') . '=' . urlencode($id);
}
if (isset($drupal_settings['ajaxPageState'])) {
$extra_post .= '&' . urlencode('ajax_page_state[theme]') . '=' . urlencode($drupal_settings['ajaxPageState']['theme']);
$extra_post .= '&' . urlencode('ajax_page_state[theme_token]') . '=' . urlencode($drupal_settings['ajaxPageState']['theme_token']);
foreach ($drupal_settings['ajaxPageState']['css'] as $key => $value) {
$extra_post .= '&' . urlencode("ajax_page_state[css][{$key}]") . '=1';
}
foreach ($drupal_settings['ajaxPageState']['js'] as $key => $value) {
$extra_post .= '&' . urlencode("ajax_page_state[js][{$key}]") . '=1';
}
}
if (!isset($ajax_path)) {
$ajax_path = isset($ajax_settings['url']) ? $ajax_settings['url'] : 'system/ajax';
}
$return = drupal_json_decode($this
->drupalPost(NULL, $edit, array(
'path' => $ajax_path,
'triggering_element' => $triggering_element,
), $options, $headers, $form_html_id, $extra_post));
if (!empty($ajax_settings) && !empty($return)) {
$ajax_settings += array(
'method' => 'replaceWith',
);
$dom = new DOMDocument();
@$dom
->loadHTML($content);
$xpath = new DOMXPath($dom);
foreach ($return as $command) {
switch ($command['command']) {
case 'settings':
$drupal_settings = drupal_array_merge_deep($drupal_settings, $command['settings']);
break;
case 'insert':
$wrapper_node = NULL;
if (!isset($command['selector'])) {
$wrapper_node = $xpath
->query('//*[@id="' . $ajax_settings['wrapper'] . '"]')
->item(0);
}
elseif (in_array($command['selector'], array(
'head',
'body',
))) {
$wrapper_node = $xpath
->query('//' . $command['selector'])
->item(0);
}
elseif (substr($command['selector'], 0, 1) == '#') {
$wrapper_node = $xpath
->query('//*[@id="' . substr($command['selector'], 1) . '"]')
->item(0);
}
if ($wrapper_node) {
$new_dom = new DOMDocument();
$new_dom
->loadHTML('<div>' . $command['data'] . '</div>');
$new_node = $dom
->importNode($new_dom->documentElement->firstChild->firstChild, TRUE);
$method = isset($command['method']) ? $command['method'] : $ajax_settings['method'];
switch ($method) {
case 'replaceWith':
$wrapper_node->parentNode
->replaceChild($new_node, $wrapper_node);
break;
case 'append':
$wrapper_node
->appendChild($new_node);
break;
case 'prepend':
$wrapper_node
->insertBefore($new_node, $wrapper_node->firstChild);
break;
case 'before':
$wrapper_node->parentNode
->insertBefore($new_node, $wrapper_node);
break;
case 'after':
$wrapper_node->parentNode
->insertBefore($new_node, $wrapper_node->nextSibling);
break;
case 'html':
foreach ($wrapper_node->childNodes as $child_node) {
$wrapper_node
->removeChild($child_node);
}
$wrapper_node
->appendChild($new_node);
break;
}
}
break;
}
}
$content = $dom
->saveHTML();
}
$this
->drupalSetContent($content);
$this
->drupalSetSettings($drupal_settings);
return $return;
}
protected function assertRadioOptionSelected($name, $value, $message = '', $group = 'Other') {
$matches = $this
->checkRadioOptionSelected($name, $value);
return $this
->assertTrue($matches, $message, $group);
}
protected function assertNoRadioOptionSelected($name, $value, $message = '', $group = 'Other') {
$matches = $this
->checkRadioOptionSelected($name, $value);
return $this
->assertFalse($matches, $message, $group);
}
protected function checkRadioOptionSelected($name, $value) {
$fields = $this
->xpath($this
->constructFieldXpath('name', $name));
if (is_array($fields)) {
foreach ($fields as $field) {
if (isset($field['checked']) && $field['checked'] == 'checked') {
if ($field['value'] == $value) {
return TRUE;
}
}
}
}
return FALSE;
}
}