@weni/unnnic-system 3.9.0 → 3.9.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/assets/tokens/colors.json.d.ts +376 -0
  3. package/dist/components/Accordion/Accordion.vue.d.ts +1 -1
  4. package/dist/components/Alert/Alert.vue.d.ts +17 -116
  5. package/dist/components/Alert/Alert.vue.d.ts.map +1 -1
  6. package/dist/components/Alert/Version1dot1.vue.d.ts +2 -38
  7. package/dist/components/Alert/Version1dot1.vue.d.ts.map +1 -1
  8. package/dist/components/AudioRecorder/AudioHandler.vue.d.ts +2 -2
  9. package/dist/components/AudioRecorder/AudioPlayer.vue.d.ts +1 -1
  10. package/dist/components/AudioRecorder/AudioRecorder.vue.d.ts +5 -5
  11. package/dist/components/AvatarIcon/AvatarIcon.vue.d.ts +3 -3
  12. package/dist/components/Banner/Banner.vue.d.ts +1 -1
  13. package/dist/components/Banner/InfoBanner.vue.d.ts +1 -1
  14. package/dist/components/Breadcrumb/Breadcrumb.vue.d.ts +1 -1
  15. package/dist/components/Button/Button.vue.d.ts +1 -1
  16. package/dist/components/Button/Button.vue.d.ts.map +1 -1
  17. package/dist/components/Button/ButtonIcon.vue.d.ts +1 -1
  18. package/dist/components/Button/types.d.ts +1 -1
  19. package/dist/components/Button/types.d.ts.map +1 -1
  20. package/dist/components/Card/AccountCard.vue.d.ts +5 -5
  21. package/dist/components/Card/BlankCard.vue.d.ts +1 -1
  22. package/dist/components/Card/Card.vue.d.ts +27 -27
  23. package/dist/components/Card/CardCompany.vue.d.ts +11 -414
  24. package/dist/components/Card/CardData.vue.d.ts +1 -1
  25. package/dist/components/Card/CardStatusesContainer.vue.d.ts +5 -5
  26. package/dist/components/Card/ContentCard.vue.d.ts +3 -3
  27. package/dist/components/Card/DashCard.vue.d.ts +5 -5
  28. package/dist/components/Card/DefaultCard.vue.d.ts +1 -1
  29. package/dist/components/Card/MarketplaceCard.vue.d.ts +2 -2
  30. package/dist/components/Card/SimpleCard.vue.d.ts +3 -3
  31. package/dist/components/Card/StatusCard.vue.d.ts +2 -2
  32. package/dist/components/Card/TitleCard.vue.d.ts +3 -3
  33. package/dist/components/CardImage/CardImage.vue.d.ts +24 -31
  34. package/dist/components/CardInformation/CardInformation.vue.d.ts +5 -5
  35. package/dist/components/CardProject/CardProject.vue.d.ts +3 -3
  36. package/dist/components/Carousel/Carousel.vue.d.ts +13 -416
  37. package/dist/components/Carousel/TagCarousel.vue.d.ts +12 -415
  38. package/dist/components/ChartBar/ChartBar.vue.d.ts +5 -5
  39. package/dist/components/ChartLine/ChartLine.vue.d.ts +1 -1
  40. package/dist/components/ChatText/ChatText.vue.d.ts +2 -2
  41. package/dist/components/ChatsContact/ChatsContact.vue.d.ts +21 -446
  42. package/dist/components/ChatsDashboardTagLive/ChatsDashboardTagLive.vue.d.ts +1 -1
  43. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts +1 -1
  44. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts.map +1 -1
  45. package/dist/components/ChatsMessage/ChatsMessage.vue.d.ts +5 -5
  46. package/dist/components/ChatsMessage/ChatsMessageStatusBackdrop.vue.d.ts +2 -2
  47. package/dist/components/ChatsNavbar/ChatsNavbar.vue.d.ts +1 -1
  48. package/dist/components/ChatsUserAvatar/ChatsUserAvatar.vue.d.ts +2 -2
  49. package/dist/components/Checkbox/Checkbox.vue.d.ts +19 -26
  50. package/dist/components/Checkbox/Checkbox.vue.d.ts.map +1 -1
  51. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts +28 -0
  52. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts.map +1 -0
  53. package/dist/components/Comment/Comment.vue.d.ts +1 -1
  54. package/dist/components/DataArea/DataArea.vue.d.ts +2 -2
  55. package/dist/components/DataTable/index.vue.d.ts +1 -1
  56. package/dist/components/DataTable/index.vue.d.ts.map +1 -1
  57. package/dist/components/DateFilter/DateFilter.vue.d.ts +251 -41
  58. package/dist/components/DatePicker/DatePicker.vue.d.ts +4 -4
  59. package/dist/components/Drawer/Drawer.vue.d.ts +4 -4
  60. package/dist/components/Dropdown/Dropdown.vue.d.ts +1 -1
  61. package/dist/components/Dropdown/LanguageSelect.vue.d.ts +3 -3
  62. package/dist/components/Flag.vue.d.ts +2 -2
  63. package/dist/components/FormElement/FormElement.vue.d.ts +51 -28
  64. package/dist/components/FormElement/FormElement.vue.d.ts.map +1 -1
  65. package/dist/components/Icon.vue.d.ts +1 -1
  66. package/dist/components/Icon.vue.d.ts.map +1 -1
  67. package/dist/components/IconLoading/IconLoading.vue.d.ts +1 -1
  68. package/dist/components/ImportCard/ImportCard.vue.d.ts +4 -4
  69. package/dist/components/Input/BaseInput.vue.d.ts +33 -2
  70. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  71. package/dist/components/Input/Input.vue.d.ts +251 -41
  72. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  73. package/dist/components/Input/TextInput.vue.d.ts +85 -25
  74. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  75. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +257 -47
  76. package/dist/components/InputNext/InputNext.vue.d.ts +5 -5
  77. package/dist/components/Label/Label.vue.d.ts +9 -15
  78. package/dist/components/Label/Label.vue.d.ts.map +1 -1
  79. package/dist/components/Modal/Modal.vue.d.ts +2 -2
  80. package/dist/components/ModalDialog/ModalDialog.vue.d.ts +199 -34
  81. package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
  82. package/dist/components/ModalNext/ModalNext.vue.d.ts +256 -46
  83. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +9 -9
  84. package/dist/components/MoodRating/MoodRating.vue.d.ts +1 -1
  85. package/dist/components/MultiSelect/MultiSelect.vue.d.ts +26 -14
  86. package/dist/components/PageHeader/PageHeader.vue.d.ts +28 -0
  87. package/dist/components/PageHeader/PageHeader.vue.d.ts.map +1 -0
  88. package/dist/components/PageHeader/index.d.ts +3 -0
  89. package/dist/components/PageHeader/index.d.ts.map +1 -0
  90. package/dist/components/PageHeader/types.d.ts +9 -0
  91. package/dist/components/PageHeader/types.d.ts.map +1 -0
  92. package/dist/components/Pagination/Pagination.vue.d.ts +3 -3
  93. package/dist/components/ProgressBar/ProgressBar.vue.d.ts +1 -1
  94. package/dist/components/Radio/Radio.vue.d.ts +10 -6
  95. package/dist/components/Radio/Radio.vue.d.ts.map +1 -1
  96. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +120 -470
  97. package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +11 -414
  98. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +21 -28
  99. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts.map +1 -1
  100. package/dist/components/SelectTime/index.vue.d.ts +85 -25
  101. package/dist/components/SkeletonLoading/skeletonTheme.vue.d.ts +1 -1
  102. package/dist/components/Slider/Slider.vue.d.ts +2 -2
  103. package/dist/components/StarRating/StarRating.vue.d.ts +1 -1
  104. package/dist/components/Switch/Switch.vue.d.ts +55 -21
  105. package/dist/components/Switch/Switch.vue.d.ts.map +1 -1
  106. package/dist/components/Tab/Tab.vue.d.ts +13 -2
  107. package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
  108. package/dist/components/TableNext/TablePagination.vue.d.ts +3 -3
  109. package/dist/components/TabsExpanded/TabsExpanded.vue.d.ts +1 -1
  110. package/dist/components/Tag/DefaultTag.vue.d.ts +4 -83
  111. package/dist/components/Tag/DefaultTag.vue.d.ts.map +1 -1
  112. package/dist/components/Tag/Tag.vue.d.ts +12 -414
  113. package/dist/components/Tag/Tag.vue.d.ts.map +1 -1
  114. package/dist/components/Tag/types.d.ts +18 -0
  115. package/dist/components/Tag/types.d.ts.map +1 -0
  116. package/dist/components/TextArea/TextArea.vue.d.ts +75 -30
  117. package/dist/components/TextArea/TextArea.vue.d.ts.map +1 -1
  118. package/dist/components/Toast/Toast.vue.d.ts +16 -0
  119. package/dist/components/Toast/Toast.vue.d.ts.map +1 -0
  120. package/dist/components/Toast/ToastManager.d.ts +14 -0
  121. package/dist/components/Toast/ToastManager.d.ts.map +1 -0
  122. package/dist/components/Toast/types.d.ts +35 -0
  123. package/dist/components/Toast/types.d.ts.map +1 -0
  124. package/dist/components/ToolTip/ToolTip.vue.d.ts +1 -1
  125. package/dist/components/Tour/Tour.vue.d.ts +3 -3
  126. package/dist/components/Tour/TourPopover.vue.d.ts +3 -3
  127. package/dist/components/UploadArea/UploadArea.vue.d.ts +4 -4
  128. package/dist/components/index.d.ts +13127 -13782
  129. package/dist/components/index.d.ts.map +1 -1
  130. package/dist/components/ui/dialog/Dialog.vue.d.ts +23 -0
  131. package/dist/components/ui/dialog/Dialog.vue.d.ts.map +1 -0
  132. package/dist/components/ui/dialog/DialogClose.vue.d.ts +19 -0
  133. package/dist/components/ui/dialog/DialogClose.vue.d.ts.map +1 -0
  134. package/dist/components/ui/dialog/DialogContent.vue.d.ts +40 -0
  135. package/dist/components/ui/dialog/DialogContent.vue.d.ts.map +1 -0
  136. package/dist/components/ui/dialog/DialogFooter.vue.d.ts +25 -0
  137. package/dist/components/ui/dialog/DialogFooter.vue.d.ts.map +1 -0
  138. package/dist/components/ui/dialog/DialogHeader.vue.d.ts +29 -0
  139. package/dist/components/ui/dialog/DialogHeader.vue.d.ts.map +1 -0
  140. package/dist/components/ui/dialog/DialogTitle.vue.d.ts +23 -0
  141. package/dist/components/ui/dialog/DialogTitle.vue.d.ts.map +1 -0
  142. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts +19 -0
  143. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts.map +1 -0
  144. package/dist/components/ui/dialog/index.d.ts +8 -0
  145. package/dist/components/ui/dialog/index.d.ts.map +1 -0
  146. package/dist/components/ui/popover/PopoverContent.vue.d.ts +1 -1
  147. package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -1
  148. package/dist/{es-4b7090cd.mjs → es-ed9b7d22.mjs} +1 -1
  149. package/dist/{index-65c23d9a.mjs → index-bbfce723.mjs} +12443 -11221
  150. package/dist/locales/en.json.d.ts +2 -1
  151. package/dist/locales/es.json.d.ts +2 -1
  152. package/dist/locales/pt_br.json.d.ts +2 -1
  153. package/dist/{pt-br-6324858c.mjs → pt-br-8c45d7e7.mjs} +1 -1
  154. package/dist/style.css +1 -1
  155. package/dist/unnnic.mjs +200 -179
  156. package/dist/unnnic.umd.js +42 -39
  157. package/dist/utils/call.d.ts +2 -1
  158. package/dist/utils/call.d.ts.map +1 -1
  159. package/package.json +2 -2
  160. package/src/assets/icons/checkbox-checked-disabled.svg +3 -0
  161. package/src/assets/icons/checkbox-checked.svg +3 -0
  162. package/src/assets/icons/checkbox-less-disabled.svg +3 -0
  163. package/src/assets/icons/checkbox-less.svg +3 -0
  164. package/src/assets/icons/radio-checked.svg +3 -0
  165. package/src/assets/icons/switch-checked-disabled.svg +3 -0
  166. package/src/assets/icons/switch-checked.svg +3 -0
  167. package/src/assets/scss/tailwind.scss +8 -0
  168. package/src/components/Alert/Alert.vue +26 -135
  169. package/src/components/Alert/SIMPLE_MIGRATION_GUIDE.md +152 -0
  170. package/src/components/Alert/Version1dot1.vue +0 -36
  171. package/src/components/Alert/__tests__/Alert.spec.js +2 -45
  172. package/src/components/Alert/__tests__/Version1dot1.spec.js +0 -21
  173. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +11 -7
  174. package/src/components/Alert/__tests__/__snapshots__/AlertBanner.spec.js.snap +2 -2
  175. package/src/components/Alert/__tests__/__snapshots__/Version1dot1.spec.js.snap +2 -2
  176. package/src/components/Button/Button.vue +68 -117
  177. package/src/components/Button/types.ts +0 -1
  178. package/src/components/ChatsContact/ChatsContact.vue +10 -6
  179. package/src/components/Checkbox/Checkbox.vue +117 -65
  180. package/src/components/Checkbox/__tests__/Checkbox.spec.js +6 -21
  181. package/src/components/CheckboxGroup/CheckboxGroup.vue +96 -0
  182. package/src/components/FormElement/FormElement.vue +63 -93
  183. package/src/components/Icon.vue +2 -0
  184. package/src/components/Input/BaseInput.vue +33 -14
  185. package/src/components/Input/Input.scss +20 -21
  186. package/src/components/Input/Input.vue +79 -56
  187. package/src/components/Input/TextInput.vue +80 -68
  188. package/src/components/Input/__test__/Input.spec.js +13 -33
  189. package/src/components/Input/__test__/TextInput.spec.js +6 -8
  190. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +14 -5
  191. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -1
  192. package/src/components/Label/Label.vue +52 -21
  193. package/src/components/Label/__tests__/Label.spec.js +1 -1
  194. package/src/components/Label/__tests__/__snapshots__/Label.spec.js.snap +1 -1
  195. package/src/components/ModalDialog/ModalDialog.vue +60 -146
  196. package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -22
  197. package/src/components/PageHeader/PageHeader.vue +154 -0
  198. package/src/components/PageHeader/index.ts +2 -0
  199. package/src/components/PageHeader/types.ts +10 -0
  200. package/src/components/Popover/__tests__/Popover.spec.js +147 -0
  201. package/src/components/Popover/__tests__/__snapshots__/Popover.spec.js.snap +8 -0
  202. package/src/components/Popover/index.vue +146 -0
  203. package/src/components/Radio/Radio.vue +118 -66
  204. package/src/components/Radio/__test__/Radio.spec.js +14 -20
  205. package/src/components/Radio/__test__/__snapshots__/Radio.spec.js.snap +3 -3
  206. package/src/components/RadioGroup/RadioGroup.vue +142 -0
  207. package/src/components/Select/SelectOption.vue +65 -0
  208. package/src/components/Select/__tests__/Select.spec.js +412 -0
  209. package/src/components/Select/__tests__/SelectItem.spec.js +330 -0
  210. package/src/components/Select/__tests__/SelectOption.spec.js +174 -0
  211. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +97 -0
  212. package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +15 -0
  213. package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +25 -0
  214. package/src/components/Select/index.vue +245 -0
  215. package/src/components/SelectSmart/SelectSmart.vue +4 -3
  216. package/src/components/Switch/Switch.vue +132 -91
  217. package/src/components/Switch/__tests__/Switch.spec.js +8 -75
  218. package/src/components/Switch/__tests__/__snapshots__/Switch.spec.js.snap +5 -6
  219. package/src/components/Tab/Tab.vue +37 -23
  220. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
  221. package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
  222. package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
  223. package/src/components/Tag/DefaultTag.vue +51 -107
  224. package/src/components/Tag/Tag.vue +32 -79
  225. package/src/components/Tag/types.ts +19 -0
  226. package/src/components/TextArea/TextArea.vue +40 -11
  227. package/src/components/TextArea/__test__/__snapshots__/TextArea.spec.js.snap +11 -3
  228. package/src/components/Toast/Toast.vue +246 -0
  229. package/src/components/Toast/ToastManager.ts +110 -0
  230. package/src/components/Toast/__tests__/Toast.spec.js +291 -0
  231. package/src/components/Toast/__tests__/ToastManager.spec.js +294 -0
  232. package/src/components/Toast/types.ts +57 -0
  233. package/src/components/index.ts +69 -26
  234. package/src/components/ui/dialog/Dialog.vue +15 -0
  235. package/src/components/ui/dialog/DialogClose.vue +25 -0
  236. package/src/components/ui/dialog/DialogContent.vue +114 -0
  237. package/src/components/ui/dialog/DialogFooter.vue +46 -0
  238. package/src/components/ui/dialog/DialogHeader.vue +79 -0
  239. package/src/components/ui/dialog/DialogTitle.vue +34 -0
  240. package/src/components/ui/dialog/DialogTrigger.vue +12 -0
  241. package/src/components/ui/dialog/index.ts +7 -0
  242. package/src/locales/en.json +2 -1
  243. package/src/locales/es.json +2 -1
  244. package/src/locales/pt_br.json +2 -1
  245. package/src/stories/Alert.stories.js +6 -67
  246. package/src/stories/Button.stories.js +29 -39
  247. package/src/stories/Checkbox.stories.js +11 -4
  248. package/src/stories/CheckboxGroup.stories.js +105 -0
  249. package/src/stories/Dialog.stories.js +832 -0
  250. package/src/stories/Input.stories.js +71 -76
  251. package/src/stories/Label.stories.js +7 -0
  252. package/src/stories/ModalDialog.mdx +3 -0
  253. package/src/stories/ModalDialog.stories.js +1 -1
  254. package/src/stories/PageHeader.stories.js +330 -0
  255. package/src/stories/Radio.stories.js +28 -1
  256. package/src/stories/RadioGroup.stories.js +144 -0
  257. package/src/stories/Select.stories.js +158 -0
  258. package/src/stories/Switch.stories.js +10 -5
  259. package/src/stories/Tab.stories.js +11 -4
  260. package/src/stories/Tag.stories.js +24 -43
  261. package/src/stories/TextArea.stories.js +14 -2
  262. package/src/stories/Toast.mdx +123 -0
  263. package/src/stories/Toast.stories.js +126 -0
  264. package/src/types/scheme-colors.d.ts +1 -0
  265. package/src/utils/call.js +46 -18
  266. package/dist/components/Tag/BrandTag.vue.d.ts +0 -51
  267. package/dist/components/Tag/BrandTag.vue.d.ts.map +0 -1
  268. package/dist/components/Tag/IndicatorTag.vue.d.ts +0 -151
  269. package/dist/components/Tag/IndicatorTag.vue.d.ts.map +0 -1
  270. package/dist/components/Tag/TagNext.vue.d.ts +0 -24
  271. package/dist/components/Tag/TagNext.vue.d.ts.map +0 -1
  272. package/src/components/Alert/AlertBanner.vue +0 -182
  273. package/src/components/Alert/AlertCaller.vue +0 -49
  274. package/src/components/Alert/__tests__/AlertBanner.spec.js +0 -89
  275. package/src/components/Alert/__tests__/AlertCaller.spec.js +0 -98
  276. package/src/components/Tag/BrandTag.vue +0 -96
  277. package/src/components/Tag/IndicatorTag.vue +0 -107
  278. package/src/components/Tag/TagNext.vue +0 -60
