From 749b6d8dd0de2e431a9becb2ed0a590dd520426a Mon Sep 17 00:00:00 2001 From: ostridm Date: Thu, 14 Sep 2023 17:47:48 +0300 Subject: [PATCH] fix(sampler): introduce max-length support for string pattern format sample (#209) closes #208 --- .../src/samplers/StringSampler.ts | 8 ++- packages/openapi-sampler/tests/string.spec.ts | 55 +++++++++++++++++++ 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/packages/openapi-sampler/src/samplers/StringSampler.ts b/packages/openapi-sampler/src/samplers/StringSampler.ts index 8a80b33a..678da90f 100644 --- a/packages/openapi-sampler/src/samplers/StringSampler.ts +++ b/packages/openapi-sampler/src/samplers/StringSampler.ts @@ -31,9 +31,9 @@ export class StringSampler implements Sampler { 'regex': () => '/regex/', 'pattern': ( _min: number, - _max: number, + max: number, { pattern }: { pattern: string | RegExp } - ) => this.patternSample(pattern), + ) => this.patternSample(pattern, max), 'default': (min: number, max: number) => this.adjustLength('lorem', min, max) }; @@ -47,8 +47,10 @@ export class StringSampler implements Sampler { return this.checkLength(sampler(min || 0, max, schema), format, min, max); } - private patternSample(pattern: string | RegExp): string { + private patternSample(pattern: string | RegExp, max?: number): string { const randExp = new RandExp(pattern); + + randExp.max = max ?? randExp.max; randExp.randInt = (a, b) => Math.floor((a + b) / 2); return randExp.gen(); diff --git a/packages/openapi-sampler/tests/string.spec.ts b/packages/openapi-sampler/tests/string.spec.ts index 79101d11..c5bc24b5 100644 --- a/packages/openapi-sampler/tests/string.spec.ts +++ b/packages/openapi-sampler/tests/string.spec.ts @@ -24,6 +24,51 @@ describe('StringSampler', () => { }, expected: '44' }, + { + input: { + type: 'string', + format: 'pattern', + pattern: '^[a-z\\u05D0-\\u05EAA-Z0-9-/\\\\.\\u05F4,\'":&#;+()\\s]*$', + maxLength: 50 + }, + expected: 'MMMMMMMMMMMMMMMMMMMMMMMMM' + }, + { + input: { + type: 'string', + format: 'pattern', + pattern: '^[A-Z0-9]*$', + maxLength: 10 + }, + expected: 'RRRRR' + }, + { + input: { + type: 'string', + format: 'pattern', + pattern: '^[A-Z0-9]{1,15}$', + maxLength: 10 + }, + expected: 'RRRRRRRR' + }, + { + input: { + type: 'string', + format: 'pattern', + pattern: '^\\w{5,5}\\d{5,5}$', + maxLength: 10 + }, + expected: 'EEEEE44444' + }, + { + input: { + type: 'string', + format: 'pattern', + pattern: '^[A-Z0-9]*$', + maxLength: 0 + }, + expected: '' + }, { input: { type: 'string', @@ -221,6 +266,16 @@ describe('StringSampler', () => { expected: 'Sample string cannot be generated by boundaries: maxLength=5, format=pattern' }, + { + input: { + type: 'string', + format: 'pattern', + pattern: '^\\w{5,5}\\d{5,5}$', + maxLength: 9 + }, + expected: + 'Sample string cannot be generated by boundaries: maxLength=9, format=pattern' + }, { input: { type: 'string',