import VueSelect from "../../src/components/Select"; import { shallowMount } from "@vue/test-utils"; import { selectWithProps } from "../helpers"; describe("Labels", () => { it("can generate labels using a custom label key", () => { const Select = selectWithProps({ options: [{ name: "Foo" }], label: "name", value: { name: "Foo" } }); expect(Select.find(".vs__selected").text()).toBe("Foo"); }); it("will console.warn when options contain objects without a valid label key", async () => { const spy = jest.spyOn(console, "warn").mockImplementation(() => {}); const Select = selectWithProps({ options: [{}] }); Select.vm.open = true; await Select.vm.$nextTick(); expect(spy).toHaveBeenCalledWith( '[vue-select warn]: Label key "option.label" does not exist in options object {}.' + "\nhttps://vue-select.org/api/props.html#getoptionlabel" ); }); it("should display a placeholder if the value is empty", () => { const Select = shallowMount(VueSelect, { propsData: { options: ["one"] }, attrs: { placeholder: "foo" } }); expect(Select.vm.searchPlaceholder).toEqual("foo"); Select.vm.$data._value = "one"; expect(Select.vm.searchPlaceholder).not.toBeDefined(); }); describe("getOptionLabel", () => { it("will return undefined if the option lacks the label key", () => { const getOptionLabel = VueSelect.props.getOptionLabel.default.bind({ label: "label" }); expect(getOptionLabel({ name: "vue" })).toEqual(undefined); }); it("will return a string value for a valid key", () => { const getOptionLabel = VueSelect.props.getOptionLabel.default.bind({ label: "label" }); expect(getOptionLabel({ label: "vue" })).toEqual("vue"); }); /** * this test fails because of a bug where Vue executes the default contents * of a slot, even if it is implemented by the consumer. * @see https://github.com/vuejs/vue/issues/10224 * @see https://github.com/vuejs/vue/pull/10229 */ xit("will not call getOptionLabel if both scoped option slots are used and a filter is provided", () => { const spy = spyOn(VueSelect.props.getOptionLabel, "default"); const Select = shallowMount(VueSelect, { propsData: { options: [{ name: "one" }], filter: () => {} }, scopedSlots: { option: '{{ props.name }}', "selected-option": '{{ props.name }}' } }); Select.vm.select({ name: "one" }); expect(spy).toHaveBeenCalledTimes(0); expect(Select.find(".selected").exists()).toBeTruthy(); }); }); });