Skip to content

Commit ca4dfd4

Browse files
authored
update tests only on save with more files excluded (#21741)
fixes #21014 and #21061
1 parent 84bbff9 commit ca4dfd4

File tree

1 file changed

+25
-29
lines changed

1 file changed

+25
-29
lines changed

src/client/testing/testController/controller.ts

+25-29
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
CancellationTokenSource,
1616
Uri,
1717
EventEmitter,
18+
TextDocument,
1819
} from 'vscode';
1920
import { IExtensionSingleActivationService } from '../../activation/types';
2021
import { ICommandManager, IWorkspaceService } from '../../common/application/types';
@@ -48,6 +49,7 @@ import { WorkspaceTestAdapter } from './workspaceTestAdapter';
4849
import { ITestDebugLauncher } from '../common/types';
4950
import { IServiceContainer } from '../../ioc/types';
5051
import { PythonResultResolver } from './common/resultResolver';
52+
import { onDidSaveTextDocument } from '../../common/vscodeApis/workspaceApis';
5153

5254
// Types gymnastics to make sure that sendTriggerTelemetry only accepts the correct types.
5355
type EventPropertyType = IEventNamePropertyMapping[EventName.UNITTEST_DISCOVERY_TRIGGER];
@@ -209,7 +211,7 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
209211
if (settings.testing.autoTestDiscoverOnSaveEnabled) {
210212
traceVerbose(`Testing: Setting up watcher for ${workspace.uri.fsPath}`);
211213
this.watchForSettingsChanges(workspace);
212-
this.watchForTestContentChanges(workspace);
214+
this.watchForTestContentChangeOnSave();
213215
}
214216
});
215217
}
@@ -493,12 +495,23 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
493495
this.disposables.push(watcher);
494496

495497
this.disposables.push(
496-
watcher.onDidChange((uri) => {
497-
traceVerbose(`Testing: Trigger refresh after change in ${uri.fsPath}`);
498-
this.sendTriggerTelemetry('watching');
499-
this.refreshData.trigger(uri, false);
498+
onDidSaveTextDocument(async (doc: TextDocument) => {
499+
const file = doc.fileName;
500+
// refresh on any settings file save
501+
if (
502+
file.includes('settings.json') ||
503+
file.includes('pytest.ini') ||
504+
file.includes('setup.cfg') ||
505+
file.includes('pyproject.toml')
506+
) {
507+
traceVerbose(`Testing: Trigger refresh after saving ${doc.uri.fsPath}`);
508+
this.sendTriggerTelemetry('watching');
509+
this.refreshData.trigger(doc.uri, false);
510+
}
500511
}),
501512
);
513+
/* Keep both watchers for create and delete since config files can change test behavior without content
514+
due to their impact on pythonPath. */
502515
this.disposables.push(
503516
watcher.onDidCreate((uri) => {
504517
traceVerbose(`Testing: Trigger refresh after creating ${uri.fsPath}`);
@@ -515,31 +528,14 @@ export class PythonTestController implements ITestController, IExtensionSingleAc
515528
);
516529
}
517530

518-
private watchForTestContentChanges(workspace: WorkspaceFolder): void {
519-
const pattern = new RelativePattern(workspace, '**/*.py');
520-
const watcher = this.workspaceService.createFileSystemWatcher(pattern);
521-
this.disposables.push(watcher);
522-
523-
this.disposables.push(
524-
watcher.onDidChange((uri) => {
525-
traceVerbose(`Testing: Trigger refresh after change in ${uri.fsPath}`);
526-
this.sendTriggerTelemetry('watching');
527-
// We want to invalidate tests for code change
528-
this.refreshData.trigger(uri, true);
529-
}),
530-
);
531-
this.disposables.push(
532-
watcher.onDidCreate((uri) => {
533-
traceVerbose(`Testing: Trigger refresh after creating ${uri.fsPath}`);
534-
this.sendTriggerTelemetry('watching');
535-
this.refreshData.trigger(uri, false);
536-
}),
537-
);
531+
private watchForTestContentChangeOnSave(): void {
538532
this.disposables.push(
539-
watcher.onDidDelete((uri) => {
540-
traceVerbose(`Testing: Trigger refresh after deleting in ${uri.fsPath}`);
541-
this.sendTriggerTelemetry('watching');
542-
this.refreshData.trigger(uri, false);
533+
onDidSaveTextDocument(async (doc: TextDocument) => {
534+
if (doc.fileName.endsWith('.py')) {
535+
traceVerbose(`Testing: Trigger refresh after saving ${doc.uri.fsPath}`);
536+
this.sendTriggerTelemetry('watching');
537+
this.refreshData.trigger(doc.uri, false);
538+
}
543539
}),
544540
);
545541
}

0 commit comments

Comments
 (0)