%PDF- %PDF-
| Direktori : /home/graphicd/www/vebto/vendor/willdurand/negotiation/tests/Negotiation/Tests/ |
| Current File : /home/graphicd/www/vebto/vendor/willdurand/negotiation/tests/Negotiation/Tests/NegotiatorTest.php |
<?php
namespace Negotiation\Tests;
use Negotiation\Exception\InvalidArgument;
use Negotiation\Exception\InvalidMediaType;
use Negotiation\Negotiator;
use Negotiation\Accept;
use Negotiation\AcceptMatch;
class NegotiatorTest extends TestCase
{
/**
* @var Negotiator
*/
private $negotiator;
protected function setUp(): void
{
$this->negotiator = new Negotiator();
}
/**
* @dataProvider dataProviderForTestGetBest
*/
public function testGetBest($header, $priorities, $expected)
{
try {
$acceptHeader = $this->negotiator->getBest($header, $priorities);
} catch (\Exception $e) {
$this->assertEquals($expected, $e);
return;
}
if ($acceptHeader === null) {
$this->assertNull($expected);
return;
}
$this->assertInstanceOf('Negotiation\Accept', $acceptHeader);
$this->assertSame($expected[0], $acceptHeader->getType());
$this->assertSame($expected[1], $acceptHeader->getParameters());
}
public static function dataProviderForTestGetBest()
{
$pearAcceptHeader = 'text/html,application/xhtml+xml,application/xml;q=0.9,text/*;q=0.7,*/*,image/gif; q=0.8, image/jpeg; q=0.6, image/*';
$rfcHeader = 'text/*;q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5';
return array(
# exceptions
array('/qwer', array('f/g'), null),
array('/qwer,f/g', array('f/g'), array('f/g', array())),
array('foo/bar', array('/qwer'), new InvalidMediaType()),
array('', array('foo/bar'), new InvalidArgument('The header string should not be empty.')),
array('*/*', array(), new InvalidArgument('A set of server priorities should be given.')),
# See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
array($rfcHeader, array('text/html;level=1'), array('text/html', array('level' => '1'))),
array($rfcHeader, array('text/html'), array('text/html', array())),
array($rfcHeader, array('text/plain'), array('text/plain', array())),
array($rfcHeader, array('image/jpeg',), array('image/jpeg', array())),
array($rfcHeader, array('text/html;level=2'), array('text/html', array('level' => '2'))),
array($rfcHeader, array('text/html;level=3'), array('text/html', array( 'level' => '3'))),
array('text/*;q=0.7, text/html;q=0.3, */*;q=0.5, image/png;q=0.4', array('text/html', 'image/png'), array('image/png', array())),
array('image/png;q=0.1, text/plain, audio/ogg;q=0.9', array('image/png', 'text/plain', 'audio/ogg'), array('text/plain', array())),
array('image/png, text/plain, audio/ogg', array('baz/asdf'), null),
array('image/png, text/plain, audio/ogg', array('audio/ogg'), array('audio/ogg', array())),
array('image/png, text/plain, audio/ogg', array('YO/SuP'), null),
array('text/html; charset=UTF-8, application/pdf', array('text/html; charset=UTF-8'), array('text/html', array('charset' => 'UTF-8'))),
array('text/html; charset=UTF-8, application/pdf', array('text/html'), null),
array('text/html, application/pdf', array('text/html; charset=UTF-8'), array('text/html', array('charset' => 'UTF-8'))),
# PEAR HTTP2 tests - have been altered from original!
array($pearAcceptHeader, array('image/gif', 'image/png', 'application/xhtml+xml', 'application/xml', 'text/html', 'image/jpeg', 'text/plain',), array('image/png', array())),
array($pearAcceptHeader, array('image/gif', 'application/xhtml+xml', 'application/xml', 'image/jpeg', 'text/plain',), array('application/xhtml+xml', array())),
array($pearAcceptHeader, array('image/gif', 'application/xml', 'image/jpeg', 'text/plain',), array('application/xml', array())),
array($pearAcceptHeader, array('image/gif', 'image/jpeg', 'text/plain'), array('image/gif', array())),
array($pearAcceptHeader, array('text/plain', 'image/png', 'image/jpeg'), array('image/png', array())),
array($pearAcceptHeader, array('image/jpeg', 'image/gif',), array('image/gif', array())),
array($pearAcceptHeader, array('image/png',), array('image/png', array())),
array($pearAcceptHeader, array('audio/midi',), array('audio/midi', array())),
array('text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', array( 'application/rss+xml'), array('application/rss+xml', array())),
# LWS / case sensitivity
array('text/* ; q=0.3, TEXT/html ;Q=0.7, text/html ; level=1, texT/Html ;leVel = 2 ;q=0.4, */* ; q=0.5', array( 'text/html; level=2'), array('text/html', array( 'level' => '2'))),
array('text/* ; q=0.3, text/html;Q=0.7, text/html ;level=1, text/html; level=2;q=0.4, */*;q=0.5', array( 'text/HTML; level=3'), array('text/html', array( 'level' => '3'))),
# Incompatible
array('text/html', array( 'application/rss'), null),
# IE8 Accept header
array('image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */*', array( 'text/html', 'application/xhtml+xml'), array('text/html', array())),
# Quality of source factors
array($rfcHeader, array('text/html;q=0.4', 'text/plain'), array('text/plain', array())),
# Wildcard "plus" parts (e.g., application/vnd.api+json)
array('application/vnd.api+json', array('application/json', 'application/*+json'), array('application/*+json', array())),
array('application/json;q=0.7, application/*+json;q=0.7', array('application/hal+json', 'application/problem+json'), array('application/hal+json', array())),
array('application/json;q=0.7, application/problem+*;q=0.7', array('application/hal+xml', 'application/problem+xml'), array('application/problem+xml', array())),
array($pearAcceptHeader, array('application/*+xml'), array('application/*+xml', array())),
# @see https://github.com/willdurand/Negotiation/issues/93
array('application/hal+json', array('application/ld+json', 'application/hal+json', 'application/xml', 'text/xml', 'application/json', 'text/html'), array('application/hal+json', array())),
);
}
/**
* @dataProvider dataProviderForTestGetOrderedElements
*/
public function testGetOrderedElements($header, $expected)
{
try {
$elements = $this->negotiator->getOrderedElements($header);
} catch (\Exception $e) {
$this->assertEquals($expected, $e);
return;
}
if (empty($elements)) {
$this->assertNull($expected);
return;
}
$this->assertInstanceOf('Negotiation\Accept', $elements[0]);
foreach ($expected as $key => $item) {
$this->assertSame($item, $elements[$key]->getValue());
}
}
public static function dataProviderForTestGetOrderedElements()
{
return array(
// error cases
array('', new InvalidArgument('The header string should not be empty.')),
array('/qwer', null),
// first one wins as no quality modifiers
array('text/html, text/xml', array('text/html', 'text/xml')),
// ordered by quality modifier
array(
'text/html;q=0.3, text/html;q=0.7',
array('text/html;q=0.7', 'text/html;q=0.3')
),
// ordered by quality modifier - the one with no modifier wins, level not taken into account
array(
'text/*;q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5',
array('text/html;level=1', 'text/html;q=0.7', '*/*;q=0.5', 'text/html;level=2;q=0.4', 'text/*;q=0.3')
),
);
}
public function testGetBestRespectsQualityOfSource()
{
$accept = $this->negotiator->getBest('text/html,text/*;q=0.7', array('text/html;q=0.5', 'text/plain;q=0.9'));
$this->assertInstanceOf('Negotiation\Accept', $accept);
$this->assertEquals('text/plain', $accept->getType());
}
public function testGetBestInvalidMediaType()
{
$this->expectException(\Negotiation\Exception\InvalidMediaType::class);
$header = 'sdlfkj20ff; wdf';
$priorities = array('foo/qwer');
$this->negotiator->getBest($header, $priorities, true);
}
/**
* @dataProvider dataProviderForTestParseHeader
*/
public function testParseHeader($header, $expected)
{
$accepts = $this->call_private_method('Negotiation\Negotiator', 'parseHeader', $this->negotiator, array($header));
$this->assertSame($expected, $accepts);
}
public static function dataProviderForTestParseHeader()
{
return array(
array('text/html ; q=0.9', array('text/html ; q=0.9')),
array('text/html,application/xhtml+xml', array('text/html', 'application/xhtml+xml')),
array(',,text/html;q=0.8 , , ', array('text/html;q=0.8')),
array('text/html;charset=utf-8; q=0.8', array('text/html;charset=utf-8; q=0.8')),
array('text/html; foo="bar"; q=0.8 ', array('text/html; foo="bar"; q=0.8')),
array('text/html; foo="bar"; qwer="asdf", image/png', array('text/html; foo="bar"; qwer="asdf"', "image/png")),
array('text/html ; quoted_comma="a,b ,c,",application/xml;q=0.9,*/*;charset=utf-8; q=0.8', array('text/html ; quoted_comma="a,b ,c,"', 'application/xml;q=0.9', '*/*;charset=utf-8; q=0.8')),
array('text/html, application/json;q=0.8, text/csv;q=0.7', array('text/html', 'application/json;q=0.8', 'text/csv;q=0.7'))
);
}
/**
* @dataProvider dataProviderForTestFindMatches
*/
public function testFindMatches($headerParts, $priorities, $expected)
{
$neg = new Negotiator();
$matches = $this->call_private_method('Negotiation\Negotiator', 'findMatches', $neg, array($headerParts, $priorities));
$this->assertEquals($expected, $matches);
}
public static function dataProviderForTestFindMatches()
{
return array(
array(
array(new Accept('text/html; charset=UTF-8'), new Accept('image/png; foo=bar; q=0.7'), new Accept('*/*; foo=bar; q=0.4')),
array(new Accept('text/html; charset=UTF-8'), new Accept('image/png; foo=bar'), new Accept('application/pdf')),
array(
new AcceptMatch(1.0, 111, 0),
new AcceptMatch(0.7, 111, 1),
new AcceptMatch(0.4, 1, 1),
)
),
array(
array(new Accept('text/html'), new Accept('image/*; q=0.7')),
array(new Accept('text/html; asfd=qwer'), new Accept('image/png'), new Accept('application/pdf')),
array(
new AcceptMatch(1.0, 110, 0),
new AcceptMatch(0.7, 100, 1),
)
),
array( # https://tools.ietf.org/html/rfc7231#section-5.3.2
array(new Accept('text/*; q=0.3'), new Accept('text/html; q=0.7'), new Accept('text/html; level=1'), new Accept('text/html; level=2; q=0.4'), new Accept('*/*; q=0.5')),
array(new Accept('text/html; level=1'), new Accept('text/html'), new Accept('text/plain'), new Accept('image/jpeg'), new Accept('text/html; level=2'), new Accept('text/html; level=3')),
array(
new AcceptMatch(0.3, 100, 0),
new AcceptMatch(0.7, 110, 0),
new AcceptMatch(1.0, 111, 0),
new AcceptMatch(0.5, 0, 0),
new AcceptMatch(0.3, 100, 1),
new AcceptMatch(0.7, 110, 1),
new AcceptMatch(0.5, 0, 1),
new AcceptMatch(0.3, 100, 2),
new AcceptMatch(0.5, 0, 2),
new AcceptMatch(0.5, 0, 3),
new AcceptMatch(0.3, 100, 4),
new AcceptMatch(0.7, 110, 4),
new AcceptMatch(0.4, 111, 4),
new AcceptMatch(0.5, 0, 4),
new AcceptMatch(0.3, 100, 5),
new AcceptMatch(0.7, 110, 5),
new AcceptMatch(0.5, 0, 5),
)
)
);
}
}