import { describe, it, expect, beforeEach } from 'vitest'; import { ApplianceValues } from '../src/values.js'; describe('ApplianceValues', () => { let values: ApplianceValues; beforeEach(() => { values = new ApplianceValues(); }); describe('basic operations', () => { it('should set and get values', () => { values.set('mode', '2'); expect(values.get('mode')).toBe('2'); }); it('should return correct size', () => { values.set('mode', '2'); expect(values.size).toBe(1); }); it('should check if key exists', () => { values.set('mode', '2'); expect(values.has('mode')).toBe(true); expect(values.has('nonexistent')).toBe(false); }); it('should delete values', () => { values.set('mode', '2'); values.set('temp', '25'); values.delete('temp'); expect(values.has('temp')).toBe(false); expect(values.has('mode')).toBe(true); }); }); describe('get method', () => { it('should return undefined for non-existent key', () => { expect(values.get('nonexistent')).toBeUndefined(); }); it('should return default value when provided', () => { expect(values.getWithDefault('nonexistent', 'default')).toBe('default'); }); it('should return existing value', () => { values.set('mode', '2'); expect(values.get('mode')).toBe('2'); }); }); describe('getWithInvalidate', () => { it('should return value and invalidate by default', () => { values.updateByResource('resource1', { mode: '2', temp: '25' }); const val = values.getWithInvalidate('mode'); expect(val).toBe('2'); expect(values.shouldResourceBeUpdated('resource1')).toBe(true); }); it('should not invalidate when invalidate=false', () => { values.updateByResource('resource1', { mode: '2', temp: '25' }); const val = values.getWithInvalidate('mode', false); expect(val).toBe('2'); expect(values.shouldResourceBeUpdated('resource1')).toBe(false); }); }); describe('updateByResource', () => { it('should update values from resource', () => { values.updateByResource('resource1', { mode: '2', temp: '25' }); expect(values.get('mode')).toBe('2'); expect(values.get('temp')).toBe('25'); }); it('should track resource last update time', () => { values.updateByResource('resource1', { mode: '2' }); expect(values.shouldResourceBeUpdated('resource1')).toBe(false); }); it('should support multiple resources', () => { values.updateByResource('basic_info', { mode: '2', pow: '1' }); values.updateByResource('sensor_info', { htemp: '25', otemp: '21' }); expect(values.shouldResourceBeUpdated('basic_info')).toBe(false); expect(values.shouldResourceBeUpdated('sensor_info')).toBe(false); }); }); describe('shouldResourceBeUpdated', () => { it('should return true for new resource', () => { expect(values.shouldResourceBeUpdated('resource1')).toBe(true); }); it('should return false after update', () => { values.updateByResource('resource1', { mode: '2' }); expect(values.shouldResourceBeUpdated('resource1')).toBe(false); }); }); describe('invalidateResource', () => { it('should invalidate existing resource', () => { values.updateByResource('resource1', { mode: '2' }); expect(values.shouldResourceBeUpdated('resource1')).toBe(false); values.invalidateResource('resource1'); expect(values.shouldResourceBeUpdated('resource1')).toBe(true); }); it('should not error on non-existent resource', () => { expect(() => values.invalidateResource('nonexistent')).not.toThrow(); }); }); describe('keys, values, entries', () => { it('should iterate over keys', () => { values.updateByResource('resource1', { mode: '2', temp: '25', fan: 'A' }); const keys = Array.from(values.keys()); expect(keys).toContain('mode'); expect(keys).toContain('temp'); expect(keys).toContain('fan'); }); it('should iterate over values', () => { values.updateByResource('resource1', { mode: '2', temp: '25' }); const vals = Array.from(values.values()); expect(vals).toContain('2'); expect(vals).toContain('25'); }); it('should iterate over entries', () => { values.updateByResource('resource1', { mode: '2' }); const entries = Array.from(values.entries()); expect(entries).toContainEqual(['mode', '2']); }); }); describe('toJSON', () => { it('should convert to JSON object', () => { values.set('mode', '2'); values.set('temp', '25'); const json = values.toJSON(); expect(json).toEqual({ mode: '2', temp: '25' }); }); }); });