ContentTypeNegotiationTest.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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 testPreferredTypeFirefoxHtml()
  25. {
  26. $content = new ContentTypeNegotiation();
  27. $request = new ServerRequest([
  28. 'url' => '/dashboard',
  29. 'environment' => [
  30. 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
  31. ],
  32. ]);
  33. $this->assertEquals('text/html', $content->preferredType($request));
  34. $this->assertEquals('text/html', $content->preferredType($request, ['text/html', 'application/xml']));
  35. $this->assertEquals('application/xml', $content->preferredType($request, ['application/xml']));
  36. $this->assertNull($content->preferredType($request, ['application/json']));
  37. }
  38. public function testPreferredTypeFirstMatch()
  39. {
  40. $content = new ContentTypeNegotiation();
  41. $request = new ServerRequest([
  42. 'url' => '/dashboard',
  43. 'environment' => [
  44. 'HTTP_ACCEPT' => 'application/json',
  45. ],
  46. ]);
  47. $this->assertEquals('application/json', $content->preferredType($request));
  48. $request = new ServerRequest([
  49. 'url' => '/dashboard',
  50. 'environment' => [
  51. 'HTTP_ACCEPT' => 'application/json,application/xml',
  52. ],
  53. ]);
  54. $this->assertEquals('application/json', $content->preferredType($request));
  55. }
  56. public function testPreferredTypeQualValue()
  57. {
  58. $content = new ContentTypeNegotiation();
  59. $request = new ServerRequest([
  60. 'url' => '/dashboard',
  61. 'environment' => [
  62. 'HTTP_ACCEPT' => 'text/xml,application/xml,application/xhtml+xml,' .
  63. 'text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
  64. ],
  65. ]);
  66. $this->assertEquals('text/xml', $content->preferredType($request));
  67. $request = new ServerRequest([
  68. 'url' => '/dashboard',
  69. 'environment' => [
  70. 'HTTP_ACCEPT' => 'text/plain;q=0.8,application/json;q=0.9',
  71. ],
  72. ]);
  73. $this->assertEquals('application/json', $content->preferredType($request));
  74. }
  75. public function testPreferredTypeSimple()
  76. {
  77. $content = new ContentTypeNegotiation();
  78. $request = new ServerRequest([
  79. 'url' => '/dashboard',
  80. 'environment' => [
  81. 'HTTP_ACCEPT' => 'application/json',
  82. ],
  83. ]);
  84. $this->assertNull($content->preferredType($request, ['text/html']));
  85. $request = $request->withEnv('HTTP_ACCEPT', 'application/json');
  86. $this->assertEquals(
  87. 'application/json',
  88. $content->preferredType($request, ['text/html', 'application/json'])
  89. );
  90. }
  91. public function testParseAccept()
  92. {
  93. $content = new ContentTypeNegotiation();
  94. $request = new ServerRequest([
  95. 'url' => '/dashboard',
  96. 'environment' => [
  97. 'HTTP_ACCEPT' => 'application/json;q=0.5,application/xml;q=0.6,application/pdf;q=0.3',
  98. ],
  99. ]);
  100. $result = $content->parseAccept($request);
  101. $expected = [
  102. '0.6' => ['application/xml'],
  103. '0.5' => ['application/json'],
  104. '0.3' => ['application/pdf'],
  105. ];
  106. $this->assertEquals($expected, $result);
  107. $request = $request->withEnv(
  108. 'HTTP_ACCEPT',
  109. 'application/pdf;q=0.3,application/json;q=0.5,application/xml;q=0.5'
  110. );
  111. $result = $content->parseAccept($request);
  112. $expected = [
  113. '0.5' => ['application/json', 'application/xml'],
  114. '0.3' => ['application/pdf'],
  115. ];
  116. $this->assertEquals($expected, $result, 'Sorting is incorrect.');
  117. }
  118. public function testParseAcceptLanguage()
  119. {
  120. $content = new ContentTypeNegotiation();
  121. $request = new ServerRequest([
  122. 'url' => '/dashboard',
  123. 'environment' => [
  124. 'HTTP_ACCEPT_LANGUAGE' => '',
  125. ],
  126. ]);
  127. $this->assertEmpty($content->parseAcceptLanguage($request));
  128. $request = $request->withEnv('HTTP_ACCEPT_LANGUAGE', 'es_mx,en_ca');
  129. $expected = [
  130. '1.0' => ['es_mx', 'en_ca'],
  131. ];
  132. $this->assertEquals($expected, $content->parseAcceptLanguage($request));
  133. $request = $request->withEnv('HTTP_ACCEPT_LANGUAGE', 'en-US,en;q=0.8,pt-BR;q=0.6,pt;q=0.4');
  134. $expected = [
  135. '1.0' => ['en-US'],
  136. '0.8' => ['en'],
  137. '0.6' => ['pt-BR'],
  138. '0.4' => ['pt'],
  139. ];
  140. $this->assertEquals($expected, $content->parseAcceptLanguage($request));
  141. }
  142. public function testAcceptLanguage()
  143. {
  144. $content = new ContentTypeNegotiation();
  145. $request = new ServerRequest([
  146. 'url' => '/dashboard',
  147. 'environment' => [
  148. 'HTTP_ACCEPT_LANGUAGE' => 'en_US,en_CA',
  149. ],
  150. ]);
  151. $this->assertFalse($content->acceptLanguage($request, 'es-mx'));
  152. $this->assertTrue($content->acceptLanguage($request, 'en-ca'));
  153. $this->assertTrue($content->acceptLanguage($request, 'en-CA'), 'Input code is lowercased');
  154. $this->assertFalse($content->acceptLanguage($request, 'en_CA'), 'Input code not normalized');
  155. }
  156. public function testAcceptedLanguage()
  157. {
  158. $content = new ContentTypeNegotiation();
  159. $request = new ServerRequest([
  160. 'url' => '/dashboard',
  161. 'environment' => [
  162. 'HTTP_ACCEPT_LANGUAGE' => 'pt-BR;q=0.6,en_US,en_CA;q=0.8',
  163. ],
  164. ]);
  165. $expected = ['en-us', 'en-ca', 'pt-br'];
  166. $this->assertEquals($expected, $content->acceptedLanguages($request));
  167. }
  168. }