Completed
Push — master ( 990e98...abd222 )
by Benjamin
02:12
created

RequestTest::testClone()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 33
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 33
rs 8.8571
cc 1
eloc 23
nc 1
nop 0
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: lejla
5
 * Date: 2016.02.10.
6
 * Time: 17:51
7
 */
8
9
namespace CurlX\Tests;
10
11
12
use CurlX\Request;
13
use CurlX\RequestInterface;
14
use PHPUnit_Framework_TestCase;
15
16
class RequestTest extends PHPUnit_Framework_TestCase
17
{
18
    public function testUrl()
19
    {
20
        $request = new Request('http://url.com');
21
        $this->assertEquals('http://url.com', $request->url);
22
23
        $request->url = 'http://url2.com';
24
        $this->assertEquals('http://url2.com', $request->url);
25
26
        $request->url = 'badurl';
27
        $this->assertEquals('http://url2.com', $request->url);
28
    }
29
30
    public function testPostFieldsBuilder()
31
    {
32
        $request = new Request();
33
34
        // No post values yet, so it should default to GET
35
        $this->assertArrayNotHasKey(CURLOPT_POST, $request->options);
36
        $this->assertEmpty($request->post_data);
37
38
        // With post values
39
        $post = ['username' => 'mike', 'password' => 'pass'];
40
        $request->post_data = $post;
41
        $this->assertArrayHasKey(CURLOPT_POST, $request->options);
42
        $this->assertEquals($post, $request->post_data);
43
44
        // Add more post fields
45
        $post2 = ['otherdata' => 'newvalue', 'username' => 'stacey'];
46
        $request->post_data = $post2;
47
        $this->assertArrayHasKey(CURLOPT_POST, $request->options);
48
        $this->assertEquals($post2 + $post, $request->post_data);
49
    }
50
51
    public function testNotify()
52
    {
53
        $request = new Request();
54
        $called1 = false;
55
        $called2 = false;
56
        $r1 = null;
57
        $r2 = null;
58
59
        $request->addListener(function(RequestInterface $var) use (&$called1, &$r1) {
60
            $called1 = true;
61
            $r1 = $var;
62
        });
63
64
        $request->addListener(function(RequestInterface $var) use (&$called2, &$r2) {
65
            $called2 = true;
66
            $r2 = $var;
67
        });
68
69
        $request->callBack([]);
70
71
        $this->assertTrue($called1, 'Callback 1 was not notified on request completion!');
72
        $this->assertInstanceOf('CurlX\RequestInterface', $r1, 'Callback 1 did not receive the request object');
73
        $this->assertTrue($called2, 'Callback 2 was not notified on request completion!');
74
        $this->assertInstanceOf('CurlX\RequestInterface', $r2, 'Callback 2 did not receive the request object');
75
    }
76
77
    public function testHeaders()
78
    {
79
        $request = new Request();
80
81
        $header = ['a' => 'aaa', 'b' => 'bbb'];
82
        $normalHeader = ['a: aaa', 'b: bbb'];
83
84
        $request->headers = $header;
85
        $this->assertEquals($header, $request->headers);
86
87
        $this->assertArrayHasKey(CURLOPT_HTTPHEADER, $request->options);
88
        $this->assertEquals($normalHeader, $request->options[CURLOPT_HTTPHEADER]);
89
90
        $header2 = ['b' => 'BBB', 'c' => 'CCC'];
91
        $normalOfBothHeaders = ['b: BBB', 'c: CCC', 'a: aaa'];
92
        $request->headers = $header2;
93
        $this->assertEquals($header2 + $header, $request->headers);
94
95
        $this->assertArrayHasKey(CURLOPT_HTTPHEADER, $request->options);
96
        $this->assertArraySubset($normalOfBothHeaders, $request->options[CURLOPT_HTTPHEADER]);
97
    }
98
99
    public function testOptions()
100
    {
101
        $request = new Request();
102
103
        $opt = [CURLOPT_CRLF => 'test', CURLOPT_AUTOREFERER => 'test'];
104
        $request->options = $opt;
105
106
        $this->assertArrayHasKey(CURLOPT_CRLF, $request->options);
107
        $this->assertArrayHasKey(CURLOPT_AUTOREFERER, $request->options);
108
        $this->assertArraySubset($opt, $request->options);
109
110
        $opt2 = [CURLOPT_AUTOREFERER => 'no-test', CURLOPT_BINARYTRANSFER => 'no-test'];
111
        $request->options = $opt2;
112
113
        $this->assertArrayHasKey(CURLOPT_CRLF, $request->options);
114
        $this->assertArrayHasKey(CURLOPT_AUTOREFERER, $request->options);
115
        $this->assertArrayHasKey(CURLOPT_BINARYTRANSFER, $request->options);
116
        $this->assertArraySubset($opt2 + $opt, $request->options);
117
    }
118
119
    public function testHandle()
120
    {
121
        $request = new Request('http://example.com');
122
        $ch = $request->handle;
123
124
        $this->assertNotNull($ch);
125
        $info = curl_getinfo($ch);
126
127
        $this->assertEquals($request->url, $info['url']);
128
129
        // Test default cUrl options
130
        $this->assertArrayHasKey(CURLOPT_RETURNTRANSFER, $request->options);
131
        $this->assertEquals($request->options[CURLOPT_RETURNTRANSFER], true);
132
    }
133
134
    public function testClone()
135
    {
136
        // We make a Request object and set parameters
137
        $request = new Request('http://url.url');
138
        $request->addListener(function(RequestInterface $r) {});
0 ignored issues
show
Unused Code introduced by
The parameter $r is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
139
        $request->post_data = ['a' => 'a'];
140
        $request->headers = ['a' => 'a'];
141
        $request->timeout = 5;
142
        $request->options = [CURLOPT_BINARYTRANSFER => true];
143
144
        // We clone it, and overwrite the parameters
145
        $request2 = clone $request;
146
        $request2->url = 'http://url2.url2';
147
        $iWasCalled = false;
148
        $request2->addListener(function(RequestInterface $r) use (&$iWasCalled) {
0 ignored issues
show
Unused Code introduced by
The parameter $r is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
149
            $iWasCalled = true;
150
        });
151
        $request2->post_data = ['a' => 'A', 'b' => 'B'];
152
        $request2->headers = ['a' => 'A', 'b' => 'B'];
153
        $request2->timeout = 10;
154
        $request2->options = [CURLOPT_BINARYTRANSFER => false];
155
156
        // Modifying the new object should not change values of the original one
157
        $this->assertEquals('http://url.url', $request->url);
158
        $this->assertEquals(['a' => 'a'], $request->post_data);
159
        $this->assertEquals(['a' => 'a'], $request->headers);
160
        $this->assertEquals(5, $request->timeout);
161
        $this->assertArraySubset([CURLOPT_BINARYTRANSFER => true], $request->options);
162
163
        // Running the first Request should not notify the cloned Request's listeners
164
        $request->callBack([]);
165
        $this->assertFalse($iWasCalled);
166
    }
167
}