HasMany.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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. $browser->scrollToBottom();
  66. // 验证表单组是否存在
  67. $this->withFormGroup($browser, $index);
  68. return $index;
  69. }
  70. /**
  71. * 获取最后一组新增的表单索引.
  72. *
  73. * @param Browser $browser
  74. *
  75. * @return int|null
  76. */
  77. public function getLastFormGroupIndex(Browser $browser)
  78. {
  79. // 获取添加的表单个数
  80. $length = $browser->script(
  81. <<<JS
  82. return $('{$this->formatSelector($browser, '@group')}').length;
  83. JS
  84. );
  85. return $length[0] ?? null;
  86. }
  87. /**
  88. * @param Browser $browser
  89. * @param \Closure $callback
  90. *
  91. * @return Browser
  92. */
  93. public function withLastFormGroup(Browser $browser, \Closure $callback = null)
  94. {
  95. return $this->withFormGroup($browser, $this->getLastFormGroupIndex($browser), $callback);
  96. }
  97. /**
  98. * 检测表单组.
  99. *
  100. * @param Browser $browser
  101. * @param \Closure $callback
  102. *
  103. * @return Browser
  104. */
  105. public function withFormGroup(Browser $browser, $index, ?\Closure $callback = null)
  106. {
  107. // 添加的表单组容器选择器
  108. $groupSelector = $this->formatGroupSelector($browser, $index);
  109. $browser->assertVisible($groupSelector);
  110. $browser->assertVisible("{$groupSelector} {$this->formatSelectorWithoutPrefix($browser, '@remove')}");
  111. return $callback ? $browser->extend($groupSelector, $callback) : $browser;
  112. }
  113. /**
  114. * @param Browser $browser
  115. * @param int $index
  116. *
  117. * @return string
  118. */
  119. protected function formatGroupSelector(Browser $browser, $index)
  120. {
  121. return "{$this->formatSelectorWithoutPrefix($browser, '@group')}:nth-of-type({$index})";
  122. }
  123. /**
  124. * 移除表单.
  125. *
  126. * @param Browser $browser
  127. * @param int $index
  128. *
  129. * @return Browser
  130. */
  131. public function remove(Browser $browser, $index)
  132. {
  133. $this->withFormGroup($browser, $index, function (Browser $browser) {
  134. $browser->script(
  135. <<<JS
  136. $('{$this->formatSelector($browser, $this->elements()['@remove'])}').click();
  137. JS
  138. );
  139. });
  140. return $browser->assertHidden($this->formatGroupSelector($browser, $index));
  141. }
  142. /**
  143. * 移除最后一个表单.
  144. *
  145. * @param Browser $browser
  146. *
  147. * @return Browser
  148. */
  149. public function removeLast(Browser $browser)
  150. {
  151. return $this->remove($browser, $this->getLastFormGroupIndex($browser));
  152. }
  153. /**
  154. * 获取hasMany内表单字段值.
  155. *
  156. * @param Browser $browser
  157. * @param string $field
  158. * @param string $value
  159. *
  160. * @return string|null
  161. */
  162. public function assertFormGroupInputValue(Browser $browser, $field, $value)
  163. {
  164. $input = $browser->script(
  165. <<<JS
  166. return $('{$browser->resolver->format('.'.$field)}').val();
  167. JS
  168. )[0] ?? null;
  169. PHPUnit::assertEquals($input, $value);
  170. }
  171. }