UnityHttpServerTests.cs•6.65 kB
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using NUnit.Framework;
using Newtonsoft.Json;
using UnityEngine;
using UnityEngine.TestTools;
namespace UnityMCP.Tests
{
    [TestFixture]
    public class UnityHttpServerTests
    {
        private const string BASE_URL = "http://localhost:23457";
        private HttpClient httpClient;
        [SetUp]
        public void Setup()
        {
            httpClient = new HttpClient();
            httpClient.Timeout = TimeSpan.FromSeconds(5);
        }
        [TearDown]
        public void TearDown()
        {
            httpClient?.Dispose();
        }
        [Test]
        public async Task Server_ShouldRespondToPing()
        {
            // Arrange
            var request = new { method = "ping" };
            var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
            // Act
            var response = await httpClient.PostAsync($"{BASE_URL}/", content);
            var responseBody = await response.Content.ReadAsStringAsync();
            var result = JsonConvert.DeserializeObject<dynamic>(responseBody);
            // Assert
            Assert.IsTrue(response.IsSuccessStatusCode);
            Assert.AreEqual("ok", result.status.ToString());
        }
        [Test]
        public async Task CreateScript_ShouldReturnSuccessWithValidParams()
        {
            // Arrange
            var request = new
            {
                method = "script/create",
                fileName = "TestScript",
                content = "public class TestScript : MonoBehaviour { }",
                folder = "Assets/Scripts/Test"
            };
            var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
            // Act
            var response = await httpClient.PostAsync($"{BASE_URL}/", content);
            var responseBody = await response.Content.ReadAsStringAsync();
            var result = JsonConvert.DeserializeObject<dynamic>(responseBody);
            // Assert
            Assert.IsTrue(response.IsSuccessStatusCode);
            Assert.IsTrue(result.success);
            Assert.IsNotNull(result.path);
            Assert.IsNotNull(result.guid);
        }
        [Test]
        public async Task CreateScript_ShouldReturnErrorWithMissingFileName()
        {
            // Arrange
            var request = new
            {
                method = "script/create",
                content = "public class TestScript : MonoBehaviour { }"
            };
            var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
            // Act
            var response = await httpClient.PostAsync($"{BASE_URL}/", content);
            var responseBody = await response.Content.ReadAsStringAsync();
            var result = JsonConvert.DeserializeObject<dynamic>(responseBody);
            // Assert
            Assert.AreEqual(400, (int)response.StatusCode);
            Assert.IsFalse(result.success);
            Assert.IsNotNull(result.error);
        }
        [Test]
        public async Task ReadScript_ShouldReturnContentForExistingFile()
        {
            // Arrange - First create a script
            var createRequest = new
            {
                method = "script/create",
                fileName = "ReadTestScript",
                content = "// Test content",
                folder = "Assets/Scripts/Test"
            };
            await httpClient.PostAsync($"{BASE_URL}/", 
                new StringContent(JsonConvert.SerializeObject(createRequest), Encoding.UTF8, "application/json"));
            // Act - Read the script
            var readRequest = new
            {
                method = "script/read",
                path = "Assets/Scripts/Test/ReadTestScript.cs"
            };
            var response = await httpClient.PostAsync($"{BASE_URL}/",
                new StringContent(JsonConvert.SerializeObject(readRequest), Encoding.UTF8, "application/json"));
            var responseBody = await response.Content.ReadAsStringAsync();
            var result = JsonConvert.DeserializeObject<dynamic>(responseBody);
            // Assert
            Assert.IsTrue(response.IsSuccessStatusCode);
            Assert.IsTrue(result.success);
            Assert.AreEqual("// Test content", result.content.ToString());
        }
        [Test]
        public async Task CreateShader_ShouldReturnSuccessWithValidParams()
        {
            // Arrange
            var request = new
            {
                method = "shader/create",
                name = "TestShader",
                content = "Shader \"Custom/TestShader\" { }",
                folder = "Assets/Shaders"
            };
            var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
            // Act
            var response = await httpClient.PostAsync($"{BASE_URL}/", content);
            var responseBody = await response.Content.ReadAsStringAsync();
            var result = JsonConvert.DeserializeObject<dynamic>(responseBody);
            // Assert
            Assert.IsTrue(response.IsSuccessStatusCode);
            Assert.IsTrue(result.success);
            Assert.IsNotNull(result.path);
            Assert.IsNotNull(result.guid);
        }
        [Test]
        public async Task GetProjectInfo_ShouldReturnProjectDetails()
        {
            // Arrange
            var request = new { method = "project/info" };
            var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
            // Act
            var response = await httpClient.PostAsync($"{BASE_URL}/", content);
            var responseBody = await response.Content.ReadAsStringAsync();
            var result = JsonConvert.DeserializeObject<dynamic>(responseBody);
            // Assert
            Assert.IsTrue(response.IsSuccessStatusCode);
            Assert.IsNotNull(result.projectPath);
            Assert.IsNotNull(result.unityVersion);
        }
        [Test]
        public async Task InvalidMethod_ShouldReturn404()
        {
            // Arrange
            var request = new { method = "invalid/method" };
            var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
            // Act
            var response = await httpClient.PostAsync($"{BASE_URL}/", content);
            // Assert
            Assert.AreEqual(404, (int)response.StatusCode);
        }
    }
}