@olaboot/esm-patient-registration-app 9.2.1 → 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 (342) 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 +507 -507
  137. package/src/constants.ts +1 -1
  138. package/src/index.ts +2 -24
  139. package/src/nav-link.test.tsx +1 -0
  140. package/src/offline.resources.ts +97 -31
  141. package/src/patient-registration/before-save-prompt.test.tsx +199 -0
  142. package/src/patient-registration/field/__mocks__/field.resource.ts +8 -7
  143. package/src/patient-registration/field/address/address-field.component.tsx +183 -186
  144. package/src/patient-registration/field/address/address-hierarchy-levels.component.tsx +6 -1
  145. package/src/patient-registration/field/address/address-hierarchy.test.tsx +289 -296
  146. package/src/patient-registration/field/address/address-search.component.tsx +20 -8
  147. package/src/patient-registration/field/address/address-search.scss +19 -2
  148. package/src/patient-registration/field/address/address-search.test.tsx +333 -141
  149. package/src/patient-registration/field/address/custom-address-field.component.tsx +1 -1
  150. package/src/patient-registration/field/cause-of-death/cause-of-death.component.tsx +1 -1
  151. package/src/patient-registration/field/cause-of-death/cause-of-death.test.tsx +251 -0
  152. package/src/patient-registration/field/custom-field.component.tsx +1 -1
  153. package/src/patient-registration/field/date-and-time-of-death/date-and-time-of-death.component.tsx +1 -1
  154. package/src/patient-registration/field/date-and-time-of-death/date-and-time-of-death.test.tsx +144 -0
  155. package/src/patient-registration/field/dob/dob.component.tsx +2 -2
  156. package/src/patient-registration/field/dob/dob.test.tsx +370 -54
  157. package/src/patient-registration/field/field.component.tsx +1 -1
  158. package/src/patient-registration/field/field.resource.ts +2 -2
  159. package/src/patient-registration/field/field.test.tsx +333 -330
  160. package/src/patient-registration/field/gender/gender-field.test.tsx +240 -54
  161. package/src/patient-registration/field/id/id-field.component.tsx +146 -144
  162. package/src/patient-registration/field/id/id-field.test.tsx +177 -121
  163. package/src/patient-registration/field/id/identifier-selection-overlay.component.tsx +200 -200
  164. package/src/patient-registration/field/id/identifier-selection-overlay.test.tsx +346 -0
  165. package/src/patient-registration/field/name/name-field.component.tsx +2 -2
  166. package/src/patient-registration/field/name/name-field.test.tsx +282 -0
  167. package/src/patient-registration/field/obs/obs-field.test.tsx +294 -118
  168. package/src/patient-registration/field/person-attributes/coded-person-attribute-field.test.tsx +172 -108
  169. package/src/patient-registration/field/person-attributes/location-person-attribute-field.component.tsx +3 -3
  170. package/src/patient-registration/field/person-attributes/location-person-attribute-field.resource.tsx +2 -5
  171. package/src/patient-registration/field/person-attributes/person-attribute-field.component.tsx +2 -2
  172. package/src/patient-registration/field/person-attributes/person-attribute-field.test.tsx +249 -131
  173. package/src/patient-registration/field/person-attributes/person-attributes.resource.ts +1 -1
  174. package/src/patient-registration/field/person-attributes/text-person-attribute-field.test.tsx +98 -70
  175. package/src/patient-registration/field/phone/phone-field.test.tsx +100 -0
  176. package/src/patient-registration/form-manager.test.ts +6 -5
  177. package/src/patient-registration/form-manager.ts +5 -2
  178. package/src/patient-registration/input/basic-input/input/input.component.tsx +3 -121
  179. package/src/patient-registration/input/basic-input/input/input.test.tsx +151 -51
  180. package/src/patient-registration/input/basic-input/select/select-input.test.tsx +113 -33
  181. package/src/patient-registration/input/combo-input/combo-input.component.tsx +60 -24
  182. package/src/patient-registration/input/custom-input/autosuggest/autosuggest.component.tsx +10 -101
  183. package/src/patient-registration/input/custom-input/autosuggest/autosuggest.test.tsx +144 -108
  184. package/src/patient-registration/input/custom-input/identifier/identifier-input.test.tsx +241 -177
  185. package/src/patient-registration/input/custom-input/identifier/utils.test.ts +47 -8
  186. package/src/patient-registration/input/dummy-data/dummy-data-input.component.tsx +12 -12
  187. package/src/patient-registration/input/dummy-data/dummy-data-input.test.tsx +52 -20
  188. package/src/patient-registration/input/input.scss +1 -2
  189. package/src/patient-registration/patient-registration-context.ts +5 -3
  190. package/src/patient-registration/patient-registration-hooks.ts +4 -12
  191. package/src/patient-registration/patient-registration-utils.test.ts +2 -1
  192. package/src/patient-registration/patient-registration-utils.ts +2 -98
  193. package/src/patient-registration/patient-registration.component.tsx +50 -46
  194. package/src/patient-registration/patient-registration.resource.test.tsx +4 -7
  195. package/src/patient-registration/patient-registration.resource.ts +1 -4
  196. package/src/patient-registration/patient-registration.scss +16 -3
  197. package/src/patient-registration/patient-registration.test.tsx +614 -580
  198. package/src/patient-registration/patient-registration.types.ts +17 -28
  199. package/src/patient-registration/section/death-info/death-info-section.test.tsx +130 -34
  200. package/src/patient-registration/section/demographics/demographics-section.test.tsx +122 -68
  201. package/src/patient-registration/section/patient-relationships/relationships-section.component.tsx +15 -15
  202. package/src/patient-registration/section/patient-relationships/relationships-section.test.tsx +278 -84
  203. package/src/patient-registration/section/section-wrapper.component.tsx +1 -1
  204. package/src/patient-registration/ui-components/overlay/overlay.test.tsx +104 -0
  205. package/src/patient-registration/validation/patient-registration-validation.test.ts +2 -1
  206. package/src/patient-registration/validation/patient-registration-validation.ts +9 -3
  207. package/src/root.component.tsx +2 -5
  208. package/src/widgets/cancel-patient-edit.test.tsx +48 -11
  209. package/src/widgets/delete-identifier-confirmation.test.tsx +77 -24
  210. package/src/widgets/edit-patient-details-button.component.tsx +14 -18
  211. package/src/widgets/edit-patient-details-button.scss +2 -2
  212. package/src/widgets/edit-patient-details-button.test.tsx +11 -13
  213. package/translations/am.json +9 -4
  214. package/translations/ar.json +9 -4
  215. package/translations/ar_SY.json +9 -4
  216. package/translations/bn.json +9 -4
  217. package/translations/cs.json +9 -4
  218. package/translations/de.json +120 -115
  219. package/translations/en.json +10 -4
  220. package/translations/en_US.json +9 -4
  221. package/translations/es.json +9 -4
  222. package/translations/es_MX.json +9 -4
  223. package/translations/fr.json +9 -4
  224. package/translations/he.json +9 -4
  225. package/translations/hi.json +9 -4
  226. package/translations/hi_IN.json +9 -4
  227. package/translations/id.json +9 -4
  228. package/translations/it.json +9 -4
  229. package/translations/ka.json +9 -4
  230. package/translations/km.json +9 -4
  231. package/translations/ku.json +9 -4
  232. package/translations/ky.json +9 -4
  233. package/translations/lg.json +9 -4
  234. package/translations/ne.json +9 -4
  235. package/translations/pl.json +9 -4
  236. package/translations/pt.json +9 -4
  237. package/translations/pt_BR.json +10 -5
  238. package/translations/qu.json +9 -4
  239. package/translations/ro_RO.json +9 -4
  240. package/translations/ru_RU.json +9 -4
  241. package/translations/si.json +9 -4
  242. package/translations/sq.json +9 -4
  243. package/translations/sw.json +9 -4
  244. package/translations/sw_KE.json +9 -4
  245. package/translations/tr.json +9 -4
  246. package/translations/tr_TR.json +9 -4
  247. package/translations/uk.json +9 -4
  248. package/translations/uz.json +9 -4
  249. package/translations/uz@Latn.json +9 -4
  250. package/translations/uz_UZ.json +9 -4
  251. package/translations/vi.json +9 -4
  252. package/translations/zh.json +50 -45
  253. package/translations/zh_CN.json +9 -4
  254. package/translations/zh_TW.json +9 -4
  255. package/vitest.config.ts +4 -0
  256. package/dist/126.js +0 -1
  257. package/dist/15.js +0 -1
  258. package/dist/1564.js +0 -1
  259. package/dist/1567.js +0 -1
  260. package/dist/1845.js +0 -1
  261. package/dist/1953.js +0 -1
  262. package/dist/200.js +0 -1
  263. package/dist/200.js.map +0 -1
  264. package/dist/215.js +0 -1
  265. package/dist/2178.js +0 -1
  266. package/dist/250.js +0 -1
  267. package/dist/250.js.map +0 -1
  268. package/dist/2523.js +0 -1
  269. package/dist/2523.js.map +0 -1
  270. package/dist/2566.js +0 -1
  271. package/dist/2586.js +0 -1
  272. package/dist/2586.js.map +0 -1
  273. package/dist/2716.js +0 -1
  274. package/dist/2716.js.map +0 -1
  275. package/dist/2759.js +0 -1
  276. package/dist/2821.js +0 -6
  277. package/dist/2821.js.map +0 -1
  278. package/dist/3089.js +0 -1
  279. package/dist/3089.js.map +0 -1
  280. package/dist/3230.js +0 -1
  281. package/dist/3441.js +0 -1
  282. package/dist/3565.js +0 -1
  283. package/dist/3571.js +0 -1
  284. package/dist/3571.js.map +0 -1
  285. package/dist/3746.js +0 -1
  286. package/dist/3925.js +0 -1
  287. package/dist/3946.js +0 -1
  288. package/dist/4024.js +0 -1
  289. package/dist/4744.js +0 -1
  290. package/dist/4744.js.map +0 -1
  291. package/dist/4809.js +0 -1
  292. package/dist/4894.js +0 -1
  293. package/dist/4970.js +0 -1
  294. package/dist/4970.js.map +0 -1
  295. package/dist/5130.js +0 -1
  296. package/dist/5187.js +0 -1
  297. package/dist/5491.js +0 -1
  298. package/dist/5491.js.map +0 -1
  299. package/dist/5595.js +0 -1
  300. package/dist/5961.js +0 -1
  301. package/dist/6133.js +0 -1
  302. package/dist/634.js +0 -1
  303. package/dist/634.js.map +0 -1
  304. package/dist/6456.js +0 -1
  305. package/dist/6466.js +0 -1
  306. package/dist/6613.js +0 -1
  307. package/dist/6783.js +0 -1
  308. package/dist/7073.js +0 -38
  309. package/dist/7073.js.map +0 -1
  310. package/dist/7154.js +0 -1
  311. package/dist/7154.js.map +0 -1
  312. package/dist/7348.js +0 -1
  313. package/dist/7439.js +0 -1
  314. package/dist/7439.js.map +0 -1
  315. package/dist/7543.js +0 -1
  316. package/dist/7607.js +0 -1
  317. package/dist/772.js +0 -1
  318. package/dist/7984.js +0 -1
  319. package/dist/7984.js.map +0 -1
  320. package/dist/8538.js +0 -1
  321. package/dist/8538.js.map +0 -1
  322. package/dist/8599.js +0 -1
  323. package/dist/8727.js +0 -1
  324. package/dist/8847.js +0 -1
  325. package/dist/9015.js +0 -1
  326. package/dist/906.js +0 -1
  327. package/dist/9065.js +0 -1
  328. package/dist/9182.js +0 -1
  329. package/dist/9339.js +0 -1
  330. package/dist/9453.js +0 -1
  331. package/dist/9833.js +0 -1
  332. package/dist/9833.js.map +0 -1
  333. package/dist/9856.js +0 -1
  334. package/dist/9856.js.map +0 -1
  335. package/dist/9920.js +0 -1
  336. package/dist/9938.js +0 -1
  337. package/dist/9943.js +0 -1
  338. package/dist/9943.js.map +0 -1
  339. package/dist/olaboot-esm-patient-registration-app.js +0 -5
  340. package/dist/olaboot-esm-patient-registration-app.js.map +0 -1
  341. package/jest.config.js +0 -3
  342. package/src/resource.ts +0 -12
