HttpRequestTest.php 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283
  1. <?php
  2. namespace Illuminate\Tests\Http;
  3. use Illuminate\Http\Request;
  4. use Illuminate\Http\UploadedFile;
  5. use Illuminate\Routing\Route;
  6. use Illuminate\Session\Store;
  7. use Illuminate\Support\Carbon;
  8. use Illuminate\Support\Collection;
  9. use InvalidArgumentException;
  10. use Mockery as m;
  11. use PHPUnit\Framework\TestCase;
  12. use RuntimeException;
  13. use Symfony\Component\HttpFoundation\File\UploadedFile as SymfonyUploadedFile;
  14. use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
  15. class HttpRequestTest extends TestCase
  16. {
  17. protected function tearDown(): void
  18. {
  19. m::close();
  20. }
  21. public function testInstanceMethod()
  22. {
  23. $request = Request::create('');
  24. $this->assertSame($request, $request->instance());
  25. }
  26. public function testMethodMethod()
  27. {
  28. $request = Request::create('', 'GET');
  29. $this->assertSame('GET', $request->method());
  30. $request = Request::create('', 'HEAD');
  31. $this->assertSame('HEAD', $request->method());
  32. $request = Request::create('', 'POST');
  33. $this->assertSame('POST', $request->method());
  34. $request = Request::create('', 'PUT');
  35. $this->assertSame('PUT', $request->method());
  36. $request = Request::create('', 'PATCH');
  37. $this->assertSame('PATCH', $request->method());
  38. $request = Request::create('', 'DELETE');
  39. $this->assertSame('DELETE', $request->method());
  40. $request = Request::create('', 'OPTIONS');
  41. $this->assertSame('OPTIONS', $request->method());
  42. }
  43. public function testRootMethod()
  44. {
  45. $request = Request::create('http://example.com/foo/bar/script.php?test');
  46. $this->assertSame('http://example.com', $request->root());
  47. }
  48. public function testPathMethod()
  49. {
  50. $request = Request::create('');
  51. $this->assertSame('/', $request->path());
  52. $request = Request::create('/foo/bar');
  53. $this->assertSame('foo/bar', $request->path());
  54. }
  55. public function testDecodedPathMethod()
  56. {
  57. $request = Request::create('/foo%20bar');
  58. $this->assertSame('foo bar', $request->decodedPath());
  59. }
  60. /**
  61. * @dataProvider segmentProvider
  62. */
  63. public function testSegmentMethod($path, $segment, $expected)
  64. {
  65. $request = Request::create($path);
  66. $this->assertEquals($expected, $request->segment($segment, 'default'));
  67. }
  68. public function segmentProvider()
  69. {
  70. return [
  71. ['', 1, 'default'],
  72. ['foo/bar//baz', 1, 'foo'],
  73. ['foo/bar//baz', 2, 'bar'],
  74. ['foo/bar//baz', 3, 'baz'],
  75. ];
  76. }
  77. /**
  78. * @dataProvider segmentsProvider
  79. */
  80. public function testSegmentsMethod($path, $expected)
  81. {
  82. $request = Request::create($path);
  83. $this->assertEquals($expected, $request->segments());
  84. $request = Request::create('foo/bar');
  85. $this->assertEquals(['foo', 'bar'], $request->segments());
  86. }
  87. public function segmentsProvider()
  88. {
  89. return [
  90. ['', []],
  91. ['foo/bar', ['foo', 'bar']],
  92. ['foo/bar//baz', ['foo', 'bar', 'baz']],
  93. ['foo/0/bar', ['foo', '0', 'bar']],
  94. ];
  95. }
  96. public function testUrlMethod()
  97. {
  98. $request = Request::create('http://foo.com/foo/bar?name=taylor');
  99. $this->assertSame('http://foo.com/foo/bar', $request->url());
  100. $request = Request::create('http://foo.com/foo/bar/?');
  101. $this->assertSame('http://foo.com/foo/bar', $request->url());
  102. }
  103. public function testFullUrlMethod()
  104. {
  105. $request = Request::create('http://foo.com/foo/bar?name=taylor');
  106. $this->assertSame('http://foo.com/foo/bar?name=taylor', $request->fullUrl());
  107. $request = Request::create('https://foo.com');
  108. $this->assertSame('https://foo.com', $request->fullUrl());
  109. $request = Request::create('https://foo.com');
  110. $this->assertSame('https://foo.com/?coupon=foo', $request->fullUrlWithQuery(['coupon' => 'foo']));
  111. $request = Request::create('https://foo.com?a=b');
  112. $this->assertSame('https://foo.com/?a=b', $request->fullUrl());
  113. $request = Request::create('https://foo.com?a=b');
  114. $this->assertSame('https://foo.com/?a=b&coupon=foo', $request->fullUrlWithQuery(['coupon' => 'foo']));
  115. $request = Request::create('https://foo.com?a=b');
  116. $this->assertSame('https://foo.com/?a=c', $request->fullUrlWithQuery(['a' => 'c']));
  117. $request = Request::create('http://foo.com/foo/bar?name=taylor');
  118. $this->assertSame('http://foo.com/foo/bar?name=taylor', $request->fullUrlWithQuery(['name' => 'taylor']));
  119. $request = Request::create('http://foo.com/foo/bar/?name=taylor');
  120. $this->assertSame('http://foo.com/foo/bar?name=graham', $request->fullUrlWithQuery(['name' => 'graham']));
  121. $request = Request::create('https://foo.com');
  122. $this->assertSame('https://foo.com/?key=value%20with%20spaces', $request->fullUrlWithQuery(['key' => 'value with spaces']));
  123. }
  124. public function testIsMethod()
  125. {
  126. $request = Request::create('/foo/bar');
  127. $this->assertTrue($request->is('foo*'));
  128. $this->assertFalse($request->is('bar*'));
  129. $this->assertTrue($request->is('*bar*'));
  130. $this->assertTrue($request->is('bar*', 'foo*', 'baz'));
  131. $request = Request::create('/');
  132. $this->assertTrue($request->is('/'));
  133. }
  134. public function testFullUrlIsMethod()
  135. {
  136. $request = Request::create('http://example.com/foo/bar');
  137. $this->assertTrue($request->fullUrlIs('http://example.com/foo/bar'));
  138. $this->assertFalse($request->fullUrlIs('example.com*'));
  139. $this->assertTrue($request->fullUrlIs('http://*'));
  140. $this->assertTrue($request->fullUrlIs('*foo*'));
  141. $this->assertTrue($request->fullUrlIs('*bar'));
  142. $this->assertTrue($request->fullUrlIs('*'));
  143. }
  144. public function testRouteIsMethod()
  145. {
  146. $request = Request::create('/foo/bar');
  147. $this->assertFalse($request->routeIs('foo.bar'));
  148. $request->setRouteResolver(function () use ($request) {
  149. $route = new Route('GET', '/foo/bar', ['as' => 'foo.bar']);
  150. $route->bind($request);
  151. return $route;
  152. });
  153. $this->assertTrue($request->routeIs('foo.bar'));
  154. $this->assertTrue($request->routeIs('foo*', '*bar'));
  155. $this->assertFalse($request->routeIs('foo.foo'));
  156. }
  157. public function testRouteMethod()
  158. {
  159. $request = Request::create('/foo/bar');
  160. $request->setRouteResolver(function () use ($request) {
  161. $route = new Route('GET', '/foo/{required}/{optional?}', []);
  162. $route->bind($request);
  163. return $route;
  164. });
  165. $this->assertSame('bar', $request->route('required'));
  166. $this->assertSame('bar', $request->route('required', 'default'));
  167. $this->assertNull($request->route('optional'));
  168. $this->assertSame('default', $request->route('optional', 'default'));
  169. }
  170. public function testAjaxMethod()
  171. {
  172. $request = Request::create('/');
  173. $this->assertFalse($request->ajax());
  174. $request = Request::create('/', 'GET', [], [], [], ['HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest'], '{}');
  175. $this->assertTrue($request->ajax());
  176. $request = Request::create('/', 'POST');
  177. $request->headers->set('X-Requested-With', 'XMLHttpRequest');
  178. $this->assertTrue($request->ajax());
  179. $request->headers->set('X-Requested-With', '');
  180. $this->assertFalse($request->ajax());
  181. }
  182. public function testPrefetchMethod()
  183. {
  184. $request = Request::create('/');
  185. $this->assertFalse($request->prefetch());
  186. $request->server->set('HTTP_X_MOZ', '');
  187. $this->assertFalse($request->prefetch());
  188. $request->server->set('HTTP_X_MOZ', 'prefetch');
  189. $this->assertTrue($request->prefetch());
  190. $request->server->set('HTTP_X_MOZ', 'Prefetch');
  191. $this->assertTrue($request->prefetch());
  192. $request->server->remove('HTTP_X_MOZ');
  193. $request->headers->set('Purpose', '');
  194. $this->assertFalse($request->prefetch());
  195. $request->headers->set('Purpose', 'prefetch');
  196. $this->assertTrue($request->prefetch());
  197. $request->headers->set('Purpose', 'Prefetch');
  198. $this->assertTrue($request->prefetch());
  199. }
  200. public function testPjaxMethod()
  201. {
  202. $request = Request::create('/', 'GET', [], [], [], ['HTTP_X_PJAX' => 'true'], '{}');
  203. $this->assertTrue($request->pjax());
  204. $request->headers->set('X-PJAX', 'false');
  205. $this->assertTrue($request->pjax());
  206. $request->headers->set('X-PJAX', null);
  207. $this->assertFalse($request->pjax());
  208. $request->headers->set('X-PJAX', '');
  209. $this->assertFalse($request->pjax());
  210. }
  211. public function testSecureMethod()
  212. {
  213. $request = Request::create('http://example.com');
  214. $this->assertFalse($request->secure());
  215. $request = Request::create('https://example.com');
  216. $this->assertTrue($request->secure());
  217. }
  218. public function testUserAgentMethod()
  219. {
  220. $request = Request::create('/', 'GET', [], [], [], [
  221. 'HTTP_USER_AGENT' => 'Laravel',
  222. ]);
  223. $this->assertSame('Laravel', $request->userAgent());
  224. }
  225. public function testHasMethod()
  226. {
  227. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'age' => '', 'city' => null]);
  228. $this->assertTrue($request->has('name'));
  229. $this->assertTrue($request->has('age'));
  230. $this->assertTrue($request->has('city'));
  231. $this->assertFalse($request->has('foo'));
  232. $this->assertFalse($request->has('name', 'email'));
  233. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'email' => 'foo']);
  234. $this->assertTrue($request->has('name'));
  235. $this->assertTrue($request->has('name', 'email'));
  236. $request = Request::create('/', 'GET', ['foo' => ['bar', 'bar']]);
  237. $this->assertTrue($request->has('foo'));
  238. $request = Request::create('/', 'GET', ['foo' => '', 'bar' => null]);
  239. $this->assertTrue($request->has('foo'));
  240. $this->assertTrue($request->has('bar'));
  241. $request = Request::create('/', 'GET', ['foo' => ['bar' => null, 'baz' => '']]);
  242. $this->assertTrue($request->has('foo.bar'));
  243. $this->assertTrue($request->has('foo.baz'));
  244. }
  245. public function testWhenHasMethod()
  246. {
  247. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'age' => '', 'city' => null]);
  248. $name = $age = $city = $foo = $bar = false;
  249. $request->whenHas('name', function ($value) use (&$name) {
  250. $name = $value;
  251. });
  252. $request->whenHas('age', function ($value) use (&$age) {
  253. $age = $value;
  254. });
  255. $request->whenHas('city', function ($value) use (&$city) {
  256. $city = $value;
  257. });
  258. $request->whenHas('foo', function () use (&$foo) {
  259. $foo = 'test';
  260. });
  261. $request->whenHas('bar', function () use (&$bar) {
  262. $bar = 'test';
  263. }, function () use (&$bar) {
  264. $bar = true;
  265. });
  266. $this->assertSame('Taylor', $name);
  267. $this->assertSame('', $age);
  268. $this->assertNull($city);
  269. $this->assertFalse($foo);
  270. $this->assertTrue($bar);
  271. }
  272. public function testWhenFilledMethod()
  273. {
  274. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'age' => '', 'city' => null]);
  275. $name = $age = $city = $foo = $bar = false;
  276. $request->whenFilled('name', function ($value) use (&$name) {
  277. $name = $value;
  278. });
  279. $request->whenFilled('age', function ($value) use (&$age) {
  280. $age = 'test';
  281. });
  282. $request->whenFilled('city', function ($value) use (&$city) {
  283. $city = 'test';
  284. });
  285. $request->whenFilled('foo', function () use (&$foo) {
  286. $foo = 'test';
  287. });
  288. $request->whenFilled('bar', function () use (&$bar) {
  289. $bar = 'test';
  290. }, function () use (&$bar) {
  291. $bar = true;
  292. });
  293. $this->assertSame('Taylor', $name);
  294. $this->assertFalse($age);
  295. $this->assertFalse($city);
  296. $this->assertFalse($foo);
  297. $this->assertTrue($bar);
  298. }
  299. public function testMissingMethod()
  300. {
  301. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'age' => '', 'city' => null]);
  302. $this->assertFalse($request->missing('name'));
  303. $this->assertFalse($request->missing('age'));
  304. $this->assertFalse($request->missing('city'));
  305. $this->assertTrue($request->missing('foo'));
  306. $this->assertTrue($request->missing('name', 'email'));
  307. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'email' => 'foo']);
  308. $this->assertFalse($request->missing('name'));
  309. $this->assertFalse($request->missing('name', 'email'));
  310. $request = Request::create('/', 'GET', ['foo' => ['bar', 'bar']]);
  311. $this->assertFalse($request->missing('foo'));
  312. $request = Request::create('/', 'GET', ['foo' => '', 'bar' => null]);
  313. $this->assertFalse($request->missing('foo'));
  314. $this->assertFalse($request->missing('bar'));
  315. $request = Request::create('/', 'GET', ['foo' => ['bar' => null, 'baz' => '']]);
  316. $this->assertFalse($request->missing('foo.bar'));
  317. $this->assertFalse($request->missing('foo.baz'));
  318. }
  319. public function testHasAnyMethod()
  320. {
  321. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'age' => '', 'city' => null]);
  322. $this->assertTrue($request->hasAny('name'));
  323. $this->assertTrue($request->hasAny('age'));
  324. $this->assertTrue($request->hasAny('city'));
  325. $this->assertFalse($request->hasAny('foo'));
  326. $this->assertTrue($request->hasAny('name', 'email'));
  327. $this->assertTrue($request->hasAny(['name', 'email']));
  328. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'email' => 'foo']);
  329. $this->assertTrue($request->hasAny('name', 'email'));
  330. $this->assertFalse($request->hasAny('surname', 'password'));
  331. $this->assertFalse($request->hasAny(['surname', 'password']));
  332. $request = Request::create('/', 'GET', ['foo' => ['bar' => null, 'baz' => '']]);
  333. $this->assertTrue($request->hasAny('foo.bar'));
  334. $this->assertTrue($request->hasAny('foo.baz'));
  335. $this->assertFalse($request->hasAny('foo.bax'));
  336. $this->assertTrue($request->hasAny(['foo.bax', 'foo.baz']));
  337. }
  338. public function testFilledMethod()
  339. {
  340. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'age' => '', 'city' => null]);
  341. $this->assertTrue($request->filled('name'));
  342. $this->assertFalse($request->filled('age'));
  343. $this->assertFalse($request->filled('city'));
  344. $this->assertFalse($request->filled('foo'));
  345. $this->assertFalse($request->filled('name', 'email'));
  346. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'email' => 'foo']);
  347. $this->assertTrue($request->filled('name'));
  348. $this->assertTrue($request->filled('name', 'email'));
  349. // test arrays within query string
  350. $request = Request::create('/', 'GET', ['foo' => ['bar', 'baz']]);
  351. $this->assertTrue($request->filled('foo'));
  352. $request = Request::create('/', 'GET', ['foo' => ['bar' => 'baz']]);
  353. $this->assertTrue($request->filled('foo.bar'));
  354. }
  355. public function testIsNotFilledMethod()
  356. {
  357. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'age' => '', 'city' => null]);
  358. $this->assertFalse($request->isNotFilled('name'));
  359. $this->assertTrue($request->isNotFilled('age'));
  360. $this->assertTrue($request->isNotFilled('city'));
  361. $this->assertTrue($request->isNotFilled('foo'));
  362. $this->assertFalse($request->isNotFilled(['name', 'email']));
  363. $this->assertTrue($request->isNotFilled(['foo', 'age']));
  364. $this->assertTrue($request->isNotFilled(['age', 'city']));
  365. $request = Request::create('/', 'GET', ['foo' => ['bar', 'baz' => '0']]);
  366. $this->assertFalse($request->isNotFilled('foo'));
  367. $this->assertTrue($request->isNotFilled('foo.bar'));
  368. $this->assertFalse($request->isNotFilled('foo.baz'));
  369. }
  370. public function testFilledAnyMethod()
  371. {
  372. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'age' => '', 'city' => null]);
  373. $this->assertTrue($request->anyFilled(['name']));
  374. $this->assertTrue($request->anyFilled('name'));
  375. $this->assertFalse($request->anyFilled(['age']));
  376. $this->assertFalse($request->anyFilled('age'));
  377. $this->assertFalse($request->anyFilled(['foo']));
  378. $this->assertFalse($request->anyFilled('foo'));
  379. $this->assertTrue($request->anyFilled(['age', 'name']));
  380. $this->assertTrue($request->anyFilled('age', 'name'));
  381. $this->assertTrue($request->anyFilled(['foo', 'name']));
  382. $this->assertTrue($request->anyFilled('foo', 'name'));
  383. $this->assertFalse($request->anyFilled('age', 'city'));
  384. $this->assertFalse($request->anyFilled('age', 'city'));
  385. $this->assertFalse($request->anyFilled('foo', 'bar'));
  386. $this->assertFalse($request->anyFilled('foo', 'bar'));
  387. }
  388. public function testInputMethod()
  389. {
  390. $request = Request::create('/', 'GET', ['name' => 'Taylor']);
  391. $this->assertSame('Taylor', $request->input('name'));
  392. $this->assertSame('Taylor', $request['name']);
  393. $this->assertSame('Bob', $request->input('foo', 'Bob'));
  394. $request = Request::create('/', 'GET', [], [], ['file' => new SymfonyUploadedFile(__FILE__, 'foo.php')]);
  395. $this->assertInstanceOf(SymfonyUploadedFile::class, $request['file']);
  396. }
  397. public function testBooleanMethod()
  398. {
  399. $request = Request::create('/', 'GET', ['with_trashed' => 'false', 'download' => true, 'checked' => 1, 'unchecked' => '0']);
  400. $this->assertTrue($request->boolean('checked'));
  401. $this->assertTrue($request->boolean('download'));
  402. $this->assertFalse($request->boolean('unchecked'));
  403. $this->assertFalse($request->boolean('with_trashed'));
  404. $this->assertFalse($request->boolean('some_undefined_key'));
  405. }
  406. public function testCollectMethod()
  407. {
  408. $request = Request::create('/', 'GET', ['users' => [1, 2, 3]]);
  409. $this->assertInstanceOf(Collection::class, $request->collect('users'));
  410. $this->assertTrue($request->collect('developers')->isEmpty());
  411. $this->assertEquals([1, 2, 3], $request->collect('users')->all());
  412. $this->assertEquals(['users' => [1, 2, 3]], $request->collect()->all());
  413. $request = Request::create('/', 'GET', ['text-payload']);
  414. $this->assertEquals(['text-payload'], $request->collect()->all());
  415. $request = Request::create('/', 'GET', ['email' => 'test@example.com']);
  416. $this->assertEquals(['test@example.com'], $request->collect('email')->all());
  417. $request = Request::create('/', 'GET', []);
  418. $this->assertInstanceOf(Collection::class, $request->collect());
  419. $this->assertTrue($request->collect()->isEmpty());
  420. $request = Request::create('/', 'GET', ['users' => [1, 2, 3], 'roles' => [4, 5, 6], 'foo' => ['bar', 'baz'], 'email' => 'test@example.com']);
  421. $this->assertInstanceOf(Collection::class, $request->collect(['users']));
  422. $this->assertTrue($request->collect(['developers'])->isEmpty());
  423. $this->assertTrue($request->collect(['roles'])->isNotEmpty());
  424. $this->assertEquals(['roles' => [4, 5, 6]], $request->collect(['roles'])->all());
  425. $this->assertEquals(['users' => [1, 2, 3], 'email' => 'test@example.com'], $request->collect(['users', 'email'])->all());
  426. $this->assertEquals(collect(['roles' => [4, 5, 6], 'foo' => ['bar', 'baz']]), $request->collect(['roles', 'foo']));
  427. $this->assertEquals(['users' => [1, 2, 3], 'roles' => [4, 5, 6], 'foo' => ['bar', 'baz'], 'email' => 'test@example.com'], $request->collect()->all());
  428. }
  429. public function testDateMethod()
  430. {
  431. $request = Request::create('/', 'GET', [
  432. 'as_null' => null,
  433. 'as_invalid' => 'invalid',
  434. 'as_datetime' => '20-01-01 16:30:25',
  435. 'as_format' => '1577896225',
  436. 'as_timezone' => '20-01-01 13:30:25',
  437. 'as_date' => '2020-01-01',
  438. 'as_time' => '16:30:25',
  439. ]);
  440. $current = Carbon::create(2020, 1, 1, 16, 30, 25);
  441. $this->assertNull($request->date('as_null'));
  442. $this->assertNull($request->date('doesnt_exists'));
  443. $this->assertEquals($current, $request->date('as_datetime'));
  444. $this->assertEquals($current, $request->date('as_format', 'U'));
  445. $this->assertEquals($current, $request->date('as_timezone', null, 'America/Santiago'));
  446. $this->assertTrue($request->date('as_date')->isSameDay($current));
  447. $this->assertTrue($request->date('as_time')->isSameSecond('16:30:25'));
  448. }
  449. public function testDateMethodExceptionWhenValueInvalid()
  450. {
  451. $this->expectException(InvalidArgumentException::class);
  452. $request = Request::create('/', 'GET', [
  453. 'date' => 'invalid',
  454. ]);
  455. $request->date('date');
  456. }
  457. public function testDateMethodExceptionWhenFormatInvalid()
  458. {
  459. $this->expectException(InvalidArgumentException::class);
  460. $request = Request::create('/', 'GET', [
  461. 'date' => '20-01-01 16:30:25',
  462. ]);
  463. $request->date('date', 'invalid_format');
  464. }
  465. public function testArrayAccess()
  466. {
  467. $request = Request::create('/', 'GET', ['name' => null, 'foo' => ['bar' => null, 'baz' => '']]);
  468. $request->setRouteResolver(function () use ($request) {
  469. $route = new Route('GET', '/foo/bar/{id}/{name}', []);
  470. $route->bind($request);
  471. $route->setParameter('id', 'foo');
  472. $route->setParameter('name', 'Taylor');
  473. return $route;
  474. });
  475. $this->assertFalse(isset($request['non-existent']));
  476. $this->assertNull($request['non-existent']);
  477. $this->assertTrue(isset($request['name']));
  478. $this->assertNull($request['name']);
  479. $this->assertNotSame('Taylor', $request['name']);
  480. $this->assertTrue(isset($request['foo.bar']));
  481. $this->assertNull($request['foo.bar']);
  482. $this->assertTrue(isset($request['foo.baz']));
  483. $this->assertSame('', $request['foo.baz']);
  484. $this->assertTrue(isset($request['id']));
  485. $this->assertSame('foo', $request['id']);
  486. }
  487. public function testArrayAccessWithoutRouteResolver()
  488. {
  489. $request = Request::create('/', 'GET', ['name' => 'Taylor']);
  490. $this->assertFalse(isset($request['non-existent']));
  491. $this->assertNull($request['non-existent']);
  492. $this->assertTrue(isset($request['name']));
  493. $this->assertSame('Taylor', $request['name']);
  494. }
  495. public function testAllMethod()
  496. {
  497. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'age' => null]);
  498. $this->assertEquals(['name' => 'Taylor', 'age' => null, 'email' => null], $request->all('name', 'age', 'email'));
  499. $this->assertEquals(['name' => 'Taylor'], $request->all('name'));
  500. $this->assertEquals(['name' => 'Taylor', 'age' => null], $request->all());
  501. $request = Request::create('/', 'GET', ['developer' => ['name' => 'Taylor', 'age' => null]]);
  502. $this->assertEquals(['developer' => ['name' => 'Taylor', 'skills' => null]], $request->all('developer.name', 'developer.skills'));
  503. $this->assertEquals(['developer' => ['name' => 'Taylor', 'skills' => null]], $request->all(['developer.name', 'developer.skills']));
  504. $this->assertEquals(['developer' => ['age' => null]], $request->all('developer.age'));
  505. $this->assertEquals(['developer' => ['skills' => null]], $request->all('developer.skills'));
  506. $this->assertEquals(['developer' => ['name' => 'Taylor', 'age' => null]], $request->all());
  507. }
  508. public function testKeysMethod()
  509. {
  510. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'age' => null]);
  511. $this->assertEquals(['name', 'age'], $request->keys());
  512. $files = [
  513. 'foo' => [
  514. 'size' => 500,
  515. 'name' => 'foo.jpg',
  516. 'tmp_name' => __FILE__,
  517. 'type' => 'blah',
  518. 'error' => null,
  519. ],
  520. ];
  521. $request = Request::create('/', 'GET', [], [], $files);
  522. $this->assertEquals(['foo'], $request->keys());
  523. $request = Request::create('/', 'GET', ['name' => 'Taylor'], [], $files);
  524. $this->assertEquals(['name', 'foo'], $request->keys());
  525. }
  526. public function testOnlyMethod()
  527. {
  528. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'age' => null]);
  529. $this->assertEquals(['name' => 'Taylor', 'age' => null], $request->only('name', 'age', 'email'));
  530. $request = Request::create('/', 'GET', ['developer' => ['name' => 'Taylor', 'age' => null]]);
  531. $this->assertEquals(['developer' => ['name' => 'Taylor']], $request->only('developer.name', 'developer.skills'));
  532. $this->assertEquals(['developer' => ['age' => null]], $request->only('developer.age'));
  533. $this->assertEquals([], $request->only('developer.skills'));
  534. }
  535. public function testExceptMethod()
  536. {
  537. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'age' => 25]);
  538. $this->assertEquals(['name' => 'Taylor'], $request->except('age'));
  539. $this->assertEquals([], $request->except('age', 'name'));
  540. }
  541. public function testQueryMethod()
  542. {
  543. $request = Request::create('/', 'GET', ['name' => 'Taylor']);
  544. $this->assertSame('Taylor', $request->query('name'));
  545. $this->assertSame('Bob', $request->query('foo', 'Bob'));
  546. $all = $request->query(null);
  547. $this->assertSame('Taylor', $all['name']);
  548. $request = Request::create('/', 'GET', ['hello' => 'world', 'user' => ['Taylor', 'Mohamed Said']]);
  549. $this->assertSame(['Taylor', 'Mohamed Said'], $request->query('user'));
  550. $this->assertSame(['hello' => 'world', 'user' => ['Taylor', 'Mohamed Said']], $request->query->all());
  551. $request = Request::create('/?hello=world&user[]=Taylor&user[]=Mohamed%20Said', 'GET', []);
  552. $this->assertSame(['Taylor', 'Mohamed Said'], $request->query('user'));
  553. $this->assertSame(['hello' => 'world', 'user' => ['Taylor', 'Mohamed Said']], $request->query->all());
  554. }
  555. public function testPostMethod()
  556. {
  557. $request = Request::create('/', 'POST', ['name' => 'Taylor']);
  558. $this->assertSame('Taylor', $request->post('name'));
  559. $this->assertSame('Bob', $request->post('foo', 'Bob'));
  560. $all = $request->post(null);
  561. $this->assertSame('Taylor', $all['name']);
  562. }
  563. public function testCookieMethod()
  564. {
  565. $request = Request::create('/', 'GET', [], ['name' => 'Taylor']);
  566. $this->assertSame('Taylor', $request->cookie('name'));
  567. $this->assertSame('Bob', $request->cookie('foo', 'Bob'));
  568. $all = $request->cookie(null);
  569. $this->assertSame('Taylor', $all['name']);
  570. }
  571. public function testHasCookieMethod()
  572. {
  573. $request = Request::create('/', 'GET', [], ['foo' => 'bar']);
  574. $this->assertTrue($request->hasCookie('foo'));
  575. $this->assertFalse($request->hasCookie('qu'));
  576. }
  577. public function testFileMethod()
  578. {
  579. $files = [
  580. 'foo' => [
  581. 'size' => 500,
  582. 'name' => 'foo.jpg',
  583. 'tmp_name' => __FILE__,
  584. 'type' => 'blah',
  585. 'error' => null,
  586. ],
  587. ];
  588. $request = Request::create('/', 'GET', [], [], $files);
  589. $this->assertInstanceOf(SymfonyUploadedFile::class, $request->file('foo'));
  590. }
  591. public function testHasFileMethod()
  592. {
  593. $request = Request::create('/', 'GET', [], [], []);
  594. $this->assertFalse($request->hasFile('foo'));
  595. $files = [
  596. 'foo' => [
  597. 'size' => 500,
  598. 'name' => 'foo.jpg',
  599. 'tmp_name' => __FILE__,
  600. 'type' => 'blah',
  601. 'error' => null,
  602. ],
  603. ];
  604. $request = Request::create('/', 'GET', [], [], $files);
  605. $this->assertTrue($request->hasFile('foo'));
  606. }
  607. public function testServerMethod()
  608. {
  609. $request = Request::create('/', 'GET', [], [], [], ['foo' => 'bar']);
  610. $this->assertSame('bar', $request->server('foo'));
  611. $this->assertSame('bar', $request->server('foo.doesnt.exist', 'bar'));
  612. $all = $request->server(null);
  613. $this->assertSame('bar', $all['foo']);
  614. }
  615. public function testMergeMethod()
  616. {
  617. $request = Request::create('/', 'GET', ['name' => 'Taylor']);
  618. $merge = ['buddy' => 'Dayle'];
  619. $request->merge($merge);
  620. $this->assertSame('Taylor', $request->input('name'));
  621. $this->assertSame('Dayle', $request->input('buddy'));
  622. }
  623. public function testMergeIfMissingMethod()
  624. {
  625. $request = Request::create('/', 'GET', ['name' => 'Taylor']);
  626. $merge = ['boolean_setting' => 0];
  627. $request->mergeIfMissing($merge);
  628. $this->assertSame('Taylor', $request->input('name'));
  629. $this->assertSame(0, $request->input('boolean_setting'));
  630. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'boolean_setting' => 1]);
  631. $merge = ['boolean_setting' => 0];
  632. $request->mergeIfMissing($merge);
  633. $this->assertSame('Taylor', $request->input('name'));
  634. $this->assertSame(1, $request->input('boolean_setting'));
  635. }
  636. public function testReplaceMethod()
  637. {
  638. $request = Request::create('/', 'GET', ['name' => 'Taylor']);
  639. $replace = ['buddy' => 'Dayle'];
  640. $request->replace($replace);
  641. $this->assertNull($request->input('name'));
  642. $this->assertSame('Dayle', $request->input('buddy'));
  643. }
  644. public function testOffsetUnsetMethod()
  645. {
  646. $request = Request::create('/', 'HEAD', ['name' => 'Taylor']);
  647. $request->offsetUnset('name');
  648. $this->assertNull($request->input('name'));
  649. }
  650. public function testHeaderMethod()
  651. {
  652. $request = Request::create('/', 'GET', [], [], [], ['HTTP_DO_THIS' => 'foo']);
  653. $this->assertSame('foo', $request->header('do-this'));
  654. $all = $request->header(null);
  655. $this->assertSame('foo', $all['do-this'][0]);
  656. }
  657. public function testBearerTokenMethod()
  658. {
  659. $request = Request::create('/', 'GET', [], [], [], ['HTTP_AUTHORIZATION' => 'Bearer fooBearerbar']);
  660. $this->assertSame('fooBearerbar', $request->bearerToken());
  661. $request = Request::create('/', 'GET', [], [], [], ['HTTP_AUTHORIZATION' => 'Basic foo, Bearer bar']);
  662. $this->assertSame('bar', $request->bearerToken());
  663. $request = Request::create('/', 'GET', [], [], [], ['HTTP_AUTHORIZATION' => 'Bearer foo,bar']);
  664. $this->assertSame('foo', $request->bearerToken());
  665. }
  666. public function testJSONMethod()
  667. {
  668. $payload = ['name' => 'taylor'];
  669. $request = Request::create('/', 'GET', [], [], [], ['CONTENT_TYPE' => 'application/json'], json_encode($payload));
  670. $this->assertSame('taylor', $request->json('name'));
  671. $this->assertSame('taylor', $request->input('name'));
  672. $data = $request->json()->all();
  673. $this->assertEquals($payload, $data);
  674. }
  675. public function testJSONEmulatingPHPBuiltInServer()
  676. {
  677. $payload = ['name' => 'taylor'];
  678. $content = json_encode($payload);
  679. $request = Request::create('/', 'GET', [], [], [], ['HTTP_CONTENT_TYPE' => 'application/json', 'HTTP_CONTENT_LENGTH' => strlen($content)], $content);
  680. $this->assertTrue($request->isJson());
  681. $data = $request->json()->all();
  682. $this->assertEquals($payload, $data);
  683. $data = $request->all();
  684. $this->assertEquals($payload, $data);
  685. }
  686. public function getPrefersCases()
  687. {
  688. return [
  689. ['application/json', ['json'], 'json'],
  690. ['application/json', ['html', 'json'], 'json'],
  691. ['application/foo+json', 'application/foo+json', 'application/foo+json'],
  692. ['application/foo+json', 'json', 'json'],
  693. ['application/json;q=0.5, text/html;q=1.0', ['json', 'html'], 'html'],
  694. ['application/json;q=0.5, text/plain;q=1.0, text/html;q=1.0', ['json', 'txt', 'html'], 'txt'],
  695. ['application/*', 'json', 'json'],
  696. ['application/json; charset=utf-8', 'json', 'json'],
  697. ['application/xml; charset=utf-8', ['html', 'json'], null],
  698. ['application/json, text/html', ['html', 'json'], 'json'],
  699. ['application/json;q=0.4, text/html;q=0.6', ['html', 'json'], 'html'],
  700. ['application/json; charset=utf-8', 'application/json', 'application/json'],
  701. ['application/json, text/html', ['text/html', 'application/json'], 'application/json'],
  702. ['application/json;q=0.4, text/html;q=0.6', ['text/html', 'application/json'], 'text/html'],
  703. ['application/json;q=0.4, text/html;q=0.6', ['application/json', 'text/html'], 'text/html'],
  704. ['*/*; charset=utf-8', 'json', 'json'],
  705. ['application/*', 'application/json', 'application/json'],
  706. ['application/*', 'application/xml', 'application/xml'],
  707. ['application/*', 'text/html', null],
  708. ];
  709. }
  710. /**
  711. * @dataProvider getPrefersCases
  712. */
  713. public function testPrefersMethod($accept, $prefers, $expected)
  714. {
  715. $this->assertSame(
  716. $expected, Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => $accept])->prefers($prefers)
  717. );
  718. }
  719. public function testAllInputReturnsInputAndFiles()
  720. {
  721. $file = $this->getMockBuilder(UploadedFile::class)->setConstructorArgs([__FILE__, 'photo.jpg'])->getMock();
  722. $request = Request::create('/?boom=breeze', 'GET', ['foo' => 'bar'], [], ['baz' => $file]);
  723. $this->assertEquals(['foo' => 'bar', 'baz' => $file, 'boom' => 'breeze'], $request->all());
  724. }
  725. public function testAllInputReturnsNestedInputAndFiles()
  726. {
  727. $file = $this->getMockBuilder(UploadedFile::class)->setConstructorArgs([__FILE__, 'photo.jpg'])->getMock();
  728. $request = Request::create('/?boom=breeze', 'GET', ['foo' => ['bar' => 'baz']], [], ['foo' => ['photo' => $file]]);
  729. $this->assertEquals(['foo' => ['bar' => 'baz', 'photo' => $file], 'boom' => 'breeze'], $request->all());
  730. }
  731. public function testAllInputReturnsInputAfterReplace()
  732. {
  733. $request = Request::create('/?boom=breeze', 'GET', ['foo' => ['bar' => 'baz']]);
  734. $request->replace(['foo' => ['bar' => 'baz'], 'boom' => 'breeze']);
  735. $this->assertEquals(['foo' => ['bar' => 'baz'], 'boom' => 'breeze'], $request->all());
  736. }
  737. public function testAllInputWithNumericKeysReturnsInputAfterReplace()
  738. {
  739. $request1 = Request::create('/', 'POST', [0 => 'A', 1 => 'B', 2 => 'C']);
  740. $request1->replace([0 => 'A', 1 => 'B', 2 => 'C']);
  741. $this->assertEquals([0 => 'A', 1 => 'B', 2 => 'C'], $request1->all());
  742. $request2 = Request::create('/', 'POST', [1 => 'A', 2 => 'B', 3 => 'C']);
  743. $request2->replace([1 => 'A', 2 => 'B', 3 => 'C']);
  744. $this->assertEquals([1 => 'A', 2 => 'B', 3 => 'C'], $request2->all());
  745. }
  746. public function testInputWithEmptyFilename()
  747. {
  748. $invalidFiles = [
  749. 'file' => [
  750. 'name' => null,
  751. 'type' => null,
  752. 'tmp_name' => null,
  753. 'error' => 4,
  754. 'size' => 0,
  755. ],
  756. ];
  757. $baseRequest = SymfonyRequest::create('/?boom=breeze', 'GET', ['foo' => ['bar' => 'baz']], [], $invalidFiles);
  758. Request::createFromBase($baseRequest);
  759. }
  760. public function testMultipleFileUploadWithEmptyValue()
  761. {
  762. $invalidFiles = [
  763. 'file' => [
  764. 'name' => [''],
  765. 'type' => [''],
  766. 'tmp_name' => [''],
  767. 'error' => [4],
  768. 'size' => [0],
  769. ],
  770. ];
  771. $baseRequest = SymfonyRequest::create('/?boom=breeze', 'GET', ['foo' => ['bar' => 'baz']], [], $invalidFiles);
  772. $request = Request::createFromBase($baseRequest);
  773. $this->assertEmpty($request->files->all());
  774. }
  775. public function testOldMethodCallsSession()
  776. {
  777. $request = Request::create('/');
  778. $session = m::mock(Store::class);
  779. $session->shouldReceive('getOldInput')->once()->with('foo', 'bar')->andReturn('boom');
  780. $request->setLaravelSession($session);
  781. $this->assertSame('boom', $request->old('foo', 'bar'));
  782. }
  783. public function testFlushMethodCallsSession()
  784. {
  785. $request = Request::create('/');
  786. $session = m::mock(Store::class);
  787. $session->shouldReceive('flashInput')->once();
  788. $request->setLaravelSession($session);
  789. $request->flush();
  790. }
  791. public function testExpectsJson()
  792. {
  793. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'application/json']);
  794. $this->assertTrue($request->expectsJson());
  795. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => '*/*']);
  796. $this->assertFalse($request->expectsJson());
  797. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => '*/*', 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest']);
  798. $this->assertTrue($request->expectsJson());
  799. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => null, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest']);
  800. $this->assertTrue($request->expectsJson());
  801. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => '*/*', 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest', 'HTTP_X_PJAX' => 'true']);
  802. $this->assertFalse($request->expectsJson());
  803. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'text/html']);
  804. $this->assertFalse($request->expectsJson());
  805. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'text/html', 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest']);
  806. $this->assertFalse($request->expectsJson());
  807. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'text/html', 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest', 'HTTP_X_PJAX' => 'true']);
  808. $this->assertFalse($request->expectsJson());
  809. }
  810. public function testFormatReturnsAcceptableFormat()
  811. {
  812. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'application/json']);
  813. $this->assertSame('json', $request->format());
  814. $this->assertTrue($request->wantsJson());
  815. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'application/json; charset=utf-8']);
  816. $this->assertSame('json', $request->format());
  817. $this->assertTrue($request->wantsJson());
  818. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'application/atom+xml']);
  819. $this->assertSame('atom', $request->format());
  820. $this->assertFalse($request->wantsJson());
  821. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'is/not/known']);
  822. $this->assertSame('html', $request->format());
  823. $this->assertSame('foo', $request->format('foo'));
  824. }
  825. public function testFormatReturnsAcceptsJson()
  826. {
  827. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'application/json']);
  828. $this->assertSame('json', $request->format());
  829. $this->assertTrue($request->accepts('application/json'));
  830. $this->assertTrue($request->accepts('application/baz+json'));
  831. $this->assertTrue($request->acceptsJson());
  832. $this->assertFalse($request->acceptsHtml());
  833. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'application/foo+json']);
  834. $this->assertTrue($request->accepts('application/foo+json'));
  835. $this->assertFalse($request->accepts('application/bar+json'));
  836. $this->assertFalse($request->accepts('application/json'));
  837. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'application/*']);
  838. $this->assertTrue($request->accepts('application/xml'));
  839. $this->assertTrue($request->accepts('application/json'));
  840. }
  841. public function testFormatReturnsAcceptsHtml()
  842. {
  843. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'text/html']);
  844. $this->assertSame('html', $request->format());
  845. $this->assertTrue($request->accepts('text/html'));
  846. $this->assertTrue($request->acceptsHtml());
  847. $this->assertFalse($request->acceptsJson());
  848. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'text/*']);
  849. $this->assertTrue($request->accepts('text/html'));
  850. $this->assertTrue($request->accepts('text/plain'));
  851. }
  852. public function testFormatReturnsAcceptsAll()
  853. {
  854. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => '*/*']);
  855. $this->assertSame('html', $request->format());
  856. $this->assertTrue($request->accepts('text/html'));
  857. $this->assertTrue($request->accepts('foo/bar'));
  858. $this->assertTrue($request->accepts('application/baz+xml'));
  859. $this->assertTrue($request->acceptsHtml());
  860. $this->assertTrue($request->acceptsJson());
  861. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => '*']);
  862. $this->assertSame('html', $request->format());
  863. $this->assertTrue($request->accepts('text/html'));
  864. $this->assertTrue($request->accepts('foo/bar'));
  865. $this->assertTrue($request->accepts('application/baz+xml'));
  866. $this->assertTrue($request->acceptsHtml());
  867. $this->assertTrue($request->acceptsJson());
  868. }
  869. public function testFormatReturnsAcceptsMultiple()
  870. {
  871. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'application/json,text/*']);
  872. $this->assertTrue($request->accepts(['text/html', 'application/json']));
  873. $this->assertTrue($request->accepts('text/html'));
  874. $this->assertTrue($request->accepts('text/foo'));
  875. $this->assertTrue($request->accepts('application/json'));
  876. $this->assertTrue($request->accepts('application/baz+json'));
  877. }
  878. public function testFormatReturnsAcceptsCharset()
  879. {
  880. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'application/json; charset=utf-8']);
  881. $this->assertTrue($request->accepts(['text/html', 'application/json']));
  882. $this->assertFalse($request->accepts('text/html'));
  883. $this->assertFalse($request->accepts('text/foo'));
  884. $this->assertTrue($request->accepts('application/json'));
  885. $this->assertTrue($request->accepts('application/baz+json'));
  886. }
  887. public function testBadAcceptHeader()
  888. {
  889. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)']);
  890. $this->assertFalse($request->accepts(['text/html', 'application/json']));
  891. $this->assertFalse($request->accepts('text/html'));
  892. $this->assertFalse($request->accepts('text/foo'));
  893. $this->assertFalse($request->accepts('application/json'));
  894. $this->assertFalse($request->accepts('application/baz+json'));
  895. $this->assertFalse($request->acceptsHtml());
  896. $this->assertFalse($request->acceptsJson());
  897. // Should not be handled as regex.
  898. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => '.+/.+']);
  899. $this->assertFalse($request->accepts('application/json'));
  900. $this->assertFalse($request->accepts('application/baz+json'));
  901. // Should not produce compilation error on invalid regex.
  902. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => '(/(']);
  903. $this->assertFalse($request->accepts('text/html'));
  904. }
  905. public function testCaseInsensitiveAcceptHeader()
  906. {
  907. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'APPLICATION/JSON']);
  908. $this->assertTrue($request->accepts(['text/html', 'application/json']));
  909. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'AppLiCaTion/JsOn']);
  910. $this->assertTrue($request->accepts(['text/html', 'application/json']));
  911. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'APPLICATION/*']);
  912. $this->assertTrue($request->accepts(['text/html', 'application/json']));
  913. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'APPLICATION/JSON']);
  914. $this->assertTrue($request->expectsJson());
  915. }
  916. public function testSessionMethod()
  917. {
  918. $this->expectException(RuntimeException::class);
  919. $this->expectExceptionMessage('Session store not set on request.');
  920. $request = Request::create('/');
  921. $request->session();
  922. }
  923. public function testUserResolverMakesUserAvailableAsMagicProperty()
  924. {
  925. $request = Request::create('/', 'GET', [], [], [], ['HTTP_ACCEPT' => 'application/json']);
  926. $request->setUserResolver(function () {
  927. return 'user';
  928. });
  929. $this->assertSame('user', $request->user());
  930. }
  931. public function testFingerprintMethod()
  932. {
  933. $request = Request::create('/', 'GET', [], [], [], []);
  934. $request->setRouteResolver(function () use ($request) {
  935. $route = new Route('GET', '/foo/bar/{id}', []);
  936. $route->bind($request);
  937. return $route;
  938. });
  939. $this->assertEquals(40, mb_strlen($request->fingerprint()));
  940. }
  941. public function testFingerprintWithoutRoute()
  942. {
  943. $this->expectException(RuntimeException::class);
  944. $this->expectExceptionMessage('Unable to generate fingerprint. Route unavailable.');
  945. $request = Request::create('/', 'GET', [], [], [], []);
  946. $request->fingerprint();
  947. }
  948. public function testCreateFromBase()
  949. {
  950. $body = [
  951. 'foo' => 'bar',
  952. 'baz' => ['qux'],
  953. ];
  954. $server = [
  955. 'CONTENT_TYPE' => 'application/json',
  956. ];
  957. $base = SymfonyRequest::create('/', 'GET', [], [], [], $server, json_encode($body));
  958. $request = Request::createFromBase($base);
  959. $this->assertEquals($request->request->all(), $body);
  960. }
  961. /**
  962. * Tests for Http\Request magic methods `__get()` and `__isset()`.
  963. *
  964. * @link https://github.com/laravel/framework/issues/10403 Form request object attribute returns empty when have some string.
  965. */
  966. public function testMagicMethods()
  967. {
  968. // Simulates QueryStrings.
  969. $request = Request::create('/', 'GET', ['foo' => 'bar', 'empty' => '']);
  970. // Parameter 'foo' is 'bar', then it ISSET and is NOT EMPTY.
  971. $this->assertSame('bar', $request->foo);
  972. $this->assertTrue(isset($request->foo));
  973. $this->assertNotEmpty($request->foo);
  974. // Parameter 'empty' is '', then it ISSET and is EMPTY.
  975. $this->assertSame('', $request->empty);
  976. $this->assertTrue(isset($request->empty));
  977. $this->assertEmpty($request->empty);
  978. // Parameter 'undefined' is undefined/null, then it NOT ISSET and is EMPTY.
  979. $this->assertNull($request->undefined);
  980. $this->assertFalse(isset($request->undefined));
  981. $this->assertEmpty($request->undefined);
  982. // Simulates Route parameters.
  983. $request = Request::create('/example/bar', 'GET', ['xyz' => 'overwritten']);
  984. $request->setRouteResolver(function () use ($request) {
  985. $route = new Route('GET', '/example/{foo}/{xyz?}/{undefined?}', []);
  986. $route->bind($request);
  987. return $route;
  988. });
  989. // Router parameter 'foo' is 'bar', then it ISSET and is NOT EMPTY.
  990. $this->assertSame('bar', $request->foo);
  991. $this->assertSame('bar', $request['foo']);
  992. $this->assertTrue(isset($request->foo));
  993. $this->assertNotEmpty($request->foo);
  994. // Router parameter 'undefined' is undefined/null, then it NOT ISSET and is EMPTY.
  995. $this->assertNull($request->undefined);
  996. $this->assertFalse(isset($request->undefined));
  997. $this->assertEmpty($request->undefined);
  998. // Special case: router parameter 'xyz' is 'overwritten' by QueryString, then it ISSET and is NOT EMPTY.
  999. // Basically, QueryStrings have priority over router parameters.
  1000. $this->assertSame('overwritten', $request->xyz);
  1001. $this->assertTrue(isset($request->foo));
  1002. $this->assertNotEmpty($request->foo);
  1003. // Simulates empty QueryString and Routes.
  1004. $request = Request::create('/');
  1005. $request->setRouteResolver(function () use ($request) {
  1006. $route = new Route('GET', '/', []);
  1007. $route->bind($request);
  1008. return $route;
  1009. });
  1010. // Parameter 'undefined' is undefined/null, then it NOT ISSET and is EMPTY.
  1011. $this->assertNull($request->undefined);
  1012. $this->assertFalse(isset($request->undefined));
  1013. $this->assertEmpty($request->undefined);
  1014. // Special case: simulates empty QueryString and Routes, without the Route Resolver.
  1015. // It'll happen when you try to get a parameter outside a route.
  1016. $request = Request::create('/');
  1017. // Parameter 'undefined' is undefined/null, then it NOT ISSET and is EMPTY.
  1018. $this->assertNull($request->undefined);
  1019. $this->assertFalse(isset($request->undefined));
  1020. $this->assertEmpty($request->undefined);
  1021. }
  1022. public function testHttpRequestFlashCallsSessionFlashInputWithInputData()
  1023. {
  1024. $session = m::mock(Store::class);
  1025. $session->shouldReceive('flashInput')->once()->with(['name' => 'Taylor', 'email' => 'foo']);
  1026. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'email' => 'foo']);
  1027. $request->setLaravelSession($session);
  1028. $request->flash();
  1029. }
  1030. public function testHttpRequestFlashOnlyCallsFlashWithProperParameters()
  1031. {
  1032. $session = m::mock(Store::class);
  1033. $session->shouldReceive('flashInput')->once()->with(['name' => 'Taylor']);
  1034. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'email' => 'foo']);
  1035. $request->setLaravelSession($session);
  1036. $request->flashOnly(['name']);
  1037. }
  1038. public function testHttpRequestFlashExceptCallsFlashWithProperParameters()
  1039. {
  1040. $session = m::mock(Store::class);
  1041. $session->shouldReceive('flashInput')->once()->with(['name' => 'Taylor']);
  1042. $request = Request::create('/', 'GET', ['name' => 'Taylor', 'email' => 'foo']);
  1043. $request->setLaravelSession($session);
  1044. $request->flashExcept(['email']);
  1045. }
  1046. }