import componentTest from "helpers/component-test"; moduleForComponent("multi-select", { integration: true, beforeEach: function() { this.set("subject", selectKit()); } }); componentTest("with objects and values", { template: "{{multi-select content=items values=values}}", beforeEach() { this.set("items", [{ id: 1, name: "hello" }, { id: 2, name: "world" }]); this.set("values", [1, 2]); }, test(assert) { andThen(() => { assert.equal( this.get("subject") .header() .value(), "1,2" ); }); } }); componentTest("with title", { template: '{{multi-select title=(i18n "test.title")}}', beforeEach() { I18n.translations[I18n.locale].js.test = { title: "My title" }; }, test(assert) { andThen(() => assert.equal( selectKit() .header() .title(), "My title" ) ); } }); componentTest("interactions", { template: "{{multi-select none=none content=items values=values}}", beforeEach() { I18n.translations[I18n.locale].js.test = { none: "none" }; this.set("items", [ { id: 1, name: "regis" }, { id: 2, name: "sam" }, { id: 3, name: "robin" } ]); this.set("values", [1, 2]); }, test(assert) { this.get("subject").expand(); andThen(() => { assert.equal( this.get("subject") .highlightedRow() .name(), "robin", "it highlights the first content row" ); }); this.set("none", "test.none"); andThen(() => { assert.ok( this.get("subject") .noneRow() .exists() ); assert.equal( this.get("subject") .highlightedRow() .name(), "robin", "it highlights the first content row" ); }); this.get("subject").selectRowByValue(3); this.get("subject").expand(); andThen(() => { assert.equal( this.get("subject") .highlightedRow() .name(), "none", "it highlights none row if no content" ); }); this.get("subject").fillInFilter("joffrey"); andThen(() => { assert.equal( this.get("subject") .highlightedRow() .name(), "joffrey", "it highlights create row when filling filter" ); }); this.get("subject") .keyboard() .enter(); andThen(() => { assert.equal( this.get("subject") .highlightedRow() .name(), "none", "it highlights none row after creating content and no content left" ); }); this.get("subject") .keyboard() .backspace(); andThen(() => { const $lastSelectedName = this.get("subject") .header() .el() .find(".selected-name") .last(); assert.equal($lastSelectedName.attr("data-name"), "joffrey"); assert.ok( $lastSelectedName.hasClass("is-highlighted"), "it highlights the last selected name when using backspace" ); }); this.get("subject") .keyboard() .backspace(); andThen(() => { const $lastSelectedName = this.get("subject") .header() .el() .find(".selected-name") .last(); assert.equal( $lastSelectedName.attr("data-name"), "robin", "it removes the previous highlighted selected content" ); assert.notOk( this.get("subject") .rowByValue("joffrey") .exists(), "generated content shouldn’t appear in content when removed" ); }); this.get("subject") .keyboard() .selectAll(); andThen(() => { const $highlightedSelectedNames = this.get("subject") .header() .el() .find(".selected-name.is-highlighted"); assert.equal( $highlightedSelectedNames.length, 3, "it highlights each selected name" ); }); this.get("subject") .keyboard() .backspace(); andThen(() => { const $selectedNames = this.get("subject") .header() .el() .find(".selected-name"); assert.equal($selectedNames.length, 0, "it removed all selected content"); }); andThen(() => { assert.ok(this.get("subject").isFocused()); assert.ok(this.get("subject").isExpanded()); }); this.get("subject") .keyboard() .escape(); andThen(() => { assert.ok(this.get("subject").isFocused()); assert.notOk(this.get("subject").isExpanded()); }); this.get("subject") .keyboard() .escape(); andThen(() => { assert.notOk(this.get("subject").isFocused()); assert.notOk(this.get("subject").isExpanded()); }); } }); componentTest("with limitMatches", { template: "{{multi-select content=content limitMatches=2}}", beforeEach() { this.set("content", ["sam", "jeff", "neil"]); }, test(assert) { this.get("subject").expand(); andThen(() => assert.equal( this.get("subject") .el() .find(".select-kit-row").length, 2 ) ); } }); componentTest("with minimum", { template: "{{multi-select content=content minimum=1}}", beforeEach() { this.set("content", ["sam", "jeff", "neil"]); }, test(assert) { this.get("subject").expand(); andThen(() => assert.equal( this.get("subject").validationMessage(), "Select at least 1 item." ) ); this.get("subject").selectRowByValue("sam"); andThen(() => { assert.equal( this.get("subject") .header() .label(), "sam" ); }); } }); componentTest("with minimumLabel", { template: '{{multi-select content=content minimum=1 minimumLabel="test.minimum"}}', beforeEach() { I18n.translations[I18n.locale].js.test = { minimum: "min %{count}" }; this.set("content", ["sam", "jeff", "neil"]); }, test(assert) { this.get("subject").expand(); andThen(() => assert.equal(this.get("subject").validationMessage(), "min 1") ); this.get("subject").selectRowByValue("jeff"); andThen(() => { assert.equal( this.get("subject") .header() .label(), "jeff" ); }); } });