Skip to content

Commit 497d86e

Browse files
authoredApr 18, 2024
Merge pull request #11 from PADAS/validate-duplicated-items-choices
Validate duplicated items for single select
2 parents dca134f + 0f3e602 commit 497d86e

File tree

5 files changed

+45
-7
lines changed

5 files changed

+45
-7
lines changed
 

‎.eslintrc.cjs

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'],
1212
'import/prefer-default-export': 'off',
1313
'react/require-default-props': 'off',
1414
'@typescript-eslint/no-use-before-define': 'off',
15+
'@typescript-eslint/no-explicit-any': 'off',
1516
'no-plusplus': [2, { allowForLoopAfterthoughts: true }]
1617
},
1718
root: true,
18-
};
19+
};

‎.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,4 @@ coverage/
4343

4444
# OSX
4545
.DS_Store
46+
.idea

‎common/mockData/formatterMockData.ts

+29
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,35 @@ export const JSON_SCHEMA_INACTIVE_FIELD_SET_TITLE_MAP_FAKE_DATA = '{\n' +
223223
' }\n' +
224224
'}';
225225

226+
export const JSON_SCHEMA_DUPLICATED_CHOICES_SINGLE_SELECT_FAKE_DATA = '{\n' +
227+
' "definition": [\n' +
228+
' "single_select"\n' +
229+
' ],\n' +
230+
' "description": "This schema will be used for regression testing in the mobile app",\n' +
231+
' "schema": {\n' +
232+
' "$schema": "http://json-schema.org/draft-04/schema#",\n' +
233+
' "icon_id": "generic_rep",\n' +
234+
' "id": "https://mobile-bash.pamdas.org/api/v1.0/activity/events/schema/eventtype/single_select_query_no_required",\n' +
235+
' "image_url": "https://mobile-bash.pamdas.org/static/generic-black.svg",\n' +
236+
' "properties": {\n' +
237+
' "single_select": {\n' +
238+
' "enum": [\n' +
239+
' "new",\n' +
240+
' "new"\n' +
241+
' ],\n' +
242+
' "enumNames": {\n' +
243+
' "new": "New/Fresh",\n' +
244+
' "old": "New/Fresh"\n' +
245+
' },\n' +
246+
' "title": "I\'m a single select query",\n' +
247+
' "type": "string"\n' +
248+
' }\n' +
249+
' },\n' +
250+
' "title": "String",\n' +
251+
' "type": "object"\n' +
252+
' }\n' +
253+
'}';
254+
226255
export const JSON_SCHEMA_DATE_TIME_FIELD_SETS = '{\n' +
227256
' "schema": {\n' +
228257
' "$schema": "http://json-schema.org/draft-04/schema#",\n' +

‎src/utils/utils.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
/* eslint-disable import/no-named-as-default */
21
// External Dependencies
32
import { isEmpty } from 'lodash-es';
43

@@ -20,13 +19,13 @@ export enum ElementDisplay {
2019

2120
export const FIELD_SET = 'fieldset';
2221
export const HELP_VALUE = 'helpvalue';
23-
2422
export const REQUIRED_PROPERTY = 'required';
2523
export const CHECKBOXES = 'checkboxes';
2624
export const INACTIVE_ENUM = 'inactive_enum';
2725
export const DISABLED_ENUM = 'inactive_titleMap';
2826
export const STRING_TYPE = 'string';
2927
export const ARRAY_TYPE = 'array';
28+
export const ENUM = 'enum';
3029

3130
export const isObject = (item: any) => item instanceof Object;
3231

@@ -61,6 +60,7 @@ export const getSchemaValidations = (stringSchema: string) => ({
6160
hasCheckboxes: hasCheckboxes(stringSchema),
6261
hasInactiveChoices: hasInactiveChoices(stringSchema),
6362
hasDisabledChoices: hasDisabledChoices(stringSchema),
63+
hasEnums: hasEnums(stringSchema),
6464
});
6565

6666
export const isArrayProperty = (property: any) => property.type === ARRAY_TYPE && !property.items?.enum
@@ -74,6 +74,8 @@ const hasInactiveChoices = (stringSchema: string) => stringSchema.includes(INACT
7474

7575
const hasDisabledChoices = (stringSchema: string) => stringSchema.includes(DISABLED_ENUM);
7676

77+
const hasEnums = (stringSchema: string) => stringSchema.includes(ENUM);
78+
7779
export const isInactiveChoice = (item: any) => item.type === STRING_TYPE
7880
&& item.enum?.length > 0 && item.inactive_enum?.length > 0;
7981

‎test/JsonFormatter.test.tsx

+9-4
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import jsonSchemaFieldSets from "../common/mockData/jsonSchemaFielSetMock.json";
44
import expectedSchema from "../common/mockData/jsonSchemaExpectedMock.json";
55
import expectedUISchema from "../common/mockData/uiSchemaExpectedMock.json";
66
import expectedFieldSetUISchema from "../common/mockData/uiSchemaFielSetExpectedMock.json";
7-
import { validateJSONSchema } from "../src/validateJsonSchema";
8-
import { generateUISchema } from "../src/generateUISchema";
7+
import { validateJSONSchema } from "../src";
8+
import { generateUISchema } from "../src";
99
import {
1010
JSON_SCHEMA_ID_$SCHEMA_FAKE_DATA,
1111
JSON_SCHEMA_EMPTY_CHOICES_FAKE_DATA,
@@ -21,9 +21,10 @@ import {
2121
JSON_SCHEMA_INACTIVE_TITLE_MAP_FAKE_DATA,
2222
JSON_SCHEMA_INACTIVE_FIELD_SET_TITLE_MAP_FAKE_DATA,
2323
JSON_SCHEMA_DEFAULT_VALUES,
24-
JSON_SCHEMA_DATE_TIME_FIELDSETS, JSON_SCHEMA_DATE_TIME_FIELD_SETS, UI_SCHEMA_ELEMENT_DATE_TIME_FIELD_SETS,
24+
JSON_SCHEMA_DUPLICATED_CHOICES_SINGLE_SELECT_FAKE_DATA,
25+
JSON_SCHEMA_DATE_TIME_FIELD_SETS,
26+
UI_SCHEMA_ELEMENT_DATE_TIME_FIELD_SETS,
2527
} from "../common/mockData/formatterMockData";
26-
import exp = require('node:constants');
2728

2829
describe('JSON Schema validation', () => {
2930

@@ -83,6 +84,10 @@ describe('JSON Schema validation', () => {
8384
expect(validSchema.schema.properties.reportorigin.items.enum).not.toContain('phot_evidence_collected');
8485
});
8586

87+
it('Validate duplicated items in single select', () => {
88+
expect(() => validateJSONSchema(JSON_SCHEMA_DUPLICATED_CHOICES_SINGLE_SELECT_FAKE_DATA)).toThrow('Duplicated items');
89+
});
90+
8691
it('Format schema definition location', () => {
8792
const validSchema = validateJSONSchema(JSON_SCHEMA_INVALID_DEFINITION_LOCATION_FAKE_DATA);
8893
expect(validSchema.schema.definition).toBeUndefined();

0 commit comments

Comments
 (0)