import { it, describe, expect } from 'vitest' import { mask, parseMaskingPatterns } from '../src/utils.js' describe('wdio-logger utils', () => { describe('parseMaskingPatterns', () => { it('should works when undefined', () => { const patterns = parseMaskingPatterns(undefined) expect(patterns).toEqual(undefined) }) it('should skip when pattern is empty', () => { const patterns = parseMaskingPatterns('') expect(patterns).toEqual([]) }) it('should works when pattern has space', () => { const patterns = parseMaskingPatterns(' ') expect(patterns).toEqual([]) }) it('should parse one pattern with no flag', () => { const stringPatterns = '/--key=[^ ]*/' const patterns = parseMaskingPatterns(stringPatterns) expect(patterns).toEqual([/--key=[^ ]*/]) }) it('should parse one pattern no flag and no slash', () => { const stringPatterns = '--key=[^ ]*' const patterns = parseMaskingPatterns(stringPatterns) expect(patterns).toEqual([/--key=[^ ]*/]) }) it('should parse one pattern having 0 group and case insensitive', () => { const stringPatterns = '/--key=[^ ]*/i' const patterns = parseMaskingPatterns(stringPatterns) expect(patterns).toEqual([/--key=[^ ]*/i]) }) it('should parse one pattern having 0 group and global flag', () => { const stringPatterns = '/--key=[^ ]*/g' const patterns = parseMaskingPatterns(stringPatterns) expect(patterns).toEqual([/--key=[^ ]*/g]) }) it('should parse one pattern ex having 1 group', () => { const stringPatterns = '/--key=([^ ]*)/g' const patterns = parseMaskingPatterns(stringPatterns) expect(patterns).toEqual([/--key=([^ ]*)/g]) }) it('should parse one pattern having 2 group', () => { const stringPatterns = '(--key=)([^ ]*)' const patterns = parseMaskingPatterns(stringPatterns) expect(patterns).toEqual([/(--key=)([^ ]*)/]) }) it('should "parse" one pattern having more than 2 group', () => { const stringPatterns = '(--key)(=)([^ ]*)' const patterns = parseMaskingPatterns(stringPatterns) expect(patterns).toEqual([/(--key)(=)([^ ]*)/]) }) it('should parse two patterns having 2 groups each', () => { const stringPatterns = '(--key=)([^ ]*),/(TOKEN=)([^ ]*)/i' const patterns = parseMaskingPatterns(stringPatterns) expect(patterns).toEqual([/(--key=)([^ ]*)/, /(TOKEN=)([^ ]*)/i]) }) it('skipped regex when it is invalid', () => { const stringPatterns = '(--key=)([^ ]*,/(TOKEN=)([^ ]*)/i' const patterns = parseMaskingPatterns(stringPatterns) expect(patterns).toEqual([/(TOKEN=)([^ ]*)/i]) }) it('should support human error with comma-space separation', () => { const stringPatterns = '(--key=)([^ ]*), /(TOKEN=)([^ ]*)/i' const patterns = parseMaskingPatterns(stringPatterns) expect(patterns).toEqual([/(--key=)([^ ]*)/, /(TOKEN=)([^ ]*)/i]) }) it('empty when all invalid', () => { const stringPatterns = '(--key=)([^ ]*' const patterns = parseMaskingPatterns(stringPatterns) expect(patterns).toEqual([]) }) it('undefined when wrong type', () => { const stringPatterns = [] as unknown as string const patterns = parseMaskingPatterns(stringPatterns) expect(patterns).toEqual(undefined) }) it('empty when invalid empty pattern string ', () => { const stringPatterns = '//' const patterns = parseMaskingPatterns(stringPatterns) expect(patterns).toEqual([]) }) }) describe('mask', () => { it('should return the arg as it is when not a string', () => { const arg = 123 const patterns = [/--key=[^ ]*/] const maskedValue = mask(arg as unknown as string, patterns) expect(maskedValue).toEqual(arg) }) it('should return the arg when undefined', () => { const arg = undefined const patterns = [/--key=[^ ]*/] const maskedValue = mask(arg as unknown as string, patterns) expect(maskedValue).toEqual(arg) }) it('should not mask when nothing to mask', () => { const arg = 'mask nothing' const patterns = [/--key=[^ ]*/] const maskedValue = mask(arg, patterns) expect(maskedValue).toEqual(arg) }) it('should mask when there is something to mask', () => { const arg = '--key=mySecretKey' const patterns = [/--key=[^ ]*/] const maskedValue = mask(arg, patterns) expect(maskedValue).toEqual('**MASKED**') }) it('should mask and keep the rest of the string', () => { const arg = 'before --key=mySecretKey after' const patterns = [/--key=[^ ]*/] const maskedValue = mask(arg, patterns) expect(maskedValue).toEqual('before **MASKED** after') }) it('should mask the captured group only when having one capturing group', () => { const arg = 'before --key=mySecretKey after' const patterns = [/--key=([^ ]*)/] const maskedValue = mask(arg, patterns) expect(maskedValue).toEqual('before --key=**MASKED** after') }) it('should mask all captured groups when having 2 groups', () => { const arg = 'before --key=mySecretKey after' const patterns = [/(--key)=([^ ]*)/] const maskedValue = mask(arg, patterns) expect(maskedValue).toEqual('before **MASKED**=**MASKED** after') }) it('should also work with global flag', () => { const arg = 'before --key=mySecretKey after' const patterns = [/--key=([^ ]*)/g] const maskedValue = mask(arg, patterns) expect(maskedValue).toEqual('before --key=**MASKED** after') }) it('should masked multiple occurrences with the global flag', () => { const arg = 'before --key=mySecretKey1 --key=mySecretKey2 after' const patterns = [/--key=([^ ]*)/g] const maskedValue = mask(arg, patterns) expect(maskedValue).toEqual('before --key=**MASKED** --key=**MASKED** after') }) it('should masked properly when having case insensitive flag', () => { const arg = 'before --KEY=mySecretKey1 --key=mySecretKey2 after' const patterns = [/--key=([^ ]*)/ig] const maskedValue = mask(arg, patterns) expect(maskedValue).toEqual('before --KEY=**MASKED** --key=**MASKED** after') }) it('should keep trailing new line if one existed', () => { const arg = 'RESULT test\n' const patterns = [/RESULT ([^ ]*)/] const maskedValue = mask(arg, patterns) expect(maskedValue).toEqual('RESULT **MASKED**\n') }) }) })