From b210aaddf26629179f77fe19f62f65d8a0ca2b87 Mon Sep 17 00:00:00 2001 From: undergroundwires Date: Thu, 16 Dec 2021 02:40:56 +0100 Subject: [PATCH] Improve script/category name validation - Use better error messages with more context. - Unify their validation logic and share tests. - Validate also type of the name. - Refactor node (Script/Category) parser tests for easier future changes and cleaner test code (using `TestBuilder` to do dirty work in unified way). - Add more tests. Custom `Error` properties are compared manually due to `chai` not supporting deep equality checks (chaijs/chai#1065, chaijs/chai#1405). --- src/application/Parser/CategoryParser.ts | 131 +++++++--- .../Parser/NodeValidation/NodeData.ts | 3 + .../Parser/NodeValidation/NodeDataError.ts | 35 +++ .../Parser/NodeValidation/NodeType.ts | 4 + .../Parser/NodeValidation/NodeValidator.ts | 38 +++ src/application/Parser/Script/ScriptParser.ts | 60 +++-- src/domain/Script.ts | 2 +- .../application/Parser/CategoryParser.spec.ts | 235 ++++++++++++++---- .../NodeValidation/NodeDataError.spec.ts | 67 +++++ .../NodeValidation/NodeValidator.spec.ts | 100 ++++++++ .../NodeValidation/NodeValidatorTestRunner.ts | 87 +++++++ .../Parser/Script/ScriptParser.spec.ts | 205 ++++++++++----- tests/unit/domain/Script.spec.ts | 4 +- .../shared/Assertions/ExpectThrowsError.ts | 50 ++++ tests/unit/shared/Stubs/EnumParserStub.ts | 4 +- .../shared/Stubs/NodeDataErrorContextStub.ts | 12 + tests/unit/shared/TestCases/AbsentTests.ts | 16 +- 17 files changed, 857 insertions(+), 196 deletions(-) create mode 100644 src/application/Parser/NodeValidation/NodeData.ts create mode 100644 src/application/Parser/NodeValidation/NodeDataError.ts create mode 100644 src/application/Parser/NodeValidation/NodeType.ts create mode 100644 src/application/Parser/NodeValidation/NodeValidator.ts create mode 100644 tests/unit/application/Parser/NodeValidation/NodeDataError.spec.ts create mode 100644 tests/unit/application/Parser/NodeValidation/NodeValidator.spec.ts create mode 100644 tests/unit/application/Parser/NodeValidation/NodeValidatorTestRunner.ts create mode 100644 tests/unit/shared/Assertions/ExpectThrowsError.ts create mode 100644 tests/unit/shared/Stubs/NodeDataErrorContextStub.ts diff --git a/src/application/Parser/CategoryParser.ts b/src/application/Parser/CategoryParser.ts index d602415a..a83fd830 100644 --- a/src/application/Parser/CategoryParser.ts +++ b/src/application/Parser/CategoryParser.ts @@ -3,6 +3,8 @@ import type { } from '@/application/collections/'; import { Script } from '@/domain/Script'; import { Category } from '@/domain/Category'; +import { NodeValidator } from '@/application/Parser/NodeValidation/NodeValidator'; +import { NodeType } from '@/application/Parser/NodeValidation/NodeType'; import { parseDocUrls } from './DocumentationParser'; import { ICategoryCollectionParseContext } from './Script/ICategoryCollectionParseContext'; import { parseScript } from './Script/ScriptParser'; @@ -12,35 +14,67 @@ let categoryIdCounter = 0; export function parseCategory( category: CategoryData, context: ICategoryCollectionParseContext, + factory: CategoryFactoryType = CategoryFactory, ): Category { if (!context) { throw new Error('missing context'); } - ensureValid(category); + return parseCategoryRecursively({ + categoryData: category, + context, + factory, + }); +} + +interface ICategoryParseContext { + readonly categoryData: CategoryData, + readonly context: ICategoryCollectionParseContext, + readonly factory: CategoryFactoryType, + readonly parentCategory?: CategoryData, +} +// eslint-disable-next-line consistent-return +function parseCategoryRecursively(context: ICategoryParseContext): Category { + ensureValidCategory(context.categoryData, context.parentCategory); const children: ICategoryChildren = { subCategories: new Array(), subScripts: new Array