ContentTypeNegotiationTest.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. declare(strict_types=1);
  3. namespace Cake\Test\TestCase\Http;
  4. use Cake\Http\ContentTypeNegotiation;
  5. use Cake\Http\ServerRequest;
  6. use Cake\TestSuite\TestCase;
  7. class ContentTypeNegotiationTest extends TestCase
  8. {
  9. public function testPreferredTypeNoAccept()
  10. {
  11. $request = new ServerRequest([
  12. 'url' => '/dashboard',
  13. ]);
  14. $content = new ContentTypeNegotiation();
  15. $this->assertNull($content->preferredType($request));
  16. $request = new ServerRequest([
  17. 'url' => '/dashboard',
  18. 'environment' => [
  19. 'HTTP_ACCEPT' => '',
  20. ],
  21. ]);
  22. $this->assertNull($content->preferredType($request));
  23. }
  24. public function testPreferredTypeFirstMatch()
  25. {
  26. $content = new ContentTypeNegotiation();
  27. $request = new ServerRequest([
  28. 'url' => '/dashboard',
  29. 'environment' => [
  30. 'HTTP_ACCEPT' => 'application/json',
  31. ],
  32. ]);
  33. $this->assertEquals('application/json', $content->preferredType($request));
  34. $request = new ServerRequest([
  35. 'url' => '/dashboard',
  36. 'environment' => [
  37. 'HTTP_ACCEPT' => 'application/json,application/xml',
  38. ],
  39. ]);
  40. $this->assertEquals('application/json', $content->preferredType($request));
  41. }
  42. public function testPreferredTypeQualValue()
  43. {
  44. $content = new ContentTypeNegotiation();
  45. $request = new ServerRequest([
  46. 'url' => '/dashboard',
  47. 'environment' => [
  48. 'HTTP_ACCEPT' => 'text/xml,application/xml,application/xhtml+xml,' .
  49. 'text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
  50. ],
  51. ]);
  52. $this->assertEquals('text/xml', $content->preferredType($request));
  53. $request = new ServerRequest([
  54. 'url' => '/dashboard',
  55. 'environment' => [
  56. 'HTTP_ACCEPT' => 'text/plain;q=0.8,application/json;q=0.9',
  57. ],
  58. ]);
  59. $this->assertEquals('application/json', $content->preferredType($request));
  60. }
  61. public function testPreferredTypeSimple()
  62. {
  63. $content = new ContentTypeNegotiation();
  64. $request = new ServerRequest([
  65. 'url' => '/dashboard',
  66. 'environment' => [
  67. 'HTTP_ACCEPT' => 'application/json',
  68. ],
  69. ]);
  70. $this->assertNull($content->preferredType($request, ['text/html']));
  71. $request = $request->withEnv('HTTP_ACCEPT', 'application/json');
  72. $this->assertEquals(
  73. 'application/json',
  74. $content->preferredType($request, ['text/html', 'application/json'])
  75. );
  76. }
  77. public function testParseAccept()
  78. {
  79. $content = new ContentTypeNegotiation();
  80. $request = new ServerRequest([
  81. 'url' => '/dashboard',
  82. 'environment' => [
  83. 'HTTP_ACCEPT' => 'application/json;q=0.5,application/xml;q=0.6,application/pdf;q=0.3',
  84. ],
  85. ]);
  86. $result = $content->parseAccept($request);
  87. $expected = [
  88. '0.6' => ['application/xml'],
  89. '0.5' => ['application/json'],
  90. '0.3' => ['application/pdf'],
  91. ];
  92. $this->assertEquals($expected, $result);
  93. $request = $request->withEnv(
  94. 'HTTP_ACCEPT',
  95. 'application/pdf;q=0.3,application/json;q=0.5,application/xml;q=0.5'
  96. );
  97. $result = $content->parseAccept($request);
  98. $expected = [
  99. '0.5' => ['application/json', 'application/xml'],
  100. '0.3' => ['application/pdf'],
  101. ];
  102. $this->assertEquals($expected, $result, 'Sorting is incorrect.');
  103. }
  104. public function testParseAcceptLanguage()
  105. {
  106. $content = new ContentTypeNegotiation();
  107. $request = new ServerRequest([
  108. 'url' => '/dashboard',
  109. 'environment' => [
  110. 'HTTP_ACCEPT_LANGUAGE' => '',
  111. ],
  112. ]);
  113. $this->assertEmpty($content->parseAcceptLanguage($request));
  114. $request = $request->withEnv('HTTP_ACCEPT_LANGUAGE', 'es_mx,en_ca');
  115. $expected = [
  116. '1.0' => ['es_mx', 'en_ca'],
  117. ];
  118. $this->assertEquals($expected, $content->parseAcceptLanguage($request));
  119. $request = $request->withEnv('HTTP_ACCEPT_LANGUAGE', 'en-US,en;q=0.8,pt-BR;q=0.6,pt;q=0.4');
  120. $expected = [
  121. '1.0' => ['en-US'],
  122. '0.8' => ['en'],
  123. '0.6' => ['pt-BR'],
  124. '0.4' => ['pt'],
  125. ];
  126. $this->assertEquals($expected, $content->parseAcceptLanguage($request));
  127. }
  128. public function testAcceptLanguage()
  129. {
  130. $content = new ContentTypeNegotiation();
  131. $request = new ServerRequest([
  132. 'url' => '/dashboard',
  133. 'environment' => [
  134. 'HTTP_ACCEPT_LANGUAGE' => 'en_US,en_CA',
  135. ],
  136. ]);
  137. $this->assertFalse($content->acceptLanguage($request, 'es-mx'));
  138. $this->assertTrue($content->acceptLanguage($request, 'en-ca'));
  139. $this->assertTrue($content->acceptLanguage($request, 'en-CA'), 'Input code is lowercased');
  140. $this->assertFalse($content->acceptLanguage($request, 'en_CA'), 'Input code not normalized');
  141. }
  142. public function testAcceptedLanguage()
  143. {
  144. $content = new ContentTypeNegotiation();
  145. $request = new ServerRequest([
  146. 'url' => '/dashboard',
  147. 'environment' => [
  148. 'HTTP_ACCEPT_LANGUAGE' => 'pt-BR;q=0.6,en_US,en_CA;q=0.8',
  149. ],
  150. ]);
  151. $expected = ['en-us', 'en-ca', 'pt-br'];
  152. $this->assertEquals($expected, $content->acceptedLanguages($request, 'es-mx'));
  153. }
  154. }