MenuTest.php 4.8 KB

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