flysystem-offload/vendor/sabre/http/tests/HTTP/MessageTest.php

282 lines
6.9 KiB
PHP

<?php
declare(strict_types=1);
namespace Sabre\HTTP;
class MessageTest extends \PHPUnit\Framework\TestCase
{
public function testConstruct()
{
$message = new MessageMock();
$this->assertInstanceOf('Sabre\HTTP\Message', $message);
}
public function testStreamBody()
{
$body = 'foo';
$h = fopen('php://memory', 'r+');
fwrite($h, $body);
rewind($h);
$message = new MessageMock();
$message->setBody($h);
$this->assertEquals($body, $message->getBodyAsString());
rewind($h);
$this->assertEquals($body, stream_get_contents($message->getBodyAsStream()));
rewind($h);
$this->assertEquals($body, stream_get_contents($message->getBody()));
}
public function testStringBody()
{
$body = 'foo';
$message = new MessageMock();
$message->setBody($body);
$this->assertEquals($body, $message->getBodyAsString());
$this->assertEquals($body, stream_get_contents($message->getBodyAsStream()));
$this->assertEquals($body, $message->getBody());
}
public function testCallbackBodyAsString()
{
$body = $this->createCallback('foo');
$message = new MessageMock();
$message->setBody($body);
$string = $message->getBodyAsString();
$this->assertSame('foo', $string);
}
public function testCallbackBodyAsStream()
{
$body = $this->createCallback('foo');
$message = new MessageMock();
$message->setBody($body);
$stream = $message->getBodyAsStream();
$this->assertSame('foo', stream_get_contents($stream));
}
public function testGetBodyWhenCallback()
{
$callback = $this->createCallback('foo');
$message = new MessageMock();
$message->setBody($callback);
$this->assertSame($callback, $message->getBody());
}
/**
* It's possible that streams contains more data than the Content-Length.
*
* The request object should make sure to never emit more than
* Content-Length, if Content-Length is set.
*
* This is in particular useful when responding to range requests with
* streams that represent files on the filesystem, as it's possible to just
* seek the stream to a certain point, set the content-length and let the
* request object do the rest.
*/
public function testLongStreamToStringBody()
{
$body = fopen('php://memory', 'r+');
fwrite($body, 'abcdefg');
fseek($body, 2);
$message = new MessageMock();
$message->setBody($body);
$message->setHeader('Content-Length', '4');
$this->assertEquals(
'cdef',
$message->getBodyAsString()
);
}
/**
* Some clients include a content-length header, but the header is empty.
* This is definitely broken behavior, but we should support it.
*/
public function testEmptyContentLengthHeader()
{
$body = fopen('php://memory', 'r+');
fwrite($body, 'abcdefg');
fseek($body, 2);
$message = new MessageMock();
$message->setBody($body);
$message->setHeader('Content-Length', '');
$this->assertEquals(
'cdefg',
$message->getBodyAsString()
);
}
public function testGetEmptyBodyStream()
{
$message = new MessageMock();
$body = $message->getBodyAsStream();
$this->assertEquals('', stream_get_contents($body));
}
public function testGetEmptyBodyString()
{
$message = new MessageMock();
$body = $message->getBodyAsString();
$this->assertEquals('', $body);
}
public function testHeaders()
{
$message = new MessageMock();
$message->setHeader('X-Foo', 'bar');
// Testing caselessness
$this->assertEquals('bar', $message->getHeader('X-Foo'));
$this->assertEquals('bar', $message->getHeader('x-fOO'));
$this->assertTrue(
$message->removeHeader('X-FOO')
);
$this->assertNull($message->getHeader('X-Foo'));
$this->assertFalse(
$message->removeHeader('X-FOO')
);
}
public function testSetHeaders()
{
$message = new MessageMock();
$headers = [
'X-Foo' => ['1'],
'X-Bar' => ['2'],
];
$message->setHeaders($headers);
$this->assertEquals($headers, $message->getHeaders());
$message->setHeaders([
'X-Foo' => ['3', '4'],
'X-Bar' => '5',
]);
$expected = [
'X-Foo' => ['3', '4'],
'X-Bar' => ['5'],
];
$this->assertEquals($expected, $message->getHeaders());
}
public function testAddHeaders()
{
$message = new MessageMock();
$headers = [
'X-Foo' => ['1'],
'X-Bar' => ['2'],
];
$message->addHeaders($headers);
$this->assertEquals($headers, $message->getHeaders());
$message->addHeaders([
'X-Foo' => ['3', '4'],
'X-Bar' => '5',
]);
$expected = [
'X-Foo' => ['1', '3', '4'],
'X-Bar' => ['2', '5'],
];
$this->assertEquals($expected, $message->getHeaders());
}
public function testSendBody()
{
$message = new MessageMock();
// String
$message->setBody('foo');
// Stream
$h = fopen('php://memory', 'r+');
fwrite($h, 'bar');
rewind($h);
$message->setBody($h);
$body = $message->getBody();
rewind($body);
$this->assertEquals('bar', stream_get_contents($body));
}
public function testMultipleHeaders()
{
$message = new MessageMock();
$message->setHeader('a', '1');
$message->addHeader('A', '2');
$this->assertEquals(
'1,2',
$message->getHeader('A')
);
$this->assertEquals(
'1,2',
$message->getHeader('a')
);
$this->assertEquals(
['1', '2'],
$message->getHeaderAsArray('a')
);
$this->assertEquals(
['1', '2'],
$message->getHeaderAsArray('A')
);
$this->assertEquals(
[],
$message->getHeaderAsArray('B')
);
}
public function testHasHeaders()
{
$message = new MessageMock();
$this->assertFalse($message->hasHeader('X-Foo'));
$message->setHeader('X-Foo', 'Bar');
$this->assertTrue($message->hasHeader('X-Foo'));
}
/**
* @param string $content
*
* @return \Closure Returns a callback printing $content to php://output stream
*/
private function createCallback($content)
{
return function () use ($content) {
echo $content;
};
}
}
class MessageMock extends Message
{
}