123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- import { mount } from "@vue/test-utils"
- import autocomplete from "../AutoComplete"
- const props = {
- placeholder: "",
- value: "",
- spellcheck: false,
- source: ["app", "apple", "appliance", "brian", "bob", "alice"],
- }
- // ["pp", "pple", "ppliance", "lice"]
- const suggestionStr = props.source
- .filter((str) => str.startsWith("a"))
- .map((str) => str.slice(1))
- const factory = (props) =>
- mount(autocomplete, {
- propsData: props,
- })
- describe("autocomplete", () => {
- test("mounts properly", () => {
- const wrapper = factory(props)
- expect(wrapper).toBeTruthy()
- })
- test("emits input event on text update [v-model compat]", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("testval")
- await wrapper.vm.$nextTick()
- expect(wrapper.emitted("input")).toBeTruthy()
- expect(wrapper.emitted("input").length).toEqual(1)
- })
- test("shows matching suggestions", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("a")
- await wrapper.vm.$nextTick()
- const suggestions = wrapper.findAll("li").wrappers.map((el) => el.text())
- suggestionStr.forEach((str) => expect(suggestions).toContain(str))
- })
- test("doesnt show non-matching suggestions", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("b")
- await wrapper.vm.$nextTick()
- const suggestions = wrapper.findAll("li").wrappers.map((el) => el.text())
- suggestionStr.forEach((str) => expect(suggestions).not.toContain(str))
- })
- test("updates suggestions on input", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("b")
- await wrapper.vm.$nextTick()
- const suggestions = wrapper.findAll("li").wrappers.map((el) => el.text())
- suggestionStr.forEach((str) => expect(suggestions).not.toContain(str))
- })
- test("applies suggestion on clicking", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("b")
- await wrapper.vm.$nextTick()
- const selectedSuggestion = wrapper.findAll("li").at(0)
- const selectedText = selectedSuggestion.text()
- await selectedSuggestion.trigger("click")
- await wrapper.vm.$nextTick()
- expect(input.element.value).toEqual(`b${selectedText}`)
- })
- test("hide selection on pressing ESC", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("b")
- await wrapper.vm.$nextTick()
- await input.trigger("keyup", { code: "Escape" })
- await wrapper.vm.$nextTick()
- expect(wrapper.find("ul").exists()).toEqual(false)
- })
- test("pressing up when nothing is selected selects the first in the list", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("a")
- await wrapper.vm.$nextTick()
- await input.trigger("keydown", {
- code: "ArrowUp",
- })
- await wrapper.vm.$nextTick()
- expect(
- wrapper.findAll("li").at(0).element.classList.contains("active")
- ).toEqual(true)
- })
- test("pressing down arrow when nothing is selected selects the first in the list", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("a")
- await wrapper.vm.$nextTick()
- await input.trigger("keydown", {
- code: "ArrowDown",
- })
- await wrapper.vm.$nextTick()
- expect(
- wrapper.findAll("li").at(0).element.classList.contains("active")
- ).toEqual(true)
- })
- test("pressing down arrow moves down the selection list", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("a")
- await wrapper.vm.$nextTick()
- await input.trigger("keydown", {
- code: "ArrowDown",
- })
- await wrapper.vm.$nextTick()
- await input.trigger("keydown", {
- code: "ArrowDown",
- })
- await wrapper.vm.$nextTick()
- expect(
- wrapper.findAll("li").at(1).element.classList.contains("active")
- ).toEqual(true)
- })
- test("pressing up arrow moves up the selection list", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("a")
- await wrapper.vm.$nextTick()
- await input.trigger("keydown", {
- code: "ArrowDown",
- })
- await wrapper.vm.$nextTick()
- await input.trigger("keydown", {
- code: "ArrowDown",
- })
- await wrapper.vm.$nextTick()
- await input.trigger("keydown", {
- code: "ArrowUp",
- })
- await wrapper.vm.$nextTick()
- expect(
- wrapper.findAll("li").at(0).element.classList.contains("active")
- ).toEqual(true)
- })
- test("pressing down arrow at the end of the list doesn't update the selection", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("b")
- await wrapper.vm.$nextTick()
- await input.trigger("keydown", {
- code: "ArrowDown",
- })
- await wrapper.vm.$nextTick()
- await input.trigger("keydown", {
- code: "ArrowDown",
- })
- await wrapper.vm.$nextTick()
- expect(
- wrapper.findAll("li").at(1).element.classList.contains("active")
- ).toEqual(true)
- await input.trigger("keydown", {
- code: "ArrowDown",
- })
- await wrapper.vm.$nextTick()
- expect(
- wrapper.findAll("li").at(1).element.classList.contains("active")
- ).toEqual(true)
- })
- test("pressing up arrow at the top of the list doesn't update the selection", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("b")
- await wrapper.vm.$nextTick()
- await input.trigger("keydown", {
- code: "ArrowDown",
- })
- await wrapper.vm.$nextTick()
- await input.trigger("keydown", {
- code: "ArrowUp",
- })
- await wrapper.vm.$nextTick()
- expect(
- wrapper.findAll("li").at(0).element.classList.contains("active")
- ).toEqual(true)
- await input.trigger("keydown", {
- code: "ArrowUp",
- })
- await wrapper.vm.$nextTick()
- expect(
- wrapper.findAll("li").at(0).element.classList.contains("active")
- ).toEqual(true)
- })
- test("pressing tab performs the current completion", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("a")
- await wrapper.vm.$nextTick()
- await input.trigger("keydown", {
- code: "ArrowDown",
- })
- await wrapper.vm.$nextTick()
- const selectedSuggestion = wrapper.find("li.active").text()
- await input.trigger("keydown", {
- code: "Tab",
- })
- await wrapper.vm.$nextTick()
- expect(input.element.value).toEqual(`a${selectedSuggestion}`)
- })
- test("pressing tab when nothing is selected selects the first suggestion", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("a")
- await wrapper.vm.$nextTick()
- const firstSuggestionText = wrapper.findAll("li").at(0).text()
- await input.trigger("keydown", {
- code: "Tab",
- })
- await wrapper.vm.$nextTick()
- expect(input.element.value).toEqual(`a${firstSuggestionText}`)
- })
- test("pressing any non-special key doesn't do anything", async () => {
- const wrapper = factory(props)
- const input = wrapper.find("input")
- await input.setValue("a")
- await wrapper.vm.$nextTick()
- await input.trigger("keydown", {
- code: "ArrowDown",
- })
- await wrapper.vm.$nextTick()
- const selectedSuggestion = wrapper.find("li.active").text()
- await input.trigger("keydown", {
- code: "Tab",
- })
- await wrapper.vm.$nextTick()
- expect(input.element.value).toEqual(`a${selectedSuggestion}`)
- })
- })
|