@olaboot/esm-patient-registration-app 9.2.0 → 10.0.2

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 (346) hide show
  1. package/dist/1339.js +1 -0
  2. package/dist/1339.js.map +1 -0
  3. package/dist/1480.js +1 -0
  4. package/dist/1480.js.map +1 -0
  5. package/dist/1646.js +1 -0
  6. package/dist/1646.js.map +1 -0
  7. package/dist/1789.js +1 -0
  8. package/dist/1789.js.map +1 -0
  9. package/dist/1869.js +1 -0
  10. package/dist/1869.js.map +1 -0
  11. package/dist/1877.js +1 -0
  12. package/dist/1877.js.map +1 -0
  13. package/dist/2317.js +1 -0
  14. package/dist/2317.js.map +1 -0
  15. package/dist/2416.js +1 -0
  16. package/dist/2416.js.map +1 -0
  17. package/dist/2747.js +1 -0
  18. package/dist/2747.js.map +1 -0
  19. package/dist/282.js +1 -0
  20. package/dist/282.js.map +1 -0
  21. package/dist/2881.js +1 -0
  22. package/dist/2881.js.map +1 -0
  23. package/dist/3378.js +1 -0
  24. package/dist/3378.js.map +1 -0
  25. package/dist/3720.js +1 -0
  26. package/dist/3720.js.map +1 -0
  27. package/dist/3906.js +1 -0
  28. package/dist/3906.js.map +1 -0
  29. package/dist/3963.js +1 -0
  30. package/dist/3963.js.map +1 -0
  31. package/dist/3989.js +1 -0
  32. package/dist/3989.js.map +1 -0
  33. package/dist/4106.js +1 -0
  34. package/dist/4106.js.map +1 -0
  35. package/dist/4111.js +1 -0
  36. package/dist/4111.js.map +1 -0
  37. package/dist/434.js +1 -0
  38. package/dist/434.js.map +1 -0
  39. package/dist/4348.js +1 -0
  40. package/dist/4348.js.map +1 -0
  41. package/dist/4383.js +1 -0
  42. package/dist/4383.js.map +1 -0
  43. package/dist/4658.js +1 -0
  44. package/dist/4658.js.map +1 -0
  45. package/dist/466.js +1 -0
  46. package/dist/466.js.map +1 -0
  47. package/dist/4928.js +1 -0
  48. package/dist/4928.js.map +1 -0
  49. package/dist/5117.js +1 -0
  50. package/dist/5117.js.map +1 -0
  51. package/dist/5132.js +1 -0
  52. package/dist/5132.js.map +1 -0
  53. package/dist/5145.js +1 -0
  54. package/dist/5145.js.map +1 -0
  55. package/dist/5208.js +43 -0
  56. package/dist/5208.js.map +1 -0
  57. package/dist/527.js +1 -0
  58. package/dist/527.js.map +1 -0
  59. package/dist/5280.js +1 -0
  60. package/dist/5280.js.map +1 -0
  61. package/dist/5338.js +6 -0
  62. package/dist/5338.js.map +1 -0
  63. package/dist/5503.js +1 -0
  64. package/dist/5503.js.map +1 -0
  65. package/dist/555.js +1 -0
  66. package/dist/555.js.map +1 -0
  67. package/dist/556.js +1 -0
  68. package/dist/556.js.map +1 -0
  69. package/dist/5644.js +1 -0
  70. package/dist/5644.js.map +1 -0
  71. package/dist/5697.js +1 -0
  72. package/dist/{4024.js.map → 5697.js.map} +1 -1
  73. package/dist/5940.js +1 -0
  74. package/dist/5940.js.map +1 -0
  75. package/dist/6047.js +1 -0
  76. package/dist/6047.js.map +1 -0
  77. package/dist/6371.js +1 -0
  78. package/dist/6371.js.map +1 -0
  79. package/dist/6377.js +1 -0
  80. package/dist/6377.js.map +1 -0
  81. package/dist/6388.js +1 -0
  82. package/dist/6388.js.map +1 -0
  83. package/dist/6444.js +1 -0
  84. package/dist/6444.js.map +1 -0
  85. package/dist/6508.js +1 -0
  86. package/dist/6508.js.map +1 -0
  87. package/dist/6724.js +1 -0
  88. package/dist/6724.js.map +1 -0
  89. package/dist/689.js +1 -0
  90. package/dist/689.js.map +1 -0
  91. package/dist/6904.js +1 -0
  92. package/dist/6904.js.map +1 -0
  93. package/dist/7045.js +1 -0
  94. package/dist/7045.js.map +1 -0
  95. package/dist/7175.js +1 -0
  96. package/dist/7175.js.map +1 -0
  97. package/dist/7182.js +1 -0
  98. package/dist/7182.js.map +1 -0
  99. package/dist/7649.js +1 -0
  100. package/dist/7649.js.map +1 -0
  101. package/dist/7742.js +1 -0
  102. package/dist/7742.js.map +1 -0
  103. package/dist/7912.js +1 -0
  104. package/dist/7912.js.map +1 -0
  105. package/dist/8358.js +1 -0
  106. package/dist/8358.js.map +1 -0
  107. package/dist/8359.js +1 -0
  108. package/dist/8359.js.map +1 -0
  109. package/dist/8695.js +1 -0
  110. package/dist/8695.js.map +1 -0
  111. package/dist/903.js +1 -0
  112. package/dist/903.js.map +1 -0
  113. package/dist/9061.js +1 -0
  114. package/dist/9061.js.map +1 -0
  115. package/dist/9072.js +1 -0
  116. package/dist/9072.js.map +1 -0
  117. package/dist/9397.js +1 -0
  118. package/dist/9397.js.map +1 -0
  119. package/dist/9712.js +1 -0
  120. package/dist/9712.js.map +1 -0
  121. package/dist/9771.js +1 -0
  122. package/dist/9771.js.map +1 -0
  123. package/dist/9806.js +1 -0
  124. package/dist/9806.js.map +1 -0
  125. package/dist/9816.js +1 -0
  126. package/dist/9816.js.map +1 -0
  127. package/dist/main.js +7 -6
  128. package/dist/main.js.map +1 -1
  129. package/dist/openmrs-esm-patient-registration-app.js +6 -0
  130. package/dist/{olaboot-esm-patient-registration-app.js.buildmanifest.json → openmrs-esm-patient-registration-app.js.buildmanifest.json} +540 -455
  131. package/dist/openmrs-esm-patient-registration-app.js.map +1 -0
  132. package/dist/routes.json +1 -1
  133. package/package.json +8 -9
  134. package/src/add-patient-link.extension.tsx +3 -2
  135. package/src/add-patient-link.test.tsx +2 -1
  136. package/src/config-schema.ts +1 -1
  137. package/src/index.ts +2 -24
  138. package/src/nav-link.test.tsx +1 -0
  139. package/src/offline.resources.ts +97 -31
  140. package/src/patient-registration/before-save-prompt.test.tsx +199 -0
  141. package/src/patient-registration/field/__mocks__/field.resource.ts +8 -7
  142. package/src/patient-registration/field/address/address-field.component.tsx +10 -13
  143. package/src/patient-registration/field/address/address-hierarchy-levels.component.tsx +6 -1
  144. package/src/patient-registration/field/address/address-hierarchy.test.tsx +191 -198
  145. package/src/patient-registration/field/address/address-search.component.tsx +20 -8
  146. package/src/patient-registration/field/address/address-search.scss +19 -2
  147. package/src/patient-registration/field/address/address-search.test.tsx +249 -57
  148. package/src/patient-registration/field/address/custom-address-field.component.tsx +1 -1
  149. package/src/patient-registration/field/cause-of-death/cause-of-death.component.tsx +1 -1
  150. package/src/patient-registration/field/cause-of-death/cause-of-death.test.tsx +251 -0
  151. package/src/patient-registration/field/custom-field.component.tsx +1 -1
  152. package/src/patient-registration/field/date-and-time-of-death/date-and-time-of-death.component.tsx +1 -1
  153. package/src/patient-registration/field/date-and-time-of-death/date-and-time-of-death.test.tsx +144 -0
  154. package/src/patient-registration/field/dob/dob.component.tsx +2 -2
  155. package/src/patient-registration/field/dob/dob.test.tsx +370 -54
  156. package/src/patient-registration/field/field.component.tsx +1 -1
  157. package/src/patient-registration/field/field.resource.ts +2 -2
  158. package/src/patient-registration/field/field.test.tsx +25 -22
  159. package/src/patient-registration/field/gender/gender-field.test.tsx +240 -54
  160. package/src/patient-registration/field/id/id-field.component.tsx +15 -5
  161. package/src/patient-registration/field/id/id-field.test.tsx +103 -47
  162. package/src/patient-registration/field/id/identifier-selection-overlay.test.tsx +346 -0
  163. package/src/patient-registration/field/name/name-field.component.tsx +2 -2
  164. package/src/patient-registration/field/name/name-field.test.tsx +282 -0
  165. package/src/patient-registration/field/obs/obs-field.test.tsx +294 -118
  166. package/src/patient-registration/field/person-attributes/coded-person-attribute-field.test.tsx +172 -108
  167. package/src/patient-registration/field/person-attributes/location-person-attribute-field.component.tsx +3 -3
  168. package/src/patient-registration/field/person-attributes/location-person-attribute-field.resource.tsx +2 -5
  169. package/src/patient-registration/field/person-attributes/person-attribute-field.component.tsx +2 -2
  170. package/src/patient-registration/field/person-attributes/person-attribute-field.test.tsx +249 -131
  171. package/src/patient-registration/field/person-attributes/person-attributes.resource.ts +1 -1
  172. package/src/patient-registration/field/person-attributes/text-person-attribute-field.test.tsx +98 -70
  173. package/src/patient-registration/field/phone/phone-field.test.tsx +100 -0
  174. package/src/patient-registration/form-manager.test.ts +6 -5
  175. package/src/patient-registration/form-manager.ts +5 -2
  176. package/src/patient-registration/input/basic-input/input/input.component.tsx +3 -121
  177. package/src/patient-registration/input/basic-input/input/input.test.tsx +151 -51
  178. package/src/patient-registration/input/basic-input/select/select-input.test.tsx +113 -33
  179. package/src/patient-registration/input/combo-input/combo-input.component.tsx +60 -24
  180. package/src/patient-registration/input/custom-input/autosuggest/autosuggest.component.tsx +10 -101
  181. package/src/patient-registration/input/custom-input/autosuggest/autosuggest.test.tsx +144 -108
  182. package/src/patient-registration/input/custom-input/identifier/identifier-input.test.tsx +241 -177
  183. package/src/patient-registration/input/custom-input/identifier/utils.test.ts +47 -8
  184. package/src/patient-registration/input/dummy-data/dummy-data-input.component.tsx +12 -12
  185. package/src/patient-registration/input/dummy-data/dummy-data-input.test.tsx +52 -20
  186. package/src/patient-registration/input/input.scss +1 -2
  187. package/src/patient-registration/patient-registration-context.ts +5 -3
  188. package/src/patient-registration/patient-registration-hooks.ts +4 -12
  189. package/src/patient-registration/patient-registration-utils.test.ts +2 -1
  190. package/src/patient-registration/patient-registration-utils.ts +2 -98
  191. package/src/patient-registration/patient-registration.component.tsx +50 -46
  192. package/src/patient-registration/patient-registration.resource.test.tsx +4 -7
  193. package/src/patient-registration/patient-registration.resource.ts +1 -4
  194. package/src/patient-registration/patient-registration.scss +16 -3
  195. package/src/patient-registration/patient-registration.test.tsx +99 -65
  196. package/src/patient-registration/patient-registration.types.ts +17 -28
  197. package/src/patient-registration/section/death-info/death-info-section.test.tsx +130 -34
  198. package/src/patient-registration/section/demographics/demographics-section.test.tsx +122 -68
  199. package/src/patient-registration/section/patient-relationships/relationships-section.component.tsx +15 -15
  200. package/src/patient-registration/section/patient-relationships/relationships-section.test.tsx +278 -84
  201. package/src/patient-registration/section/section-wrapper.component.tsx +1 -1
  202. package/src/patient-registration/ui-components/overlay/overlay.test.tsx +104 -0
  203. package/src/patient-registration/validation/patient-registration-validation.test.ts +2 -1
  204. package/src/patient-registration/validation/patient-registration-validation.ts +9 -3
  205. package/src/root.component.tsx +2 -5
  206. package/src/widgets/cancel-patient-edit.test.tsx +48 -11
  207. package/src/widgets/delete-identifier-confirmation.test.tsx +77 -24
  208. package/src/widgets/edit-patient-details-button.component.tsx +14 -18
  209. package/src/widgets/edit-patient-details-button.scss +2 -2
  210. package/src/widgets/edit-patient-details-button.test.tsx +11 -13
  211. package/translations/am.json +9 -4
  212. package/translations/ar.json +9 -4
  213. package/translations/ar_SY.json +9 -4
  214. package/translations/bn.json +9 -4
  215. package/translations/cs.json +9 -4
  216. package/translations/de.json +120 -115
  217. package/translations/en.json +9 -4
  218. package/translations/en_US.json +9 -4
  219. package/translations/es.json +9 -4
  220. package/translations/es_MX.json +9 -4
  221. package/translations/fr.json +9 -4
  222. package/translations/he.json +9 -4
  223. package/translations/hi.json +9 -4
  224. package/translations/hi_IN.json +9 -4
  225. package/translations/id.json +9 -4
  226. package/translations/it.json +9 -4
  227. package/translations/ka.json +9 -4
  228. package/translations/km.json +9 -4
  229. package/translations/ku.json +9 -4
  230. package/translations/ky.json +9 -4
  231. package/translations/lg.json +9 -4
  232. package/translations/ne.json +9 -4
  233. package/translations/pl.json +9 -4
  234. package/translations/pt.json +9 -4
  235. package/translations/pt_BR.json +10 -5
  236. package/translations/qu.json +9 -4
  237. package/translations/ro_RO.json +9 -4
  238. package/translations/ru_RU.json +9 -4
  239. package/translations/si.json +9 -4
  240. package/translations/sq.json +9 -4
  241. package/translations/sw.json +9 -4
  242. package/translations/sw_KE.json +9 -4
  243. package/translations/tr.json +9 -4
  244. package/translations/tr_TR.json +9 -4
  245. package/translations/uk.json +9 -4
  246. package/translations/uz.json +9 -4
  247. package/translations/uz@Latn.json +9 -4
  248. package/translations/uz_UZ.json +9 -4
  249. package/translations/vi.json +9 -4
  250. package/translations/zh.json +50 -45
  251. package/translations/zh_CN.json +9 -4
  252. package/translations/zh_TW.json +9 -4
  253. package/vitest.config.ts +4 -0
  254. package/ADDRESS_CONFIGURATION.md +0 -152
  255. package/IDENTIFIER_CONFIGURATION.md +0 -142
  256. package/IMPLEMENTATION_SUMMARY.md +0 -111
  257. package/QUICK_START.md +0 -95
  258. package/address-required-fields-config.json +0 -26
  259. package/dist/126.js +0 -1
  260. package/dist/15.js +0 -1
  261. package/dist/1564.js +0 -1
  262. package/dist/1567.js +0 -1
  263. package/dist/1845.js +0 -1
  264. package/dist/1953.js +0 -1
  265. package/dist/200.js +0 -1
  266. package/dist/200.js.map +0 -1
  267. package/dist/215.js +0 -1
  268. package/dist/2178.js +0 -1
  269. package/dist/250.js +0 -1
  270. package/dist/250.js.map +0 -1
  271. package/dist/2523.js +0 -1
  272. package/dist/2523.js.map +0 -1
  273. package/dist/2566.js +0 -1
  274. package/dist/2586.js +0 -1
  275. package/dist/2586.js.map +0 -1
  276. package/dist/2716.js +0 -1
  277. package/dist/2716.js.map +0 -1
  278. package/dist/2759.js +0 -1
  279. package/dist/2821.js +0 -6
  280. package/dist/2821.js.map +0 -1
  281. package/dist/3089.js +0 -1
  282. package/dist/3089.js.map +0 -1
  283. package/dist/3230.js +0 -1
  284. package/dist/3441.js +0 -1
  285. package/dist/3565.js +0 -1
  286. package/dist/3571.js +0 -1
  287. package/dist/3571.js.map +0 -1
  288. package/dist/3746.js +0 -1
  289. package/dist/3925.js +0 -1
  290. package/dist/3946.js +0 -1
  291. package/dist/4024.js +0 -1
  292. package/dist/4744.js +0 -1
  293. package/dist/4744.js.map +0 -1
  294. package/dist/4809.js +0 -1
  295. package/dist/4894.js +0 -1
  296. package/dist/4970.js +0 -1
  297. package/dist/4970.js.map +0 -1
  298. package/dist/5130.js +0 -1
  299. package/dist/5187.js +0 -1
  300. package/dist/5491.js +0 -1
  301. package/dist/5491.js.map +0 -1
  302. package/dist/5595.js +0 -1
  303. package/dist/5961.js +0 -1
  304. package/dist/6133.js +0 -1
  305. package/dist/634.js +0 -1
  306. package/dist/634.js.map +0 -1
  307. package/dist/6456.js +0 -1
  308. package/dist/6466.js +0 -1
  309. package/dist/6613.js +0 -1
  310. package/dist/6783.js +0 -1
  311. package/dist/7073.js +0 -38
  312. package/dist/7073.js.map +0 -1
  313. package/dist/7154.js +0 -1
  314. package/dist/7154.js.map +0 -1
  315. package/dist/7348.js +0 -1
  316. package/dist/7439.js +0 -1
  317. package/dist/7439.js.map +0 -1
  318. package/dist/7543.js +0 -1
  319. package/dist/7607.js +0 -1
  320. package/dist/772.js +0 -1
  321. package/dist/7984.js +0 -1
  322. package/dist/7984.js.map +0 -1
  323. package/dist/8538.js +0 -1
  324. package/dist/8538.js.map +0 -1
  325. package/dist/8599.js +0 -1
  326. package/dist/8727.js +0 -1
  327. package/dist/8847.js +0 -1
  328. package/dist/9015.js +0 -1
  329. package/dist/906.js +0 -1
  330. package/dist/9065.js +0 -1
  331. package/dist/9182.js +0 -1
  332. package/dist/9339.js +0 -1
  333. package/dist/9453.js +0 -1
  334. package/dist/9833.js +0 -1
  335. package/dist/9833.js.map +0 -1
  336. package/dist/9856.js +0 -1
  337. package/dist/9856.js.map +0 -1
  338. package/dist/9920.js +0 -1
  339. package/dist/9938.js +0 -1
  340. package/dist/9943.js +0 -1
  341. package/dist/9943.js.map +0 -1
  342. package/dist/olaboot-esm-patient-registration-app.js +0 -5
  343. package/dist/olaboot-esm-patient-registration-app.js.map +0 -1
  344. package/example-config.json +0 -14
  345. package/jest.config.js +0 -3
  346. package/src/resource.ts +0 -12
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
- import { screen } from '@testing-library/react';
2
+ import { vi, describe, it, expect } from 'vitest';
3
+ import { screen, waitFor } from '@testing-library/react';
3
4
  import userEvent from '@testing-library/user-event';
