2015-08-27 12:03:05 -07:00
< ? php
namespace GuzzleHttp\Tests\Psr7 ;
use GuzzleHttp\Psr7 ;
use GuzzleHttp\Psr7\FnStream ;
use GuzzleHttp\Psr7\NoSeekStream ;
class FunctionsTest extends \PHPUnit_Framework_TestCase
{
public function testCopiesToString ()
{
$s = Psr7\stream_for ( 'foobaz' );
$this -> assertEquals ( 'foobaz' , Psr7\copy_to_string ( $s ));
$s -> seek ( 0 );
$this -> assertEquals ( 'foo' , Psr7\copy_to_string ( $s , 3 ));
$this -> assertEquals ( 'baz' , Psr7\copy_to_string ( $s , 3 ));
$this -> assertEquals ( '' , Psr7\copy_to_string ( $s ));
}
public function testCopiesToStringStopsWhenReadFails ()
{
$s1 = Psr7\stream_for ( 'foobaz' );
$s1 = FnStream :: decorate ( $s1 , [
'read' => function () { return '' ; }
]);
$result = Psr7\copy_to_string ( $s1 );
$this -> assertEquals ( '' , $result );
}
public function testCopiesToStream ()
{
$s1 = Psr7\stream_for ( 'foobaz' );
$s2 = Psr7\stream_for ( '' );
Psr7\copy_to_stream ( $s1 , $s2 );
$this -> assertEquals ( 'foobaz' , ( string ) $s2 );
$s2 = Psr7\stream_for ( '' );
$s1 -> seek ( 0 );
Psr7\copy_to_stream ( $s1 , $s2 , 3 );
$this -> assertEquals ( 'foo' , ( string ) $s2 );
Psr7\copy_to_stream ( $s1 , $s2 , 3 );
$this -> assertEquals ( 'foobaz' , ( string ) $s2 );
}
public function testStopsCopyToStreamWhenWriteFails ()
{
$s1 = Psr7\stream_for ( 'foobaz' );
$s2 = Psr7\stream_for ( '' );
$s2 = FnStream :: decorate ( $s2 , [ 'write' => function () { return 0 ; }]);
Psr7\copy_to_stream ( $s1 , $s2 );
$this -> assertEquals ( '' , ( string ) $s2 );
}
public function testStopsCopyToSteamWhenWriteFailsWithMaxLen ()
{
$s1 = Psr7\stream_for ( 'foobaz' );
$s2 = Psr7\stream_for ( '' );
$s2 = FnStream :: decorate ( $s2 , [ 'write' => function () { return 0 ; }]);
Psr7\copy_to_stream ( $s1 , $s2 , 10 );
$this -> assertEquals ( '' , ( string ) $s2 );
}
public function testStopsCopyToSteamWhenReadFailsWithMaxLen ()
{
$s1 = Psr7\stream_for ( 'foobaz' );
$s1 = FnStream :: decorate ( $s1 , [ 'read' => function () { return '' ; }]);
$s2 = Psr7\stream_for ( '' );
Psr7\copy_to_stream ( $s1 , $s2 , 10 );
$this -> assertEquals ( '' , ( string ) $s2 );
}
public function testReadsLines ()
{
$s = Psr7\stream_for ( " foo \n baz \n bar " );
$this -> assertEquals ( " foo \n " , Psr7\readline ( $s ));
$this -> assertEquals ( " baz \n " , Psr7\readline ( $s ));
$this -> assertEquals ( " bar " , Psr7\readline ( $s ));
}
public function testReadsLinesUpToMaxLength ()
{
$s = Psr7\stream_for ( " 12345 \n " );
$this -> assertEquals ( " 123 " , Psr7\readline ( $s , 4 ));
$this -> assertEquals ( " 45 \n " , Psr7\readline ( $s ));
}
public function testReadsLineUntilFalseReturnedFromRead ()
{
$s = $this -> getMockBuilder ( 'GuzzleHttp\Psr7\Stream' )
-> setMethods ([ 'read' , 'eof' ])
-> disableOriginalConstructor ()
-> getMock ();
$s -> expects ( $this -> exactly ( 2 ))
-> method ( 'read' )
-> will ( $this -> returnCallback ( function () {
static $c = false ;
if ( $c ) {
return false ;
}
$c = true ;
return 'h' ;
}));
$s -> expects ( $this -> exactly ( 2 ))
-> method ( 'eof' )
-> will ( $this -> returnValue ( false ));
$this -> assertEquals ( " h " , Psr7\readline ( $s ));
}
public function testCalculatesHash ()
{
$s = Psr7\stream_for ( 'foobazbar' );
$this -> assertEquals ( md5 ( 'foobazbar' ), Psr7\hash ( $s , 'md5' ));
}
/**
* @ expectedException \RuntimeException
*/
public function testCalculatesHashThrowsWhenSeekFails ()
{
$s = new NoSeekStream ( Psr7\stream_for ( 'foobazbar' ));
$s -> read ( 2 );
Psr7\hash ( $s , 'md5' );
}
public function testCalculatesHashSeeksToOriginalPosition ()
{
$s = Psr7\stream_for ( 'foobazbar' );
$s -> seek ( 4 );
$this -> assertEquals ( md5 ( 'foobazbar' ), Psr7\hash ( $s , 'md5' ));
$this -> assertEquals ( 4 , $s -> tell ());
}
public function testOpensFilesSuccessfully ()
{
$r = Psr7\try_fopen ( __FILE__ , 'r' );
$this -> assertInternalType ( 'resource' , $r );
fclose ( $r );
}
/**
* @ expectedException \RuntimeException
* @ expectedExceptionMessage Unable to open / path / to / does / not / exist using mode r
*/
public function testThrowsExceptionNotWarning ()
{
Psr7\try_fopen ( '/path/to/does/not/exist' , 'r' );
}
public function parseQueryProvider ()
{
return [
// Does not need to parse when the string is empty
[ '' , []],
// Can parse mult-values items
[ 'q=a&q=b' , [ 'q' => [ 'a' , 'b' ]]],
// Can parse multi-valued items that use numeric indices
[ 'q[0]=a&q[1]=b' , [ 'q[0]' => 'a' , 'q[1]' => 'b' ]],
// Can parse duplicates and does not include numeric indices
[ 'q[]=a&q[]=b' , [ 'q[]' => [ 'a' , 'b' ]]],
// Ensures that the value of "q" is an array even though one value
[ 'q[]=a' , [ 'q[]' => 'a' ]],
// Does not modify "." to "_" like PHP's parse_str()
[ 'q.a=a&q.b=b' , [ 'q.a' => 'a' , 'q.b' => 'b' ]],
// Can decode %20 to " "
[ 'q%20a=a%20b' , [ 'q a' => 'a b' ]],
// Can parse funky strings with no values by assigning each to null
[ 'q&a' , [ 'q' => null , 'a' => null ]],
// Does not strip trailing equal signs
[ 'data=abc=' , [ 'data' => 'abc=' ]],
// Can store duplicates without affecting other values
[ 'foo=a&foo=b&?µ=c' , [ 'foo' => [ 'a' , 'b' ], '?µ' => 'c' ]],
// Sets value to null when no "=" is present
[ 'foo' , [ 'foo' => null ]],
// Preserves "0" keys.
[ '0' , [ '0' => null ]],
// Sets the value to an empty string when "=" is present
[ '0=' , [ '0' => '' ]],
// Preserves falsey keys
[ 'var=0' , [ 'var' => '0' ]],
[ 'a[b][c]=1&a[b][c]=2' , [ 'a[b][c]' => [ '1' , '2' ]]],
[ 'a[b]=c&a[d]=e' , [ 'a[b]' => 'c' , 'a[d]' => 'e' ]],
// Ensure it doesn't leave things behind with repeated values
// Can parse mult-values items
[ 'q=a&q=b&q=c' , [ 'q' => [ 'a' , 'b' , 'c' ]]],
];
}
/**
* @ dataProvider parseQueryProvider
*/
public function testParsesQueries ( $input , $output )
{
$result = Psr7\parse_query ( $input );
$this -> assertSame ( $output , $result );
}
public function testDoesNotDecode ()
{
$str = 'foo%20=bar' ;
$data = Psr7\parse_query ( $str , false );
$this -> assertEquals ([ 'foo%20' => 'bar' ], $data );
}
/**
* @ dataProvider parseQueryProvider
*/
public function testParsesAndBuildsQueries ( $input , $output )
{
$result = Psr7\parse_query ( $input , false );
$this -> assertSame ( $input , Psr7\build_query ( $result , false ));
}
public function testEncodesWithRfc1738 ()
{
$str = Psr7\build_query ([ 'foo bar' => 'baz+' ], PHP_QUERY_RFC1738 );
$this -> assertEquals ( 'foo+bar=baz%2B' , $str );
}
public function testEncodesWithRfc3986 ()
{
$str = Psr7\build_query ([ 'foo bar' => 'baz+' ], PHP_QUERY_RFC3986 );
$this -> assertEquals ( 'foo%20bar=baz%2B' , $str );
}
public function testDoesNotEncode ()
{
$str = Psr7\build_query ([ 'foo bar' => 'baz+' ], false );
$this -> assertEquals ( 'foo bar=baz+' , $str );
}
public function testCanControlDecodingType ()
{
$result = Psr7\parse_query ( 'var=foo+bar' , PHP_QUERY_RFC3986 );
$this -> assertEquals ( 'foo+bar' , $result [ 'var' ]);
$result = Psr7\parse_query ( 'var=foo+bar' , PHP_QUERY_RFC1738 );
$this -> assertEquals ( 'foo bar' , $result [ 'var' ]);
}
public function testParsesRequestMessages ()
{
$req = " GET /abc HTTP/1.0 \r \n Host: foo.com \r \n Foo: Bar \r \n Baz: Bam \r \n Baz: Qux \r \n \r \n Test " ;
$request = Psr7\parse_request ( $req );
$this -> assertEquals ( 'GET' , $request -> getMethod ());
$this -> assertEquals ( '/abc' , $request -> getRequestTarget ());
$this -> assertEquals ( '1.0' , $request -> getProtocolVersion ());
$this -> assertEquals ( 'foo.com' , $request -> getHeaderLine ( 'Host' ));
$this -> assertEquals ( 'Bar' , $request -> getHeaderLine ( 'Foo' ));
$this -> assertEquals ( 'Bam, Qux' , $request -> getHeaderLine ( 'Baz' ));
$this -> assertEquals ( 'Test' , ( string ) $request -> getBody ());
$this -> assertEquals ( 'http://foo.com/abc' , ( string ) $request -> getUri ());
}
public function testParsesRequestMessagesWithHttpsScheme ()
{
$req = " PUT /abc?baz=bar HTTP/1.1 \r \n Host: foo.com:443 \r \n \r \n " ;
$request = Psr7\parse_request ( $req );
$this -> assertEquals ( 'PUT' , $request -> getMethod ());
$this -> assertEquals ( '/abc?baz=bar' , $request -> getRequestTarget ());
$this -> assertEquals ( '1.1' , $request -> getProtocolVersion ());
$this -> assertEquals ( 'foo.com:443' , $request -> getHeaderLine ( 'Host' ));
$this -> assertEquals ( '' , ( string ) $request -> getBody ());
$this -> assertEquals ( 'https://foo.com/abc?baz=bar' , ( string ) $request -> getUri ());
}
public function testParsesRequestMessagesWithUriWhenHostIsNotFirst ()
{
$req = " PUT / HTTP/1.1 \r \n Foo: Bar \r \n Host: foo.com \r \n \r \n " ;
$request = Psr7\parse_request ( $req );
$this -> assertEquals ( 'PUT' , $request -> getMethod ());
$this -> assertEquals ( '/' , $request -> getRequestTarget ());
$this -> assertEquals ( 'http://foo.com/' , ( string ) $request -> getUri ());
}
2015-09-04 13:20:09 -07:00
public function testParsesRequestMessagesWithFullUri ()
{
$req = " GET https://www.google.com:443/search?q=foobar HTTP/1.1 \r \n Host: www.google.com \r \n \r \n " ;
$request = Psr7\parse_request ( $req );
$this -> assertEquals ( 'GET' , $request -> getMethod ());
$this -> assertEquals ( 'https://www.google.com:443/search?q=foobar' , $request -> getRequestTarget ());
$this -> assertEquals ( '1.1' , $request -> getProtocolVersion ());
$this -> assertEquals ( 'www.google.com' , $request -> getHeaderLine ( 'Host' ));
$this -> assertEquals ( '' , ( string ) $request -> getBody ());
$this -> assertEquals ( 'https://www.google.com/search?q=foobar' , ( string ) $request -> getUri ());
}
2015-08-27 12:03:05 -07:00
/**
* @ expectedException \InvalidArgumentException
*/
public function testValidatesRequestMessages ()
{
Psr7\parse_request ( " HTTP/1.1 200 OK \r \n \r \n " );
}
public function testParsesResponseMessages ()
{
$res = " HTTP/1.0 200 OK \r \n Foo: Bar \r \n Baz: Bam \r \n Baz: Qux \r \n \r \n Test " ;
$response = Psr7\parse_response ( $res );
$this -> assertEquals ( 200 , $response -> getStatusCode ());
$this -> assertEquals ( 'OK' , $response -> getReasonPhrase ());
$this -> assertEquals ( '1.0' , $response -> getProtocolVersion ());
$this -> assertEquals ( 'Bar' , $response -> getHeaderLine ( 'Foo' ));
$this -> assertEquals ( 'Bam, Qux' , $response -> getHeaderLine ( 'Baz' ));
$this -> assertEquals ( 'Test' , ( string ) $response -> getBody ());
}
/**
* @ expectedException \InvalidArgumentException
*/
public function testValidatesResponseMessages ()
{
Psr7\parse_response ( " GET / HTTP/1.1 \r \n \r \n " );
}
public function testDetermineMimetype ()
{
$this -> assertNull ( Psr7\mimetype_from_extension ( 'not-a-real-extension' ));
$this -> assertEquals (
'application/json' ,
Psr7\mimetype_from_extension ( 'json' )
);
$this -> assertEquals (
'image/jpeg' ,
Psr7\mimetype_from_filename ( '/tmp/images/IMG034821.JPEG' )
);
}
public function testCreatesUriForValue ()
{
$this -> assertInstanceOf ( 'GuzzleHttp\Psr7\Uri' , Psr7\uri_for ( '/foo' ));
$this -> assertInstanceOf (
'GuzzleHttp\Psr7\Uri' ,
Psr7\uri_for ( new Psr7\Uri ( '/foo' ))
);
}
/**
* @ expectedException \InvalidArgumentException
*/
public function testValidatesUri ()
{
Psr7\uri_for ([]);
}
public function testKeepsPositionOfResource ()
{
$h = fopen ( __FILE__ , 'r' );
fseek ( $h , 10 );
$stream = Psr7\stream_for ( $h );
$this -> assertEquals ( 10 , $stream -> tell ());
$stream -> close ();
}
public function testCreatesWithFactory ()
{
$stream = Psr7\stream_for ( 'foo' );
$this -> assertInstanceOf ( 'GuzzleHttp\Psr7\Stream' , $stream );
$this -> assertEquals ( 'foo' , $stream -> getContents ());
$stream -> close ();
}
public function testFactoryCreatesFromEmptyString ()
{
$s = Psr7\stream_for ();
$this -> assertInstanceOf ( 'GuzzleHttp\Psr7\Stream' , $s );
}
public function testFactoryCreatesFromNull ()
{
$s = Psr7\stream_for ( null );
$this -> assertInstanceOf ( 'GuzzleHttp\Psr7\Stream' , $s );
}
public function testFactoryCreatesFromResource ()
{
$r = fopen ( __FILE__ , 'r' );
$s = Psr7\stream_for ( $r );
$this -> assertInstanceOf ( 'GuzzleHttp\Psr7\Stream' , $s );
$this -> assertSame ( file_get_contents ( __FILE__ ), ( string ) $s );
}
public function testFactoryCreatesFromObjectWithToString ()
{
$r = new HasToString ();
$s = Psr7\stream_for ( $r );
$this -> assertInstanceOf ( 'GuzzleHttp\Psr7\Stream' , $s );
$this -> assertEquals ( 'foo' , ( string ) $s );
}
public function testCreatePassesThrough ()
{
$s = Psr7\stream_for ( 'foo' );
$this -> assertSame ( $s , Psr7\stream_for ( $s ));
}
/**
* @ expectedException \InvalidArgumentException
*/
public function testThrowsExceptionForUnknown ()
{
Psr7\stream_for ( new \stdClass ());
}
public function testReturnsCustomMetadata ()
{
$s = Psr7\stream_for ( 'foo' , [ 'metadata' => [ 'hwm' => 3 ]]);
$this -> assertEquals ( 3 , $s -> getMetadata ( 'hwm' ));
$this -> assertArrayHasKey ( 'hwm' , $s -> getMetadata ());
}
public function testCanSetSize ()
{
$s = Psr7\stream_for ( '' , [ 'size' => 10 ]);
$this -> assertEquals ( 10 , $s -> getSize ());
}
public function testCanCreateIteratorBasedStream ()
{
$a = new \ArrayIterator ([ 'foo' , 'bar' , '123' ]);
$p = Psr7\stream_for ( $a );
$this -> assertInstanceOf ( 'GuzzleHttp\Psr7\PumpStream' , $p );
$this -> assertEquals ( 'foo' , $p -> read ( 3 ));
$this -> assertFalse ( $p -> eof ());
$this -> assertEquals ( 'b' , $p -> read ( 1 ));
$this -> assertEquals ( 'a' , $p -> read ( 1 ));
$this -> assertEquals ( 'r12' , $p -> read ( 3 ));
$this -> assertFalse ( $p -> eof ());
$this -> assertEquals ( '3' , $p -> getContents ());
$this -> assertTrue ( $p -> eof ());
$this -> assertEquals ( 9 , $p -> tell ());
}
public function testConvertsRequestsToStrings ()
{
$request = new Psr7\Request ( 'PUT' , 'http://foo.com/hi?123' , [
'Baz' => 'bar' ,
'Qux' => ' ipsum'
], 'hello' , '1.0' );
$this -> assertEquals (
" PUT /hi?123 HTTP/1.0 \r \n Host: foo.com \r \n Baz: bar \r \n Qux: ipsum \r \n \r \n hello " ,
Psr7\str ( $request )
);
}
public function testConvertsResponsesToStrings ()
{
$response = new Psr7\Response ( 200 , [
'Baz' => 'bar' ,
'Qux' => ' ipsum'
], 'hello' , '1.0' , 'FOO' );
$this -> assertEquals (
" HTTP/1.0 200 FOO \r \n Baz: bar \r \n Qux: ipsum \r \n \r \n hello " ,
Psr7\str ( $response )
);
}
public function parseParamsProvider ()
{
$res1 = array (
array (
'<http:/.../front.jpeg>' ,
'rel' => 'front' ,
'type' => 'image/jpeg' ,
),
array (
'<http://.../back.jpeg>' ,
'rel' => 'back' ,
'type' => 'image/jpeg' ,
),
);
return array (
array (
'<http:/.../front.jpeg>; rel="front"; type="image/jpeg", <http://.../back.jpeg>; rel=back; type="image/jpeg"' ,
$res1
),
array (
'<http:/.../front.jpeg>; rel="front"; type="image/jpeg",<http://.../back.jpeg>; rel=back; type="image/jpeg"' ,
$res1
),
array (
'foo="baz"; bar=123, boo, test="123", foobar="foo;bar"' ,
array (
array ( 'foo' => 'baz' , 'bar' => '123' ),
array ( 'boo' ),
array ( 'test' => '123' ),
array ( 'foobar' => 'foo;bar' )
)
),
array (
'<http://.../side.jpeg?test=1>; rel="side"; type="image/jpeg",<http://.../side.jpeg?test=2>; rel=side; type="image/jpeg"' ,
array (
array ( '<http://.../side.jpeg?test=1>' , 'rel' => 'side' , 'type' => 'image/jpeg' ),
array ( '<http://.../side.jpeg?test=2>' , 'rel' => 'side' , 'type' => 'image/jpeg' )
)
),
array (
'' ,
array ()
)
);
}
/**
* @ dataProvider parseParamsProvider
*/
public function testParseParams ( $header , $result )
{
$this -> assertEquals ( $result , Psr7\parse_header ( $header ));
}
public function testParsesArrayHeaders ()
{
$header = [ 'a, b' , 'c' , 'd, e' ];
$this -> assertEquals ([ 'a' , 'b' , 'c' , 'd' , 'e' ], Psr7\normalize_header ( $header ));
}
public function testRewindsBody ()
{
$body = Psr7\stream_for ( 'abc' );
$res = new Psr7\Response ( 200 , [], $body );
Psr7\rewind_body ( $res );
$this -> assertEquals ( 0 , $body -> tell ());
$body -> rewind ( 1 );
Psr7\rewind_body ( $res );
$this -> assertEquals ( 0 , $body -> tell ());
}
/**
* @ expectedException \RuntimeException
*/
public function testThrowsWhenBodyCannotBeRewound ()
{
$body = Psr7\stream_for ( 'abc' );
$body -> read ( 1 );
$body = FnStream :: decorate ( $body , [
'rewind' => function () { throw new \RuntimeException ( 'a' ); }
]);
$res = new Psr7\Response ( 200 , [], $body );
Psr7\rewind_body ( $res );
}
public function testCanModifyRequestWithUri ()
{
$r1 = new Psr7\Request ( 'GET' , 'http://foo.com' );
$r2 = Psr7\modify_request ( $r1 , [
'uri' => new Psr7\Uri ( 'http://www.foo.com' )
]);
$this -> assertEquals ( 'http://www.foo.com' , ( string ) $r2 -> getUri ());
$this -> assertEquals ( 'www.foo.com' , ( string ) $r2 -> getHeaderLine ( 'host' ));
}
public function testCanModifyRequestWithCaseInsensitiveHeader ()
{
$r1 = new Psr7\Request ( 'GET' , 'http://foo.com' , [ 'User-Agent' => 'foo' ]);
$r2 = Psr7\modify_request ( $r1 , [ 'set_headers' => [ 'User-agent' => 'bar' ]]);
$this -> assertEquals ( 'bar' , $r2 -> getHeaderLine ( 'User-Agent' ));
$this -> assertEquals ( 'bar' , $r2 -> getHeaderLine ( 'User-agent' ));
}
public function testReturnsAsIsWhenNoChanges ()
{
$request = new Psr7\Request ( 'GET' , 'http://foo.com' );
$this -> assertSame ( $request , Psr7\modify_request ( $request , []));
}
public function testReturnsUriAsIsWhenNoChanges ()
{
$r1 = new Psr7\Request ( 'GET' , 'http://foo.com' );
$r2 = Psr7\modify_request ( $r1 , [ 'set_headers' => [ 'foo' => 'bar' ]]);
$this -> assertNotSame ( $r1 , $r2 );
$this -> assertEquals ( 'bar' , $r2 -> getHeaderLine ( 'foo' ));
}
public function testRemovesHeadersFromMessage ()
{
$r1 = new Psr7\Request ( 'GET' , 'http://foo.com' , [ 'foo' => 'bar' ]);
$r2 = Psr7\modify_request ( $r1 , [ 'remove_headers' => [ 'foo' ]]);
$this -> assertNotSame ( $r1 , $r2 );
$this -> assertFalse ( $r2 -> hasHeader ( 'foo' ));
}
public function testAddsQueryToUri ()
{
$r1 = new Psr7\Request ( 'GET' , 'http://foo.com' );
$r2 = Psr7\modify_request ( $r1 , [ 'query' => 'foo=bar' ]);
$this -> assertNotSame ( $r1 , $r2 );
$this -> assertEquals ( 'foo=bar' , $r2 -> getUri () -> getQuery ());
}
}