|
|
|
@ -1,6 +1,6 @@ |
|
|
|
import { describe, expect, it } from 'vitest'; |
|
|
|
|
|
|
|
import { bindMethods } from '../util'; |
|
|
|
import { bindMethods, getNestedValue } from '../util'; |
|
|
|
|
|
|
|
class TestClass { |
|
|
|
public value: string; |
|
|
|
@ -78,3 +78,79 @@ describe('bindMethods', () => { |
|
|
|
expect(value).toBe('test'); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
describe('getNestedValue', () => { |
|
|
|
interface UserProfile { |
|
|
|
age: number; |
|
|
|
name: string; |
|
|
|
} |
|
|
|
|
|
|
|
interface UserSettings { |
|
|
|
theme: string; |
|
|
|
} |
|
|
|
|
|
|
|
interface Data { |
|
|
|
user: { |
|
|
|
profile: UserProfile; |
|
|
|
settings: UserSettings; |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
const data: Data = { |
|
|
|
user: { |
|
|
|
profile: { |
|
|
|
age: 25, |
|
|
|
name: 'Alice', |
|
|
|
}, |
|
|
|
settings: { |
|
|
|
theme: 'dark', |
|
|
|
}, |
|
|
|
}, |
|
|
|
}; |
|
|
|
|
|
|
|
it('should get a nested value when the path is valid', () => { |
|
|
|
const result = getNestedValue(data, 'user.profile.name'); |
|
|
|
expect(result).toBe('Alice'); |
|
|
|
}); |
|
|
|
|
|
|
|
it('should return undefined for non-existent property', () => { |
|
|
|
const result = getNestedValue(data, 'user.profile.gender'); |
|
|
|
expect(result).toBeUndefined(); |
|
|
|
}); |
|
|
|
|
|
|
|
it('should return undefined when accessing a non-existent deep path', () => { |
|
|
|
const result = getNestedValue(data, 'user.nonexistent.field'); |
|
|
|
expect(result).toBeUndefined(); |
|
|
|
}); |
|
|
|
|
|
|
|
it('should return undefined if a middle level is undefined', () => { |
|
|
|
const result = getNestedValue({ user: undefined }, 'user.profile.name'); |
|
|
|
expect(result).toBeUndefined(); |
|
|
|
}); |
|
|
|
|
|
|
|
it('should return the correct value for a nested setting', () => { |
|
|
|
const result = getNestedValue(data, 'user.settings.theme'); |
|
|
|
expect(result).toBe('dark'); |
|
|
|
}); |
|
|
|
|
|
|
|
it('should work for a single-level path', () => { |
|
|
|
const result = getNestedValue({ a: 1, b: 2 }, 'b'); |
|
|
|
expect(result).toBe(2); |
|
|
|
}); |
|
|
|
|
|
|
|
it('should return the entire object if path is empty', () => { |
|
|
|
expect(() => getNestedValue(data, '')()).toThrow(); |
|
|
|
}); |
|
|
|
|
|
|
|
it('should handle paths with array indexes', () => { |
|
|
|
const complexData = { list: [{ name: 'Item1' }, { name: 'Item2' }] }; |
|
|
|
const result = getNestedValue(complexData, 'list.1.name'); |
|
|
|
expect(result).toBe('Item2'); |
|
|
|
}); |
|
|
|
|
|
|
|
it('should return undefined when accessing an out-of-bounds array index', () => { |
|
|
|
const complexData = { list: [{ name: 'Item1' }] }; |
|
|
|
const result = getNestedValue(complexData, 'list.2.name'); |
|
|
|
expect(result).toBeUndefined(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|