MenuTest.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. namespace Tests\Browser;
  3. use Dcat\Admin\Models\Menu;
  4. use Laravel\Dusk\Browser;
  5. use Tests\Browser\Components\Form\MenuEditForm;
  6. use Tests\Browser\Components\Form\Field\MultipleSelect2;
  7. use Tests\Browser\Components\Form\Field\Select2;
  8. use Tests\Browser\Pages\MenuEditPage;
  9. use Tests\Browser\Pages\MenuPage;
  10. use Tests\TestCase;
  11. /**
  12. * @group menu
  13. */
  14. class MenuTest extends TestCase
  15. {
  16. public function testMenuIndex()
  17. {
  18. $this->browse(function (Browser $browser) {
  19. $browser->visit(new MenuPage());
  20. });
  21. }
  22. public function testAddMenu()
  23. {
  24. $this->browse(function (Browser $browser) {
  25. $item = [
  26. 'parent_id' => '0',
  27. 'title' => 'Test',
  28. 'uri' => 'test',
  29. 'icon' => 'fa-user',
  30. 'roles' => [1],
  31. 'permissions' => [4, 5],
  32. ];
  33. $browser
  34. ->visit(new MenuPage())
  35. ->newMenu($item)
  36. ->waitForText(__('admin.save_succeeded'), 2);
  37. $newMenuId = Menu::query()->orderByDesc('id')->first()->id;
  38. // 检测是否写入数据库
  39. $this->assertDatabase($newMenuId, $item);
  40. $this->assertEquals(8, Menu::count());
  41. });
  42. }
  43. public function testDeleteMenu()
  44. {
  45. $this->delete('admin/auth/menu/8');
  46. $this->assertEquals(7, Menu::count());
  47. }
  48. public function testEditMenu()
  49. {
  50. $this->browse(function (Browser $browser) {
  51. $newTitle = 'blablabla';
  52. $browser->visit(new MenuEditPage(1));
  53. $browser->script("$(\"input[name='title']\").val(\"{$newTitle}\")");
  54. $browser->press(__('admin.submit'))
  55. ->waitForLocation(test_admin_path('auth/menu'), 2);
  56. $this->seeInDatabase(config('admin.database.menu_table'), ['title' => $newTitle])
  57. ->assertEquals(7, Menu::count());
  58. });
  59. }
  60. public function testEditMenuParent()
  61. {
  62. $this->browse(function (Browser $browser) {
  63. $id = 5;
  64. $browser->visit(new MenuEditPage($id))
  65. ->within(new Select2('select[name="parent_id"]'), function ($browser) use ($id) {
  66. $browser->choose($id);
  67. })
  68. ->press(__('admin.submit'))
  69. ->waitForText('500 Internal Server Error', 2);
  70. });
  71. }
  72. public function testQuickEditMenu()
  73. {
  74. $this->browse(function (Browser $browser) {
  75. $id = 5;
  76. $updates = [
  77. 'title' => 'balabala',
  78. 'icon' => 'fa-list',
  79. 'parent_id' => 0,
  80. 'roles' => 1,
  81. 'permissions' => [4, 5, 6],
  82. ];
  83. $browser->visit(new MenuPage())
  84. ->within(sprintf('li[data-id="%d"]', $id), function (Browser $browser) {
  85. $browser->click('.tree-quick-edit');
  86. })
  87. ->whenAvailable('.layui-layer-page', function (Browser $browser) use ($id, $updates) {
  88. $browser->whenElementAvailable(new MenuEditForm($id), function (Browser $browser) use ($updates) {
  89. // 检测表单
  90. $browser->fill($updates);
  91. }, 3)
  92. ->assertSee(__('admin.edit'))
  93. ->click('div')
  94. ->whenElementAvailable(new MultipleSelect2('select[name="roles[]"]'), function (Browser $browser) {
  95. $browser->choose(1);
  96. }, 2)
  97. ->clickLink(__('admin.submit'));
  98. }, 3)
  99. ->waitForText(__('admin.update_succeeded'), 3)
  100. ->waitForLocation(test_admin_path('auth/menu'), 2)
  101. ->waitForText('balabala', 2);
  102. // 检测是否写入数据库
  103. $this->assertDatabase($id, $updates);
  104. });
  105. }
  106. private function assertDatabase($id, $updates)
  107. {
  108. $roles = $updates['roles'];
  109. $permissions = $updates['permissions'];
  110. unset($updates['roles'], $updates['permissions']);
  111. // 检测是否写入数据库
  112. $this->seeInDatabase(config('admin.database.menu_table'), $updates);
  113. foreach ((array) $roles as $role) {
  114. $this->seeInDatabase(
  115. config('admin.database.role_menu_table'),
  116. ['role_id' => $role, 'menu_id' => $id]
  117. );
  118. }
  119. foreach ((array) $permissions as $permission) {
  120. $this->seeInDatabase(
  121. config('admin.database.permission_menu_table'),
  122. ['permission_id' => $permission, 'menu_id' => $id]
  123. );
  124. }
  125. }
  126. }