From c0a22f58766120d70caae8853e8ab4a3e20368ef Mon Sep 17 00:00:00 2001
From: tjz <415800467@qq.com>
Date: Fri, 18 May 2018 21:09:52 +0800
Subject: [PATCH] test: add auto-complate test

---
 .../auto-complete/__tests__/index.test.js     | 32 ++++++++++++
 components/auto-complete/index.jsx            | 16 +++---
 tests/shared/focusTest.js                     | 52 +++++++++++++++++++
 3 files changed, 90 insertions(+), 10 deletions(-)
 create mode 100644 components/auto-complete/__tests__/index.test.js
 create mode 100644 tests/shared/focusTest.js

diff --git a/components/auto-complete/__tests__/index.test.js b/components/auto-complete/__tests__/index.test.js
new file mode 100644
index 000000000..0d4b9a58a
--- /dev/null
+++ b/components/auto-complete/__tests__/index.test.js
@@ -0,0 +1,32 @@
+import { mount } from '@vue/test-utils'
+import { render } from '@vue/server-test-utils'
+import Vue from 'vue'
+import AutoComplete from '..'
+import focusTest from '../../../tests/shared/focusTest'
+
+describe('AutoComplete with Custom Input Element Render', () => {
+  focusTest(AutoComplete)
+  function $$ (className) {
+    return document.body.querySelectorAll(className)
+  }
+  it('AutoComplete with custom Input render perfectly', (done) => {
+    const wrapper = mount({
+      render (h) {
+        return <AutoComplete ref='component' dataSource={['12345', '23456', '34567']}>
+          <input />
+        </AutoComplete>
+      },
+    }, { attachToDocument: true, sync: false })
+    expect(wrapper.findAll('input').length).toBe(1)
+    const input = wrapper.find('input')
+    input.element.value = '123'
+    input.trigger('input')
+    Vue.nextTick(() => {
+      const popupComponent = wrapper.find({ name: 'Trigger' }).vm._component
+      expect($$('.ant-select-dropdown-menu-item').length).toBe(3)
+      expect(popupComponent).not.toBe(null)
+      expect(popupComponent).not.toBe(undefined)
+      done()
+    })
+  })
+})
diff --git a/components/auto-complete/index.jsx b/components/auto-complete/index.jsx
index 89a2628ba..e7dcc99ef 100644
--- a/components/auto-complete/index.jsx
+++ b/components/auto-complete/index.jsx
@@ -63,19 +63,15 @@ export default {
     },
 
     focus () {
-      this.$nextTick(() => {
-        if (this.$refs.select) {
-          this.$refs.select.focus()
-        }
-      })
+      if (this.$refs.select) {
+        this.$refs.select.focus()
+      }
     },
 
     blur () {
-      this.$nextTick(() => {
-        if (this.$refs.select) {
-          this.$refs.select.blur()
-        }
-      })
+      if (this.$refs.select) {
+        this.$refs.select.blur()
+      }
     },
   },
 
diff --git a/tests/shared/focusTest.js b/tests/shared/focusTest.js
new file mode 100644
index 000000000..943b8e302
--- /dev/null
+++ b/tests/shared/focusTest.js
@@ -0,0 +1,52 @@
+import { mount } from '@vue/test-utils'
+import Vue from 'vue'
+export default function focusTest (Component) {
+  describe('focus and blur', () => {
+    beforeAll(() => {
+      jest.useFakeTimers()
+    })
+
+    afterAll(() => {
+      jest.useRealTimers()
+    })
+
+    it('focus() and onFocus', () => {
+      const handleFocus = jest.fn()
+      const wrapper = mount({
+        render (h) {
+          return <Component ref='component' onFocus={handleFocus} />
+        },
+      }, { attachToDocument: true, sync: false })
+      wrapper.vm.$refs.component.focus()
+      jest.runAllTimers()
+      expect(handleFocus).toBeCalled()
+    })
+
+    it('blur() and onBlur', () => {
+      const handleBlur = jest.fn()
+      const wrapper = mount({
+        render (h) {
+          return <Component ref='component' onBlur={handleBlur} />
+        },
+      }, { attachToDocument: true, sync: false })
+      wrapper.vm.$refs.component.focus()
+      wrapper.vm.$refs.component.blur()
+      jest.runAllTimers()
+      expect(handleBlur).toBeCalled()
+    })
+
+    it('autoFocus', (done) => {
+      jest.useRealTimers()
+      const handleFocus = jest.fn()
+      mount({
+        render (h) {
+          return <Component autoFocus onFocus={handleFocus} />
+        },
+      }, { attachToDocument: true, sync: false })
+      setTimeout(() => {
+        expect(handleFocus).toBeCalled()
+        done()
+      }, 1000)
+    })
+  })
+}