unity-mcp/TestProjects/UnityMCPTests/Assets/Tests/EditMode/Services/ToolSyncServiceTests.cs

89 lines
2.8 KiB
C#
Raw Normal View History

Allow users to easily add tools in the Asset folder (#324) * Fix issue #308: Find py files in MCPForUnityTools and version.txt This allows for auto finding new tools. A good dir on a custom tool would look like this: CustomTool/ ├── CustomTool.MCPEnabler.asmdef ├── CustomTool.MCPEnabler.asmdef.meta ├── ExternalAssetToolFunction.cs ├── ExternalAssetToolFunction.cs.meta ├── external_asset_tool_function.py ├── external_asset_tool_function.py.meta ├── version.txt └── version.txt.meta CS files are left in the tools folder. The asmdef is recommended to allow for dependency on MCPForUnity when MCP For Unity is installed: asmdef example { "name": "CustomTool.MCPEnabler", "rootNamespace": "MCPForUnity.Editor.Tools", "references": [ "CustomTool", "MCPForUnity.Editor" ], "includePlatforms": [ "Editor" ], "excludePlatforms": [], "allowUnsafeCode": false, "overrideReferences": false, "precompiledReferences": [], "autoReferenced": true, "defineConstraints": [], "versionDefines": [], "noEngineReferences": false } * Follow-up: address CodeRabbit feedback for #308 (<GetToolsFolderIdentifier was duplicated>) * Follow-up: address CodeRabbit feedback for #308 – centralize GetToolsFolderIdentifier, fix tools copy dir, and limit scan scope * Fixing so the MCP don't removes _skipDirs e.g. __pycache__ * skip empty folders with no py files * Rabbit: "Fix identifier collision between different package roots." * Update MCPForUnity/Editor/Helpers/ServerInstaller.cs Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Rabbbit: Cleanup may delete server’s built-in tool subfolders — restrict to managed names. * Fixed minor + missed onadding rabit change * Revert "Fixed minor + missed onadding rabit change" This reverts commit 571ca8c5de3d07da3791dad558677909a07e886d. * refactor: remove Unity project tools copying and version tracking functionality * refactor: consolidate module discovery logic into shared utility function * Remove unused imports * feat: add Python tool registry and sync system for MCP server integration * feat: add auto-sync processor for Python tools with Unity editor integration * feat: add menu item to reimport all Python files in project Good to give users a manual option * Fix infinite loop error Don't react to PythonToolAsset changes - it only needs to react to Python file changes. And we also batch asset edits to minimise the DB refreshes * refactor: move Python tool sync menu items under Window/MCP For Unity/Tool Sync * Update docs * Remove duplicate header * feat: add OnValidate handler to sync Python tools when asset is modified This fixes the issue with deletions in the asset, now file removals are synced * test: add unit tests for Python tools asset and sync services * Update MCPForUnity/Editor/Helpers/PythonToolSyncProcessor.cs Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * style: remove trailing whitespace from Python tool sync files * test: remove incomplete unit tests from ToolSyncServiceTests * perf: optimize Python file reimport by using AssetDatabase.FindAssets instead of GetAllAssetPaths --------- Co-authored-by: Johan Holtby <72528418+JohanHoltby@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-10-18 12:18:25 +08:00
using System.IO;
using NUnit.Framework;
using UnityEngine;
using MCPForUnity.Editor.Data;
using MCPForUnity.Editor.Services;
namespace MCPForUnityTests.Editor.Services
{
public class ToolSyncServiceTests
{
private ToolSyncService _service;
private string _testToolsDir;
[SetUp]
public void SetUp()
{
_service = new ToolSyncService();
_testToolsDir = Path.Combine(Path.GetTempPath(), "UnityMCPTests", "tools");
// Clean up any existing test directory
if (Directory.Exists(_testToolsDir))
{
Directory.Delete(_testToolsDir, true);
}
}
[TearDown]
public void TearDown()
{
// Clean up test directory
if (Directory.Exists(_testToolsDir))
{
try
{
Directory.Delete(_testToolsDir, true);
}
catch
{
// Ignore cleanup errors
}
}
}
[Test]
public void SyncProjectTools_CreatesDestinationDirectory()
{
_service.SyncProjectTools(_testToolsDir);
Assert.IsTrue(Directory.Exists(_testToolsDir), "Should create destination directory");
}
[Test]
public void SyncProjectTools_ReturnsSuccess_WhenNoPythonToolsAssets()
{
var result = _service.SyncProjectTools(_testToolsDir);
Assert.IsNotNull(result, "Should return a result");
Assert.AreEqual(0, result.CopiedCount, "Should not copy any files");
Assert.AreEqual(0, result.ErrorCount, "Should not have errors");
}
[Test]
public void SyncProjectTools_CleansUpStaleFiles()
{
// Create a stale file in the destination
Directory.CreateDirectory(_testToolsDir);
string staleFile = Path.Combine(_testToolsDir, "old_tool.py");
File.WriteAllText(staleFile, "print('old')");
Assert.IsTrue(File.Exists(staleFile), "Stale file should exist before sync");
// Sync with no assets (should cleanup the stale file)
_service.SyncProjectTools(_testToolsDir);
Assert.IsFalse(File.Exists(staleFile), "Stale file should be removed after sync");
}
[Test]
public void SyncProjectTools_ReportsCorrectCounts()
{
var result = _service.SyncProjectTools(_testToolsDir);
Assert.IsTrue(result.CopiedCount >= 0, "Copied count should be non-negative");
Assert.IsTrue(result.SkippedCount >= 0, "Skipped count should be non-negative");
Assert.IsTrue(result.ErrorCount >= 0, "Error count should be non-negative");
}
}
}