box-ui-elements 23.4.0-beta.1 → 23.4.0-beta.3

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 (125) hide show
  1. package/dist/explorer.js +1 -1
  2. package/dist/preview.js +1 -1
  3. package/dist/sidebar.js +1 -1
  4. package/es/common/types/metadata.js.flow +1 -0
  5. package/es/common/types/metadata.js.map +1 -1
  6. package/es/features/metadata-instance-editor/CascadePolicy.js +6 -2
  7. package/es/features/metadata-instance-editor/CascadePolicy.js.flow +19 -12
  8. package/es/features/metadata-instance-editor/CascadePolicy.js.map +1 -1
  9. package/es/features/metadata-instance-editor/Instance.js +31 -9
  10. package/es/features/metadata-instance-editor/Instance.js.flow +41 -9
  11. package/es/features/metadata-instance-editor/Instance.js.map +1 -1
  12. package/es/features/metadata-instance-editor/Instances.js +2 -0
  13. package/es/features/metadata-instance-editor/Instances.js.flow +3 -0
  14. package/es/features/metadata-instance-editor/Instances.js.map +1 -1
  15. package/es/features/metadata-instance-editor/MetadataInstanceEditor.js +2 -0
  16. package/es/features/metadata-instance-editor/MetadataInstanceEditor.js.flow +3 -0
  17. package/es/features/metadata-instance-editor/MetadataInstanceEditor.js.map +1 -1
  18. package/es/features/metadata-instance-editor/TemplateDropdown.js +1 -1
  19. package/es/features/metadata-instance-editor/TemplateDropdown.js.flow +1 -1
  20. package/es/features/metadata-instance-editor/TemplateDropdown.js.map +1 -1
  21. package/es/features/metadata-instance-editor/TemplatedInstance.js +2 -0
  22. package/es/features/metadata-instance-editor/TemplatedInstance.js.flow +11 -1
  23. package/es/features/metadata-instance-editor/TemplatedInstance.js.map +1 -1
  24. package/es/features/metadata-instance-editor/constants.js +2 -1
  25. package/es/features/metadata-instance-editor/constants.js.flow +3 -1
  26. package/es/features/metadata-instance-editor/constants.js.map +1 -1
  27. package/es/features/metadata-instance-fields/DateMetadataField.js +30 -25
  28. package/es/features/metadata-instance-fields/DateMetadataField.js.flow +31 -27
  29. package/es/features/metadata-instance-fields/DateMetadataField.js.map +1 -1
  30. package/es/features/metadata-instance-fields/EnumMetadataField.js +8 -5
  31. package/es/features/metadata-instance-fields/EnumMetadataField.js.flow +8 -6
  32. package/es/features/metadata-instance-fields/EnumMetadataField.js.map +1 -1
  33. package/es/features/metadata-instance-fields/FloatMetadataField.js +2 -0
  34. package/es/features/metadata-instance-fields/FloatMetadataField.js.flow +3 -0
  35. package/es/features/metadata-instance-fields/FloatMetadataField.js.map +1 -1
  36. package/es/features/metadata-instance-fields/IntegerMetadataField.js +2 -0
  37. package/es/features/metadata-instance-fields/IntegerMetadataField.js.flow +3 -0
  38. package/es/features/metadata-instance-fields/IntegerMetadataField.js.map +1 -1
  39. package/es/features/metadata-instance-fields/MetadataField.js +7 -0
  40. package/es/features/metadata-instance-fields/MetadataField.js.flow +8 -0
  41. package/es/features/metadata-instance-fields/MetadataField.js.map +1 -1
  42. package/es/features/metadata-instance-fields/MultiSelectMetadataField.js +2 -0
  43. package/es/features/metadata-instance-fields/MultiSelectMetadataField.js.flow +3 -0
  44. package/es/features/metadata-instance-fields/MultiSelectMetadataField.js.map +1 -1
  45. package/es/features/metadata-instance-fields/TextMetadataField.js +8 -5
  46. package/es/features/metadata-instance-fields/TextMetadataField.js.flow +8 -6
  47. package/es/features/metadata-instance-fields/TextMetadataField.js.map +1 -1
  48. package/i18n/bn-IN.js +4 -4
  49. package/i18n/bn-IN.properties +4 -4
  50. package/i18n/da-DK.js +4 -4
  51. package/i18n/da-DK.properties +4 -4
  52. package/i18n/de-DE.js +4 -4
  53. package/i18n/de-DE.properties +4 -4
  54. package/i18n/es-419.js +3 -3
  55. package/i18n/es-419.properties +3 -3
  56. package/i18n/es-ES.js +3 -3
  57. package/i18n/es-ES.properties +3 -3
  58. package/i18n/fi-FI.js +3 -3
  59. package/i18n/fi-FI.properties +3 -3
  60. package/i18n/fr-CA.js +4 -4
  61. package/i18n/fr-CA.properties +4 -4
  62. package/i18n/fr-FR.js +4 -4
  63. package/i18n/fr-FR.properties +4 -4
  64. package/i18n/hi-IN.js +4 -4
  65. package/i18n/hi-IN.properties +4 -4
  66. package/i18n/it-IT.js +4 -4
  67. package/i18n/it-IT.properties +4 -4
  68. package/i18n/ko-KR.js +4 -4
  69. package/i18n/ko-KR.properties +4 -4
  70. package/i18n/nb-NO.js +4 -4
  71. package/i18n/nb-NO.properties +4 -4
  72. package/i18n/nl-NL.js +4 -4
  73. package/i18n/nl-NL.properties +4 -4
  74. package/i18n/pl-PL.js +4 -4
  75. package/i18n/pl-PL.properties +4 -4
  76. package/i18n/pt-BR.js +4 -4
  77. package/i18n/pt-BR.properties +4 -4
  78. package/i18n/ru-RU.js +4 -4
  79. package/i18n/ru-RU.properties +4 -4
  80. package/i18n/sv-SE.js +4 -4
  81. package/i18n/sv-SE.properties +4 -4
  82. package/i18n/tr-TR.js +4 -4
  83. package/i18n/tr-TR.properties +4 -4
  84. package/i18n/zh-CN.js +4 -4
  85. package/i18n/zh-CN.properties +4 -4
  86. package/i18n/zh-TW.js +4 -4
  87. package/i18n/zh-TW.properties +4 -4
  88. package/package.json +1 -1
  89. package/src/common/types/metadata.js +1 -0
  90. package/src/features/metadata-instance-editor/CascadePolicy.js +19 -12
  91. package/src/features/metadata-instance-editor/Instance.js +41 -9
  92. package/src/features/metadata-instance-editor/Instances.js +3 -0
  93. package/src/features/metadata-instance-editor/MetadataInstanceEditor.js +3 -0
  94. package/src/features/metadata-instance-editor/TemplateDropdown.js +1 -1
  95. package/src/features/metadata-instance-editor/TemplatedInstance.js +11 -1
  96. package/src/features/metadata-instance-editor/__tests__/CascadePolicy.test.js +92 -1
  97. package/src/features/metadata-instance-editor/__tests__/Instance.test.js +207 -2
  98. package/src/features/metadata-instance-editor/__tests__/Instances.test.js +92 -3
  99. package/src/features/metadata-instance-editor/__tests__/MetadataInstanceEditor.test.js +105 -0
  100. package/src/features/metadata-instance-editor/__tests__/TemplatedInstance.test.js +83 -1
  101. package/src/features/metadata-instance-editor/__tests__/__snapshots__/CascadePolicy.test.js.snap +1 -0
  102. package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instance.test.js.snap +16 -5
  103. package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instances.test.js.snap +4 -2
  104. package/src/features/metadata-instance-editor/__tests__/__snapshots__/MetadataInstanceEditor.test.js.snap +1 -0
  105. package/src/features/metadata-instance-editor/__tests__/__snapshots__/TemplatedInstance.test.js.snap +2 -2
  106. package/src/features/metadata-instance-editor/constants.js +3 -1
  107. package/src/features/metadata-instance-fields/DateMetadataField.js +31 -27
  108. package/src/features/metadata-instance-fields/EnumMetadataField.js +8 -6
  109. package/src/features/metadata-instance-fields/FloatMetadataField.js +3 -0
  110. package/src/features/metadata-instance-fields/IntegerMetadataField.js +3 -0
  111. package/src/features/metadata-instance-fields/MetadataField.js +8 -0
  112. package/src/features/metadata-instance-fields/MultiSelectMetadataField.js +3 -0
  113. package/src/features/metadata-instance-fields/TextMetadataField.js +8 -6
  114. package/src/features/metadata-instance-fields/__tests__/DateMetadataField.test.js +59 -8
  115. package/src/features/metadata-instance-fields/__tests__/EnumMetadataField.test.js +63 -18
  116. package/src/features/metadata-instance-fields/__tests__/FloatMetadataField.test.js +68 -4
  117. package/src/features/metadata-instance-fields/__tests__/IntegerMetadataField.test.js +90 -4
  118. package/src/features/metadata-instance-fields/__tests__/MultiSelectMetadataField.test.js +95 -7
  119. package/src/features/metadata-instance-fields/__tests__/TextMetadataField.test.js +107 -14
  120. package/src/features/metadata-instance-fields/__tests__/__snapshots__/DateMetadataField.test.js.snap +0 -18
  121. package/src/features/metadata-instance-fields/__tests__/__snapshots__/EnumMetadataField.test.js.snap +0 -84
  122. package/src/features/metadata-instance-fields/__tests__/__snapshots__/FloatMetadataField.test.js.snap +0 -8
  123. package/src/features/metadata-instance-fields/__tests__/__snapshots__/IntegerMetadataField.test.js.snap +0 -8
  124. package/src/features/metadata-instance-fields/__tests__/__snapshots__/MultiSelectMetadataField.test.js.snap +0 -58
  125. package/src/features/metadata-instance-fields/__tests__/__snapshots__/TextMetadataField.test.js.snap +0 -31
