diff options
author | kibigo! <marrus-sh@users.noreply.github.com> | 2017-10-11 10:43:10 -0700 |
---|---|---|
committer | kibigo! <marrus-sh@users.noreply.github.com> | 2017-10-11 10:43:10 -0700 |
commit | 8d6b9ba4946b5b159af0fbd130637a226a286796 (patch) | |
tree | 9def26711682d29338cfa1b081822029a01669eb /spec/javascript | |
parent | f0a2a6c875e9294f0ea1d4c6bc90529e41a2dc37 (diff) | |
parent | 476e79b8e340c9103352a0799e102e4aca1a5593 (diff) |
Merge upstream 2.0ish #165
Diffstat (limited to 'spec/javascript')
-rw-r--r-- | spec/javascript/components/avatar.test.js | 14 | ||||
-rw-r--r-- | spec/javascript/components/avatar_overlay.test.js | 10 | ||||
-rw-r--r-- | spec/javascript/components/button.test.js | 23 | ||||
-rw-r--r-- | spec/javascript/components/display_name.test.js | 7 | ||||
-rw-r--r-- | spec/javascript/components/emoji_index.test.js | 111 | ||||
-rw-r--r-- | spec/javascript/components/emojify.test.js | 16 | ||||
-rw-r--r-- | spec/javascript/setup.js | 8 |
7 files changed, 161 insertions, 28 deletions
diff --git a/spec/javascript/components/avatar.test.js b/spec/javascript/components/avatar.test.js index ee40812ca..34949f2b5 100644 --- a/spec/javascript/components/avatar.test.js +++ b/spec/javascript/components/avatar.test.js @@ -1,8 +1,9 @@ +import React from 'react'; +import Avatar from '../../../app/javascript/mastodon/components/avatar'; + import { expect } from 'chai'; import { render } from 'enzyme'; import { fromJS } from 'immutable'; -import React from 'react'; -import Avatar from '../../../app/javascript/mastodon/components/avatar'; describe('<Avatar />', () => { const account = fromJS({ @@ -12,27 +13,28 @@ describe('<Avatar />', () => { avatar: '/animated/alice.gif', avatar_static: '/static/alice.jpg', }); + const size = 100; const animated = render(<Avatar account={account} animate size={size} />); const still = render(<Avatar account={account} size={size} />); // Autoplay - it('renders a div element with the given src as background', () => { + xit('renders a div element with the given src as background', () => { expect(animated.find('div')).to.have.style('background-image', `url(${account.get('avatar')})`); }); - it('renders a div element of the given size', () => { + xit('renders a div element of the given size', () => { ['width', 'height'].map((attr) => { expect(animated.find('div')).to.have.style(attr, `${size}px`); }); }); // Still - it('renders a div element with the given static src as background if not autoplay', () => { + xit('renders a div element with the given static src as background if not autoplay', () => { expect(still.find('div')).to.have.style('background-image', `url(${account.get('avatar_static')})`); }); - it('renders a div element of the given size if not autoplay', () => { + xit('renders a div element of the given size if not autoplay', () => { ['width', 'height'].map((attr) => { expect(still.find('div')).to.have.style(attr, `${size}px`); }); diff --git a/spec/javascript/components/avatar_overlay.test.js b/spec/javascript/components/avatar_overlay.test.js index a8f0e13d5..fe1d3a012 100644 --- a/spec/javascript/components/avatar_overlay.test.js +++ b/spec/javascript/components/avatar_overlay.test.js @@ -1,8 +1,9 @@ +import React from 'react'; +import AvatarOverlay from '../../../app/javascript/mastodon/components/avatar_overlay'; + import { expect } from 'chai'; import { render } from 'enzyme'; import { fromJS } from 'immutable'; -import React from 'react'; -import AvatarOverlay from '../../../app/javascript/mastodon/components/avatar_overlay'; describe('<Avatar />', () => { const account = fromJS({ @@ -12,6 +13,7 @@ describe('<Avatar />', () => { avatar: '/animated/alice.gif', avatar_static: '/static/alice.jpg', }); + const friend = fromJS({ username: 'eve', acct: 'eve@blackhat.lair', @@ -22,12 +24,12 @@ describe('<Avatar />', () => { const overlay = render(<AvatarOverlay account={account} friend={friend} />); - it('renders account static src as base of overlay avatar', () => { + xit('renders account static src as base of overlay avatar', () => { expect(overlay.find('.account__avatar-overlay-base')) .to.have.style('background-image', `url(${account.get('avatar_static')})`); }); - it('renders friend static src as overlay of overlay avatar', () => { + xit('renders friend static src as overlay of overlay avatar', () => { expect(overlay.find('.account__avatar-overlay-overlay')) .to.have.style('background-image', `url(${friend.get('avatar_static')})`); }); diff --git a/spec/javascript/components/button.test.js b/spec/javascript/components/button.test.js index 9cf8b1eed..d2cd0b4e7 100644 --- a/spec/javascript/components/button.test.js +++ b/spec/javascript/components/button.test.js @@ -1,16 +1,17 @@ +import React from 'react'; +import Button from '../../../app/javascript/mastodon/components/button'; + import { expect } from 'chai'; import { shallow } from 'enzyme'; import sinon from 'sinon'; -import React from 'react'; -import Button from '../../../app/javascript/mastodon/components/button'; describe('<Button />', () => { - it('renders a button element', () => { + xit('renders a button element', () => { const wrapper = shallow(<Button />); expect(wrapper).to.match('button'); }); - it('renders the given text', () => { + xit('renders the given text', () => { const text = 'foo'; const wrapper = shallow(<Button text={text} />); expect(wrapper.find('button')).to.have.text(text); @@ -30,18 +31,18 @@ describe('<Button />', () => { expect(handler.called).to.equal(false); }); - it('renders a disabled attribute if props.disabled given', () => { + xit('renders a disabled attribute if props.disabled given', () => { const wrapper = shallow(<Button disabled />); expect(wrapper.find('button')).to.be.disabled(); }); - it('renders the children', () => { + xit('renders the children', () => { const children = <p>children</p>; const wrapper = shallow(<Button>{children}</Button>); expect(wrapper.find('button')).to.contain(children); }); - it('renders the props.text instead of children', () => { + xit('renders the props.text instead of children', () => { const text = 'foo'; const children = <p>children</p>; const wrapper = shallow(<Button text={text}>{children}</Button>); @@ -49,22 +50,22 @@ describe('<Button />', () => { expect(wrapper.find('button')).to.not.contain(children); }); - it('renders style="display: block; width: 100%;" if props.block given', () => { + xit('renders style="display: block; width: 100%;" if props.block given', () => { const wrapper = shallow(<Button block />); expect(wrapper.find('button')).to.have.className('button--block'); }); - it('renders style="display: inline-block; width: auto;" by default', () => { + xit('renders style="display: inline-block; width: auto;" by default', () => { const wrapper = shallow(<Button />); expect(wrapper.find('button')).to.not.have.className('button--block'); }); - it('adds class "button-secondary" if props.secondary given', () => { + xit('adds class "button-secondary" if props.secondary given', () => { const wrapper = shallow(<Button secondary />); expect(wrapper.find('button')).to.have.className('button-secondary'); }); - it('does not add class "button-secondary" by default', () => { + xit('does not add class "button-secondary" by default', () => { const wrapper = shallow(<Button />); expect(wrapper.find('button')).to.not.have.className('button-secondary'); }); diff --git a/spec/javascript/components/display_name.test.js b/spec/javascript/components/display_name.test.js index ab484cf3e..97a111894 100644 --- a/spec/javascript/components/display_name.test.js +++ b/spec/javascript/components/display_name.test.js @@ -1,11 +1,12 @@ +import React from 'react'; +import DisplayName from '../../../app/javascript/mastodon/components/display_name'; + import { expect } from 'chai'; import { render } from 'enzyme'; import { fromJS } from 'immutable'; -import React from 'react'; -import DisplayName from '../../../app/javascript/mastodon/components/display_name'; describe('<DisplayName />', () => { - it('renders display name + account name', () => { + xit('renders display name + account name', () => { const account = fromJS({ username: 'bar', acct: 'bar@baz', diff --git a/spec/javascript/components/emoji_index.test.js b/spec/javascript/components/emoji_index.test.js new file mode 100644 index 000000000..cdb50cb8c --- /dev/null +++ b/spec/javascript/components/emoji_index.test.js @@ -0,0 +1,111 @@ +import { expect } from 'chai'; +import { search } from '../../../app/javascript/mastodon/features/emoji/emoji_mart_search_light'; +import { emojiIndex } from 'emoji-mart'; +import { pick } from 'lodash'; + +const trimEmojis = emoji => pick(emoji, ['id', 'unified', 'native', 'custom']); + +// hack to fix https://github.com/chaijs/type-detect/issues/98 +// see: https://github.com/chaijs/type-detect/issues/98#issuecomment-325010785 +import jsdom from 'jsdom'; +global.window = new jsdom.JSDOM().window; +global.document = window.document; +global.HTMLElement = window.HTMLElement; + +describe('emoji_index', () => { + + it('should give same result for emoji_index_light and emoji-mart', () => { + let expected = [{ + id: 'pineapple', + unified: '1f34d', + native: '🍍', + }]; + expect(search('pineapple').map(trimEmojis)).to.deep.equal(expected); + expect(emojiIndex.search('pineapple').map(trimEmojis)).to.deep.equal(expected); + }); + + it('orders search results correctly', () => { + let expected = [{ + id: 'apple', + unified: '1f34e', + native: '🍎', + }, { + id: 'pineapple', + unified: '1f34d', + native: '🍍', + }, { + id: 'green_apple', + unified: '1f34f', + native: '🍏', + }, { + id: 'iphone', + unified: '1f4f1', + native: '📱', + }]; + expect(search('apple').map(trimEmojis)).to.deep.equal(expected); + expect(emojiIndex.search('apple').map(trimEmojis)).to.deep.equal(expected); + }); + + it('handles custom emoji', () => { + let custom = [{ + id: 'mastodon', + name: 'mastodon', + short_names: ['mastodon'], + text: '', + emoticons: [], + keywords: ['mastodon'], + imageUrl: 'http://example.com', + custom: true, + }]; + search('', { custom }); + emojiIndex.search('', { custom }); + let expected = [ { id: 'mastodon', custom: true } ]; + expect(search('masto').map(trimEmojis)).to.deep.equal(expected); + expect(emojiIndex.search('masto').map(trimEmojis)).to.deep.equal(expected); + }); + + it('should filter only emojis we care about, exclude pineapple', () => { + let emojisToShowFilter = (unified) => unified !== '1F34D'; + expect(search('apple', { emojisToShowFilter }).map((obj) => obj.id)) + .not.to.contain('pineapple'); + expect(emojiIndex.search('apple', { emojisToShowFilter }).map((obj) => obj.id)) + .not.to.contain('pineapple'); + }); + + it('can include/exclude categories', () => { + expect(search('flag', { include: ['people'] })) + .to.deep.equal([]); + expect(emojiIndex.search('flag', { include: ['people'] })) + .to.deep.equal([]); + }); + + it('does an emoji whose unified name is irregular', () => { + let expected = [{ + 'id': 'water_polo', + 'unified': '1f93d', + 'native': '🤽', + }, { + 'id': 'man-playing-water-polo', + 'unified': '1f93d-200d-2642-fe0f', + 'native': '🤽♂️', + }, { + 'id': 'woman-playing-water-polo', + 'unified': '1f93d-200d-2640-fe0f', + 'native': '🤽♀️', + }]; + expect(search('polo').map(trimEmojis)).to.deep.equal(expected); + expect(emojiIndex.search('polo').map(trimEmojis)).to.deep.equal(expected); + }); + + it('can search for thinking_face', () => { + let expected = [ { id: 'thinking_face', unified: '1f914', native: '🤔' } ]; + expect(search('thinking_fac').map(trimEmojis)).to.deep.equal(expected); + expect(emojiIndex.search('thinking_fac').map(trimEmojis)).to.deep.equal(expected); + }); + + it('can search for woman-facepalming', () => { + let expected = [ { id: 'woman-facepalming', unified: '1f926-200d-2640-fe0f', native: '🤦♀️' } ]; + expect(search('woman-facep').map(trimEmojis)).to.deep.equal(expected); + expect(emojiIndex.search('woman-facep').map(trimEmojis)).deep.equal(expected); + }); +}); diff --git a/spec/javascript/components/emojify.test.js b/spec/javascript/components/emojify.test.js index 6e73c9251..3105c8e3f 100644 --- a/spec/javascript/components/emojify.test.js +++ b/spec/javascript/components/emojify.test.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import emojify from '../../../app/javascript/mastodon/emoji'; +import emojify from '../../../app/javascript/mastodon/features/emoji/emoji'; describe('emojify', () => { it('ignores unknown shortcodes', () => { @@ -44,4 +44,18 @@ describe('emojify', () => { it('ignores unicode inside of tags', () => { expect(emojify('<p data-foo="\uD83D\uDC69\uD83D\uDC69\uD83D\uDC66"></p>')).to.equal('<p data-foo="\uD83D\uDC69\uD83D\uDC69\uD83D\uDC66"></p>'); }); + + it('does multiple emoji properly (issue 5188)', () => { + expect(emojify('👌🌈💕')).to.equal('<img draggable="false" class="emojione" alt="👌" title=":ok_hand:" src="/emoji/1f44c.svg" /><img draggable="false" class="emojione" alt="🌈" title=":rainbow:" src="/emoji/1f308.svg" /><img draggable="false" class="emojione" alt="💕" title=":two_hearts:" src="/emoji/1f495.svg" />'); + expect(emojify('👌 🌈 💕')).to.equal('<img draggable="false" class="emojione" alt="👌" title=":ok_hand:" src="/emoji/1f44c.svg" /> <img draggable="false" class="emojione" alt="🌈" title=":rainbow:" src="/emoji/1f308.svg" /> <img draggable="false" class="emojione" alt="💕" title=":two_hearts:" src="/emoji/1f495.svg" />'); + }); + + it('does an emoji that has no shortcode', () => { + expect(emojify('🕉️')).to.equal('<img draggable="false" class="emojione" alt="🕉️" title="" src="/emoji/1f549.svg" />'); + }); + + it('does an emoji whose filename is irregular', () => { + expect(emojify('↙️')).to.equal('<img draggable="false" class="emojione" alt="↙️" title=":arrow_lower_left:" src="/emoji/2199.svg" />'); + }); + }); diff --git a/spec/javascript/setup.js b/spec/javascript/setup.js index c9c8aed07..ab8a36b95 100644 --- a/spec/javascript/setup.js +++ b/spec/javascript/setup.js @@ -1,11 +1,13 @@ import { JSDOM } from 'jsdom'; -import chai from 'chai'; -import chaiEnzyme from 'chai-enzyme'; -chai.use(chaiEnzyme()); +import Enzyme from 'enzyme'; +import Adapter from 'enzyme-adapter-react-16'; + +Enzyme.configure({ adapter: new Adapter() }); const { window } = new JSDOM('', { userAgent: 'node.js', }); + Object.keys(window).forEach(property => { if (typeof global[property] === 'undefined') { global[property] = window[property]; |