refactor(configmanager): rename UI project and split test projects
Rename ConfigManager to ConfigManager.Ui to match the Core/CLI/UI project structure, and split the monolithic test project into Core.Tests, Cli.Tests, and Ui.Tests to align with the source project organization.
This commit is contained in:
@@ -0,0 +1,243 @@
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Headless.XUnit;
|
||||
using Avalonia.VisualTree;
|
||||
using JdeScoping.ConfigManager.Ui.Views.Dialogs;
|
||||
|
||||
namespace JdeScoping.ConfigManager.Ui.Tests.Views.Dialogs;
|
||||
|
||||
/// <summary>
|
||||
/// UI tests for dialog views.
|
||||
/// </summary>
|
||||
public class DialogViewTests
|
||||
{
|
||||
/// <summary>
|
||||
/// Verifies that NewStoreDialog renders with the expected input fields.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void NewStoreDialogView_RendersInputFields()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new NewStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert - NewStoreDialog contains TextBoxes for store path and key file path
|
||||
var textBoxes = dialog.GetVisualDescendants().OfType<TextBox>().ToList();
|
||||
textBoxes.Count.ShouldBeGreaterThanOrEqualTo(2); // Store path and Key file path
|
||||
|
||||
// Verify section headers
|
||||
var textBlocks = dialog.GetVisualDescendants().OfType<TextBlock>().ToList();
|
||||
textBlocks.Any(tb => tb.Text == "Store Location").ShouldBeTrue();
|
||||
textBlocks.Any(tb => tb.Text == "Key File").ShouldBeTrue();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that NewStoreDialog has Browse and Generate buttons for key file.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void NewStoreDialogView_HasBrowseAndGenerateButtons()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new NewStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert
|
||||
var buttons = dialog.GetVisualDescendants().OfType<Button>().ToList();
|
||||
|
||||
var buttonContents = buttons.Select(b => b.Content?.ToString()).ToList();
|
||||
buttonContents.ShouldContain("Browse...");
|
||||
buttonContents.ShouldContain("Generate");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that NewStoreDialog has Create and Cancel buttons.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void NewStoreDialogView_HasCreateAndCancelButtons()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new NewStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert
|
||||
var buttons = dialog.GetVisualDescendants().OfType<Button>().ToList();
|
||||
|
||||
var buttonContents = buttons.Select(b => b.Content?.ToString()).ToList();
|
||||
buttonContents.ShouldContain("Create");
|
||||
buttonContents.ShouldContain("Cancel");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that NewStoreDialog has the correct title.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void NewStoreDialogView_HasCorrectTitle()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new NewStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert
|
||||
dialog.Title.ShouldBe("Create New Secure Store");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that NewStoreDialog has the expected size constraints.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void NewStoreDialogView_HasExpectedSize()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new NewStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert - Width=550, Height=350, MinWidth=450, MinHeight=300
|
||||
dialog.Width.ShouldBe(550);
|
||||
dialog.Height.ShouldBe(350);
|
||||
dialog.MinWidth.ShouldBe(450);
|
||||
dialog.MinHeight.ShouldBe(300);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that UnlockStoreDialog renders with key file input field.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void UnlockStoreDialogView_RendersKeyFileField()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new UnlockStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert - UnlockStoreDialog contains TextBoxes for store path (read-only) and key file path
|
||||
var textBoxes = dialog.GetVisualDescendants().OfType<TextBox>().ToList();
|
||||
textBoxes.Count.ShouldBeGreaterThanOrEqualTo(2); // Store path and Key file path
|
||||
|
||||
// Verify section headers
|
||||
var textBlocks = dialog.GetVisualDescendants().OfType<TextBlock>().ToList();
|
||||
textBlocks.Any(tb => tb.Text == "Store File").ShouldBeTrue();
|
||||
textBlocks.Any(tb => tb.Text == "Key File").ShouldBeTrue();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that UnlockStoreDialog has a Browse button for key file.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void UnlockStoreDialogView_HasBrowseButton()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new UnlockStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert
|
||||
var buttons = dialog.GetVisualDescendants().OfType<Button>().ToList();
|
||||
|
||||
var buttonContents = buttons.Select(b => b.Content?.ToString()).ToList();
|
||||
buttonContents.ShouldContain("Browse...");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that UnlockStoreDialog has Unlock and Cancel buttons.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void UnlockStoreDialogView_HasUnlockAndCancelButtons()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new UnlockStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert
|
||||
var buttons = dialog.GetVisualDescendants().OfType<Button>().ToList();
|
||||
|
||||
var buttonContents = buttons.Select(b => b.Content?.ToString()).ToList();
|
||||
buttonContents.ShouldContain("Unlock");
|
||||
buttonContents.ShouldContain("Cancel");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that UnlockStoreDialog has the correct title.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void UnlockStoreDialogView_HasCorrectTitle()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new UnlockStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert
|
||||
dialog.Title.ShouldBe("Unlock Secure Store");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that UnlockStoreDialog has the expected size constraints.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void UnlockStoreDialogView_HasExpectedSize()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new UnlockStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert - Width=500, Height=320, MinWidth=400, MinHeight=280
|
||||
dialog.Width.ShouldBe(500);
|
||||
dialog.Height.ShouldBe(320);
|
||||
dialog.MinWidth.ShouldBe(400);
|
||||
dialog.MinHeight.ShouldBe(280);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that NewStoreDialog is not resizable.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void NewStoreDialogView_IsNotResizable()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new NewStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert
|
||||
dialog.CanResize.ShouldBeFalse();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that UnlockStoreDialog is not resizable.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void UnlockStoreDialogView_IsNotResizable()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new UnlockStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert
|
||||
dialog.CanResize.ShouldBeFalse();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that NewStoreDialog contains a ScrollViewer.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void NewStoreDialogView_ContainsScrollViewer()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new NewStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert
|
||||
var scrollViewer = dialog.FindDescendantOfType<ScrollViewer>();
|
||||
scrollViewer.ShouldNotBeNull();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that UnlockStoreDialog contains a ScrollViewer.
|
||||
/// </summary>
|
||||
[AvaloniaFact]
|
||||
public void UnlockStoreDialogView_ContainsScrollViewer()
|
||||
{
|
||||
// Arrange & Act
|
||||
var dialog = new UnlockStoreDialog();
|
||||
dialog.Show();
|
||||
|
||||
// Assert
|
||||
var scrollViewer = dialog.FindDescendantOfType<ScrollViewer>();
|
||||
scrollViewer.ShouldNotBeNull();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user