summaryrefslogtreecommitdiff
path: root/www/crm/wp-content/plugins/civicrm/civicrm/ext/api4/tests/phpunit/Query/SelectQueryMultiJoinTest.php
blob: 860bd785201afa9e72f38cb6adcb0ec04e02c0b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php

namespace Civi\Test\Api4\Query;

use Civi\Api4\Contact;
use Civi\Api4\Email;
use Civi\Test\Api4\UnitTestCase;

/**
 * Class SelectQueryMultiJoinTest
 * @package Civi\Test\Api4\Query
 * @group headless
 */
class SelectQueryMultiJoinTest extends UnitTestCase {
  public function setUpHeadless() {
    $this->cleanup(['tablesToTruncate' => ['civicrm_contact', 'civicrm_email']]);
    $this->loadDataSet('MultiContactMultiEmail');
    return parent::setUpHeadless();
  }

  public function testOneToManySelect() {
    $results = Contact::get()
      ->addSelect('emails.email')
      ->execute()
      ->indexBy('id')
      ->getArrayCopy();

    $firstContactId = $this->getReference('test_contact_1')['id'];
    $secondContactId = $this->getReference('test_contact_2')['id'];

    $firstContact = $results[$firstContactId];
    $secondContact = $results[$secondContactId];
    $firstContactEmails = array_column($firstContact['emails'], 'email');
    $secondContactEmails = array_column($secondContact['emails'], 'email');

    $expectedFirstEmails = [
    'test_contact_one_home@fakedomain.com',
    'test_contact_one_work@fakedomain.com',
    ];
    $expectedSecondEmails = [
      'test_contact_two_home@fakedomain.com',
      'test_contact_two_work@fakedomain.com',
    ];

    $this->assertEquals($expectedFirstEmails, $firstContactEmails);
    $this->assertEquals($expectedSecondEmails, $secondContactEmails);
  }

  public function testManyToOneSelect() {
    $results = Email::get()
      ->addSelect('contact.display_name')
      ->execute()
      ->indexBy('id')
      ->getArrayCopy();

    $firstEmail = $this->getReference('test_email_1');
    $secondEmail = $this->getReference('test_email_2');
    $thirdEmail = $this->getReference('test_email_3');
    $fourthEmail = $this->getReference('test_email_4');
    $firstContactEmailIds = [$firstEmail['id'], $secondEmail['id']];
    $secondContactEmailIds = [$thirdEmail['id'], $fourthEmail['id']];

    foreach ($results as $id => $email) {
      $displayName = $email['contact']['display_name'];
      if (in_array($id, $firstContactEmailIds)) {
        $this->assertEquals('First Contact', $displayName);
      }
      elseif (in_array($id, $secondContactEmailIds)) {
        $this->assertEquals('Second Contact', $displayName);
      }
    }
  }

}