@@ -1,121 +1,177 @@
1
- import React from 'react';
2
- import { Form, Formik } from 'formik';
3
- import { screen } from '@testing-library/react';
4
- import { getDefaultsFromConfigSchema, useConfig } from '@openmrs/esm-framework';
5
- import { type AddressTemplate, type IdentifierSource } from '../../patient-registration.types';
6
- import { mockIdentifierTypes, mockOpenmrsId, mockPatient, mockSession } from '__mocks__';
7
- import { renderWithContext } from 'tools';
8
- import { esmPatientRegistrationSchema, type RegistrationConfig } from '../../../config-schema';
9
- import { type Resources } from '../../../offline.resources';
10
- import {
11
- PatientRegistrationContextProvider,
12
- type PatientRegistrationContextProps,
13
- } from '../../patient-registration-context';
14
- import { Identifiers, setIdentifierSource } from './id-field.component';
15
- import { ResourcesContextProvider } from '../../../resources-context';
16
-
17
- const mockUseConfig = jest.mocked(useConfig<RegistrationConfig>);
18
-
19
- const mockResourcesContextValue = {
20
- addressTemplate: null as unknown as AddressTemplate,
21
- currentSession: mockSession.data,
22
- identifierTypes: [],
23
- relationshipTypes: [],
24
- } as Resources;
25
-
26
- const mockInitialFormValues = {
27
- additionalFamilyName: '',
28
- additionalGivenName: '',
29
- additionalMiddleName: '',
30
- addNameInLocalLanguage: false,
31
- address: {},
32
- birthdate: null,
33
- birthdateEstimated: false,
34
- deathCause: '',
35
- deathDate: '',
36
- familyName: 'Doe',
37
- gender: 'male',
38
- givenName: 'John',
39
- identifiers: mockOpenmrsId,
40
- isDead: false,
41
- middleName: 'Test',
42
- monthsEstimated: 0,
43
- patientUuid: mockPatient.uuid,
44
- relationships: [],
45
- telephoneNumber: '',
46
- yearsEstimated: 0,
47
- };
48
-
49
- const mockContextValues: PatientRegistrationContextProps = {
50
- currentPhoto: null,
51
- inEditMode: false,
52
- identifierTypes: [],
53
- initialFormValues: mockInitialFormValues,
54
- isOffline: false,
55
- setCapturePhotoProps: jest.fn(),
56
- setFieldValue: jest.fn(),
57
- setInitialFormValues: jest.fn(),
58
- validationSchema: null,
59
- values: mockInitialFormValues,
60
- } as unknown as PatientRegistrationContextProps;
61
-
62
- describe('Identifiers', () => {
63
- beforeEach(() => {
64
- mockUseConfig.mockReturnValue({
65
- ...getDefaultsFromConfigSchema(esmPatientRegistrationSchema),
66
- defaultPatientIdentifierTypes: ['OpenMRS ID'],
67
- });
68
- });
69
-
70
- it('should render loading skeleton when identifier types are loading', () => {
71
- renderWithContext(
72
- <Formik initialValues={{}} onSubmit={null}>
73
- <Form>
74
- <PatientRegistrationContextProvider value={mockContextValues}>
75
- <Identifiers />
76
- </PatientRegistrationContextProvider>
77
- </Form>
78
- </Formik>,
79
- ResourcesContextProvider,
80
- mockResourcesContextValue,
81
- );
82
-
83
- expect(screen.getByRole('progressbar')).toBeInTheDocument();
84
- });
85
-
86
- it('should render identifier inputs when identifier types are loaded', () => {
87
- mockResourcesContextValue.identifierTypes = mockIdentifierTypes;
88
-
89
- renderWithContext(
90
- <Formik initialValues={{}} onSubmit={null}>
91
- <Form>
92
- <PatientRegistrationContextProvider value={mockContextValues}>
93
- <Identifiers />
94
- </PatientRegistrationContextProvider>
95
- </Form>
96
- </Formik>,
97
- ResourcesContextProvider,
98
- mockResourcesContextValue,
99
- );
100
-
101
- expect(screen.getByText('Identifiers')).toBeInTheDocument();
102
- });
103
- });
104
-
105
- describe('setIdentifierSource', () => {
106
- describe('auto-generation', () => {
107
- it('should return auto-generated as the identifier value', () => {
108
- const identifierSource = { autoGenerationOption: { automaticGenerationEnabled: true } } as IdentifierSource;
109
- const { identifierValue } = setIdentifierSource(identifierSource, '', '');
110
- expect(identifierValue).toBe('auto-generated');
111
- });
112
-
113
- it('should return the identifier value when manual entry enabled', () => {
114
- const identifierSource = {
115
- autoGenerationOption: { automaticGenerationEnabled: true, manualEntryEnabled: true },
116
- } as IdentifierSource;
117
- const { identifierValue } = setIdentifierSource(identifierSource, '10001V', '');
118
- expect(identifierValue).toBe('10001V');
119
- });
120
- });
121
- });
1
+ import React from 'react';
2
+ import { vi, describe, it, expect, beforeEach } from 'vitest';
3
+ import { Form, Formik } from 'formik';
4
+ import { screen, waitFor } from '@testing-library/react';
5
+ import userEvent from '@testing-library/user-event';
6
+ import { getDefaultsFromConfigSchema, useConfig } from '@openmrs/esm-framework';
7
+ import { type AddressTemplate, type IdentifierSource } from '../../patient-registration.types';
8
+ import { mockIdentifierTypes, mockOpenmrsId, mockPatient, mockSession } from '__mocks__';
9
+ import { renderWithContext } from 'tools';
10
+ import { esmPatientRegistrationSchema, type RegistrationConfig } from '../../../config-schema';
11
+ import { type Resources } from '../../../offline.resources';
12
+ import {
13
+ PatientRegistrationContextProvider,
14
+ type PatientRegistrationContextProps,
15
+ } from '../../patient-registration-context';
16
+ import { Identifiers, setIdentifierSource } from './id-field.component';
17
+ import { ResourcesContextProvider } from '../../../resources-context';
18
+
19
+ const mockUseConfig = vi.mocked(useConfig<RegistrationConfig>);
20
+
21
+ const mockResourcesContextValue = {
22
+ addressTemplate: null as unknown as AddressTemplate,
23
+ currentSession: mockSession.data,
24
+ identifierTypes: [],
25
+ relationshipTypes: { results: [] },
26
+ } as Resources;
27
+
28
+ const mockInitialFormValues = {
29
+ additionalFamilyName: '',
30
+ additionalGivenName: '',
31
+ additionalMiddleName: '',
32
+ addNameInLocalLanguage: false,
33
+ address: {},
34
+ birthdate: null,
35
+ birthdateEstimated: false,
36
+ deathCause: '',
37
+ deathDate: '',
38
+ familyName: 'Doe',
39
+ gender: 'male',
40
+ givenName: 'John',
41
+ identifiers: mockOpenmrsId,
42
+ isDead: false,
43
+ middleName: 'Test',
44
+ monthsEstimated: 0,
45
+ patientUuid: mockPatient.uuid,
46
+ relationships: [],
47
+ telephoneNumber: '',
48
+ yearsEstimated: 0,
49
+ };
50
+
51
+ const mockContextValues: PatientRegistrationContextProps = {
52
+ currentPhoto: null,
53
+ inEditMode: false,
54
+ identifierTypes: [],
55
+ initialFormValues: mockInitialFormValues,
56
+ isOffline: false,
57
+ setCapturePhotoProps: vi.fn(),
58
+ setFieldValue: vi.fn(),
59
+ setInitialFormValues: vi.fn(),
60
+ validationSchema: null,
61
+ values: mockInitialFormValues,
62
+ } as unknown as PatientRegistrationContextProps;
63
+
64
+ /**
65
+ * Helper to render Identifiers component with Formik.
66
+ */
67
+ function renderIdentifiers(
68
+ contextValues: PatientRegistrationContextProps = mockContextValues,
69
+ resourcesContextValue: Resources = mockResourcesContextValue,
70
+ ) {
71
+ return renderWithContext(
72
+ <Formik initialValues={{}} onSubmit={() => {}}>
73
+ <Form>
74
+ <PatientRegistrationContextProvider value={contextValues}>
75
+ <Identifiers />
76
+ </PatientRegistrationContextProvider>
77
+ </Form>
78
+ </Formik>,
79
+ ResourcesContextProvider,
80
+ resourcesContextValue,
81
+ );
82
+ }
83
+
84
+ describe('Identifiers component', () => {
85
+ beforeEach(() => {
86
+ mockUseConfig.mockReturnValue({
87
+ ...getDefaultsFromConfigSchema(esmPatientRegistrationSchema),
88
+ defaultPatientIdentifierTypes: ['OpenMRS ID'],
89
+ });
90
+ mockResourcesContextValue.identifierTypes = [];
91
+ });
92
+
93
+ describe('Loading state', () => {
94
+ it('renders loading skeleton when identifier types are not available', () => {
95
+ renderIdentifiers();
96
+
97
+ expect(screen.getByRole('progressbar')).toBeInTheDocument();
98
+ });
99
+ });
100
+
101
+ describe('Rendering', () => {
102
+ it('renders identifier inputs when identifier types are loaded', () => {
103
+ mockResourcesContextValue.identifierTypes = mockIdentifierTypes;
104
+ renderIdentifiers();
105
+
106
+ expect(screen.getByText('Identifiers')).toBeInTheDocument();
107
+ const configureButton = screen.getByRole('button', { name: 'Configure' });
108
+ expect(configureButton).toBeInTheDocument();
109
+ expect(configureButton).toBeEnabled();
110
+ });
111
+
112
+ it('renders default identifier types', () => {
113
+ mockResourcesContextValue.identifierTypes = mockIdentifierTypes;
114
+ renderIdentifiers();
115
+
116
+ // OpenMRS ID should be rendered as it's in defaultPatientIdentifierTypes
117
+ // The identifier might be auto-generated (hidden) or visible
118
+ const identifierInput = screen.queryByLabelText(/openmrs id/i);
119
+ const autoGeneratedPlaceholder = screen.queryByTestId('identifier-placeholder');
120
+ expect(identifierInput || autoGeneratedPlaceholder).toBeTruthy();
121
+ });
122
+ });
123
+
124
+ describe('User interaction', () => {
125
+ it('opens identifier selection overlay when Configure button is clicked', async () => {
126
+ const user = userEvent.setup();
127
+ mockResourcesContextValue.identifierTypes = mockIdentifierTypes;
128
+ renderIdentifiers();
129
+
130
+ const configureButton = screen.getByRole('button', { name: 'Configure' });
131
+ await user.click(configureButton);
132
+
133
+ await waitFor(() => {
134
+ expect(screen.getByRole('button', { name: 'Close overlay' })).toBeInTheDocument();
135
+ });
136
+ });
137
+ });
138
+ });
139
+
140
+ describe('setIdentifierSource utility', () => {
141
+ describe('Auto-generation behavior', () => {
142
+ it('returns auto-generated as identifier value when auto-generation is enabled and manual entry is disabled', () => {
143
+ const identifierSource = {
144
+ autoGenerationOption: {
145
+ automaticGenerationEnabled: true,
146
+ manualEntryEnabled: false,
147
+ },
148
+ } as IdentifierSource;
149
+ const result = setIdentifierSource(identifierSource, '', '');
150
+ expect(result.identifierValue).toBe('auto-generated');
151
+ expect(result.autoGeneration).toBe(true);
152
+ });
153
+
154
+ it('returns provided identifier value when manual entry is enabled', () => {
155
+ const identifierSource = {
156
+ autoGenerationOption: {
157
+ automaticGenerationEnabled: true,
158
+ manualEntryEnabled: true,
159
+ },
160
+ } as IdentifierSource;
161
+ const result = setIdentifierSource(identifierSource, '10001V', '');
162
+ expect(result.identifierValue).toBe('10001V');
163
+ expect(result.autoGeneration).toBe(true);
164
+ });
165
+
166
+ it('returns initial value when identifier value is auto-generated and manual entry is enabled', () => {
167
+ const identifierSource = {
168
+ autoGenerationOption: {
169
+ automaticGenerationEnabled: true,
170
+ manualEntryEnabled: true,
171
+ },
172
+ } as IdentifierSource;
173
+ const result = setIdentifierSource(identifierSource, 'auto-generated', 'initial-value');
174
+ expect(result.identifierValue).toBe('initial-value');
175
+ });
176
+ });
177
+ });