Completed
Push — master ( 284884...b70f30 )
by Kamil
20:25
created

PaypalApiMocker::mockStream()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
c 1
b 1
f 0
dl 0
loc 8
rs 9.4285
cc 1
eloc 5
nc 1
nop 1
1
<?php
2
3
/*
4
 * This file is part of the Sylius package.
5
 *
6
 * (c) Paweł Jędrzejewski
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Sylius\Behat;
13
14
use Guzzle\Http\Message\Response;
15
use Guzzle\Stream\Stream;
16
use Mockery\Mock;
17
use Payum\Core\Bridge\Guzzle\HttpClient;
18
19
/**
20
 * @author Arkadiusz Krakowiak <[email protected]>
21
 */
22
class PaypalApiMocker
23
{
24
    /**
25
     * @var MockerInterface
26
     */
27
    private $mocker;
28
29
    /**
30
     * @var ResponseLoaderInterface
31
     */
32
    private $responseLoader;
33
34
    /**
35
     * @param MockerInterface $mocker
36
     * @param ResponseLoaderInterface $responseLoader
37
     */
38
    public function __construct(MockerInterface $mocker, ResponseLoaderInterface $responseLoader)
39
    {
40
        $this->mocker = $mocker;
41
        $this->responseLoader = $responseLoader;
42
    }
43
44
    /**
45
     * {@inheritdoc}
46
     */
47
    public function mockApiSuccessfulPaymentResponse()
48
    {
49
        $mockedResponse = $this->responseLoader->getMockedResponse('Paypal/paypal_api_successful_payment.json');
50
        $firstGetExpressCheckoutDetailsStream = $this->mockStream($mockedResponse['firstGetExpressCheckoutDetails']);
51
        $firstGetExpressCheckoutDetailsResponse = $this->mockHttpResponse(200, $firstGetExpressCheckoutDetailsStream);
52
53
        $doExpressCheckoutPaymentStream = $this->mockStream($mockedResponse['doExpressCheckoutPayment']);
54
        $doExpressCheckoutPaymentResponse = $this->mockHttpResponse(200, $doExpressCheckoutPaymentStream);
55
56
        $secondGetExpressCheckoutDetailsStream = $this->mockStream($mockedResponse['secondGetExpressCheckoutDetails']);
57
        $secondGetExpressCheckoutDetailsResponse = $this->mockHttpResponse(200, $secondGetExpressCheckoutDetailsStream);
58
59
        $getTransactionDetailsStream = $this->mockStream($mockedResponse['getTransactionDetails']);
60
        $getTransactionDetailsResponse = $this->mockHttpResponse(200, $getTransactionDetailsStream);
61
62
        $this->mocker->mockService('payum.http_client', HttpClient::class)
63
            ->shouldReceive('send')
64
            ->times(4)
65
            ->andReturn($firstGetExpressCheckoutDetailsResponse, $doExpressCheckoutPaymentResponse, $secondGetExpressCheckoutDetailsResponse, $getTransactionDetailsResponse)
66
        ;
67
    }
68
69
    /**
70
     * {@inheritdoc}
71
     */
72
    public function mockApiPaymentInitializeResponse()
73
    {
74
        $mockedResponse = $this->responseLoader->getMockedResponse('Paypal/paypal_api_initialize_payment.json');
75
        $setExpressCheckoutStream = $this->mockStream($mockedResponse['setExpressCheckout']);
76
        $setExpressCheckoutResponse = $this->mockHttpResponse(200, $setExpressCheckoutStream);
77
78
        $getExpressCheckoutDetailsStream = $this->mockStream($mockedResponse['getExpressCheckoutDetails']);
79
        $getExpressCheckoutDetailsResponse = $this->mockHttpResponse(200, $getExpressCheckoutDetailsStream);
80
81
        $this->mocker->mockService('payum.http_client', HttpClient::class)
82
            ->shouldReceive('send')
83
            ->twice()
84
            ->andReturn($setExpressCheckoutResponse, $getExpressCheckoutDetailsResponse)
85
        ;
86
    }
87
88
    /**
89
     * @param string $content
90
     *
91
     * @return Mock
92
     */
93
    private function mockStream($content)
94
    {
95
        $mockedStream = $this->mocker->mockCollaborator(Stream::class);
96
        $mockedStream->shouldReceive('getContents')->once()->andReturn($content);
97
        $mockedStream->shouldReceive('close')->once()->andReturn();
98
99
        return $mockedStream;
100
    }
101
102
    /**
103
     * @param int $statusCode
104
     * @param mixed $streamMock
105
     *
106
     * @return Mock
107
     */
108
    private function mockHttpResponse($statusCode, $streamMock)
109
    {
110
        $mockedHttpResponse = $this->mocker->mockCollaborator(Response::class);
111
        $mockedHttpResponse->shouldReceive('getStatusCode')->once()->andReturn($statusCode);
112
        $mockedHttpResponse->shouldReceive('getBody')->once()->andReturn($streamMock);
113
114
        return $mockedHttpResponse;
115
    }
116
}
117