MockClient::getMockResponse()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace Gemz\HttpClient\Testing;
4
5
use Gemz\HttpClient\Client;
6
use Gemz\HttpClient\Config;
7
use Gemz\HttpClient\Response;
8
use Symfony\Component\HttpClient\MockHttpClient;
9
use Symfony\Component\HttpClient\Response\MockResponse;
10
use Symfony\Contracts\HttpClient\ResponseInterface;
11
12
class MockClient extends Client
13
{
14
    /** @var MockResponse */
15
    protected $mockResponse;
16
17
    /** @var ResponseInterface */
18
    protected $response;
19
20
    /** @var mixed */
21
    protected $mockBody;
22
23
    /** @var array<mixed> */
24
    protected $mockInfo = [];
25
26
    /**
27
     * @param mixed $body
28
     *
29
     * @return $this
30
     */
31
    public function mockBody($body): self
32
    {
33
        $this->mockBody = $body;
34
35
        return $this;
36
    }
37
38
    /**
39
     * @param array<mixed> $info
40
     *
41
     * @return $this
42
     */
43
    public function mockInfo(array $info): self
44
    {
45
        $this->mockInfo = $info;
46
47
        return $this;
48
    }
49
50
    /**
51
     * @return MockResponse
52
     */
53
    protected function buildMockResponse(): MockResponse
54
    {
55
        return new MockResponse(
56
            $this->mockBody,
57
            $this->mockInfo
58
        );
59
    }
60
61
    /**
62
     * @return ResponseInterface
63
     */
64
    public function getMockResponse(): ResponseInterface
65
    {
66
        return $this->response;
67
    }
68
    /**
69
     * @param string $method
70
     * @param string $endpoint
71
     *
72
     * @return Response|mixed
73
     *
74
     * @throws \Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface
75
     */
76
    protected function request(string $method, string $endpoint)
77
    {
78
        $this->resolvePayload();
79
80
        $client = new MockHttpClient($this->buildMockResponse(), $this->getBaseUri());
81
82
        $this->response = $client->request($method, $endpoint, $this->mergeConfigAndOptions());
83
        return new Response($this->response);
84
    }
85
86
    /**
87
     * @return array<mixed>
88
     */
89
    protected function mergeConfigAndOptions(): array
90
    {
91
        $headers = array_merge($this->getConfig()['headers'] ?? [], $this->options['headers'] ?? []);
92
        $options = array_merge($this->getConfig(), $this->options);
93
94
        $options['headers'] = $headers;
95
96
        return $options;
97
    }
98
99
    /**
100
     * @return array<mixed>
101
     */
102
    public function getRequestOptions(): array
103
    {
104
        return $this->mergeConfigAndOptions();
105
    }
106
107
    /**
108
     * @return string
109
     */
110
    protected function getBaseUri()
111
    {
112
        $config = $this->config !== null
113
            ? $this->config->toArray()
114
            : Config::make()->toArray();
115
116
        return $config['base_uri'] ?? 'http://localhost.test';
117
    }
118
119
    /**
120
     * @return array<mixed>
121
     */
122
    protected function getConfig(): array
123
    {
124
        $config = $this->config !== null ? $this->config : Config::make();
125
126
        return $config->toArray();
127
    }
128
}
129