import { moduleForWidget, widgetTest } from 'helpers/widget-test';
import { createWidget } from 'discourse/widgets/widget';
import { withPluginApi } from 'discourse/lib/plugin-api';
import hbs from 'discourse/widgets/hbs-compiler';
moduleForWidget('base');
widgetTest('widget attributes are passed in via args', {
template: `{{mount-widget widget="hello-test" args=args}}`,
beforeEach() {
createWidget('hello-test', {
tagName: 'div.test',
template: hbs`Hello {{attrs.name}}`
});
this.set('args', { name: 'Robin' });
},
test(assert) {
assert.equal(this.$('.test').text(), "Hello Robin");
}
});
widgetTest("hbs template - no tagName", {
template: `{{mount-widget widget="hbs-test" args=args}}`,
beforeEach() {
createWidget('hbs-test', {
template: hbs`
Hello {{attrs.name}}
`
});
this.set('args', { name: 'Robin' });
},
test(assert) {
assert.equal(this.$('div.test').text(), "Hello Robin");
}
});
widgetTest("hbs template - with tagName", {
template: `{{mount-widget widget="hbs-test" args=args}}`,
beforeEach() {
createWidget('hbs-test', {
tagName: 'div.test',
template: hbs`Hello {{attrs.name}}`
});
this.set('args', { name: 'Robin' });
},
test(assert) {
assert.equal(this.$('div.test').text(), "Hello Robin");
}
});
widgetTest('buildClasses', {
template: `{{mount-widget widget="classname-test" args=args}}`,
beforeEach() {
createWidget('classname-test', {
tagName: 'div.test',
buildClasses(attrs) {
return ['static', attrs.dynamic];
}
});
this.set('args', { dynamic: 'cool-class' });
},
test(assert) {
assert.ok(this.$('.test.static.cool-class').length, 'it has all the classes');
}
});
widgetTest('buildAttributes', {
template: `{{mount-widget widget="attributes-test" args=args}}`,
beforeEach() {
createWidget('attributes-test', {
tagName: 'div.test',
buildAttributes(attrs) {
return { "data-evil": 'trout', "aria-label": attrs.label };
}
});
this.set('args', { label: 'accessibility' });
},
test(assert) {
assert.ok(this.$('.test[data-evil=trout]').length);
assert.ok(this.$('.test[aria-label=accessibility]').length);
}
});
widgetTest('buildId', {
template: `{{mount-widget widget="id-test" args=args}}`,
beforeEach() {
createWidget('id-test', {
buildId(attrs) {
return `test-${attrs.id}`;
}
});
this.set('args', { id: 1234 });
},
test(assert) {
assert.ok(this.$('#test-1234').length);
}
});
widgetTest('widget state', {
template: `{{mount-widget widget="state-test"}}`,
beforeEach() {
createWidget('state-test', {
tagName: 'button.test',
buildKey: () => `button-test`,
template: hbs`{{state.clicks}} clicks`,
defaultState() {
return { clicks: 0 };
},
click() {
this.state.clicks++;
}
});
},
test(assert) {
assert.ok(this.$('button.test').length, 'it renders the button');
assert.equal(this.$('button.test').text(), "0 clicks");
click(this.$('button'));
andThen(() => {
assert.equal(this.$('button.test').text(), "1 clicks");
});
}
});
widgetTest('widget update with promise', {
template: `{{mount-widget widget="promise-test"}}`,
beforeEach() {
createWidget('promise-test', {
tagName: 'button.test',
buildKey: () => 'promise-test',
template: hbs`
{{#if state.name}}
{{state.name}}
{{else}}
No name
{{/if}}
`,
click() {
return new Ember.RSVP.Promise(resolve => {
Ember.run.next(() => {
this.state.name = "Robin";
resolve();
});
});
}
});
},
test(assert) {
assert.equal(this.$('button.test').text().trim(), "No name");
click(this.$('button'));
andThen(() => {
assert.equal(this.$('button.test').text().trim(), "Robin");
});
}
});
widgetTest('widget attaching', {
template: `{{mount-widget widget="attach-test"}}`,
beforeEach() {
createWidget('test-embedded', { tagName: 'div.embedded' });
createWidget('attach-test', {
tagName: 'div.container',
template: hbs`{{attach widget="test-embedded"}}`
});
},
test(assert) {
assert.ok(this.$('.container').length, "renders container");
assert.ok(this.$('.container .embedded').length, "renders attached");
}
});
widgetTest("handlebars d-icon", {
template: `{{mount-widget widget="hbs-icon-test" args=args}}`,
beforeEach() {
createWidget('hbs-icon-test', {
template: hbs`{{d-icon "arrow-down"}}`
});
},
test(assert) {
assert.equal(this.$('i.fa.fa-arrow-down').length, 1);
}
});
widgetTest("handlebars i18n", {
template: `{{mount-widget widget="hbs-i18n-test" args=args}}`,
beforeEach() {
createWidget('hbs-i18n-test', {
template: hbs`
{{i18n "hbs_test0"}}
{{i18n attrs.key}}
test
`
});
I18n.extras = [ {
"hbs_test0": "evil",
"hbs_test1": "trout"
} ];
this.set('args', { key: 'hbs_test1' });
},
test(assert) {
// comin up
assert.equal(this.$('span.string').text(), 'evil');
assert.equal(this.$('span.var').text(), 'trout');
assert.equal(this.$('a').prop('title'), 'evil');
}
});
widgetTest('handlebars #each', {
template: `{{mount-widget widget="hbs-each-test" args=args}}`,
beforeEach() {
createWidget('hbs-each-test', {
tagName: 'ul',
template: hbs`
{{#each attrs.items as |item|}}
{{item}}
{{/each}}
`
});
this.set('args', {
items: ['one', 'two', 'three']
});
},
test(assert) {
assert.equal(this.$('ul li').length, 3);
assert.equal(this.$('ul li:eq(0)').text(), "one");
}
});
widgetTest('widget decorating', {
template: `{{mount-widget widget="decorate-test"}}`,
beforeEach() {
createWidget('decorate-test', {
tagName: 'div.decorate',
template: hbs`main content`
});
withPluginApi('0.1', api => {
api.decorateWidget('decorate-test:before', dec => {
return dec.h('b', 'before');
});
api.decorateWidget('decorate-test:after', dec => {
return dec.h('i', 'after');
});
});
},
test(assert) {
assert.ok(this.$('.decorate').length);
assert.equal(this.$('.decorate b').text(), 'before');
assert.equal(this.$('.decorate i').text(), 'after');
}
});
widgetTest('widget settings', {
template: `{{mount-widget widget="settings-test"}}`,
beforeEach() {
createWidget('settings-test', {
tagName: 'div.settings',
template: hbs`age is {{settings.age}}`,
settings: { age: 36 }
});
},
test(assert) {
assert.equal(this.$('.settings').text(), 'age is 36');
}
});
widgetTest('override settings', {
template: `{{mount-widget widget="ov-settings-test"}}`,
beforeEach() {
createWidget('ov-settings-test', {
tagName: 'div.settings',
template: hbs`age is {{settings.age}}`,
settings: { age: 36 },
});
withPluginApi('0.1', api => {
api.changeWidgetSetting('ov-settings-test', 'age', 37);
});
},
test(assert) {
assert.equal(this.$('.settings').text(), 'age is 37');
}
});