You are here

public function ContributionDummyTest::testSubmitContribution in Webform CiviCRM Integration 8.5

File

tests/src/FunctionalJavascript/ContributionDummyTest.php, line 93

Class

ContributionDummyTest
Tests submitting a Webform with CiviCRM: Contribution with Line Items and Sales Tax

Namespace

Drupal\Tests\webform_civicrm\FunctionalJavascript

Code

public function testSubmitContribution() {
  $payment_processor = $this
    ->createPaymentProcessor();
  $this
    ->setupSalesTax(2, $accountParams = []);
  $this->cid2 = $this
    ->createIndividual([
    'first_name' => 'Mark',
    'last_name' => 'Cooper',
  ]);
  $this
    ->drupalLogin($this->adminUser);
  $this
    ->drupalGet(Url::fromRoute('entity.webform.civicrm', [
    'webform' => $this->webform
      ->id(),
  ]));
  $this
    ->enableCivicrmOnWebform();
  $this
    ->getSession()
    ->getPage()
    ->selectFieldOption('number_of_contacts', 2);
  $this
    ->assertSession()
    ->assertWaitOnAjaxRequest();
  $this
    ->htmlOutput();
  $this
    ->getSession()
    ->getPage()
    ->clickLink('2. Contact 2');
  $this
    ->getSession()
    ->getPage()
    ->checkField("civicrm_2_contact_1_contact_existing");
  $this
    ->configureContributionTab(FALSE, $payment_processor['id']);
  $this
    ->getSession()
    ->getPage()
    ->checkField("Contribution Amount");
  $this
    ->assertSession()
    ->checkboxChecked("Contribution Amount");
  $el = $this
    ->getSession()
    ->getPage()
    ->findField('Payment Processor');
  $opts = $el
    ->findAll('css', 'option');
  $this
    ->assertCount(3, $opts, 'Payment processor values: ' . implode(', ', array_map(static function (NodeElement $el) {
    return $el
      ->getValue();
  }, $opts)));
  $this
    ->enableBillingSection();
  $this
    ->getSession()
    ->getPage()
    ->selectFieldOption('lineitem_1_number_of_lineitem', 2);
  $this
    ->assertSession()
    ->assertWaitOnAjaxRequest();
  $this
    ->htmlOutput();
  $this
    ->getSession()
    ->getPage()
    ->checkField("civicrm_1_lineitem_1_contribution_line_total");
  $this
    ->assertSession()
    ->checkboxChecked("civicrm_1_lineitem_1_contribution_line_total");
  $this
    ->getSession()
    ->getPage()
    ->checkField("civicrm_1_lineitem_2_contribution_line_total");
  $this
    ->assertSession()
    ->checkboxChecked("civicrm_1_lineitem_2_contribution_line_total");

  // Set the Financial Type for the second line item to Member Dues (which has Sales Tax on it).
  $this
    ->getSession()
    ->getPage()
    ->selectFieldOption('civicrm_1_lineitem_2_contribution_financial_type_id', 2);
  $this
    ->saveCiviCRMSettings();
  $this
    ->drupalGet($this->webform
    ->toUrl('canonical', [
    'query' => [
      'cid2' => $this->cid2['id'],
    ],
  ]));
  $this
    ->assertPageNoErrorMessages();
  $this
    ->getSession()
    ->getPage()
    ->fillField('First Name', 'Frederick');
  $this
    ->getSession()
    ->getPage()
    ->fillField('Last Name', 'Pabst');
  $this
    ->getSession()
    ->getPage()
    ->fillField('Email', 'fred@example.com');
  $this
    ->getSession()
    ->getPage()
    ->fillField('Line Item Amount', '20.00');
  $this
    ->getSession()
    ->getPage()
    ->fillField('Line Item Amount 2', '29.50');
  $this
    ->assertFieldValue('edit-civicrm-2-contact-1-contact-first-name', 'Mark');
  $this
    ->assertFieldValue('edit-civicrm-2-contact-1-contact-last-name', 'Cooper');
  $this
    ->addFieldValue('civicrm_2_contact_1_contact_first_name', 'MarkUpdated');
  $this
    ->addFieldValue('civicrm_2_contact_1_contact_last_name', 'CooperUpdated');
  $this
    ->getSession()
    ->getPage()
    ->pressButton('Next >');
  $this
    ->assertSession()
    ->waitForField('edit-wizard-prev');
  $this
    ->getSession()
    ->getPage()
    ->pressButton('edit-wizard-prev');
  $this
    ->assertSession()
    ->waitForField('edit-civicrm-2-contact-1-contact-first-name');
  $this
    ->assertFieldValue('edit-civicrm-2-contact-1-contact-first-name', 'MarkUpdated');
  $this
    ->assertFieldValue('edit-civicrm-2-contact-1-contact-last-name', 'CooperUpdated');
  $this
    ->getSession()
    ->getPage()
    ->pressButton('Next >');
  $this
    ->getSession()
    ->getPage()
    ->fillField('Contribution Amount', '10.00');
  $this
    ->assertSession()
    ->elementExists('css', '#wf-crm-billing-items');
  $this
    ->htmlOutput();
  $this
    ->assertSession()
    ->elementTextContains('css', '#wf-crm-billing-total', '60.98');
  $this
    ->fillCardAndSubmit();
  $api_result = $this->utils
    ->wf_civicrm_api('contribution', 'get', [
    'sequential' => 1,
  ]);
  $this
    ->assertEquals(1, $api_result['count']);
  $contribution = reset($api_result['values']);
  $this
    ->assertNotEmpty($contribution['trxn_id']);
  $this
    ->assertEquals($this->webform
    ->label(), $contribution['contribution_source']);
  $this
    ->assertEquals('Donation', $contribution['financial_type']);
  $this
    ->assertEquals('60.98', $contribution['total_amount']);
  $contribution_total_amount = $contribution['total_amount'];
  $this
    ->assertEquals('Completed', $contribution['contribution_status']);
  $this
    ->assertEquals('USD', $contribution['currency']);

  // Also retrieve tax_amount (have to ask for it to be returned):
  $api_result = $this->utils
    ->wf_civicrm_api('contribution', 'get', [
    'sequential' => 1,
    'return' => 'tax_amount',
  ]);
  $contribution = reset($api_result['values']);
  $this
    ->assertEquals('1.48', $contribution['tax_amount']);
  $tax_total_amount = $contribution['tax_amount'];
  $api_result = $this->utils
    ->wf_civicrm_api('line_item', 'get', [
    'sequential' => 1,
  ]);
  $this
    ->assertEquals('10.00', $api_result['values'][0]['line_total']);
  $this
    ->assertEquals('1', $api_result['values'][0]['financial_type_id']);
  $this
    ->assertEquals('20.00', $api_result['values'][1]['line_total']);
  $this
    ->assertEquals('1', $api_result['values'][1]['financial_type_id']);
  $this
    ->assertEquals('29.50', $api_result['values'][2]['line_total']);
  $this
    ->assertEquals('1.48', $api_result['values'][2]['tax_amount']);
  $this
    ->assertEquals('2', $api_result['values'][2]['financial_type_id']);

  // throw new \Exception(var_export($api_result, TRUE));
  $sum_line_total = $api_result['values'][0]['line_total'] + $api_result['values'][1]['line_total'] + $api_result['values'][2]['line_total'];
  $sum_tax_amount = $api_result['values'][2]['tax_amount'];
  $this
    ->assertEquals($tax_total_amount, $sum_tax_amount);
  $this
    ->assertEquals($contribution_total_amount, $sum_line_total + $sum_tax_amount);
}