You are here

FunctionsTest.php in Zircon Profile 8

File

vendor/guzzlehttp/psr7/tests/FunctionsTest.php
View source
<?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\nbaz\nbar");
    $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\nHost: foo.com\r\nFoo: Bar\r\nBaz: Bam\r\nBaz: Qux\r\n\r\nTest";
    $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\nHost: 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\nFoo: Bar\r\nHost: 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());
  }
  public function testParsesRequestMessagesWithFullUri() {
    $req = "GET https://www.google.com:443/search?q=foobar HTTP/1.1\r\nHost: 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());
  }

  /**
   * @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\nFoo: Bar\r\nBaz: Bam\r\nBaz: Qux\r\n\r\nTest";
    $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\nHost: foo.com\r\nBaz: bar\r\nQux: ipsum\r\n\r\nhello", 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\nBaz: bar\r\nQux: ipsum\r\n\r\nhello", 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());
  }

}

Classes

Namesort descending Description
FunctionsTest