public function ContactSubmissionTest::testSubmitWebform in Webform CiviCRM Integration 8.5
Test submitting a contact.
@dataProvider dataContactValues
File
- tests/
src/ FunctionalJavascript/ ContactSubmissionTest.php, line 318
Class
- ContactSubmissionTest
- Tests submitting a Webform with CiviCRM and a single contact.
Namespace
Drupal\Tests\webform_civicrm\FunctionalJavascriptCode
public function testSubmitWebform($contact_type, array $contact_values) {
$this
->assertArrayHasKey('contact', $contact_values, 'Test data must contain contact');
$this
->assertArrayHasKey('first_name', $contact_values['contact'], 'Test contact data must contain first_name');
$this
->assertArrayHasKey('last_name', $contact_values['contact'], 'Test contact data must contain last_name');
$this
->drupalLogin($this->adminUser);
$this
->drupalGet(Url::fromRoute('entity.webform.civicrm', [
'webform' => $this->webform
->id(),
]));
// The label has a <div> in it which can cause weird failures here.
$this
->assertSession()
->waitForText('Enable CiviCRM Processing');
$this
->assertSession()
->waitForField('nid');
$this
->htmlOutput();
$this
->getSession()
->getPage()
->checkField('nid');
$this
->getSession()
->getPage()
->selectFieldOption('1_contact_type', strtolower($contact_type));
$this
->assertSession()
->assertWaitOnAjaxRequest();
// @see wf_crm_location_fields().
$configurable_contact_field_groups = [
'address' => [
'street_address',
'city',
'postal_code',
'county_id',
'country_id',
'state_province_id',
],
'email' => 'email',
'website' => 'url',
'phone' => 'phone',
'im' => 'name',
];
// refactor that -> use yield
// address => 'street_address' or 'city'
foreach ($configurable_contact_field_groups as $field_group => $field_value_key) {
if (isset($contact_values[$field_group])) {
$this
->assertTrue(is_array($contact_values[$field_group]));
$this
->assertTrue(isset($contact_values[$field_group][0]));
$this
->getSession()
->getPage()
->selectFieldOption('contact_1_number_of_' . $field_group, count($contact_values[$field_group]));
$this
->assertSession()
->assertWaitOnAjaxRequest();
$this
->htmlOutput();
if (is_array($field_value_key)) {
foreach ($field_value_key as $value_key) {
$this
->getSession()
->getPage()
->checkField("civicrm_1_contact_1_{$field_group}_{$value_key}");
$this
->assertSession()
->checkboxChecked("civicrm_1_contact_1_{$field_group}_{$value_key}");
}
}
else {
$this
->assertSession()
->checkboxChecked("civicrm_1_contact_1_{$field_group}_{$field_value_key}");
}
}
}
$this
->getSession()
->getPage()
->pressButton('Save Settings');
$this
->assertSession()
->pageTextContains('Saved CiviCRM settings');
$this
->drupalLogout();
$this
->drupalGet($this->webform
->toUrl('canonical'));
$this
->assertPageNoErrorMessages();
foreach ($contact_values as $entity_type => $field_values) {
foreach ($field_values as $field_name => $field_value) {
if (is_array($field_value)) {
foreach ($field_value as $key => $value) {
$selector = "civicrm_1_contact_1_{$entity_type}_{$key}";
$this
->addFieldValue($selector, $value);
$this
->assertSession()
->assertWaitOnAjaxRequest();
}
}
else {
$selector = "civicrm_1_contact_1_{$entity_type}_{$field_name}";
$this
->addFieldValue($selector, $field_value);
}
}
}
$this
->getSession()
->getPage()
->pressButton('Submit');
$this
->assertSession()
->pageTextContains('New submission added to CiviCRM Webform Test.');
$contact_result = $this->utils
->wf_civicrm_api('contact', 'get', [
'sequential' => 1,
'first_name' => $contact_values['contact']['first_name'],
'last_name' => $contact_values['contact']['last_name'],
]);
$result_debug = var_export($contact_result, TRUE);
$this
->assertArrayHasKey('count', $contact_result, $result_debug);
$this
->assertEquals(1, $contact_result['count'], $result_debug);
$contact = $contact_result['values'][0];
$this
->assertEquals($contact_type, $contact['contact_type']);
foreach ($contact_values['contact'] as $field_name => $field_value) {
$this
->assertEquals($field_value, $contact[$field_name], $result_debug);
}
if (isset($contact_values['email'])) {
$this
->assertEquals($contact_values['email'][0]['email'], $contact['email']);
}
foreach ($configurable_contact_field_groups as $field_group => $field_value_key) {
if (isset($contact_values[$field_group])) {
$api_result = $this->utils
->wf_civicrm_api($field_group, 'get', [
'sequential' => 1,
'contact_id' => $contact['contact_id'],
]);
$this
->assertEquals(count($contact_values[$field_group]), $api_result['count']);
foreach ($api_result['values'] as $key => $result_entity) {
if (is_array($field_value_key)) {
foreach ($field_value_key as $value_key) {
if (isset($contact_values[$field_group][$key][$value_key])) {
switch ($value_key) {
case 'state_province_id':
$state = $this->utils
->wf_civicrm_api('StateProvince', 'getvalue', [
'return' => "abbreviation",
'id' => $result_entity[$value_key],
]);
$this
->assertEquals($contact_values[$field_group][$key][$value_key], $state);
break;
default:
$this
->assertEquals($contact_values[$field_group][$key][$value_key], $result_entity[$value_key]);
break;
}
}
}
}
elseif (isset($contact_values[$field_group][$key][$field_value_key])) {
$this
->assertEquals($contact_values[$field_group][$key][$field_value_key], $result_entity[$field_value_key]);
}
}
}
}
}