fix(ci): resolve no-selector-parameter lint error in TeamLogSourceTracker

Split setTracking(enabled) into separate enableTracking/disableTracking
public methods per sonarjs/no-selector-parameter rule. Update all callers
and test mocks accordingly.
This commit is contained in:
iliya 2026-03-29 12:59:52 +03:00
parent 388a24d715
commit c91a886d49
5 changed files with 29 additions and 32 deletions

View file

@ -197,7 +197,7 @@ export class TeamDataService {
if (enabled) { if (enabled) {
void this.teamLogSourceTracker void this.teamLogSourceTracker
.setTracking(teamName, 'change_presence', true) .enableTracking(teamName, 'change_presence')
.catch((error) => .catch((error) =>
logger.debug(`Failed to start change-presence tracking for ${teamName}: ${String(error)}`) logger.debug(`Failed to start change-presence tracking for ${teamName}: ${String(error)}`)
); );
@ -205,7 +205,7 @@ export class TeamDataService {
} }
void this.teamLogSourceTracker void this.teamLogSourceTracker
.setTracking(teamName, 'change_presence', false) .disableTracking(teamName, 'change_presence')
.catch((error) => .catch((error) =>
logger.debug(`Failed to stop change-presence tracking for ${teamName}: ${String(error)}`) logger.debug(`Failed to stop change-presence tracking for ${teamName}: ${String(error)}`)
); );

View file

@ -58,21 +58,11 @@ export class TeamLogSourceTracker {
return state ? { ...state.snapshot } : null; return state ? { ...state.snapshot } : null;
} }
async setTracking(
teamName: string,
consumer: TeamLogSourceTrackingConsumer,
enabled: boolean
): Promise<TeamLogSourceSnapshot> {
return enabled
? this.enableTracking(teamName, consumer)
: this.disableTracking(teamName, consumer);
}
async ensureTracking(teamName: string): Promise<TeamLogSourceSnapshot> { async ensureTracking(teamName: string): Promise<TeamLogSourceSnapshot> {
return this.enableTracking(teamName, 'change_presence'); return this.enableTracking(teamName, 'change_presence');
} }
private async enableTracking( async enableTracking(
teamName: string, teamName: string,
consumer: TeamLogSourceTrackingConsumer consumer: TeamLogSourceTrackingConsumer
): Promise<TeamLogSourceSnapshot> { ): Promise<TeamLogSourceSnapshot> {
@ -139,7 +129,7 @@ export class TeamLogSourceTracker {
await this.disableTracking(teamName, 'change_presence'); await this.disableTracking(teamName, 'change_presence');
} }
private async disableTracking( async disableTracking(
teamName: string, teamName: string,
consumer: TeamLogSourceTrackingConsumer consumer: TeamLogSourceTrackingConsumer
): Promise<TeamLogSourceSnapshot> { ): Promise<TeamLogSourceSnapshot> {

View file

@ -102,14 +102,14 @@ export class TeammateToolTracker {
state.epoch += 1; state.epoch += 1;
state.filesByPath.clear(); state.filesByPath.clear();
state.refreshQueued = false; state.refreshQueued = false;
await this.logSourceTracker.setTracking(teamName, 'tool_activity', true); await this.logSourceTracker.enableTracking(teamName, 'tool_activity');
await this.refreshTeam(teamName); await this.refreshTeam(teamName);
} }
private async disableTracking(teamName: string): Promise<void> { private async disableTracking(teamName: string): Promise<void> {
const state = this.stateByTeam.get(teamName); const state = this.stateByTeam.get(teamName);
if (!state) { if (!state) {
await this.logSourceTracker.setTracking(teamName, 'tool_activity', false); await this.logSourceTracker.disableTracking(teamName, 'tool_activity');
return; return;
} }
state.enabled = false; state.enabled = false;
@ -117,7 +117,7 @@ export class TeammateToolTracker {
this.resetAllTrackedTools(teamName, state.filesByPath); this.resetAllTrackedTools(teamName, state.filesByPath);
state.filesByPath.clear(); state.filesByPath.clear();
state.refreshQueued = false; state.refreshQueued = false;
await this.logSourceTracker.setTracking(teamName, 'tool_activity', false); await this.logSourceTracker.disableTracking(teamName, 'tool_activity');
} }
private async refreshTeam(teamName: string): Promise<void> { private async refreshTeam(teamName: string): Promise<void> {

View file

@ -147,7 +147,8 @@ describe('TeamDataService', () => {
}); });
it('starts and stops task change presence tracking outside getTeamData', async () => { it('starts and stops task change presence tracking outside getTeamData', async () => {
const setTracking = vi.fn(async () => undefined); const enableTracking = vi.fn(async () => undefined);
const disableTracking = vi.fn(async () => undefined);
const service = new TeamDataService( const service = new TeamDataService(
{ {
@ -174,7 +175,8 @@ describe('TeamDataService', () => {
deleteTasks: vi.fn(async () => undefined), deleteTasks: vi.fn(async () => undefined),
} as never, } as never,
{ {
setTracking, enableTracking,
disableTracking,
} as never } as never
); );
@ -182,8 +184,8 @@ describe('TeamDataService', () => {
service.setTaskChangePresenceTracking('my-team', false); service.setTaskChangePresenceTracking('my-team', false);
await Promise.resolve(); await Promise.resolve();
expect(setTracking).toHaveBeenNthCalledWith(1, 'my-team', 'change_presence', true); expect(enableTracking).toHaveBeenNthCalledWith(1, 'my-team', 'change_presence');
expect(setTracking).toHaveBeenNthCalledWith(2, 'my-team', 'change_presence', false); expect(disableTracking).toHaveBeenNthCalledWith(1, 'my-team', 'change_presence');
}); });
it('surfaces controller reconcile failures', async () => { it('surfaces controller reconcile failures', async () => {

View file

@ -79,7 +79,11 @@ describe('TeammateToolTracker', () => {
mtimeMs: Date.now(), mtimeMs: Date.now(),
}, },
]); ]);
const setTracking = vi.fn(async () => ({ const enableTracking = vi.fn(async () => ({
projectFingerprint: null,
logSourceGeneration: null,
}));
const disableTracking = vi.fn(async () => ({
projectFingerprint: null, projectFingerprint: null,
logSourceGeneration: null, logSourceGeneration: null,
})); }));
@ -87,13 +91,13 @@ describe('TeammateToolTracker', () => {
const tracker = new TeammateToolTracker( const tracker = new TeammateToolTracker(
{ listAttributedSubagentFiles } as never, { listAttributedSubagentFiles } as never,
{ setTracking } as never, { enableTracking, disableTracking } as never,
(event) => events.push(event) (event) => events.push(event)
); );
await tracker.setTracking('my-team', true); await tracker.setTracking('my-team', true);
expect(setTracking).toHaveBeenCalledWith('my-team', 'tool_activity', true); expect(enableTracking).toHaveBeenCalledWith('my-team', 'tool_activity');
expect(events).toHaveLength(1); expect(events).toHaveLength(1);
const payload = JSON.parse(events[0].detail ?? ''); const payload = JSON.parse(events[0].detail ?? '');
expect(payload).toMatchObject({ expect(payload).toMatchObject({
@ -133,7 +137,7 @@ describe('TeammateToolTracker', () => {
const events: TeamChangeEvent[] = []; const events: TeamChangeEvent[] = [];
const tracker = new TeammateToolTracker( const tracker = new TeammateToolTracker(
{ listAttributedSubagentFiles } as never, { listAttributedSubagentFiles } as never,
{ setTracking: vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null })) } as never, { enableTracking: vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null })), disableTracking: vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null })) } as never,
(event) => events.push(event) (event) => events.push(event)
); );
@ -190,7 +194,7 @@ describe('TeammateToolTracker', () => {
const events: TeamChangeEvent[] = []; const events: TeamChangeEvent[] = [];
const tracker = new TeammateToolTracker( const tracker = new TeammateToolTracker(
{ listAttributedSubagentFiles } as never, { listAttributedSubagentFiles } as never,
{ setTracking: vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null })) } as never, { enableTracking: vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null })), disableTracking: vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null })) } as never,
(event) => events.push(event) (event) => events.push(event)
); );
@ -239,7 +243,7 @@ describe('TeammateToolTracker', () => {
const events: TeamChangeEvent[] = []; const events: TeamChangeEvent[] = [];
const tracker = new TeammateToolTracker( const tracker = new TeammateToolTracker(
{ listAttributedSubagentFiles } as never, { listAttributedSubagentFiles } as never,
{ setTracking: vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null })) } as never, { enableTracking: vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null })), disableTracking: vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null })) } as never,
(event) => events.push(event) (event) => events.push(event)
); );
@ -296,7 +300,7 @@ describe('TeammateToolTracker', () => {
const events: TeamChangeEvent[] = []; const events: TeamChangeEvent[] = [];
const tracker = new TeammateToolTracker( const tracker = new TeammateToolTracker(
{ listAttributedSubagentFiles } as never, { listAttributedSubagentFiles } as never,
{ setTracking: vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null })) } as never, { enableTracking: vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null })), disableTracking: vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null })) } as never,
(event) => events.push(event) (event) => events.push(event)
); );
@ -345,11 +349,12 @@ describe('TeammateToolTracker', () => {
Array<{ memberName: string; sessionId: string; filePath: string; mtimeMs: number }> Array<{ memberName: string; sessionId: string; filePath: string; mtimeMs: number }>
>(); >();
const listAttributedSubagentFiles = vi.fn(() => deferred.promise); const listAttributedSubagentFiles = vi.fn(() => deferred.promise);
const setTracking = vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null })); const enableTracking = vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null }));
const disableTracking = vi.fn(async () => ({ projectFingerprint: null, logSourceGeneration: null }));
const events: TeamChangeEvent[] = []; const events: TeamChangeEvent[] = [];
const tracker = new TeammateToolTracker( const tracker = new TeammateToolTracker(
{ listAttributedSubagentFiles } as never, { listAttributedSubagentFiles } as never,
{ setTracking } as never, { enableTracking, disableTracking } as never,
(event) => events.push(event) (event) => events.push(event)
); );
@ -369,7 +374,7 @@ describe('TeammateToolTracker', () => {
await Promise.all([enablePromise, disablePromise]); await Promise.all([enablePromise, disablePromise]);
expect(events).toHaveLength(0); expect(events).toHaveLength(0);
expect(setTracking).toHaveBeenNthCalledWith(1, 'my-team', 'tool_activity', true); expect(enableTracking).toHaveBeenNthCalledWith(1, 'my-team', 'tool_activity');
expect(setTracking).toHaveBeenNthCalledWith(2, 'my-team', 'tool_activity', false); expect(disableTracking).toHaveBeenNthCalledWith(1, 'my-team', 'tool_activity');
}); });
}); });