@@ -0,0 +1,412 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import { beforeEach, describe, expect, afterEach, test, vi } from 'vitest';
3
+ import UnnnicSelect from '../index.vue';
4
+
5
+ vi.mock('../../mixins/i18n', () => ({
6
+ default: {
7
+ methods: {
8
+ $t: (key) => key,
9
+ },
10
+ },
11
+ }));
12
+
13
+ describe('UnnnicSelect.vue', () => {
14
+ let wrapper;
15
+
16
+ const defaultProps = {
17
+ options: [
18
+ { label: 'Option 1', value: 'option1' },
19
+ { label: 'Option 2', value: 'option2' },
20
+ { label: 'Option 3', value: 'option3' },
21
+ ],
22
+ modelValue: null,
23
+ };
24
+
25
+ const mountWrapper = (props = {}, slots = {}) => {
26
+ return mount(UnnnicSelect, {
27
+ props: {
28
+ ...defaultProps,
29
+ ...props,
30
+ },
31
+ global: {
32
+ mocks: {
33
+ $t: (key) => key,
34
+ },
35
+ },
36
+ slots,
37
+ });
38
+ };
39
+
40
+ beforeEach(() => {
41
+ wrapper = mountWrapper();
42
+ });
43
+
44
+ afterEach(() => {
45
+ wrapper?.unmount();
46
+ });
47
+
48
+ describe('rendering', () => {
49
+ test('renders correctly', () => {
50
+ expect(wrapper.exists()).toBe(true);
51
+ expect(wrapper.find('.unnnic-select').exists()).toBe(true);
52
+ });
53
+
54
+ test('renders input component', () => {
55
+ const input = wrapper.findComponent({ name: 'UnnnicInput' });
56
+ expect(input.exists()).toBe(true);
57
+ });
58
+
59
+ test('renders popover component', () => {
60
+ const popover = wrapper.findComponent({ name: 'UnnnicPopover' });
61
+ expect(popover.exists()).toBe(true);
62
+ });
63
+
64
+ test('renders select options when popover is open', async () => {
65
+ wrapper.vm.openPopover = true;
66
+ await wrapper.vm.$nextTick();
67
+ const options = wrapper.findAllComponents({ name: 'UnnnicSelectOption' });
68
+ expect(options.length).toBe(3);
69
+ });
70
+ });
71
+
72
+ describe('props validation', () => {
73
+ test('validates required options prop', () => {
74
+ const { options } = wrapper.vm.$options.props;
75
+ expect(options.required).toBe(true);
76
+ });
77
+
78
+ test('validates required modelValue prop', () => {
79
+ const { modelValue } = wrapper.vm.$options.props;
80
+ expect(modelValue.required).toBe(true);
81
+ });
82
+
83
+ test('applies default values correctly', () => {
84
+ expect(wrapper.vm.size).toBe('md');
85
+ expect(wrapper.vm.type).toBe('normal');
86
+ expect(wrapper.vm.placeholder).toBe('');
87
+ expect(wrapper.vm.optionsLines).toBe(5);
88
+ expect(wrapper.vm.returnObject).toBe(false);
89
+ expect(wrapper.vm.itemLabel).toBe('label');
90
+ expect(wrapper.vm.itemValue).toBe('value');
91
+ expect(wrapper.vm.locale).toBe('en');
92
+ expect(wrapper.vm.enableSearch).toBe(false);
93
+ expect(wrapper.vm.disabled).toBe(false);
94
+ });
95
+ });
96
+
97
+ describe('input display', () => {
98
+ test('displays placeholder when no option is selected', () => {
99
+ const input = wrapper.findComponent({ name: 'UnnnicInput' });
100
+ expect(input.props('placeholder')).toBe('');
101
+ });
102
+
103
+ test('displays selected option label', async () => {
104
+ await wrapper.setProps({ modelValue: 'option1' });
105
+ const input = wrapper.findComponent({ name: 'UnnnicInput' });
106
+ expect(input.props('modelValue')).toBe('Option 1');
107
+ });
108
+
109
+ test('displays custom placeholder', async () => {
110
+ await wrapper.setProps({ placeholder: 'Select an option' });
111
+ const input = wrapper.findComponent({ name: 'UnnnicInput' });
112
+ expect(input.props('placeholder')).toBe('Select an option');
113
+ });
114
+
115
+ test('input is readonly', () => {
116
+ const input = wrapper.findComponent({ name: 'UnnnicInput' });
117
+ expect(input.props('readonly')).toBe(true);
118
+ });
119
+
120
+ test('input shows correct icon based on popover state', async () => {
121
+ const input = wrapper.findComponent({ name: 'UnnnicInput' });
122
+
123
+ // Initially closed
124
+ expect(input.props('iconRight')).toBe('keyboard_arrow_down');
125
+
126
+ // When popover is open
127
+ wrapper.vm.openPopover = true;
128
+ await wrapper.vm.$nextTick();
129
+ expect(input.props('iconRight')).toBe('keyboard_arrow_up');
130
+ });
131
+ });
132
+
133
+ describe('option selection', () => {
134
+ test('emits update:modelValue when option is selected', async () => {
135
+ wrapper.vm.openPopover = true;
136
+ await wrapper.vm.$nextTick();
137
+ const options = wrapper.findAllComponents({ name: 'UnnnicSelectOption' });
138
+
139
+ await options[0].vm.$emit('click');
140
+
141
+ expect(wrapper.emitted('update:modelValue')).toBeTruthy();
142
+ expect(wrapper.emitted('update:modelValue')[0]).toEqual(['option1']);
143
+ });
144
+
145
+ test('emits object when returnObject is true', async () => {
146
+ await wrapper.setProps({ returnObject: true });
147
+ wrapper.vm.openPopover = true;
148
+ await wrapper.vm.$nextTick();
149
+ const options = wrapper.findAllComponents({ name: 'UnnnicSelectOption' });
150
+
151
+ await options[0].vm.$emit('click');
152
+
153
+ expect(wrapper.emitted('update:modelValue')[0]).toEqual([
154
+ { label: 'Option 1', value: 'option1' },
155
+ ]);
156
+ });
157
+
158
+ test('does not emit when same option is selected', async () => {
159
+ await wrapper.setProps({ modelValue: 'option1' });
160
+ wrapper.vm.openPopover = true;
161
+ await wrapper.vm.$nextTick();
162
+ const options = wrapper.findAllComponents({ name: 'UnnnicSelectOption' });
163
+
164
+ await options[0].vm.$emit('click');
165
+
166
+ expect(wrapper.emitted('update:modelValue')).toBeFalsy();
167
+ });
168
+
169
+ test('does not emit when disabled option is clicked', async () => {
170
+ const disabledOptions = [
171
+ { label: 'Option 1', value: 'option1' },
172
+ { label: 'Disabled Option', value: 'disabled', disabled: true },
173
+ ];
174
+
175
+ await wrapper.setProps({ options: disabledOptions });
176
+ wrapper.vm.openPopover = true;
177
+ await wrapper.vm.$nextTick();
178
+ const options = wrapper.findAllComponents({ name: 'UnnnicSelectOption' });
179
+
180
+ await options[1].vm.$emit('click');
181
+
182
+ expect(wrapper.emitted('update:modelValue')).toBeFalsy();
183
+ });
184
+ });
185
+
186
+ describe('search functionality', () => {
187
+ test('renders search input when enableSearch is true', async () => {
188
+ await wrapper.setProps({ enableSearch: true });
189
+ wrapper.vm.openPopover = true;
190
+ await wrapper.vm.$nextTick();
191
+ const searchInputs = wrapper.findAllComponents({ name: 'UnnnicInput' });
192
+ expect(searchInputs.length).toBe(2); // Main input + search input
193
+ });
194
+
195
+ test('does not render search input when enableSearch is false', async () => {
196
+ await wrapper.setProps({ enableSearch: false, modelValue: true });
197
+ const searchInputs = wrapper.findAllComponents({ name: 'UnnnicInput' });
198
+ expect(searchInputs.length).toBe(1); // Only main input
199
+ });
200
+
201
+ test('emits update:search when search input changes', async () => {
202
+ await wrapper.setProps({ enableSearch: true });
203
+ wrapper.vm.openPopover = true;
204
+ await wrapper.vm.$nextTick();
205
+ const searchInput = wrapper.findAllComponents({ name: 'UnnnicInput' })[1];
206
+
207
+ await searchInput.vm.$emit('update:modelValue', 'test search');
208
+
209
+ expect(wrapper.emitted('update:search')).toBeTruthy();
210
+ expect(wrapper.emitted('update:search')[0]).toEqual(['test search']);
211
+ });
212
+
213
+ test('filters options based on search term', async () => {
214
+ await wrapper.setProps({ enableSearch: true, search: 'Option 1' });
215
+
216
+ const filteredOptions = wrapper.vm.filteredOptions;
217
+ expect(filteredOptions.length).toBe(1);
218
+ expect(filteredOptions[0].label).toBe('Option 1');
219
+ });
220
+
221
+ test('filters options by both label and value', async () => {
222
+ await wrapper.setProps({ enableSearch: true, search: 'option1' });
223
+
224
+ const filteredOptions = wrapper.vm.filteredOptions;
225
+ expect(filteredOptions.length).toBe(1);
226
+ expect(filteredOptions[0].value).toBe('option1');
227
+ });
228
+
229
+ test('shows all options when search is empty', async () => {
230
+ await wrapper.setProps({ enableSearch: true, search: '' });
231
+
232
+ const filteredOptions = wrapper.vm.filteredOptions;
233
+ expect(filteredOptions.length).toBe(3);
234
+ });
235
+ });
236
+
237
+ describe('computed properties', () => {
238
+ test('calculatedMaxHeight returns correct value', () => {
239
+ const maxHeight = wrapper.vm.calculatedMaxHeight;
240
+ expect(maxHeight).toBe('235px');
241
+ });
242
+
243
+ test('calculatedMaxHeight includes search height when enabled', async () => {
244
+ await wrapper.setProps({ enableSearch: true });
245
+ const maxHeight = wrapper.vm.calculatedMaxHeight;
246
+ expect(maxHeight).toBe('289px');
247
+ });
248
+
249
+ test('calculatedMaxHeight returns unset when no options', async () => {
250
+ await wrapper.setProps({ options: [] });
251
+ const maxHeight = wrapper.vm.calculatedMaxHeight;
252
+ expect(maxHeight).toBe('unset');
253
+ });
254
+
255
+ test('selectedItem returns correct item for returnObject false', async () => {
256
+ await wrapper.setProps({ modelValue: 'option2' });
257
+ const selectedItem = wrapper.vm.selectedItem;
258
+ expect(selectedItem.label).toBe('Option 2');
259
+ expect(selectedItem.value).toBe('option2');
260
+ });
261
+
262
+ test('selectedItem returns modelValue for returnObject true', async () => {
263
+ const selectedOption = { label: 'Option 2', value: 'option2' };
264
+ await wrapper.setProps({
265
+ returnObject: true,
266
+ modelValue: selectedOption,
267
+ });
268
+ const selectedItem = wrapper.vm.selectedItem;
269
+ expect(selectedItem).toStrictEqual(selectedOption);
270
+ });
271
+
272
+ test('inputValue returns correct label', async () => {
273
+ await wrapper.setProps({ modelValue: 'option3' });
274
+ const inputValue = wrapper.vm.inputValue;
275
+ expect(inputValue).toBe('Option 3');
276
+ });
277
+
278
+ test('inputValue returns undefined when no selection', () => {
279
+ const inputValue = wrapper.vm.inputValue;
280
+ expect(inputValue).toBeUndefined();
281
+ });
282
+ });
283
+
284
+ describe('disabled state', () => {
285
+ test('passes disabled prop to input', async () => {
286
+ await wrapper.setProps({ disabled: true });
287
+ const input = wrapper.findComponent({ name: 'UnnnicInput' });
288
+ expect(input.props('disabled')).toBe(true);
289
+ });
290
+
291
+ test('input is not disabled by default', () => {
292
+ const input = wrapper.findComponent({ name: 'UnnnicInput' });
293
+ expect(input.props('disabled')).toBe(false);
294
+ });
295
+ });
296
+
297
+ describe('size prop', () => {
298
+ test('passes size prop to input', async () => {
299
+ await wrapper.setProps({ size: 'sm' });
300
+ const input = wrapper.findComponent({ name: 'UnnnicInput' });
301
+ expect(input.props('size')).toBe('sm');
302
+ });
303
+
304
+ test('defaults to md size', () => {
305
+ const input = wrapper.findComponent({ name: 'UnnnicInput' });
306
+ expect(input.props('size')).toBe('md');
307
+ });
308
+ });
309
+
310
+ describe('label and message props', () => {
311
+ test('passes label prop to input', async () => {
312
+ await wrapper.setProps({ label: 'Select Label' });
313
+ const input = wrapper.findComponent({ name: 'UnnnicInput' });
314
+ expect(input.props('label')).toBe('Select Label');
315
+ });
316
+
317
+ test('passes message prop to input', async () => {
318
+ await wrapper.setProps({ message: 'Select Message' });
319
+ const input = wrapper.findComponent({ name: 'UnnnicInput' });
320
+ expect(input.props('message')).toBe('Select Message');
321
+ });
322
+
323
+ test('passes errors prop to input', async () => {
324
+ await wrapper.setProps({ errors: 'Error message' });
325
+ const input = wrapper.findComponent({ name: 'UnnnicInput' });
326
+ expect(input.props('errors')).toBe('Error message');
327
+ });
328
+ });
329
+
330
+ describe('custom item keys', () => {
331
+ test('uses custom itemLabel and itemValue', async () => {
332
+ const customOptions = [
333
+ { name: 'Custom 1', id: 'custom1' },
334
+ { name: 'Custom 2', id: 'custom2' },
335
+ ];
336
+
337
+ await wrapper.setProps({
338
+ options: customOptions,
339
+ itemLabel: 'name',
340
+ itemValue: 'id',
341
+ modelValue: 'custom1',
342
+ });
343
+
344
+ const inputValue = wrapper.vm.inputValue;
345
+ expect(inputValue).toBe('Custom 1');
346
+ });
347
+ });
348
+
349
+ describe('edge cases', () => {
350
+ test('handles empty options array', async () => {
351
+ await wrapper.setProps({ options: [] });
352
+ expect(wrapper.vm.filteredOptions).toEqual([]);
353
+ expect(wrapper.vm.calculatedMaxHeight).toBe('unset');
354
+ });
355
+
356
+ test('handles null modelValue', async () => {
357
+ await wrapper.setProps({ modelValue: null });
358
+ expect(wrapper.vm.inputValue).toBeUndefined();
359
+ expect(wrapper.vm.selectedItem).toBeUndefined();
360
+ });
361
+
362
+ test('handles undefined modelValue', async () => {
363
+ await wrapper.setProps({ modelValue: undefined });
364
+ expect(wrapper.vm.inputValue).toBeUndefined();
365
+ expect(wrapper.vm.selectedItem).toBeUndefined();
366
+ });
367
+
368
+ test('handles case insensitive search', async () => {
369
+ await wrapper.setProps({ enableSearch: true, search: 'OPTION 1' });
370
+ const filteredOptions = wrapper.vm.filteredOptions;
371
+ expect(filteredOptions.length).toBe(1);
372
+ expect(filteredOptions[0].label).toBe('Option 1');
373
+ });
374
+
375
+ test('handles partial search matches', async () => {
376
+ await wrapper.setProps({ enableSearch: true, search: 'tion' });
377
+ const filteredOptions = wrapper.vm.filteredOptions;
378
+ expect(filteredOptions.length).toBe(3); // All options contain 'tion'
379
+ });
380
+ });
381
+
382
+ describe('component structure', () => {
383
+ test('has correct component name', () => {
384
+ expect(wrapper.vm.$options.name).toBe('UnnnicSelect');
385
+ });
386
+
387
+ test('includes i18n mixin', () => {
388
+ expect(wrapper.vm.$options.mixins).toBeDefined();
389
+ });
390
+ });
391
+
392
+ describe('snapshot testing', () => {
393
+ test('matches snapshot with default props', () => {
394
+ expect(wrapper.html()).toMatchSnapshot();
395
+ });
396
+
397
+ test('matches snapshot with selected value', async () => {
398
+ await wrapper.setProps({ modelValue: 'option1' });
399
+ expect(wrapper.html()).toMatchSnapshot();
400
+ });
401
+
402
+ test('matches snapshot with search enabled', async () => {
403
+ await wrapper.setProps({ enableSearch: true, modelValue: true });
404
+ expect(wrapper.html()).toMatchSnapshot();
405
+ });
406
+
407
+ test('matches snapshot with disabled state', async () => {
408
+ await wrapper.setProps({ disabled: true });
409
+ expect(wrapper.html()).toMatchSnapshot();
410
+ });
411
+ });
412
+ });