From 21ee204599ed83905ca138c16e0ea835e57c692e Mon Sep 17 00:00:00 2001 From: Arnau Giralt Date: Tue, 20 Feb 2024 11:15:06 +0100 Subject: [PATCH] Add alignment options to Menu component --- components/src/stories/Menu.stories.js | 35 +++++++--- components/src/widgets/menu/widget.spec.js | 57 ++++++++++++++-- components/src/widgets/menu/widget.vue | 75 ++++++++++++++-------- 3 files changed, 124 insertions(+), 43 deletions(-) diff --git a/components/src/stories/Menu.stories.js b/components/src/stories/Menu.stories.js index 738baa8f..d412190b 100644 --- a/components/src/stories/Menu.stories.js +++ b/components/src/stories/Menu.stories.js @@ -10,16 +10,22 @@ export const Component = { setup() { return {args}; }, - template: ` - -
-

item

-
-
` + template: ` + + +
+

item

+
+
+ ` }), + + args: { + align: 'left', + }, }; export default { @@ -28,4 +34,13 @@ export default { parameters: { layout: 'centered', }, -}; \ No newline at end of file + + argTypes: { + align: { + options: ['right', 'left'], + control: { + type: 'select', + }, + }, + }, +}; diff --git a/components/src/widgets/menu/widget.spec.js b/components/src/widgets/menu/widget.spec.js index 90f631d2..5d4af180 100644 --- a/components/src/widgets/menu/widget.spec.js +++ b/components/src/widgets/menu/widget.spec.js @@ -48,11 +48,11 @@ describe('Menu component', () => { describe('onMounted', () => { it('adds up event listener on component mount', () => { const addEventListenerSpy = jest.spyOn(document, 'addEventListener'); - + mount(Menu); expect(addEventListenerSpy).toHaveBeenCalledWith('click', expect.any(Function)); - + addEventListenerSpy.mockRestore(); }); }); @@ -60,13 +60,58 @@ describe('Menu component', () => { describe('onUnmounted', () => { it('cleans up event listener on component unmount', async () => { const removeEventListenerSpy = jest.spyOn(document, 'removeEventListener'); - + const wrapper = mount(Menu); await wrapper.unmount(); - + expect(removeEventListenerSpy).toHaveBeenCalledWith('click', expect.any(Function)); - + removeEventListenerSpy.mockRestore(); }); - }) + }); + + describe('alignment class', () => { + it('sets the "menu-content_align-right" class if align=right', async () => { + const wrapper = mount(Menu, { + props: { + align: 'right', + }, + }); + + // Open menu + await wrapper.find('.menu-trigger').trigger('click'); + + expect(wrapper.find('.menu-content_align-right').exists()).toEqual(true); + }); + + it('sets the "menu-content_align-left" class if align=left', async () => { + const wrapper = mount(Menu, { + props: { + align: 'left', + }, + }); + + // Open menu + await wrapper.find('.menu-trigger').trigger('click'); + + expect(wrapper.find('.menu-content_align-left').exists()).toEqual(true); + }); + }); + + describe('align prop validator', () => { + it.each([ + // expected, value + [true, 'left'], + [true, 'right'], + [false, 'center'], + [false, 'foo'], + ])( + 'returns %s if the prop value is %s', + (expected, value) => { + const result = Menu.props.align.validator(value); + + expect(result).toEqual(expected); + }, + ); + }); }); diff --git a/components/src/widgets/menu/widget.vue b/components/src/widgets/menu/widget.vue index 0b17ca21..2c863916 100644 --- a/components/src/widgets/menu/widget.vue +++ b/components/src/widgets/menu/widget.vue @@ -3,17 +3,18 @@ ref="menu" class="menu" > - - +