feat: 初始化NewLife Studio项目,完成基础框架与数据管理模块
何炳宏 authored at 2026-05-26 12:09:09
3.86 KiB
NewLife.Studio
using NewLife.Studio.Core.DTOs;
using NewLife.Studio.Modules.DataStudio.ViewModels;
using Xunit;

namespace NewLife.Studio.Modules.DataStudio.Tests;

public class QueryTabTests
{
    [Fact]
    public void Default_Sql_IsSelectStarFrom()
    {
        var tab = new QueryTab();
        Assert.Equal("SELECT * FROM ", tab.Sql);
    }

    [Fact]
    public void Default_Title_IsQuery1()
    {
        var tab = new QueryTab();
        Assert.Equal("查询 1", tab.Title);
    }

    [Fact]
    public void Default_Result_IsNull()
    {
        var tab = new QueryTab();
        Assert.Null(tab.Result);
    }

    [Fact]
    public void ResultGrid_IsNotNull()
    {
        var tab = new QueryTab();
        Assert.NotNull(tab.ResultGrid);
    }

    [Fact]
    public void Sql_CanBeSet()
    {
        var tab = new QueryTab();
        tab.Sql = "SELECT * FROM users WHERE id = 1";
        Assert.Equal("SELECT * FROM users WHERE id = 1", tab.Sql);
    }

    [Fact]
    public void Title_CanBeSet()
    {
        var tab = new QueryTab();
        tab.Title = "自定义查询";
        Assert.Equal("自定义查询", tab.Title);
    }

    [Fact]
    public void Setting_Result_UpdatesResultGrid()
    {
        var tab = new QueryTab();
        var result = new QueryResult
        {
            Columns = new[]
            {
                new ColumnInfo { Name = "Id", DataType = "INTEGER" },
                new ColumnInfo { Name = "Name", DataType = "TEXT" }
            },
            Rows = new List<object?[]>
            {
                new object?[] { 1, "Test" }
            },
            RowCount = 1,
            ElapsedMs = 42
        };

        tab.Result = result;

        Assert.Same(result, tab.Result);
        Assert.Equal(1, tab.ResultGrid.RowCount);
        Assert.Equal(42, tab.ResultGrid.ElapsedMs);
        Assert.Equal(2, tab.ResultGrid.Columns.Count);
        Assert.Equal("Id", tab.ResultGrid.Columns[0].Name);
    }

    [Fact]
    public void Setting_Result_ToNull_ClearsNothing()
    {
        var tab = new QueryTab();
        // First set a result
        tab.Result = new QueryResult
        {
            Columns = new[] { new ColumnInfo { Name = "X" } },
            Rows = new List<object?[]> { new object?[] { 1 } },
            RowCount = 1
        };

        // Then set to null - OnResultChanged won't call SetResult for null values
        tab.Result = null;

        // ResultGrid still holds previous data (since OnResultChanged only acts when value != null)
        Assert.Equal(1, tab.ResultGrid.RowCount);
    }

    [Fact]
    public void Setting_Result_WithError_PropagatesError()
    {
        var tab = new QueryTab();
        tab.Result = new QueryResult
        {
            Columns = [],
            Rows = [],
            Error = "Syntax error near 'INNER'"
        };

        Assert.Equal("Syntax error near 'INNER'", tab.ResultGrid.Error);
        Assert.True(tab.ResultGrid.HasError);
    }

    [Fact]
    public void Setting_Result_WithTruncated_PropagatesWarning()
    {
        var tab = new QueryTab();
        tab.Result = new QueryResult
        {
            Columns = [],
            Rows = [],
            Truncated = true,
            RowCount = 1000
        };

        Assert.True(tab.ResultGrid.IsTruncated);
        Assert.Equal("(结果已裁剪)", tab.ResultGrid.TruncatedWarning);
        Assert.Equal(1000, tab.ResultGrid.RowCount);
    }

    [Fact]
    public void EachQueryTab_HasIndependentResultGrid()
    {
        var tab1 = new QueryTab();
        var tab2 = new QueryTab();

        Assert.NotSame(tab1.ResultGrid, tab2.ResultGrid);

        tab1.Result = new QueryResult
        {
            Columns = new[] { new ColumnInfo { Name = "A" } },
            Rows = new List<object?[]> { new object?[] { 1 } },
            RowCount = 1
        };

        Assert.Equal(1, tab1.ResultGrid.RowCount);
        Assert.Equal(0, tab2.ResultGrid.RowCount);
    }
}