Passed
Push — master ( 2113f4...0612f0 )
by Sergey
03:32 queued 01:00
created

SavePrivatePersonTest   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 113
Duplicated Lines 0 %

Importance

Changes 4
Bugs 0 Features 4
Metric Value
wmc 7
eloc 52
c 4
b 0
f 4
dl 0
loc 113
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A testCounterpartyPrivatePersonCrud() 0 38 2
A assertIsContactPerson() 0 9 1
A assertIsCounterpartyOptions() 0 6 1
A setUp() 0 5 1
A assertIsCounterparty() 0 9 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace SergeyNezbritskiy\Tests\Integration\Models\ContactPerson;
6
7
use Exception;
8
use PHPUnit\Framework\TestCase;
9
use SergeyNezbritskiy\NovaPoshta\Models\ContactPerson;
10
use SergeyNezbritskiy\NovaPoshta\Models\Counterparty;
11
use SergeyNezbritskiy\NovaPoshta\Tests\UsesConnectionTrait;
12
13
class SavePrivatePersonTest extends TestCase
14
{
15
    use UsesConnectionTrait;
16
17
    /**
18
     * Kharkiv city ref
19
     */
20
    private const CITY_REF = 'db5c88e0-391c-11dd-90d9-001a92567626';
21
22
    private Counterparty $model;
23
    private ContactPerson $contactPersonModel;
24
25
    protected function setUp(): void
26
    {
27
        $connection = $this->getConnection();
28
        $this->model = new Counterparty($connection);
29
        $this->contactPersonModel = new ContactPerson($connection);
30
    }
31
32
    /**
33
     * @return void
34
     * @throws Exception
35
     */
36
    public function testCounterpartyPrivatePersonCrud(): void
37
    {
38
        $sfx = $this->randomString(5);
39
        $counterparty = [
40
            'FirstName' => 'Іван' . $sfx,
41
            'MiddleName' => 'Іванович' . $sfx,
42
            'LastName' => 'Іванов' . $sfx,
43
            'Phone' => rand(380000000000, 380000999999),
44
            'Email' => '[email protected]',
45
            'CounterpartyProperty' => 'Recipient',
46
        ];
47
48
        //create counterparty
49
        $actualResult = $this->model->savePrivatePerson($counterparty);
50
        $this->assertIsCounterparty($actualResult);
51
52
        //update counterparty
53
        $counterparty['Ref'] = $actualResult['Ref'];
54
        $counterparty['MiddleName'] = 'Петрович' . $sfx;
55
        $counterparty['CityRef'] = self::CITY_REF;
56
57
        $actualResult = $this->model->updatePrivatePerson($counterparty);
58
        $this->assertSame($counterparty['MiddleName'], $actualResult['MiddleName']);
59
60
        //get counterparty options
61
        $counterpartyOptions = $this->model->getCounterpartyOptions($counterparty['Ref']);
62
        $this->assertIsCounterpartyOptions($counterpartyOptions);
63
64
        //get counterparty contact persons
65
        $contactPersons = $this->model->getCounterpartyContactPersons($counterparty['Ref']);
66
        $this->assertIsContactPerson($contactPersons[0]);
67
68
        //delete counterparty
69
        foreach ($contactPersons as $contactPerson) {
70
            $this->contactPersonModel->delete($contactPerson['Ref']);
71
        }
72
        $this->expectExceptionMessage('Counterparty PrivatePerson can\'t be deleted');
73
        $this->model->delete($counterparty['Ref']);
74
    }
75
76
    /**
77
     * @param array $counterparty
78
     * @return void
79
     */
80
    private function assertIsCounterparty(array $counterparty): void
81
    {
82
        $this->assertArrayHasKey('Ref', $counterparty);
83
        $this->assertArrayHasKey('Description', $counterparty);
84
        $this->assertArrayHasKey('FirstName', $counterparty);
85
        $this->assertArrayHasKey('LastName', $counterparty);
86
        $this->assertArrayHasKey('Counterparty', $counterparty);
87
        $this->assertArrayHasKey('EDRPOU', $counterparty);
88
        $this->assertArrayHasKey('CounterpartyType', $counterparty);
89
    }
90
91
    /**
92
     * @param array $contactPerson
93
     * @return void
94
     */
95
    private function assertIsContactPerson(array $contactPerson): void
96
    {
97
        $this->assertArrayHasKey('Ref', $contactPerson);
98
        $this->assertArrayHasKey('Description', $contactPerson);
99
        $this->assertArrayHasKey('Phones', $contactPerson);
100
        $this->assertArrayHasKey('FirstName', $contactPerson);
101
        $this->assertArrayHasKey('LastName', $contactPerson);
102
        $this->assertArrayHasKey('MiddleName', $contactPerson);
103
        $this->assertArrayHasKey('Email', $contactPerson);
104
    }
105
106
    /**
107
     * @param array $counterpartyOptions
108
     * @return void
109
     */
110
    private function assertIsCounterpartyOptions(array $counterpartyOptions): void
111
    {
112
        $this->assertArrayHasKey('Debtor', $counterpartyOptions);
113
        $this->assertArrayHasKey('DebtorParams', $counterpartyOptions);
114
        $this->assertArrayHasKey('SecurePayment', $counterpartyOptions);
115
        $this->assertArrayHasKey('MainCounterparty', $counterpartyOptions);
116
    }
117
118
    /**
119
     * @throws Exception
120
     */
121
    private function randomString($length = 10): string
122
    {
123
        $characters = 'абвгґдеєжзиіїйклмнопрстуфхцчшщьюяАБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ';
124
        $charactersLength = mb_strlen($characters);
125
        $randomString = '';
126
        for ($i = 0; $i < $length; $i++) {
127
            $symbolPosition = random_int(0, $charactersLength - 1);
128
            $randomString .= mb_substr($characters, $symbolPosition, 1);
129
        }
130
        return $randomString;
131
    }
132
}
133