File size: 2,185 Bytes
d2897cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 Mautic\WebhookBundle\Tests\Http;

use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Response;
use Mautic\CoreBundle\Helper\CoreParametersHelper;
use Mautic\WebhookBundle\Http\Client;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;

final class ClientTest extends TestCase
{
    /**
     * @var MockObject&CoreParametersHelper
     */
    private MockObject $parametersMock;

    /**
     * @var MockObject&GuzzleClient
     */
    private MockObject $httpClientMock;

    private Client $client;

    protected function setUp(): void
    {
        parent::setUp();

        $this->parametersMock = $this->createMock(CoreParametersHelper::class);
        $this->httpClientMock = $this->createMock(GuzzleClient::class);
        $this->client         = new Client($this->parametersMock, $this->httpClientMock);
    }

    public function testPost(): void
    {
        $method  = 'POST';
        $url     = 'url';
        $payload = ['payload'];
        $siteUrl = 'siteUrl';
        $headers = [
            'Content-Type'      => 'application/json',
            'X-Origin-Base-URL' => $siteUrl,
        ];

        $response = new Response();

        $this->parametersMock->expects($this->once())
            ->method('get')
            ->with('site_url')
            ->willReturn($siteUrl);

        $this->httpClientMock->expects($this->once())
            ->method('sendRequest')
            ->with($this->callback(function (Request $request) use ($method, $url, $headers, $payload) {
                $this->assertSame($method, $request->getMethod());
                $this->assertSame($url, $request->getUri()->getPath());

                foreach ($headers as $headerName => $headerValue) {
                    $header = $request->getHeader($headerName);
                    $this->assertSame($headerValue, $header[0]);
                }

                $this->assertSame(json_encode($payload), (string) $request->getBody());

                return true;
            }))
            ->willReturn($response);

        $this->assertEquals($response, $this->client->post($url, $payload));
    }
}