@@ -11,6 +11,7 @@ type Props = {
11
11
  description?: string,
12
12
  displayName: string,
13
13
  error?: React.Node,
14
+ isDisabled?: boolean,
14
15
  onChange: (key: string, value: MetadataFieldValue) => void,
15
16
  onRemove: (key: string) => void,
16
17
  type: string,
@@ -22,6 +23,7 @@ const FloatMetadataField = ({
22
23
  displayName,
23
24
  description,
24
25
  error,
26
+ isDisabled,
25
27
  onChange,
26
28
  onRemove,
27
29
  type,
@@ -32,6 +34,7 @@ const FloatMetadataField = ({
32
34
  description={description}
33
35
  displayName={displayName}
34
36
  error={error}
37
+ isDisabled={isDisabled}
35
38
  onChange={(key: string, value: MetadataFieldValue) => {
36
39
  if (isValidValue(type, value)) {
37
40
  onChange(key, value);
@@ -11,6 +11,7 @@ type Props = {
11
11
  description?: string,
12
12
  displayName: string,
13
13
  error?: React.Node,
14
+ isDisabled?: boolean,
14
15
  onChange: (key: string, value: MetadataFieldValue) => void,
15
16
  onRemove: (key: string) => void,
16
17
  type: string,
@@ -22,6 +23,7 @@ const IntegerMetadataField = ({
22
23
  displayName,
23
24
  description,
24
25
  error,
26
+ isDisabled,
25
27
  onChange,
26
28
  onRemove,
27
29
  type,
@@ -32,6 +34,7 @@ const IntegerMetadataField = ({
32
34
  description={description}
33
35
  displayName={displayName}
34
36
  error={error}
37
+ isDisabled={isDisabled}
35
38
  onChange={(key: string, value: MetadataFieldValue) => {
36
39
  if (isValidValue(type, value)) {
37
40
  onChange(key, value);
@@ -31,6 +31,7 @@ type Props = {
31
31
  description?: string,
32
32
  displayName: string,
33
33
  error?: React.Node,
34
+ isDisabled?: boolean,
34
35
  isHidden?: boolean,
35
36
  onChange?: (key: string, value: MetadataFieldValue) => void,
36
37
  onRemove?: (key: string) => void,
@@ -45,6 +46,7 @@ const MetadataField = ({
45
46
  displayName,
46
47
  description,
47
48
  error,
49
+ isDisabled,
48
50
  isHidden,
49
51
  canEdit,
50
52
  onChange,
@@ -79,6 +81,7 @@ const MetadataField = ({
79
81
  dataValue={dataValue}
80
82
  description={description}
81
83
  displayName={displayName}
84
+ isDisabled={isDisabled}
82
85
  onChange={onChange}
83
86
  onRemove={onRemove}
84
87
  />
@@ -92,6 +95,7 @@ const MetadataField = ({
92
95
  description={description}
93
96
  displayName={displayName}
94
97
  error={error}
98
+ isDisabled={isDisabled}
95
99
  onChange={onChange}
96
100
  onRemove={onRemove}
97
101
  type={type}
@@ -106,6 +110,7 @@ const MetadataField = ({
106
110
  description={description}
107
111
  displayName={displayName}
108
112
  error={error}
113
+ isDisabled={isDisabled}
109
114
  onChange={onChange}
110
115
  onRemove={onRemove}
111
116
  type={type}
@@ -120,6 +125,7 @@ const MetadataField = ({
120
125
  dataValue={dataValue}
121
126
  description={description}
122
127
  displayName={displayName}
128
+ isDisabled={isDisabled}
123
129
  onChange={onChange}
124
130
  onRemove={onRemove}
125
131
  options={options}
@@ -134,6 +140,7 @@ const MetadataField = ({
134
140
  dataValue={dataValue}
135
141
  description={description}
136
142
  displayName={displayName}
143
+ isDisabled={isDisabled}
137
144
  onChange={onChange}
138
145
  onRemove={onRemove}
139
146
  options={options}
@@ -147,6 +154,7 @@ const MetadataField = ({
147
154
  dataValue={dataValue}
148
155
  description={description}
149
156
  displayName={displayName}
157
+ isDisabled={isDisabled}
150
158
  onChange={onChange}
151
159
  onRemove={onRemove}
152
160
  />
@@ -18,6 +18,7 @@ type Props = {
18
18
  dataValue?: MetadataFieldValue,
19
19
  description?: string,
20
20
  displayName: string,
21
+ isDisabled?: boolean,
21
22
  onChange: (key: string, value: MetadataFieldValue) => void,
22
23
  onRemove: (key: string) => void,
23
24
  options?: Array<MetadataTemplateFieldOption>,
@@ -29,6 +30,7 @@ const MultiSelectMetadataField = ({
29
30
  dataValue,
30
31
  displayName,
31
32
  description,
33
+ isDisabled,
32
34
  onChange,
33
35
  onRemove,
34
36
  options = [],
@@ -41,6 +43,7 @@ const MultiSelectMetadataField = ({
41
43
  {!!description && <i className="bdl-MultiSelectMetadataField-desc">{description}</i>}
42
44
  <MultiSelect
43
45
  blurExceptionClassNames={blurExceptionClassNames}
46
+ isDisabled={isDisabled}
44
47
  isEscapedWithReference
45
48
  isScrollable
46
49
  onChange={(selectedOptions: Array<SelectOptionProp>) => {
@@ -1,6 +1,6 @@
1
1
  // @flow
2
2
  import * as React from 'react';
3
- import { injectIntl } from 'react-intl';
3
+ import { useIntl } from 'react-intl';
4
4
 
5
5
  import TextInput from '../../components/text-input';
6
6
 
@@ -14,7 +14,7 @@ type Props = {
14
14
  description?: string,
15
15
  displayName: string,
16
16
  error?: React.Node,
17
- intl: any,
17
+ isDisabled?: boolean,
18
18
  onChange: (key: string, value: MetadataFieldValue) => void,
19
19
  onRemove: (key: string) => void,
20
20
  type?: string,
@@ -26,11 +26,13 @@ const TextMetadataField = ({
26
26
  displayName,
27
27
  description,
28
28
  error,
29
- intl,
29
+ isDisabled,
30
30
  onChange,
31
31
  onRemove,
32
32
  type = 'text',
33
33
  }: Props) => {
34
+ const { formatMessage } = useIntl();
35
+
34
36
  let value = '';
35
37
 
36
38
  if (typeof dataValue === 'number') {
@@ -45,6 +47,7 @@ const TextMetadataField = ({
45
47
  description={description}
46
48
  error={error}
47
49
  hideOptionalLabel
50
+ disabled={isDisabled}
48
51
  label={displayName}
49
52
  name={dataKey}
50
53
  onChange={(event: SyntheticKeyboardEvent<HTMLInputElement>) => {
@@ -55,12 +58,11 @@ const TextMetadataField = ({
55
58
  onRemove(dataKey);
56
59
  }
57
60
  }}
58
- placeholder={intl.formatMessage(messages.metadataFieldSetValue)}
61
+ placeholder={formatMessage(messages.metadataFieldSetValue)}
59
62
  type={type}
60
63
  value={value}
61
64
  />
62
65
  );
63
66
  };
64
67
 
65
- export { TextMetadataField as TextMetadataFieldBase };
66
- export default injectIntl(TextMetadataField);
68
+ export default TextMetadataField;
@@ -1,14 +1,65 @@
1
1
  import * as React from 'react';
2
+ import { render, screen } from '../../../test-utils/testing-library';
2
3
 
3
- import { DateMetadataFieldBase as DateMetadataField } from '../DateMetadataField';
4
+ import DateMetadataField from '../DateMetadataField';
4
5
 
5
- describe('features/metadata-instance-editor/fields/DateMetadataField', () => {
6
- const intl = {
7
- formatMessage: jest.fn(),
8
- };
6
+ describe('DateMetadataField', () => {
7
+ const getDateFieldBaseProps = (props = {}) => ({
8
+ dataKey: 'testKeyDate',
9
+ displayName: 'Test Date Field',
10
+ onChange: jest.fn(),
11
+ onRemove: jest.fn(),
12
+ dataValue: '2023-01-15T00:00:00.000Z',
13
+ canEdit: true,
14
+ ...props,
15
+ });
16
+
17
+ test('should correctly render a date field with its value', () => {
18
+ const testDate = '2024-07-26T00:00:00.000Z';
19
+ render(
20
+ <DateMetadataField
21
+ {...getDateFieldBaseProps({
22
+ dataValue: testDate,
23
+ displayName: 'My Test Date',
24
+ })}
25
+ />,
26
+ );
27
+
28
+ const dateInput = screen.getByRole('textbox', { name: 'My Test Date' });
29
+ expect(dateInput).toBeInTheDocument();
30
+ expect(dateInput).toHaveValue('July 26, 2024');
31
+ });
32
+
33
+ test('should display description when provided', () => {
34
+ const descriptionText = 'This is a date field description.';
35
+ render(
36
+ <DateMetadataField
37
+ {...getDateFieldBaseProps({
38
+ displayName: 'My Date With Desc',
39
+ description: descriptionText,
40
+ })}
41
+ />,
42
+ );
43
+
44
+ const dateInput = screen.getByRole('textbox', { name: 'My Date With Desc This is a date field description.' });
45
+ expect(dateInput).toBeInTheDocument();
46
+ expect(screen.getByText(descriptionText)).toBeInTheDocument();
47
+ });
48
+
49
+ test('should render as disabled when isDisabled is true', () => {
50
+ render(<DateMetadataField {...getDateFieldBaseProps({ isDisabled: true })} />);
51
+ expect(screen.getByRole('textbox', { name: 'Test Date Field' })).toBeDisabled();
52
+ });
53
+
54
+ test('should render as enabled when isDisabled is false', () => {
55
+ render(<DateMetadataField {...getDateFieldBaseProps({ isDisabled: false })} />);
56
+ expect(screen.getByRole('textbox', { name: 'Test Date Field' })).not.toBeDisabled();
57
+ });
9
58
 
10
- test('should correctly render a date field', () => {
11
- const wrapper = shallow(<DateMetadataField dataValue="2018-06-13T00:00:00.000Z" intl={intl} />);
12
- expect(wrapper).toMatchSnapshot();
59
+ test('should render as enabled when isDisabled is not provided', () => {
60
+ const props = getDateFieldBaseProps();
61
+ delete props.isDisabled;
62
+ render(<DateMetadataField {...props} />);
63
+ expect(screen.getByRole('textbox', { name: 'Test Date Field' })).not.toBeDisabled();
13
64
  });
14
65
  });
@@ -1,31 +1,76 @@
1
1
  import * as React from 'react';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { render, screen } from '../../../test-utils/testing-library';
2
4
 
3
- import { EnumMetadataFieldBase as EnumMetadataField } from '../EnumMetadataField';
5
+ import EnumMetadataField from '../EnumMetadataField';
4
6
 
5
- describe('features/metadata-instance-editor/fields/EnumMetadataField', () => {
6
- const intl = {
7
- formatMessage: jest.fn(),
8
- };
7
+ describe('EnumMetadataField', () => {
8
+ const defaultOptions = [
9
+ { key: 'opt1', displayName: 'Option 1' },
10
+ { key: 'opt2', displayName: 'Option 2' },
11
+ { key: 'opt3', displayName: 'Option 3' },
12
+ ];
9
13
 
10
- test('should correctly render an enum field', () => {
11
- const wrapper = shallow(
14
+ const getEnumFieldBaseProps = (props = {}) => ({
15
+ dataKey: 'testKeyEnum',
16
+ displayName: 'Test Enum Field',
17
+ onChange: jest.fn(),
18
+ onRemove: jest.fn(),
19
+ options: defaultOptions,
20
+ dataValue: 'opt1',
21
+ canEdit: true,
22
+ ...props,
23
+ });
24
+
25
+ test('should display options and reflect selected value', async () => {
26
+ render(
12
27
  <EnumMetadataField
13
- dataValue="value"
14
- intl={intl}
15
- options={[{ key: 'foo' }, { key: 'bar' }, { key: 'baz' }]}
28
+ {...getEnumFieldBaseProps({
29
+ dataValue: 'opt2',
30
+ displayName: 'My Test Enum',
31
+ })}
16
32
  />,
17
33
  );
18
- expect(wrapper).toMatchSnapshot();
34
+
35
+ const listbox = screen.getByRole('listbox', { name: 'My Test Enum' });
36
+ await userEvent.click(listbox);
37
+
38
+ expect(listbox).toBeInTheDocument();
39
+ expect(screen.getByRole('option', { name: 'opt2', selected: true })).toBeInTheDocument();
40
+ expect(screen.getByRole('option', { name: 'opt1' })).toBeInTheDocument();
41
+ expect(screen.getByRole('option', { name: 'opt3' })).toBeInTheDocument();
19
42
  });
20
- test('should correctly render an enum field with description', () => {
21
- const wrapper = shallow(
43
+
44
+ test('should display description when provided', () => {
45
+ const descriptionText = 'This is a test description.';
46
+ render(
22
47
  <EnumMetadataField
23
- dataValue="value"
24
- description="description"
25
- intl={intl}
26
- options={[{ key: 'foo' }, { key: 'bar' }, { key: 'baz' }]}
48
+ {...getEnumFieldBaseProps({
49
+ displayName: 'My Enum With Desc',
50
+ description: descriptionText,
51
+ })}
27
52
  />,
28
53
  );
29
- expect(wrapper).toMatchSnapshot();
54
+
55
+ const listbox = screen.getByRole('listbox', { name: 'My Enum With Desc This is a test description.' });
56
+ expect(listbox).toBeInTheDocument();
57
+ expect(screen.getByText(descriptionText)).toBeInTheDocument();
58
+ });
59
+
60
+ test('should render as disabled when isDisabled is true', () => {
61
+ render(<EnumMetadataField {...getEnumFieldBaseProps({ isDisabled: true })} />);
62
+ expect(screen.getByRole('listbox', { name: 'Test Enum Field' })).toBeDisabled();
63
+ });
64
+
65
+ test('should render as enabled when isDisabled is false', () => {
66
+ render(<EnumMetadataField {...getEnumFieldBaseProps({ isDisabled: false })} />);
67
+ expect(screen.getByRole('listbox', { name: 'Test Enum Field' })).not.toBeDisabled();
68
+ });
69
+
70
+ test('should render as enabled when isDisabled is not provided', () => {
71
+ const props = getEnumFieldBaseProps();
72
+ delete props.isDisabled;
73
+ render(<EnumMetadataField {...props} />);
74
+ expect(screen.getByRole('listbox', { name: 'Test Enum Field' })).not.toBeDisabled();
30
75
  });
31
76
  });
@@ -1,10 +1,74 @@
1
1
  import * as React from 'react';
2
+ import { render, screen } from '../../../test-utils/testing-library';
2
3
 
3
4
  import FloatMetadataField from '../FloatMetadataField';
4
5
 
5
- describe('features/metadata-instance-editor/fields/FloatMetadataField', () => {
6
- test('should correctly render a float field', () => {
7
- const wrapper = shallow(<FloatMetadataField dataValue="value" />);
8
- expect(wrapper).toMatchSnapshot();
6
+ describe('FloatMetadataField', () => {
7
+ const getFloatFieldBaseProps = (props = {}) => ({
8
+ dataKey: 'testKeyFloat',
9
+ displayName: 'Test Float Field',
10
+ onChange: jest.fn(),
11
+ onRemove: jest.fn(),
12
+ type: 'float',
13
+ dataValue: 123.45,
14
+ canEdit: true,
15
+ ...props,
16
+ });
17
+
18
+ test('should correctly render a float field with its value', () => {
19
+ render(
20
+ <FloatMetadataField
21
+ {...getFloatFieldBaseProps({
22
+ dataValue: 987.65,
23
+ displayName: 'My Test Float',
24
+ })}
25
+ />,
26
+ );
27
+ const floatInput = screen.getByRole('textbox', { name: 'My Test Float' });
28
+ expect(floatInput).toBeInTheDocument();
29
+ expect(floatInput).toHaveValue('987.65');
30
+ });
31
+
32
+ test('should display description when provided', () => {
33
+ const descriptionText = 'This is a float field description.';
34
+ render(
35
+ <FloatMetadataField
36
+ {...getFloatFieldBaseProps({
37
+ displayName: 'My Float With Desc',
38
+ description: descriptionText,
39
+ })}
40
+ />,
41
+ );
42
+ const floatInput = screen.getByRole('textbox', {
43
+ name: 'My Float With Desc This is a float field description.',
44
+ });
45
+ expect(floatInput).toBeInTheDocument();
46
+ expect(screen.getByText(descriptionText)).toBeInTheDocument();
47
+ });
48
+
49
+ test('should render as disabled when isDisabled is true', () => {
50
+ const descriptionText = 'A description for the float field.';
51
+ render(<FloatMetadataField {...getFloatFieldBaseProps({ isDisabled: true, description: descriptionText })} />);
52
+ expect(
53
+ screen.getByRole('textbox', { name: 'Test Float Field A description for the float field.' }),
54
+ ).toBeDisabled();
55
+ });
56
+
57
+ test('should render as enabled when isDisabled is false', () => {
58
+ const descriptionText = 'A description for the float field.';
59
+ render(<FloatMetadataField {...getFloatFieldBaseProps({ isDisabled: false, description: descriptionText })} />);
60
+ expect(
61
+ screen.getByRole('textbox', { name: 'Test Float Field A description for the float field.' }),
62
+ ).not.toBeDisabled();
63
+ });
64
+
65
+ test('should render as enabled when isDisabled is not provided', () => {
66
+ const props = getFloatFieldBaseProps();
67
+ props.description = 'A description for the float field.';
68
+ delete props.isDisabled;
69
+ render(<FloatMetadataField {...props} />);
70
+ expect(
71
+ screen.getByRole('textbox', { name: 'Test Float Field A description for the float field.' }),
72
+ ).not.toBeDisabled();
9
73
  });
10
74
  });
@@ -1,10 +1,96 @@
1
1
  import * as React from 'react';
2
+ import { render, screen } from '../../../test-utils/testing-library';
2
3
 
3
4
  import IntegerMetadataField from '../IntegerMetadataField';
4
5
 
5
- describe('features/metadata-instance-editor/fields/IntegerMetadataField', () => {
6
- test('should correctly render an integer field', () => {
7
- const wrapper = shallow(<IntegerMetadataField dataValue="value" />);
8
- expect(wrapper).toMatchSnapshot();
6
+ describe('IntegerMetadataField', () => {
7
+ const getIntegerFieldBaseProps = (props = {}) => ({
8
+ dataKey: 'testKeyInteger',
9
+ displayName: 'Test Integer Field',
10
+ onChange: jest.fn(),
11
+ onRemove: jest.fn(),
12
+ type: 'integer',
13
+ dataValue: 123,
14
+ canEdit: true,
15
+ ...props,
16
+ });
17
+
18
+ test('should correctly render an integer field with its value', () => {
19
+ render(
20
+ <IntegerMetadataField
21
+ {...getIntegerFieldBaseProps({
22
+ dataValue: 456,
23
+ displayName: 'My Test Integer',
24
+ })}
25
+ />,
26
+ );
27
+ const integerInput = screen.getByRole('textbox', { name: 'My Test Integer' });
28
+ expect(integerInput).toBeInTheDocument();
29
+ expect(integerInput).toHaveValue('456');
30
+ });
31
+
32
+ test('should display description when provided', () => {
33
+ const descriptionText = 'This is an integer field description.';
34
+ render(
35
+ <IntegerMetadataField
36
+ {...getIntegerFieldBaseProps({
37
+ displayName: 'My Integer With Desc',
38
+ description: descriptionText,
39
+ })}
40
+ />,
41
+ );
42
+ const integerInput = screen.getByRole('textbox', {
43
+ name: 'My Integer With Desc This is an integer field description.',
44
+ });
45
+ expect(integerInput).toBeInTheDocument();
46
+ expect(screen.getByText(descriptionText)).toBeInTheDocument();
47
+ });
48
+
49
+ test('should render as disabled when isDisabled is true', () => {
50
+ const descriptionText = 'An integer field description for disabled test.';
51
+ render(
52
+ <IntegerMetadataField
53
+ {...getIntegerFieldBaseProps({
54
+ isDisabled: true,
55
+ description: descriptionText,
56
+ displayName: 'Disabled Integer Field',
57
+ })}
58
+ />,
59
+ );
60
+ expect(
61
+ screen.getByRole('textbox', {
62
+ name: 'Disabled Integer Field An integer field description for disabled test.',
63
+ }),
64
+ ).toBeDisabled();
65
+ });
66
+
67
+ test('should render as enabled when isDisabled is false', () => {
68
+ const descriptionText = 'An integer field description for enabled test.';
69
+ render(
70
+ <IntegerMetadataField
71
+ {...getIntegerFieldBaseProps({
72
+ isDisabled: false,
73
+ description: descriptionText,
74
+ displayName: 'Enabled Integer Field',
75
+ })}
76
+ />,
77
+ );
78
+ expect(
79
+ screen.getByRole('textbox', {
80
+ name: 'Enabled Integer Field An integer field description for enabled test.',
81
+ }),
82
+ ).not.toBeDisabled();
83
+ });
84
+
85
+ test('should render as enabled when isDisabled is not provided', () => {
86
+ const props = getIntegerFieldBaseProps({
87
+ description: 'An integer field for default enabled test.',
88
+ displayName: 'Default Enabled Integer',
89
+ });
90
+ delete props.isDisabled;
91
+ render(<IntegerMetadataField {...props} />);
92
+ expect(
93
+ screen.getByRole('textbox', { name: 'Default Enabled Integer An integer field for default enabled test.' }),
94
+ ).not.toBeDisabled();
9
95
  });
10
96
  });
@@ -1,15 +1,103 @@
1
1
  import * as React from 'react';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { render, screen } from '../../../test-utils/testing-library';
2
4
 
3
5
  import MultiSelectMetadataField from '../MultiSelectMetadataField';
4
6
 
5
- describe('features/metadata-instance-editor/fields/MultiSelectMetadataField', () => {
6
- test('should correctly render', () => {
7
- const wrapper = shallow(<MultiSelectMetadataField dataValue={['value']} />);
8
- expect(wrapper).toMatchSnapshot();
7
+ describe('MultiSelectMetadataField', () => {
8
+ const defaultOptions = [
9
+ { key: 'opt1', displayName: 'Option 1' },
10
+ { key: 'opt2', displayName: 'Option 2' },
11
+ { key: 'opt3', displayName: 'Option 3' },
12
+ { key: 'opt4', displayName: 'Option 4' },
13
+ ];
14
+
15
+ const getMultiSelectFieldBaseProps = (props = {}) => ({
16
+ dataKey: 'testKeyMultiSelect',
17
+ displayName: 'Test MultiSelect Field',
18
+ onChange: jest.fn(),
19
+ onRemove: jest.fn(),
20
+ options: defaultOptions,
21
+ dataValue: ['opt1', 'opt3'],
22
+ canEdit: true,
23
+ ...props,
24
+ });
25
+
26
+ test('should display options and reflect selected values', async () => {
27
+ render(
28
+ <MultiSelectMetadataField
29
+ {...getMultiSelectFieldBaseProps({
30
+ dataValue: ['opt2', 'opt4'],
31
+ displayName: 'My Test MultiSelect',
32
+ })}
33
+ />,
34
+ );
35
+
36
+ const listbox = screen.getByRole('listbox', { name: 'My Test MultiSelect' });
37
+ expect(listbox).toBeInTheDocument();
38
+ await userEvent.click(listbox);
39
+
40
+ expect(screen.getByRole('option', { name: 'opt2', selected: true })).toBeInTheDocument();
41
+ expect(screen.getByRole('option', { name: 'opt4', selected: true })).toBeInTheDocument();
42
+ expect(screen.getByRole('option', { name: 'opt1', selected: false })).toBeInTheDocument();
43
+ expect(screen.getByRole('option', { name: 'opt3', selected: false })).toBeInTheDocument();
44
+ });
45
+
46
+ test('should display description when provided', () => {
47
+ const descriptionText = 'This is a multi-select field description.';
48
+ render(
49
+ <MultiSelectMetadataField
50
+ {...getMultiSelectFieldBaseProps({
51
+ displayName: 'My MultiSelect With Desc',
52
+ description: descriptionText,
53
+ })}
54
+ />,
55
+ );
56
+ const listbox = screen.getByRole('listbox', {
57
+ name: 'My MultiSelect With Desc This is a multi-select field description.',
58
+ });
59
+ expect(listbox).toBeInTheDocument();
60
+ expect(screen.getByText(descriptionText)).toBeInTheDocument();
61
+ });
62
+
63
+ test('should render as disabled when isDisabled is true', () => {
64
+ const descriptionText = 'A description for the multi-select field.';
65
+ render(
66
+ <MultiSelectMetadataField
67
+ {...getMultiSelectFieldBaseProps({
68
+ isDisabled: true,
69
+ description: descriptionText,
70
+ })}
71
+ />,
72
+ );
73
+ expect(
74
+ screen.getByRole('listbox', { name: 'Test MultiSelect Field A description for the multi-select field.' }),
75
+ ).toBeDisabled();
76
+ });
77
+
78
+ test('should render as enabled when isDisabled is false', () => {
79
+ const descriptionText = 'A description for the multi-select field.';
80
+ render(
81
+ <MultiSelectMetadataField
82
+ {...getMultiSelectFieldBaseProps({
83
+ isDisabled: false,
84
+ description: descriptionText,
85
+ })}
86
+ />,
87
+ );
88
+ expect(
89
+ screen.getByRole('listbox', { name: 'Test MultiSelect Field A description for the multi-select field.' }),
90
+ ).not.toBeDisabled();
9
91
  });
10
92
 
11
- test('should correctly render with description', () => {
12
- const wrapper = shallow(<MultiSelectMetadataField dataValue={['value']} description="description" />);
13
- expect(wrapper).toMatchSnapshot();
93
+ test('should render as enabled when isDisabled is not provided', () => {
94
+ const props = getMultiSelectFieldBaseProps({
95
+ description: 'A description for the multi-select field.',
96
+ });
97
+ delete props.isDisabled;
98
+ render(<MultiSelectMetadataField {...props} />);
99
+ expect(
100
+ screen.getByRole('listbox', { name: 'Test MultiSelect Field A description for the multi-select field.' }),
101
+ ).not.toBeDisabled();
14
102
  });
15
103
  });