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 stringconst 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 = 123const patterns = [/--key=[^ ]*/]const maskedValue = mask(arg as unknown as string, patterns)expect(maskedValue).toEqual(arg)})it('should return the arg when undefined', () => {const arg = undefinedconst 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')})})})