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) {
void this.teamLogSourceTracker
.setTracking(teamName, 'change_presence', true)
.enableTracking(teamName, 'change_presence')
.catch((error) =>
logger.debug(`Failed to start change-presence tracking for ${teamName}: ${String(error)}`)
);
@ -205,7 +205,7 @@ export class TeamDataService {
}
void this.teamLogSourceTracker
.setTracking(teamName, 'change_presence', false)
.disableTracking(teamName, 'change_presence')
.catch((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;
}
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> {
return this.enableTracking(teamName, 'change_presence');
}
private async enableTracking(
async enableTracking(
teamName: string,
consumer: TeamLogSourceTrackingConsumer
): Promise<TeamLogSourceSnapshot> {
@ -139,7 +129,7 @@ export class TeamLogSourceTracker {
await this.disableTracking(teamName, 'change_presence');
}
private async disableTracking(
async disableTracking(
teamName: string,
consumer: TeamLogSourceTrackingConsumer
): Promise<TeamLogSourceSnapshot> {

View file

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

View file

@ -147,7 +147,8 @@ describe('TeamDataService', () => {
});
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(
{
@ -174,7 +175,8 @@ describe('TeamDataService', () => {
deleteTasks: vi.fn(async () => undefined),
} as never,
{
setTracking,
enableTracking,
disableTracking,
} as never
);
@ -182,8 +184,8 @@ describe('TeamDataService', () => {
service.setTaskChangePresenceTracking('my-team', false);
await Promise.resolve();
expect(setTracking).toHaveBeenNthCalledWith(1, 'my-team', 'change_presence', true);
expect(setTracking).toHaveBeenNthCalledWith(2, 'my-team', 'change_presence', false);
expect(enableTracking).toHaveBeenNthCalledWith(1, 'my-team', 'change_presence');
expect(disableTracking).toHaveBeenNthCalledWith(1, 'my-team', 'change_presence');
});
it('surfaces controller reconcile failures', async () => {

View file

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