File: Model\InputViewModelTests.cs
Web Access
Project: src\tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj (Aspire.Dashboard.Components.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Aspire.Dashboard.Model.Interaction;
using Aspire.DashboardService.Proto.V1;
using Xunit;
 
namespace Aspire.Dashboard.Components.Tests.Model;
 
public class InputViewModelTests
{
    [Fact]
    public void InputViewModel_ChoiceWithoutPlaceholder_DefaultsToFirstOption()
    {
        // Arrange
        var input = new InteractionInput
        {
            Label = "Choose Color",
            InputType = InputType.Choice,
        };
        input.Options.Add("red", "Red");
        input.Options.Add("blue", "Blue");
        input.Options.Add("green", "Green");
 
        // Act
        var viewModel = new InputViewModel(input);
 
        // Assert
        Assert.Equal("red", viewModel.Value);
    }
 
    [Fact]
    public void InputViewModel_ChoiceWithPlaceholder_DoesNotDefaultToFirstOption()
    {
        // Arrange
        var input = new InteractionInput
        {
            Label = "Choose Color",
            InputType = InputType.Choice,
            Placeholder = "Select a color"
        };
        input.Options.Add("red", "Red");
        input.Options.Add("blue", "Blue");
        input.Options.Add("green", "Green");
 
        // Act
        var viewModel = new InputViewModel(input);
 
        // Assert - proto strings default to empty string, not null
        Assert.True(string.IsNullOrEmpty(viewModel.Value));
    }
 
    [Fact]
    public void InputViewModel_ChoiceWithExistingValue_KeepsExistingValue()
    {
        // Arrange
        var input = new InteractionInput
        {
            Label = "Choose Color",
            InputType = InputType.Choice,
            Value = "blue"
        };
        input.Options.Add("red", "Red");
        input.Options.Add("blue", "Blue");
        input.Options.Add("green", "Green");
 
        // Act
        var viewModel = new InputViewModel(input);
 
        // Assert
        Assert.Equal("blue", viewModel.Value);
    }
 
    [Fact]
    public void InputViewModel_ChoiceWithEmptyOptions_DoesNotSetValue()
    {
        // Arrange
        var input = new InteractionInput
        {
            Label = "Choose Color",
            InputType = InputType.Choice
        };
 
        // Act
        var viewModel = new InputViewModel(input);
 
        // Assert - proto strings default to empty string, not null
        Assert.True(string.IsNullOrEmpty(viewModel.Value));
    }
 
    [Fact]
    public void InputViewModel_NonChoiceInput_DoesNotSetValue()
    {
        // Arrange
        var input = new InteractionInput
        {
            Label = "Enter Text",
            InputType = InputType.Text
        };
 
        // Act
        var viewModel = new InputViewModel(input);
 
        // Assert - proto strings default to empty string, not null
        Assert.True(string.IsNullOrEmpty(viewModel.Value));
    }
 
    [Fact]
    public void SetInput_ChoiceWithoutPlaceholder_DefaultsToFirstOption()
    {
        // Arrange
        var initialInput = new InteractionInput
        {
            Label = "Enter Text",
            InputType = InputType.Text
        };
        var viewModel = new InputViewModel(initialInput);
 
        var choiceInput = new InteractionInput
        {
            Label = "Choose Color",
            InputType = InputType.Choice
        };
        choiceInput.Options.Add("red", "Red");
        choiceInput.Options.Add("blue", "Blue");
 
        // Act
        viewModel.SetInput(choiceInput);
 
        // Assert
        Assert.Equal("red", viewModel.Value);
    }
 
    [Fact]
    public void SetInput_ChoiceWithPlaceholder_DoesNotDefaultToFirstOption()
    {
        // Arrange
        var initialInput = new InteractionInput
        {
            Label = "Enter Text",
            InputType = InputType.Text
        };
        var viewModel = new InputViewModel(initialInput);
 
        var choiceInput = new InteractionInput
        {
            Label = "Choose Color",
            InputType = InputType.Choice,
            Placeholder = "Select a color"
        };
        choiceInput.Options.Add("red", "Red");
        choiceInput.Options.Add("blue", "Blue");
 
        // Act
        viewModel.SetInput(choiceInput);
 
        // Assert - proto strings default to empty string, not null
        Assert.True(string.IsNullOrEmpty(viewModel.Value));
    }
 
    [Fact]
    public void InputViewModel_ChoiceWithAllowCustomChoice_DoesNotDefaultToFirstOption()
    {
        // Arrange
        var input = new InteractionInput
        {
            Label = "Choose Color",
            InputType = InputType.Choice,
            AllowCustomChoice = true
        };
        input.Options.Add("red", "Red");
        input.Options.Add("blue", "Blue");
        input.Options.Add("green", "Green");
 
        // Act
        var viewModel = new InputViewModel(input);
 
        // Assert - When AllowCustomChoice is true, value should not default
        Assert.True(string.IsNullOrEmpty(viewModel.Value));
    }
}