86 lines
2.6 KiB
TypeScript
86 lines
2.6 KiB
TypeScript
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
|
import { ArcamFmjIntegration, type IArcamFmjModeledCommand, type IArcamFmjSnapshot } from '../../ts/integrations/arcam_fmj/index.js';
|
|
|
|
const snapshot: IArcamFmjSnapshot = {
|
|
deviceInfo: {
|
|
name: 'Living Room Arcam',
|
|
model: 'AVR450',
|
|
uniqueId: 'arcam-abc123',
|
|
apiModel: 'API450_SERIES',
|
|
},
|
|
zones: [{
|
|
zone: 1,
|
|
power: true,
|
|
source: 'BD',
|
|
available: true,
|
|
}, {
|
|
zone: 2,
|
|
power: true,
|
|
source: 'FM',
|
|
available: true,
|
|
}],
|
|
online: true,
|
|
};
|
|
|
|
tap.test('models Arcam FMJ volume services through an explicit executor', async () => {
|
|
const executed: IArcamFmjModeledCommand[] = [];
|
|
const integration = new ArcamFmjIntegration();
|
|
const runtime = await integration.setup({
|
|
snapshot,
|
|
commandExecutor: {
|
|
execute: async (commandArg) => {
|
|
executed.push(commandArg);
|
|
return { accepted: true };
|
|
},
|
|
},
|
|
}, {});
|
|
|
|
const result = await runtime.callService!({
|
|
domain: 'media_player',
|
|
service: 'volume_set',
|
|
target: { entityId: 'media_player.living_room_arcam_zone_2' },
|
|
data: { volume_level: 0.25 },
|
|
});
|
|
|
|
expect(result.success).toBeTrue();
|
|
expect(executed[0].zone).toEqual(2);
|
|
expect(executed[0].commandCodeName).toEqual('VOLUME');
|
|
expect(executed[0].data).toEqual([25]);
|
|
expect(executed[0].responseExpected).toBeTrue();
|
|
});
|
|
|
|
tap.test('models Arcam FMJ source and power commands without pretending TCP success', async () => {
|
|
const executed: IArcamFmjModeledCommand[] = [];
|
|
const integration = new ArcamFmjIntegration();
|
|
const runtimeWithExecutor = await integration.setup({
|
|
snapshot,
|
|
commandExecutor: {
|
|
execute: async (commandArg) => {
|
|
executed.push(commandArg);
|
|
},
|
|
},
|
|
}, {});
|
|
|
|
const sourceResult = await runtimeWithExecutor.callService!({
|
|
domain: 'media_player',
|
|
service: 'select_source',
|
|
target: { entityId: 'media_player.living_room_arcam' },
|
|
data: { source: 'BD' },
|
|
});
|
|
expect(sourceResult.success).toBeTrue();
|
|
expect(executed[0].commandCodeName).toEqual('SIMULATE_RC5_IR_COMMAND');
|
|
expect(executed[0].data).toEqual([16, 4]);
|
|
expect(executed[0].usesRc5).toBeTrue();
|
|
|
|
const runtimeWithoutExecutor = await integration.setup({ snapshot }, {});
|
|
const turnOnResult = await runtimeWithoutExecutor.callService!({
|
|
domain: 'media_player',
|
|
service: 'turn_on',
|
|
target: { entityId: 'media_player.living_room_arcam' },
|
|
});
|
|
expect(turnOnResult.success).toBeFalse();
|
|
expect(turnOnResult.error).toContain('config.host or commandExecutor');
|
|
});
|
|
|
|
export default tap.start();
|