You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
5.6 KiB
186 lines
5.6 KiB
<?php |
|
namespace GuzzleHttp\Tests\Psr7; |
|
|
|
use GuzzleHttp\Psr7\AppendStream; |
|
use GuzzleHttp\Psr7; |
|
|
|
class AppendStreamTest extends \PHPUnit_Framework_TestCase |
|
{ |
|
/** |
|
* @expectedException \InvalidArgumentException |
|
* @expectedExceptionMessage Each stream must be readable |
|
*/ |
|
public function testValidatesStreamsAreReadable() |
|
{ |
|
$a = new AppendStream(); |
|
$s = $this->getMockBuilder('Psr\Http\Message\StreamInterface') |
|
->setMethods(['isReadable']) |
|
->getMockForAbstractClass(); |
|
$s->expects($this->once()) |
|
->method('isReadable') |
|
->will($this->returnValue(false)); |
|
$a->addStream($s); |
|
} |
|
|
|
/** |
|
* @expectedException \RuntimeException |
|
* @expectedExceptionMessage The AppendStream can only seek with SEEK_SET |
|
*/ |
|
public function testValidatesSeekType() |
|
{ |
|
$a = new AppendStream(); |
|
$a->seek(100, SEEK_CUR); |
|
} |
|
|
|
/** |
|
* @expectedException \RuntimeException |
|
* @expectedExceptionMessage Unable to seek stream 0 of the AppendStream |
|
*/ |
|
public function testTriesToRewindOnSeek() |
|
{ |
|
$a = new AppendStream(); |
|
$s = $this->getMockBuilder('Psr\Http\Message\StreamInterface') |
|
->setMethods(['isReadable', 'rewind', 'isSeekable']) |
|
->getMockForAbstractClass(); |
|
$s->expects($this->once()) |
|
->method('isReadable') |
|
->will($this->returnValue(true)); |
|
$s->expects($this->once()) |
|
->method('isSeekable') |
|
->will($this->returnValue(true)); |
|
$s->expects($this->once()) |
|
->method('rewind') |
|
->will($this->throwException(new \RuntimeException())); |
|
$a->addStream($s); |
|
$a->seek(10); |
|
} |
|
|
|
public function testSeeksToPositionByReading() |
|
{ |
|
$a = new AppendStream([ |
|
Psr7\stream_for('foo'), |
|
Psr7\stream_for('bar'), |
|
Psr7\stream_for('baz'), |
|
]); |
|
|
|
$a->seek(3); |
|
$this->assertEquals(3, $a->tell()); |
|
$this->assertEquals('bar', $a->read(3)); |
|
|
|
$a->seek(6); |
|
$this->assertEquals(6, $a->tell()); |
|
$this->assertEquals('baz', $a->read(3)); |
|
} |
|
|
|
public function testDetachesEachStream() |
|
{ |
|
$s1 = Psr7\stream_for('foo'); |
|
$s2 = Psr7\stream_for('bar'); |
|
$a = new AppendStream([$s1, $s2]); |
|
$this->assertSame('foobar', (string) $a); |
|
$a->detach(); |
|
$this->assertSame('', (string) $a); |
|
$this->assertSame(0, $a->getSize()); |
|
} |
|
|
|
public function testClosesEachStream() |
|
{ |
|
$s1 = Psr7\stream_for('foo'); |
|
$a = new AppendStream([$s1]); |
|
$a->close(); |
|
$this->assertSame('', (string) $a); |
|
} |
|
|
|
/** |
|
* @expectedExceptionMessage Cannot write to an AppendStream |
|
* @expectedException \RuntimeException |
|
*/ |
|
public function testIsNotWritable() |
|
{ |
|
$a = new AppendStream([Psr7\stream_for('foo')]); |
|
$this->assertFalse($a->isWritable()); |
|
$this->assertTrue($a->isSeekable()); |
|
$this->assertTrue($a->isReadable()); |
|
$a->write('foo'); |
|
} |
|
|
|
public function testDoesNotNeedStreams() |
|
{ |
|
$a = new AppendStream(); |
|
$this->assertEquals('', (string) $a); |
|
} |
|
|
|
public function testCanReadFromMultipleStreams() |
|
{ |
|
$a = new AppendStream([ |
|
Psr7\stream_for('foo'), |
|
Psr7\stream_for('bar'), |
|
Psr7\stream_for('baz'), |
|
]); |
|
$this->assertFalse($a->eof()); |
|
$this->assertSame(0, $a->tell()); |
|
$this->assertEquals('foo', $a->read(3)); |
|
$this->assertEquals('bar', $a->read(3)); |
|
$this->assertEquals('baz', $a->read(3)); |
|
$this->assertSame('', $a->read(1)); |
|
$this->assertTrue($a->eof()); |
|
$this->assertSame(9, $a->tell()); |
|
$this->assertEquals('foobarbaz', (string) $a); |
|
} |
|
|
|
public function testCanDetermineSizeFromMultipleStreams() |
|
{ |
|
$a = new AppendStream([ |
|
Psr7\stream_for('foo'), |
|
Psr7\stream_for('bar') |
|
]); |
|
$this->assertEquals(6, $a->getSize()); |
|
|
|
$s = $this->getMockBuilder('Psr\Http\Message\StreamInterface') |
|
->setMethods(['isSeekable', 'isReadable']) |
|
->getMockForAbstractClass(); |
|
$s->expects($this->once()) |
|
->method('isSeekable') |
|
->will($this->returnValue(null)); |
|
$s->expects($this->once()) |
|
->method('isReadable') |
|
->will($this->returnValue(true)); |
|
$a->addStream($s); |
|
$this->assertNull($a->getSize()); |
|
} |
|
|
|
public function testCatchesExceptionsWhenCastingToString() |
|
{ |
|
$s = $this->getMockBuilder('Psr\Http\Message\StreamInterface') |
|
->setMethods(['isSeekable', 'read', 'isReadable', 'eof']) |
|
->getMockForAbstractClass(); |
|
$s->expects($this->once()) |
|
->method('isSeekable') |
|
->will($this->returnValue(true)); |
|
$s->expects($this->once()) |
|
->method('read') |
|
->will($this->throwException(new \RuntimeException('foo'))); |
|
$s->expects($this->once()) |
|
->method('isReadable') |
|
->will($this->returnValue(true)); |
|
$s->expects($this->any()) |
|
->method('eof') |
|
->will($this->returnValue(false)); |
|
$a = new AppendStream([$s]); |
|
$this->assertFalse($a->eof()); |
|
$this->assertSame('', (string) $a); |
|
} |
|
|
|
public function testCanDetach() |
|
{ |
|
$s = new AppendStream(); |
|
$s->detach(); |
|
} |
|
|
|
public function testReturnsEmptyMetadata() |
|
{ |
|
$s = new AppendStream(); |
|
$this->assertEquals([], $s->getMetadata()); |
|
$this->assertNull($s->getMetadata('foo')); |
|
} |
|
}
|
|
|