Add native local network integrations
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
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();
|
||||
Reference in New Issue
Block a user