summaryrefslogtreecommitdiff
path: root/spec/frontend/content_editor/components/toolbar_table_button_spec.js
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/content_editor/components/toolbar_table_button_spec.js')
-rw-r--r--spec/frontend/content_editor/components/toolbar_table_button_spec.js109
1 files changed, 109 insertions, 0 deletions
diff --git a/spec/frontend/content_editor/components/toolbar_table_button_spec.js b/spec/frontend/content_editor/components/toolbar_table_button_spec.js
new file mode 100644
index 00000000000..237b2848246
--- /dev/null
+++ b/spec/frontend/content_editor/components/toolbar_table_button_spec.js
@@ -0,0 +1,109 @@
+import { GlDropdown, GlButton } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import ToolbarTableButton from '~/content_editor/components/toolbar_table_button.vue';
+import { tiptapExtension as Table } from '~/content_editor/extensions/table';
+import { tiptapExtension as TableCell } from '~/content_editor/extensions/table_cell';
+import { tiptapExtension as TableHeader } from '~/content_editor/extensions/table_header';
+import { tiptapExtension as TableRow } from '~/content_editor/extensions/table_row';
+import { createTestEditor, mockChainedCommands } from '../test_utils';
+
+describe('content_editor/components/toolbar_table_button', () => {
+ let wrapper;
+ let editor;
+
+ const buildWrapper = () => {
+ wrapper = mountExtended(ToolbarTableButton, {
+ propsData: {
+ tiptapEditor: editor,
+ },
+ });
+ };
+
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const getNumButtons = () => findDropdown().findAllComponents(GlButton).length;
+
+ beforeEach(() => {
+ editor = createTestEditor({
+ extensions: [Table, TableCell, TableRow, TableHeader],
+ });
+
+ buildWrapper();
+ });
+
+ afterEach(() => {
+ editor.destroy();
+ wrapper.destroy();
+ });
+
+ it('renders a grid of 3x3 buttons to create a table', () => {
+ expect(getNumButtons()).toBe(9); // 3 x 3
+ });
+
+ describe.each`
+ row | col | numButtons | tableSize
+ ${1} | ${2} | ${9} | ${'1x2'}
+ ${2} | ${2} | ${9} | ${'2x2'}
+ ${2} | ${3} | ${12} | ${'2x3'}
+ ${3} | ${2} | ${12} | ${'3x2'}
+ ${3} | ${3} | ${16} | ${'3x3'}
+ `('button($row, $col) in the table creator grid', ({ row, col, numButtons, tableSize }) => {
+ describe('on mouse over', () => {
+ beforeEach(async () => {
+ const button = wrapper.findByTestId(`table-${row}-${col}`);
+ await button.trigger('mouseover');
+ });
+
+ it('marks all rows and cols before it as active', () => {
+ const prevRow = Math.max(1, row - 1);
+ const prevCol = Math.max(1, col - 1);
+ expect(wrapper.findByTestId(`table-${prevRow}-${prevCol}`).element).toHaveClass(
+ 'gl-bg-blue-50!',
+ );
+ });
+
+ it('shows a help text indicating the size of the table being inserted', () => {
+ expect(findDropdown().element).toHaveText(`Insert a ${tableSize} table.`);
+ });
+
+ it('adds another row and col of buttons to create a bigger table', () => {
+ expect(getNumButtons()).toBe(numButtons);
+ });
+ });
+
+ describe('on click', () => {
+ let commands;
+
+ beforeEach(async () => {
+ commands = mockChainedCommands(editor, ['focus', 'insertTable', 'run']);
+
+ const button = wrapper.findByTestId(`table-${row}-${col}`);
+ await button.trigger('mouseover');
+ await button.trigger('click');
+ });
+
+ it('inserts a table with $tableSize rows and cols', () => {
+ expect(commands.focus).toHaveBeenCalled();
+ expect(commands.insertTable).toHaveBeenCalledWith({
+ rows: row,
+ cols: col,
+ withHeaderRow: true,
+ });
+ expect(commands.run).toHaveBeenCalled();
+
+ expect(wrapper.emitted().execute).toHaveLength(1);
+ });
+ });
+ });
+
+ it('does not create more buttons than a 8x8 grid', async () => {
+ for (let i = 3; i < 8; i += 1) {
+ expect(getNumButtons()).toBe(i * i);
+
+ // eslint-disable-next-line no-await-in-loop
+ await wrapper.findByTestId(`table-${i}-${i}`).trigger('mouseover');
+ expect(findDropdown().element).toHaveText(`Insert a ${i}x${i} table.`);
+ }
+
+ expect(getNumButtons()).toBe(64); // 8x8 (and not 9x9)
+ });
+});