4
5
  import { renderWithRouter } from 'tools';
5
6
  import { Autosuggest } from './autosuggest.component';
@@ -29,136 +30,171 @@ const mockGetSearchResults = async (query: string) => {
29
30
  });
30
31
  };
31
32
 
32
- const mockHandleSuggestionSelected = jest.fn((field, value) => [field, value]);
33
-
34
- describe('Autosuggest', () => {
35
- it('renders a search box', () => {
36
- renderWithRouter(
37
- <Autosuggest
38
- getSearchResults={mockGetSearchResults}
39
- getDisplayValue={(item) => item.display}
40
- getFieldValue={(item) => item.uuid}
41
- id="person"
42
- labelText=""
43
- onSuggestionSelected={mockHandleSuggestionSelected}
44
- placeholder="Find Person"
45
- />,
46
- );
47
-
48
- expect(screen.getByRole('searchbox')).toBeInTheDocument();
49
- expect(screen.queryByRole('list')).not.toBeInTheDocument();
33
+ /**
34
+ * Helper to render Autosuggest component.
35
+ */
36
+ function renderAutosuggest(
37
+ props: {
38
+ id?: string;
39
+ labelText?: string;
40
+ placeholder?: string;
41
+ onSuggestionSelected?: (field: string, value: string) => void;
42
+ getSearchResults?: (query: string) => Promise<Array<{ uuid: string; display: string }>>;
43
+ } = {},
44
+ ) {
45
+ const defaultProps = {
46
+ id: 'person',
47
+ labelText: '',
48
+ placeholder: 'Find Person',
49
+ onSuggestionSelected: vi.fn(),
50
+ getSearchResults: mockGetSearchResults,
51
+ getDisplayValue: (item: { display: string }) => item.display,
52
+ getFieldValue: (item: { uuid: string }) => item.uuid,
53
+ ...props,
54
+ };
55
+
56
+ return renderWithRouter(<Autosuggest<{ display: string; uuid: string }> {...defaultProps} />);
57
+ }
58
+
59
+ describe('Autosuggest component', () => {
60
+ describe('Rendering', () => {
61
+ it('renders a search box', () => {
62
+ renderAutosuggest();
63
+
64
+ expect(screen.getByRole('searchbox')).toBeInTheDocument();
65
+ expect(screen.queryByRole('list')).not.toBeInTheDocument();
66
+ });
67
+
68
+ it('renders with custom label text', () => {
69
+ renderAutosuggest({ labelText: 'Search Person' });
70
+
71
+ expect(screen.getByLabelText('Search Person')).toBeInTheDocument();
72
+ });
50
73
  });
51
74
 
52
- it('renders matching search results in a list when the user types a query', async () => {
53
- const user = userEvent.setup();
54
-
55
- renderWithRouter(
56
- <Autosuggest
57
- getSearchResults={mockGetSearchResults}
58
- getDisplayValue={(item) => item.display}
59
- getFieldValue={(item) => item.uuid}
60
- id="person"
61
- labelText=""
62
- onSuggestionSelected={mockHandleSuggestionSelected}
63
- placeholder="Find Person"
64
- />,
65
- );
66
-
67
- const searchbox = screen.getByRole('searchbox');
68
- await user.type(searchbox, 'john');
69
-
70
- const list = screen.getByRole('list');
71
-
72
- expect(list).toBeInTheDocument();
73
- expect(screen.getAllByRole('listitem').length).toEqual(2);
74
- expect(screen.getAllByRole('listitem')[0]).toHaveTextContent('John Doe');
75
- expect(screen.getAllByRole('listitem')[1]).toHaveTextContent('John Smith');
76
- });
75
+ describe('Search functionality', () => {
76
+ it('renders matching search results when user types a query', async () => {
77
+ const user = userEvent.setup();
78
+ renderAutosuggest();
79
+
80
+ const searchbox = screen.getByRole('searchbox');
81
+ await user.type(searchbox, 'john');
82
+
83
+ await waitFor(() => {
84
+ expect(screen.getByRole('list')).toBeInTheDocument();
85
+ });
86
+
87
+ await waitFor(() => {
88
+ expect(screen.getAllByRole('listitem').length).toBe(2);
89
+ });
90
+
91
+ expect(screen.getAllByRole('listitem')[0]).toHaveTextContent('John Doe');
92
+ expect(screen.getAllByRole('listitem')[1]).toHaveTextContent('John Smith');
93
+ });
94
+
95
+ it('updates suggestions when search input changes', async () => {
96
+ const user = userEvent.setup();
97
+ renderAutosuggest();
98
+
99
+ const searchbox = screen.getByRole('searchbox');
77
100
 
78
- it('clears the list of suggestions when a suggestion is selected', async () => {
79
- const user = userEvent.setup();
101
+ // Type "john" - should show 2 results
102
+ await user.type(searchbox, 'john');
80
103
 
81
- renderWithRouter(
82
- <Autosuggest
83
- getSearchResults={mockGetSearchResults}
84
- getDisplayValue={(item) => item.display}
85
- getFieldValue={(item) => item.uuid}
86
- id="person"
87
- labelText=""
88
- onSuggestionSelected={mockHandleSuggestionSelected}
89
- placeholder="Find Person"
90
- />,
91
- );
104
+ await waitFor(() => {
105
+ expect(screen.getByText('John Doe')).toBeInTheDocument();
106
+ });
92
107
 
93
- let list = screen.queryByRole('list');
94
- expect(list).not.toBeInTheDocument();
108
+ expect(screen.getByText('John Smith')).toBeInTheDocument();
95
109
 
96
- const searchbox = screen.getByRole('searchbox');
97
- await user.type(searchbox, 'john');
110
+ // Clear and type "james" - should show 1 result
111
+ await user.clear(searchbox);
112
+ await user.type(searchbox, 'james');
98
113
 
99
- list = screen.getByRole('list');
100
- expect(list).toBeInTheDocument();
114
+ await waitFor(() => {
115
+ expect(screen.queryByText('John Doe')).not.toBeInTheDocument();
116
+ });
101
117
 
102
- const listitems = screen.getAllByRole('listitem');
103
- await user.click(listitems[0]);
118
+ await waitFor(() => {
119
+ expect(screen.getByText('James Smith')).toBeInTheDocument();
120
+ });
121
+ });
104
122
 
105
- expect(mockHandleSuggestionSelected).toHaveBeenLastCalledWith('person', 'randomuuid1');
123
+ it('hides suggestions when search input is cleared', async () => {
124
+ const user = userEvent.setup();
125
+ renderAutosuggest();
106
126
 
107
- list = screen.queryByRole('list');
108
- expect(list).not.toBeInTheDocument();
127
+ const searchbox = screen.getByRole('searchbox');
128
+ await user.type(searchbox, 'john');
129
+
130
+ await waitFor(() => {
131
+ expect(screen.getByRole('list')).toBeInTheDocument();
132
+ });
133
+
134
+ await user.clear(searchbox);
135
+
136
+ await waitFor(() => {
137
+ expect(screen.queryByRole('list')).not.toBeInTheDocument();
138
+ });
139
+ });
109
140
  });
110
141
 
111
- it('changes suggestions when a search input is changed', async () => {
112
- const user = userEvent.setup();
142
+ describe('Suggestion selection', () => {
143
+ it('calls onSuggestionSelected when user clicks a suggestion', async () => {
144
+ const user = userEvent.setup();
145
+ const mockOnSuggestionSelected = vi.fn();
146
+ renderAutosuggest({ onSuggestionSelected: mockOnSuggestionSelected });
147
+
148
+ const searchbox = screen.getByRole('searchbox');
149
+ await user.type(searchbox, 'john');
150
+
151
+ await waitFor(() => {
152
+ expect(screen.getByRole('list')).toBeInTheDocument();
153
+ });
154
+
155
+ const listitems = screen.getAllByRole('listitem');
156
+ await user.click(listitems[0]);
113
157
 
114
- renderWithRouter(
115
- <Autosuggest
116
- getSearchResults={mockGetSearchResults}
117
- getDisplayValue={(item) => item.display}
118
- getFieldValue={(item) => item.uuid}
119
- id="person"
120
- labelText=""
121
- onSuggestionSelected={mockHandleSuggestionSelected}
122
- placeholder="Find Person"
123
- />,
124
- );
158
+ expect(mockOnSuggestionSelected).toHaveBeenCalledWith('person', 'randomuuid1');
159
+ });
125
160
 
126
- let list = screen.queryByRole('list');
127
- expect(list).not.toBeInTheDocument();
161
+ it('clears the suggestions list when a suggestion is selected', async () => {
162
+ const user = userEvent.setup();
163
+ renderAutosuggest();
128
164
 
129
- const searchbox = screen.getByRole('searchbox');
130
- await user.type(searchbox, 'john');
165
+ const searchbox = screen.getByRole('searchbox');
166
+ await user.type(searchbox, 'john');
131
167
 
132
- const suggestion = await screen.findByText('John Doe');
133
- expect(suggestion).toBeInTheDocument();
168
+ await waitFor(() => {
169
+ expect(screen.getByRole('list')).toBeInTheDocument();
170
+ });
134
171
 
135
- await user.clear(searchbox);
172
+ const listitems = screen.getAllByRole('listitem');
173
+ await user.click(listitems[0]);
136
174
 
137
- list = screen.queryByRole('list');
138
- expect(list).not.toBeInTheDocument();
175
+ await waitFor(() => {
176
+ expect(screen.queryByRole('list')).not.toBeInTheDocument();
177
+ });
178
+ });
139
179
  });
140
180
 
141
- it('hides the list of suggestions when the user clicks outside of the component', async () => {
142
- const user = userEvent.setup();
181
+ describe('Click outside behavior', () => {
182
+ it('hides suggestions when user clicks outside the component', async () => {
183
+ const user = userEvent.setup();
184
+ renderAutosuggest();
143
185
 
144
- renderWithRouter(
145
- <Autosuggest
146
- getSearchResults={mockGetSearchResults}
147
- getDisplayValue={(item) => item.display}
148
- getFieldValue={(item) => item.uuid}
149
- id="person"
150
- labelText=""
151
- onSuggestionSelected={mockHandleSuggestionSelected}
152
- placeholder="Find Person"
153
- />,
154
- );
186
+ const input = screen.getByRole('searchbox');
187
+ await user.type(input, 'john');
155
188
 
156
- const input = screen.getByRole('searchbox');
189
+ await waitFor(() => {
190
+ expect(screen.getByText('John Doe')).toBeInTheDocument();
191
+ });
157
192
 
158
- await user.type(input, 'john');
159
- await screen.findByText('John Doe');
160
- await user.click(document.body);
193
+ await user.click(document.body);
161
194
 
162
- expect(screen.queryByText('John Doe')).not.toBeInTheDocument();
195
+ await waitFor(() => {
196
+ expect(screen.queryByText('John Doe')).not.toBeInTheDocument();
197
+ });
198
+ });
163
199
  });
164
200
  });