✅ Add unit tests for ActionToolbar component in gamemaster module
This commit is contained in:
@@ -0,0 +1,101 @@
|
|||||||
|
/**
|
||||||
|
* ActionToolbar Component Tests
|
||||||
|
* Verifies action buttons behavior
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
||||||
|
import { mount } from '@vue/test-utils';
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import ActionToolbar from '../../../../src/components/gamemaster/ActionToolbar.vue';
|
||||||
|
import { useLineSelection } from '../../../../src/composables/useLineSelection.js';
|
||||||
|
|
||||||
|
vi.mock('../../../../src/composables/useLineSelection.js', () => ({
|
||||||
|
useLineSelection: vi.fn()
|
||||||
|
}));
|
||||||
|
|
||||||
|
const createSelectionMock = overrides => ({
|
||||||
|
selectionCount: ref(0),
|
||||||
|
copySelected: vi.fn(),
|
||||||
|
copyAll: vi.fn(),
|
||||||
|
exportSelected: vi.fn(),
|
||||||
|
exportAll: vi.fn(),
|
||||||
|
shareUrl: vi.fn(),
|
||||||
|
...overrides
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('ActionToolbar Component', () => {
|
||||||
|
let selectionMock;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
selectionMock = createSelectionMock();
|
||||||
|
useLineSelection.mockReturnValue(selectionMock);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders when file content exists', () => {
|
||||||
|
const wrapper = mount(ActionToolbar, {
|
||||||
|
props: {
|
||||||
|
fileContent: '{"test": true}',
|
||||||
|
displayLines: [],
|
||||||
|
selectedFile: 'pokemon'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(wrapper.find('.action-bar').exists()).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('disables selection-dependent actions when no selection', () => {
|
||||||
|
const wrapper = mount(ActionToolbar, {
|
||||||
|
props: {
|
||||||
|
fileContent: '{"test": true}',
|
||||||
|
displayLines: [],
|
||||||
|
selectedFile: 'pokemon'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const buttons = wrapper.findAll('button.btn-action');
|
||||||
|
expect(buttons[0].attributes('disabled')).toBeDefined();
|
||||||
|
expect(buttons[2].attributes('disabled')).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('enables selection-dependent actions when selection exists', () => {
|
||||||
|
selectionMock.selectionCount.value = 3;
|
||||||
|
|
||||||
|
const wrapper = mount(ActionToolbar, {
|
||||||
|
props: {
|
||||||
|
fileContent: '{"test": true}',
|
||||||
|
displayLines: [],
|
||||||
|
selectedFile: 'pokemon'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const buttons = wrapper.findAll('button.btn-action');
|
||||||
|
expect(buttons[0].attributes('disabled')).toBeUndefined();
|
||||||
|
expect(buttons[2].attributes('disabled')).toBeUndefined();
|
||||||
|
expect(buttons[0].text()).toContain('3 lines');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('triggers action handlers', async () => {
|
||||||
|
selectionMock.selectionCount.value = 2;
|
||||||
|
|
||||||
|
const wrapper = mount(ActionToolbar, {
|
||||||
|
props: {
|
||||||
|
fileContent: '{"test": true}',
|
||||||
|
displayLines: [],
|
||||||
|
selectedFile: 'pokemon'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const buttons = wrapper.findAll('button.btn-action');
|
||||||
|
await buttons[0].trigger('click');
|
||||||
|
await buttons[1].trigger('click');
|
||||||
|
await buttons[2].trigger('click');
|
||||||
|
await buttons[3].trigger('click');
|
||||||
|
await buttons[4].trigger('click');
|
||||||
|
|
||||||
|
expect(selectionMock.copySelected).toHaveBeenCalled();
|
||||||
|
expect(selectionMock.copyAll).toHaveBeenCalled();
|
||||||
|
expect(selectionMock.exportSelected).toHaveBeenCalled();
|
||||||
|
expect(selectionMock.exportAll).toHaveBeenCalled();
|
||||||
|
expect(selectionMock.shareUrl).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user