NavigationContextServiceTest.php 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <?php
  2. namespace Tests\Unit\Services;
  3. use App\Services\NavigationContextService;
  4. use Illuminate\Http\Request;
  5. use Tests\TestCase;
  6. class NavigationContextServiceTest extends TestCase
  7. {
  8. public function test_builds_back_navigation_stack_from_get_requests(): void
  9. {
  10. session()->start();
  11. $service = app(NavigationContextService::class);
  12. $indexRequest = Request::create('https://crm.test/reclamations?filters[comment]=abc', 'GET');
  13. $showRequest = Request::create('https://crm.test/reclamations/show/10', 'GET');
  14. $token = $service->getOrCreateToken($indexRequest);
  15. $service->rememberCurrentPage($indexRequest, $token);
  16. $service->rememberCurrentPage($showRequest, $token);
  17. $backUrl = $service->backUrl($showRequest, $token, 'https://crm.test/reclamations');
  18. $parentUrl = $service->parentUrl($token, 'https://crm.test/reclamations');
  19. $this->assertSame('https://crm.test/reclamations?filters%5Bcomment%5D=abc&nav=' . $token, $backUrl);
  20. $this->assertSame('https://crm.test/reclamations?filters%5Bcomment%5D=abc&nav=' . $token, $parentUrl);
  21. }
  22. public function test_remember_current_page_truncates_stack_when_returning_to_previous_url(): void
  23. {
  24. session()->start();
  25. $service = app(NavigationContextService::class);
  26. $orderRequest = Request::create('https://crm.test/order/show/10', 'GET');
  27. $reclamationRequest = Request::create('https://crm.test/reclamations/show/20?nav=test-token', 'GET');
  28. $catalogRequest = Request::create('https://crm.test/catalog/15?nav=test-token', 'GET');
  29. $token = $service->getOrCreateToken($orderRequest);
  30. $service->rememberCurrentPage($orderRequest, $token);
  31. $service->rememberCurrentPage($reclamationRequest, $token);
  32. $service->rememberCurrentPage($catalogRequest, $token);
  33. $service->rememberCurrentPage($reclamationRequest, $token);
  34. $contexts = session('navigation');
  35. $stack = $contexts[$token]['stack'] ?? [];
  36. $this->assertSame([
  37. 'https://crm.test/order/show/10',
  38. 'https://crm.test/reclamations/show/20',
  39. ], $stack);
  40. }
  41. public function test_parent_url_returns_fallback_when_stack_has_single_entry(): void
  42. {
  43. session()->start();
  44. $service = app(NavigationContextService::class);
  45. $request = Request::create('https://crm.test/product_sku/55', 'GET');
  46. $token = $service->getOrCreateToken($request);
  47. $service->rememberCurrentPage($request, $token);
  48. $this->assertSame('https://crm.test/product_sku?nav=' . $token, $service->parentUrl($token, 'https://crm.test/product_sku'));
  49. }
  50. public function test_back_url_preserves_nav_token_for_previous_card(): void
  51. {
  52. session()->start();
  53. $service = app(NavigationContextService::class);
  54. $catalogRequest = Request::create('https://crm.test/catalog/15?nav=test-token', 'GET');
  55. $token = $service->getOrCreateToken(Request::create('https://crm.test/reclamations', 'GET', ['nav' => 'test-token']));
  56. session([
  57. 'navigation.' . $token => [
  58. 'updated_at' => time(),
  59. 'stack' => [
  60. 'https://crm.test/order/show/10',
  61. 'https://crm.test/reclamations/show/20',
  62. 'https://crm.test/catalog/15',
  63. ],
  64. ],
  65. ]);
  66. $this->assertSame(
  67. 'https://crm.test/reclamations/show/20?nav=' . $token,
  68. $service->backUrl($catalogRequest, $token, 'https://crm.test/catalog')
  69. );
  70. $this->assertSame(
  71. 'https://crm.test/reclamations/show/20?nav=' . $token,
  72. $service->parentUrl($token, 'https://crm.test/catalog')
  73. );
  74. }
  75. }