Skip to content

Commit

Permalink
Merge pull request #11 from PADAS/validate-duplicated-items-choices
Browse files Browse the repository at this point in the history
Validate duplicated items for single select
  • Loading branch information
leo-ori authored Apr 18, 2024
2 parents dca134f + 0f3e602 commit 497d86e
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 7 deletions.
3 changes: 2 additions & 1 deletion .eslintrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'],
'import/prefer-default-export': 'off',
'react/require-default-props': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'no-plusplus': [2, { allowForLoopAfterthoughts: true }]
},
root: true,
};
};
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,4 @@ coverage/

# OSX
.DS_Store
.idea
29 changes: 29 additions & 0 deletions common/mockData/formatterMockData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,35 @@ export const JSON_SCHEMA_INACTIVE_FIELD_SET_TITLE_MAP_FAKE_DATA = '{\n' +
' }\n' +
'}';

export const JSON_SCHEMA_DUPLICATED_CHOICES_SINGLE_SELECT_FAKE_DATA = '{\n' +
' "definition": [\n' +
' "single_select"\n' +
' ],\n' +
' "description": "This schema will be used for regression testing in the mobile app",\n' +
' "schema": {\n' +
' "$schema": "http://json-schema.org/draft-04/schema#",\n' +
' "icon_id": "generic_rep",\n' +
' "id": "https://mobile-bash.pamdas.org/api/v1.0/activity/events/schema/eventtype/single_select_query_no_required",\n' +
' "image_url": "https://mobile-bash.pamdas.org/static/generic-black.svg",\n' +
' "properties": {\n' +
' "single_select": {\n' +
' "enum": [\n' +
' "new",\n' +
' "new"\n' +
' ],\n' +
' "enumNames": {\n' +
' "new": "New/Fresh",\n' +
' "old": "New/Fresh"\n' +
' },\n' +
' "title": "I\'m a single select query",\n' +
' "type": "string"\n' +
' }\n' +
' },\n' +
' "title": "String",\n' +
' "type": "object"\n' +
' }\n' +
'}';

export const JSON_SCHEMA_DATE_TIME_FIELD_SETS = '{\n' +
' "schema": {\n' +
' "$schema": "http://json-schema.org/draft-04/schema#",\n' +
Expand Down
6 changes: 4 additions & 2 deletions src/utils/utils.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
/* eslint-disable import/no-named-as-default */
// External Dependencies
import { isEmpty } from 'lodash-es';

Expand All @@ -20,13 +19,13 @@ export enum ElementDisplay {

export const FIELD_SET = 'fieldset';
export const HELP_VALUE = 'helpvalue';

export const REQUIRED_PROPERTY = 'required';
export const CHECKBOXES = 'checkboxes';
export const INACTIVE_ENUM = 'inactive_enum';
export const DISABLED_ENUM = 'inactive_titleMap';
export const STRING_TYPE = 'string';
export const ARRAY_TYPE = 'array';
export const ENUM = 'enum';

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

Expand Down Expand Up @@ -61,6 +60,7 @@ export const getSchemaValidations = (stringSchema: string) => ({
hasCheckboxes: hasCheckboxes(stringSchema),
hasInactiveChoices: hasInactiveChoices(stringSchema),
hasDisabledChoices: hasDisabledChoices(stringSchema),
hasEnums: hasEnums(stringSchema),
});

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

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

const hasEnums = (stringSchema: string) => stringSchema.includes(ENUM);

export const isInactiveChoice = (item: any) => item.type === STRING_TYPE
&& item.enum?.length > 0 && item.inactive_enum?.length > 0;

Expand Down
13 changes: 9 additions & 4 deletions test/JsonFormatter.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import jsonSchemaFieldSets from "../common/mockData/jsonSchemaFielSetMock.json";
import expectedSchema from "../common/mockData/jsonSchemaExpectedMock.json";
import expectedUISchema from "../common/mockData/uiSchemaExpectedMock.json";
import expectedFieldSetUISchema from "../common/mockData/uiSchemaFielSetExpectedMock.json";
import { validateJSONSchema } from "../src/validateJsonSchema";
import { generateUISchema } from "../src/generateUISchema";
import { validateJSONSchema } from "../src";
import { generateUISchema } from "../src";
import {
JSON_SCHEMA_ID_$SCHEMA_FAKE_DATA,
JSON_SCHEMA_EMPTY_CHOICES_FAKE_DATA,
Expand All @@ -21,9 +21,10 @@ import {
JSON_SCHEMA_INACTIVE_TITLE_MAP_FAKE_DATA,
JSON_SCHEMA_INACTIVE_FIELD_SET_TITLE_MAP_FAKE_DATA,
JSON_SCHEMA_DEFAULT_VALUES,
JSON_SCHEMA_DATE_TIME_FIELDSETS, JSON_SCHEMA_DATE_TIME_FIELD_SETS, UI_SCHEMA_ELEMENT_DATE_TIME_FIELD_SETS,
JSON_SCHEMA_DUPLICATED_CHOICES_SINGLE_SELECT_FAKE_DATA,
JSON_SCHEMA_DATE_TIME_FIELD_SETS,
UI_SCHEMA_ELEMENT_DATE_TIME_FIELD_SETS,
} from "../common/mockData/formatterMockData";
import exp = require('node:constants');

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

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

it('Validate duplicated items in single select', () => {
expect(() => validateJSONSchema(JSON_SCHEMA_DUPLICATED_CHOICES_SINGLE_SELECT_FAKE_DATA)).toThrow('Duplicated items');
});

it('Format schema definition location', () => {
const validSchema = validateJSONSchema(JSON_SCHEMA_INVALID_DEFINITION_LOCATION_FAKE_DATA);
expect(validSchema.schema.definition).toBeUndefined();
Expand Down

0 comments on commit 497d86e

Please sign in to comment.