MenuTest.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. $browser->visit(new MenuEditPage(1))
  52. ->type('title', 'blablabla')
  53. ->press(__('admin.submit'))
  54. ->waitForLocation(test_admin_path('auth/menu'), 2);
  55. $this->seeInDatabase(config('admin.database.menu_table'), ['title' => 'blablabla'])
  56. ->assertEquals(7, Menu::count());
  57. });
  58. }
  59. public function testEditMenuParent()
  60. {
  61. $this->browse(function (Browser $browser) {
  62. $id = 5;
  63. $browser->visit(new MenuEditPage($id))
  64. ->within(new Select2('select[name="parent_id"]'), function ($browser) use ($id) {
  65. $browser->choose($id);
  66. })
  67. ->press(__('admin.submit'))
  68. ->waitForText('500 Internal Server Error', 2);
  69. });
  70. }
  71. public function testQuickEditMenu()
  72. {
  73. $this->browse(function (Browser $browser) {
  74. $id = 5;
  75. $updates = [
  76. 'title' => 'balabala',
  77. 'icon' => 'fa-list',
  78. 'parent_id' => 0,
  79. 'roles' => 1,
  80. 'permissions' => [4, 5, 6],
  81. ];
  82. $browser->visit(new MenuPage())
  83. ->within(sprintf('li[data-id="%d"]', $id), function (Browser $browser) {
  84. $browser->click('.tree-quick-edit');
  85. })
  86. ->whenAvailable('.layui-layer-page', function (Browser $browser) use ($id, $updates) {
  87. $browser->whenElementAvailable(new MenuEditForm($id), function (Browser $browser) use ($updates) {
  88. // 检测表单
  89. $browser->fill($updates);
  90. }, 3)
  91. ->assertSee(__('admin.edit'))
  92. ->click('div')
  93. ->whenElementAvailable(new MultipleSelect2('select[name="roles[]"]'), function (Browser $browser) {
  94. $browser->choose(1);
  95. }, 2)
  96. ->clickLink(__('admin.submit'));
  97. }, 3)
  98. ->waitForText(__('admin.update_succeeded'), 3)
  99. ->waitForLocation(test_admin_path('auth/menu'), 2)
  100. ->waitForText('balabala', 2);
  101. // 检测是否写入数据库
  102. $this->assertDatabase($id, $updates);
  103. });
  104. }
  105. private function assertDatabase($id, $updates)
  106. {
  107. $roles = $updates['roles'];
  108. $permissions = $updates['permissions'];
  109. unset($updates['roles'], $updates['permissions']);
  110. // 检测是否写入数据库
  111. return $this
  112. ->seeInDatabase(config('admin.database.menu_table'), $updates)
  113. ->seeInDatabase(
  114. config('admin.database.role_menu_table'),
  115. ['role_id' => $roles, 'menu_id' => $id]
  116. )
  117. ->seeInDatabase(
  118. config('admin.database.permission_menu_table'),
  119. ['permission_id' => $permissions, 'menu_id' => $id]
  120. );
  121. }
  122. }