From 21dd9c991b476bd01c3bc1d210df8224141004e7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:18:43 +0000 Subject: [PATCH 1/3] Initial plan From b8b1b7b6b76241c5e12957be4d5d2fe30107105d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:45:41 +0000 Subject: [PATCH 2/3] Fix auto test discovery to respect setting changes without reload Co-authored-by: eleanorjboyd <26030610+eleanorjboyd@users.noreply.github.com> --- .../testing/testController/controller.ts | 5 +- .../controller.autoDiscovery.unit.test.ts | 85 +++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/test/testing/testController/controller.autoDiscovery.unit.test.ts diff --git a/src/client/testing/testController/controller.ts b/src/client/testing/testController/controller.ts index fe384709c371..aefc97117da5 100644 --- a/src/client/testing/testController/controller.ts +++ b/src/client/testing/testController/controller.ts @@ -549,7 +549,10 @@ export class PythonTestController implements ITestController, IExtensionSingleAc this.disposables.push( onDidSaveTextDocument(async (doc: TextDocument) => { const settings = this.configSettings.getSettings(doc.uri); - if (minimatch.default(doc.uri.fsPath, settings.testing.autoTestDiscoverOnSavePattern)) { + if ( + settings.testing.autoTestDiscoverOnSaveEnabled && + minimatch.default(doc.uri.fsPath, settings.testing.autoTestDiscoverOnSavePattern) + ) { traceVerbose(`Testing: Trigger refresh after saving ${doc.uri.fsPath}`); this.sendTriggerTelemetry('watching'); this.refreshData.trigger(doc.uri, false); diff --git a/src/test/testing/testController/controller.autoDiscovery.unit.test.ts b/src/test/testing/testController/controller.autoDiscovery.unit.test.ts new file mode 100644 index 000000000000..df112a919dda --- /dev/null +++ b/src/test/testing/testController/controller.autoDiscovery.unit.test.ts @@ -0,0 +1,85 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import * as assert from 'assert'; +import * as minimatch from 'minimatch'; +import { Uri } from 'vscode'; +import { ITestingSettings } from '../../../client/testing/configuration/types'; + +suite('PythonTestController - Auto Discovery Logic Tests', () => { + + test('auto discovery logic respects autoTestDiscoverOnSaveEnabled setting', () => { + const testUri = Uri.file('/test/test_example.py'); + + // Test case 1: Setting enabled - should trigger discovery + const enabledSettings: Partial = { + autoTestDiscoverOnSaveEnabled: true, + autoTestDiscoverOnSavePattern: '**/*.py', + }; + + const shouldTriggerWhenEnabled = + enabledSettings.autoTestDiscoverOnSaveEnabled && + minimatch.default(testUri.fsPath, enabledSettings.autoTestDiscoverOnSavePattern!); + + assert.strictEqual(shouldTriggerWhenEnabled, true, 'Should trigger when setting is enabled'); + + // Test case 2: Setting disabled - should NOT trigger discovery + const disabledSettings: Partial = { + autoTestDiscoverOnSaveEnabled: false, + autoTestDiscoverOnSavePattern: '**/*.py', + }; + + const shouldTriggerWhenDisabled = + disabledSettings.autoTestDiscoverOnSaveEnabled && + minimatch.default(testUri.fsPath, disabledSettings.autoTestDiscoverOnSavePattern!); + + assert.strictEqual(shouldTriggerWhenDisabled, false, 'Should NOT trigger when setting is disabled'); + }); + + test('auto discovery logic respects pattern setting', () => { + const testUri = Uri.file('/test/example.txt'); // Non-Python file + + // Settings with enabled but non-matching pattern + const settings: Partial = { + autoTestDiscoverOnSaveEnabled: true, + autoTestDiscoverOnSavePattern: '**/*.py', // Only Python files + }; + + const shouldTrigger = + settings.autoTestDiscoverOnSaveEnabled && + minimatch.default(testUri.fsPath, settings.autoTestDiscoverOnSavePattern!); + + assert.strictEqual(shouldTrigger, false, 'Should NOT trigger when file does not match pattern'); + }); + + test('auto discovery logic triggers when both setting and pattern match', () => { + const testUri = Uri.file('/test/test_example.py'); + + // Settings with both enabled and matching pattern + const settings: Partial = { + autoTestDiscoverOnSaveEnabled: true, + autoTestDiscoverOnSavePattern: '**/*.py', + }; + + const shouldTrigger = + settings.autoTestDiscoverOnSaveEnabled && + minimatch.default(testUri.fsPath, settings.autoTestDiscoverOnSavePattern!); + + assert.strictEqual(shouldTrigger, true, 'Should trigger when both setting is enabled and pattern matches'); + }); + + test('auto discovery logic handles undefined settings gracefully', () => { + const testUri = Uri.file('/test/test_example.py'); + + // Settings with undefined autoTestDiscoverOnSaveEnabled (should be falsy) + const undefinedSettings: Partial = { + autoTestDiscoverOnSavePattern: '**/*.py', + }; + + const shouldTrigger = + !!undefinedSettings.autoTestDiscoverOnSaveEnabled && + minimatch.default(testUri.fsPath, undefinedSettings.autoTestDiscoverOnSavePattern!); + + assert.strictEqual(shouldTrigger, false, 'Should NOT trigger when setting is undefined'); + }); +}); \ No newline at end of file From dabd575662ce6cefc5aadd2298f5690b2dfbbcc8 Mon Sep 17 00:00:00 2001 From: eleanorjboyd <26030610+eleanorjboyd@users.noreply.github.com> Date: Tue, 8 Jul 2025 15:25:52 -0700 Subject: [PATCH 3/3] remove unneeded tests --- .../controller.autoDiscovery.unit.test.ts | 85 ------------------- 1 file changed, 85 deletions(-) delete mode 100644 src/test/testing/testController/controller.autoDiscovery.unit.test.ts diff --git a/src/test/testing/testController/controller.autoDiscovery.unit.test.ts b/src/test/testing/testController/controller.autoDiscovery.unit.test.ts deleted file mode 100644 index df112a919dda..000000000000 --- a/src/test/testing/testController/controller.autoDiscovery.unit.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import * as assert from 'assert'; -import * as minimatch from 'minimatch'; -import { Uri } from 'vscode'; -import { ITestingSettings } from '../../../client/testing/configuration/types'; - -suite('PythonTestController - Auto Discovery Logic Tests', () => { - - test('auto discovery logic respects autoTestDiscoverOnSaveEnabled setting', () => { - const testUri = Uri.file('/test/test_example.py'); - - // Test case 1: Setting enabled - should trigger discovery - const enabledSettings: Partial = { - autoTestDiscoverOnSaveEnabled: true, - autoTestDiscoverOnSavePattern: '**/*.py', - }; - - const shouldTriggerWhenEnabled = - enabledSettings.autoTestDiscoverOnSaveEnabled && - minimatch.default(testUri.fsPath, enabledSettings.autoTestDiscoverOnSavePattern!); - - assert.strictEqual(shouldTriggerWhenEnabled, true, 'Should trigger when setting is enabled'); - - // Test case 2: Setting disabled - should NOT trigger discovery - const disabledSettings: Partial = { - autoTestDiscoverOnSaveEnabled: false, - autoTestDiscoverOnSavePattern: '**/*.py', - }; - - const shouldTriggerWhenDisabled = - disabledSettings.autoTestDiscoverOnSaveEnabled && - minimatch.default(testUri.fsPath, disabledSettings.autoTestDiscoverOnSavePattern!); - - assert.strictEqual(shouldTriggerWhenDisabled, false, 'Should NOT trigger when setting is disabled'); - }); - - test('auto discovery logic respects pattern setting', () => { - const testUri = Uri.file('/test/example.txt'); // Non-Python file - - // Settings with enabled but non-matching pattern - const settings: Partial = { - autoTestDiscoverOnSaveEnabled: true, - autoTestDiscoverOnSavePattern: '**/*.py', // Only Python files - }; - - const shouldTrigger = - settings.autoTestDiscoverOnSaveEnabled && - minimatch.default(testUri.fsPath, settings.autoTestDiscoverOnSavePattern!); - - assert.strictEqual(shouldTrigger, false, 'Should NOT trigger when file does not match pattern'); - }); - - test('auto discovery logic triggers when both setting and pattern match', () => { - const testUri = Uri.file('/test/test_example.py'); - - // Settings with both enabled and matching pattern - const settings: Partial = { - autoTestDiscoverOnSaveEnabled: true, - autoTestDiscoverOnSavePattern: '**/*.py', - }; - - const shouldTrigger = - settings.autoTestDiscoverOnSaveEnabled && - minimatch.default(testUri.fsPath, settings.autoTestDiscoverOnSavePattern!); - - assert.strictEqual(shouldTrigger, true, 'Should trigger when both setting is enabled and pattern matches'); - }); - - test('auto discovery logic handles undefined settings gracefully', () => { - const testUri = Uri.file('/test/test_example.py'); - - // Settings with undefined autoTestDiscoverOnSaveEnabled (should be falsy) - const undefinedSettings: Partial = { - autoTestDiscoverOnSavePattern: '**/*.py', - }; - - const shouldTrigger = - !!undefinedSettings.autoTestDiscoverOnSaveEnabled && - minimatch.default(testUri.fsPath, undefinedSettings.autoTestDiscoverOnSavePattern!); - - assert.strictEqual(shouldTrigger, false, 'Should NOT trigger when setting is undefined'); - }); -}); \ No newline at end of file