CI / build + unit (pull_request) Successful in 41s
Event-driven CommandService dispatches exact case-sensitive #command matches on COMMAND_CHANNEL (default 2) through a single-registration-point registry; first command #ping -> #pong!. Replies ride COMMAND_CHANNEL: directed DM back to the sender when present, else broadcast. Failing handler/send only logs a warn. DI: CommandModule's factory injects MeshService and attaches itself via MeshService.attachCommands() — a constructor-level cycle leaves one side null in NestJS 12's injector (verified), so no forwardRef is used. Tests 106 -> 121; docs synced (AGENTS.md, MESHTASTIC.md, README).
32 lines
1.4 KiB
TypeScript
32 lines
1.4 KiB
TypeScript
import { Test } from '@nestjs/testing';
|
|
import { describe, expect, it } from 'vitest';
|
|
import { MeshService } from '../mesh/mesh.service.js';
|
|
import { CommandModule } from './command.module.js';
|
|
import { CommandService } from './command.service.js';
|
|
|
|
describe('DI wiring (module graph)', () => {
|
|
// compile() instantiates providers but does not run lifecycle hooks, so no TCP connection is opened.
|
|
it('resolves CommandService with MeshService provided by MeshModule', async () => {
|
|
process.env.MESH_DB_PATH = ':memory:'; // keep openMessageDb from touching the repo's ./data
|
|
const moduleRef = await Test.createTestingModule({
|
|
imports: [CommandModule],
|
|
}).compile();
|
|
expect(moduleRef.get(CommandService)).toBeInstanceOf(CommandService);
|
|
expect(moduleRef.get(MeshService)).toBeInstanceOf(MeshService);
|
|
});
|
|
|
|
// the MeshService <-> CommandService cycle must resolve to live references on both sides, not undefined
|
|
it('wires both sides of the circular dependency with real instances', async () => {
|
|
process.env.MESH_DB_PATH = ':memory:';
|
|
const moduleRef = await Test.createTestingModule({
|
|
imports: [CommandModule],
|
|
}).compile();
|
|
const mesh = moduleRef.get(MeshService);
|
|
const commands = moduleRef.get(CommandService);
|
|
expect((commands as unknown as { mesh?: MeshService }).mesh).toBe(mesh);
|
|
expect((mesh as unknown as { commands?: CommandService }).commands).toBe(
|
|
commands,
|
|
);
|
|
});
|
|
});
|