|
|
@@ -0,0 +1,173 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace Tests\Browser\Components\Form\Field;
|
|
|
+
|
|
|
+use Laravel\Dusk\Browser;
|
|
|
+use PHPUnit\Framework\Assert as PHPUnit;
|
|
|
+use Tests\Browser\Components\Component;
|
|
|
+
|
|
|
+class HasMany extends Component
|
|
|
+{
|
|
|
+ protected $relation;
|
|
|
+
|
|
|
+ public function __construct($relation = null)
|
|
|
+ {
|
|
|
+ $this->relation = $relation;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取组件的 root selector.
|
|
|
+ *
|
|
|
+ * @return string
|
|
|
+ */
|
|
|
+ public function selector()
|
|
|
+ {
|
|
|
+ return '@container';
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 浏览器包含组件的断言
|
|
|
+ *
|
|
|
+ * @param Browser $browser
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ public function assert(Browser $browser)
|
|
|
+ {
|
|
|
+ $browser->assertVisible('@container')
|
|
|
+ ->assertVisible('@add')
|
|
|
+ ->assertVisible('@forms');
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读取组件的元素快捷方式.
|
|
|
+ *
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ public function elements()
|
|
|
+ {
|
|
|
+ return [
|
|
|
+ '@container' => '.has-many-'.$this->relation,
|
|
|
+ '@add' => '.add',
|
|
|
+ '@remove' => '.remove',
|
|
|
+ '@forms' => ".has-many-{$this->relation}-forms",
|
|
|
+ '@group' => ".has-many-{$this->relation}-forms .fields-group",
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 点击添加按钮.
|
|
|
+ *
|
|
|
+ * @param Browser $browser
|
|
|
+ *
|
|
|
+ * @return int
|
|
|
+ */
|
|
|
+ public function add(Browser $browser)
|
|
|
+ {
|
|
|
+ $browser->script(
|
|
|
+ <<<JS
|
|
|
+$('{$this->formatSelector($browser, '@add')}').click();
|
|
|
+JS
|
|
|
+ );
|
|
|
+
|
|
|
+ // 获取最后一个添加的表单组
|
|
|
+ $index = $this->getLastFormGroupIndex($browser);
|
|
|
+
|
|
|
+ // 验证表单组是否存在
|
|
|
+ $this->withFormGroup($browser, $index);
|
|
|
+
|
|
|
+ return $index;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取最后一组新增的表单索引.
|
|
|
+ *
|
|
|
+ * @param Browser $browser
|
|
|
+ *
|
|
|
+ * @return int|null
|
|
|
+ */
|
|
|
+ public function getLastFormGroupIndex(Browser $browser)
|
|
|
+ {
|
|
|
+ // 获取添加的表单个数
|
|
|
+ $length = $browser->script(
|
|
|
+ <<<JS
|
|
|
+return $('{$this->formatSelector($browser, '@group')}').length;
|
|
|
+JS
|
|
|
+ );
|
|
|
+
|
|
|
+ return $length[0] ?? null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param Browser $browser
|
|
|
+ * @param \Closure $callback
|
|
|
+ *
|
|
|
+ * @return Browser
|
|
|
+ */
|
|
|
+ public function withLastFormGroup(Browser $browser, \Closure $callback = null)
|
|
|
+ {
|
|
|
+ return $this->withFormGroup($browser, $this->getLastFormGroupIndex($browser), $callback);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检测表单组.
|
|
|
+ *
|
|
|
+ * @param Browser $browser
|
|
|
+ * @param \Closure $callback
|
|
|
+ *
|
|
|
+ * @return Browser
|
|
|
+ */
|
|
|
+ public function withFormGroup(Browser $browser, $index, ?\Closure $callback = null)
|
|
|
+ {
|
|
|
+ // 添加的表单组容器选择器
|
|
|
+ $groupSelector = $this->formatGroupSelector($browser, $index);
|
|
|
+
|
|
|
+ $browser->assertVisible($groupSelector);
|
|
|
+ $browser->assertVisible("{$groupSelector} {$this->formatSelectorWithoutPrefix($browser, '@remove')}");
|
|
|
+
|
|
|
+ return $callback ? $browser->with($groupSelector, $callback) : $browser;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param Browser $browser
|
|
|
+ * @param int $index
|
|
|
+ *
|
|
|
+ * @return string
|
|
|
+ */
|
|
|
+ protected function formatGroupSelector(Browser $browser, $index)
|
|
|
+ {
|
|
|
+ return "{$this->formatSelectorWithoutPrefix($browser, '@group')}:nth-of-type({$index})";
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 移除表单.
|
|
|
+ *
|
|
|
+ * @param Browser $browser
|
|
|
+ * @param int $index
|
|
|
+ *
|
|
|
+ * @return Browser
|
|
|
+ */
|
|
|
+ public function remove(Browser $browser, $index)
|
|
|
+ {
|
|
|
+ $this->withFormGroup($browser, $index, function (Browser $browser) {
|
|
|
+ $browser->script(
|
|
|
+ <<<JS
|
|
|
+$('{$this->formatSelector($browser, $this->elements()['@remove'])}').click();
|
|
|
+JS
|
|
|
+ );
|
|
|
+ });
|
|
|
+
|
|
|
+ return $browser->assertHidden($this->formatGroupSelector($browser, $index));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 移除最后一个表单.
|
|
|
+ *
|
|
|
+ * @param Browser $browser
|
|
|
+ *
|
|
|
+ * @return Browser
|
|
|
+ */
|
|
|
+ public function removeLast(Browser $browser)
|
|
|
+ {
|
|
|
+ return $this->remove($browser, $this->getLastFormGroupIndex($browser));
|
|
|
+ }
|
|
|
+}
|