HasMany.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. namespace Tests\Browser\Components\Form\Field;
  3. use Laravel\Dusk\Browser;
  4. use Tests\Browser\Components\Component;
  5. use Tests\PHPUnit;
  6. class HasMany extends Component
  7. {
  8. protected $relation;
  9. public function __construct($relation = null)
  10. {
  11. $this->relation = $relation;
  12. }
  13. /**
  14. * 获取组件的 root selector.
  15. *
  16. * @return string
  17. */
  18. public function selector()
  19. {
  20. return '@container';
  21. }
  22. /**
  23. * 浏览器包含组件的断言
  24. *
  25. * @param Browser $browser
  26. * @return void
  27. */
  28. public function assert(Browser $browser)
  29. {
  30. $browser->assertVisible('@container')
  31. ->assertVisible('@add')
  32. ->assertVisible('@forms');
  33. }
  34. /**
  35. * 读取组件的元素快捷方式.
  36. *
  37. * @return array
  38. */
  39. public function elements()
  40. {
  41. return [
  42. '@container' => '.has-many-'.$this->relation,
  43. '@add' => '.add',
  44. '@remove' => '.remove',
  45. '@forms' => ".has-many-{$this->relation}-forms",
  46. '@group' => ".has-many-{$this->relation}-forms .fields-group",
  47. ];
  48. }
  49. /**
  50. * 点击添加按钮.
  51. *
  52. * @param Browser $browser
  53. *
  54. * @return int
  55. */
  56. public function add(Browser $browser)
  57. {
  58. $browser->script(
  59. <<<JS
  60. $('{$this->formatSelector($browser, '@add')}').click();
  61. JS
  62. );
  63. // 获取最后一个添加的表单组
  64. $index = $this->getLastFormGroupIndex($browser);
  65. // 验证表单组是否存在
  66. $this->withFormGroup($browser, $index);
  67. return $index;
  68. }
  69. /**
  70. * 获取最后一组新增的表单索引.
  71. *
  72. * @param Browser $browser
  73. *
  74. * @return int|null
  75. */
  76. public function getLastFormGroupIndex(Browser $browser)
  77. {
  78. // 获取添加的表单个数
  79. $length = $browser->script(
  80. <<<JS
  81. return $('{$this->formatSelector($browser, '@group')}').length;
  82. JS
  83. );
  84. return $length[0] ?? null;
  85. }
  86. /**
  87. * @param Browser $browser
  88. * @param \Closure $callback
  89. *
  90. * @return Browser
  91. */
  92. public function withLastFormGroup(Browser $browser, \Closure $callback = null)
  93. {
  94. return $this->withFormGroup($browser, $this->getLastFormGroupIndex($browser), $callback);
  95. }
  96. /**
  97. * 检测表单组.
  98. *
  99. * @param Browser $browser
  100. * @param \Closure $callback
  101. *
  102. * @return Browser
  103. */
  104. public function withFormGroup(Browser $browser, $index, ?\Closure $callback = null)
  105. {
  106. // 添加的表单组容器选择器
  107. $groupSelector = $this->formatGroupSelector($browser, $index);
  108. $browser->assertVisible($groupSelector);
  109. $browser->assertVisible("{$groupSelector} {$this->formatSelectorWithoutPrefix($browser, '@remove')}");
  110. return $callback ? $browser->extend($groupSelector, $callback) : $browser;
  111. }
  112. /**
  113. * @param Browser $browser
  114. * @param int $index
  115. *
  116. * @return string
  117. */
  118. protected function formatGroupSelector(Browser $browser, $index)
  119. {
  120. return "{$this->formatSelectorWithoutPrefix($browser, '@group')}:nth-of-type({$index})";
  121. }
  122. /**
  123. * 移除表单.
  124. *
  125. * @param Browser $browser
  126. * @param int $index
  127. *
  128. * @return Browser
  129. */
  130. public function remove(Browser $browser, $index)
  131. {
  132. $this->withFormGroup($browser, $index, function (Browser $browser) {
  133. $browser->script(
  134. <<<JS
  135. $('{$this->formatSelector($browser, $this->elements()['@remove'])}').click();
  136. JS
  137. );
  138. });
  139. return $browser->assertHidden($this->formatGroupSelector($browser, $index));
  140. }
  141. /**
  142. * 移除最后一个表单.
  143. *
  144. * @param Browser $browser
  145. *
  146. * @return Browser
  147. */
  148. public function removeLast(Browser $browser)
  149. {
  150. return $this->remove($browser, $this->getLastFormGroupIndex($browser));
  151. }
  152. /**
  153. * 获取hasMany内表单字段值.
  154. *
  155. * @param Browser $browser
  156. * @param string $field
  157. * @param string $value
  158. *
  159. * @return string|null
  160. */
  161. public function assertFormGroupInputValue(Browser $browser, $field, $value)
  162. {
  163. $input = $browser->script(
  164. <<<JS
  165. return $('{$browser->resolver->format('.'.$field)}').val();
  166. JS
  167. )[0] ?? null;
  168. PHPUnit::assertEquals($input, $value);
  169. }
  170. }