text: import { initEmojiMock } from 'helpers/emoji';
  import Emoji from '~/content_editor/extensions/emoji';
  import { createTestEditor, createDocBuilder, triggerNodeInputRule } from '../test_utils';
  
  describe('content_editor/extensions/emoji', () => {
    let tiptapEditor;
    let doc;
    let p;
    let emoji;
    let eq;
  
    beforeEach(async () => {
      await initEmojiMock();
    });
  
    beforeEach(() => {
      tiptapEditor = createTestEditor({ extensions: [Emoji] });
      ({
        builders: { doc, p, emoji },
        eq,
      } = createDocBuilder({
        tiptapEditor,
        names: {
          loading: { nodeType: Emoji.name },
        },
      }));
    });
  
    describe('when typing a valid emoji input rule', () => {
      it('inserts an emoji node', () => {
        const expectedDoc = doc(
          p(
            ' ',
            emoji({ moji: '❤', name: 'heart', title: 'heavy black heart', unicodeVersion: '1.1' }),
          ),
        );
  
        triggerNodeInputRule({ tiptapEditor, inputRuleText: ':heart:' });
  
        expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
      });
    });
  
    describe('when typing a invalid emoji input rule', () => {
      it('does not insert an emoji node', () => {
        const { view } = tiptapEditor;
        const { selection } = view.state;
        const invalidEmoji = ':invalid:';
        const expectedDoc = doc(p());
        // Triggers the event handler that input rules listen to
        view.someProp('handleTextInput', (f) => f(view, selection.from, selection.to, invalidEmoji));
        expect(eq(tiptapEditor.state.doc, expectedDoc)).toBe(true);
      });
    });
  });
  