8d11e295b094392b91e7aa54cf111987eba4bd32
[civicrm-core.git] / tests / phpunit / api / v4 / Query / SelectQueryMultiJoinTest.php
1 <?php
2
3 namespace api\v4\Query;
4
5 use Civi\Api4\Contact;
6 use Civi\Api4\Email;
7 use api\v4\UnitTestCase;
8
9 /**
10 * Class SelectQueryMultiJoinTest
11 * @package api\v4\Query
12 * @group headless
13 */
14 class SelectQueryMultiJoinTest extends UnitTestCase {
15
16 public function setUpHeadless() {
17 $this->cleanup(['tablesToTruncate' => ['civicrm_contact', 'civicrm_email']]);
18 $this->loadDataSet('MultiContactMultiEmail');
19 return parent::setUpHeadless();
20 }
21
22 public function testOneToManySelect() {
23 $results = Contact::get()
24 ->addSelect('emails.email')
25 ->execute()
26 ->indexBy('id')
27 ->getArrayCopy();
28
29 $firstContactId = $this->getReference('test_contact_1')['id'];
30 $secondContactId = $this->getReference('test_contact_2')['id'];
31
32 $firstContact = $results[$firstContactId];
33 $secondContact = $results[$secondContactId];
34 $firstContactEmails = array_column($firstContact['emails'], 'email');
35 $secondContactEmails = array_column($secondContact['emails'], 'email');
36
37 $expectedFirstEmails = [
38 'test_contact_one_home@fakedomain.com',
39 'test_contact_one_work@fakedomain.com',
40 ];
41 $expectedSecondEmails = [
42 'test_contact_two_home@fakedomain.com',
43 'test_contact_two_work@fakedomain.com',
44 ];
45
46 $this->assertEquals($expectedFirstEmails, $firstContactEmails);
47 $this->assertEquals($expectedSecondEmails, $secondContactEmails);
48 }
49
50 public function testManyToOneSelect() {
51 $results = Email::get()
52 ->addSelect('contact.display_name')
53 ->execute()
54 ->indexBy('id')
55 ->getArrayCopy();
56
57 $firstEmail = $this->getReference('test_email_1');
58 $secondEmail = $this->getReference('test_email_2');
59 $thirdEmail = $this->getReference('test_email_3');
60 $fourthEmail = $this->getReference('test_email_4');
61 $firstContactEmailIds = [$firstEmail['id'], $secondEmail['id']];
62 $secondContactEmailIds = [$thirdEmail['id'], $fourthEmail['id']];
63
64 foreach ($results as $id => $email) {
65 $displayName = $email['contact.display_name'];
66 if (in_array($id, $firstContactEmailIds)) {
67 $this->assertEquals('First Contact', $displayName);
68 }
69 elseif (in_array($id, $secondContactEmailIds)) {
70 $this->assertEquals('Second Contact', $displayName);
71 }
72 }
73 }
74
75 }