937eb66ac8
Add comprehensive tests for services (ConnectionTestService, RuntimeConfigValidation), ViewModels (PipelineEditor, dialogs, transformers), and Avalonia headless UI tests for views and forms.
242 lines
6.4 KiB
C#
242 lines
6.4 KiB
C#
using JdeScoping.ConfigManager.Services;
|
|
using JdeScoping.ConfigManager.ViewModels.Dialogs;
|
|
|
|
namespace JdeScoping.ConfigManager.Tests.ViewModels.Dialogs;
|
|
|
|
public class DiffPreviewDialogViewModelTests
|
|
{
|
|
[Fact]
|
|
public void Constructor_WithEmptyDiff_InitializesCorrectly()
|
|
{
|
|
// Arrange
|
|
var diff = new DiffResult
|
|
{
|
|
HasChanges = false,
|
|
Lines = [],
|
|
Insertions = 0,
|
|
Deletions = 0
|
|
};
|
|
|
|
// Act
|
|
var sut = new DiffPreviewDialogViewModel(diff);
|
|
|
|
// Assert
|
|
sut.Lines.Count.ShouldBe(0);
|
|
sut.HasChanges.ShouldBeFalse();
|
|
sut.Insertions.ShouldBe(0);
|
|
sut.Deletions.ShouldBe(0);
|
|
sut.Result.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_WithChanges_PopulatesLines()
|
|
{
|
|
// Arrange
|
|
var diff = new DiffResult
|
|
{
|
|
HasChanges = true,
|
|
Lines =
|
|
[
|
|
new DiffLine { OldLineNumber = 1, NewLineNumber = 1, Text = "unchanged line", Type = DiffLineType.Unchanged },
|
|
new DiffLine { OldLineNumber = 2, NewLineNumber = null, Text = "removed line", Type = DiffLineType.Removed },
|
|
new DiffLine { OldLineNumber = null, NewLineNumber = 2, Text = "added line", Type = DiffLineType.Added }
|
|
],
|
|
Insertions = 1,
|
|
Deletions = 1
|
|
};
|
|
|
|
// Act
|
|
var sut = new DiffPreviewDialogViewModel(diff);
|
|
|
|
// Assert
|
|
sut.Lines.Count.ShouldBe(3);
|
|
sut.HasChanges.ShouldBeTrue();
|
|
sut.Insertions.ShouldBe(1);
|
|
sut.Deletions.ShouldBe(1);
|
|
}
|
|
|
|
[Fact]
|
|
public void SaveCommand_SetsResultTrue_AndInvokesRequestClose()
|
|
{
|
|
// Arrange
|
|
var diff = CreateEmptyDiff();
|
|
var sut = new DiffPreviewDialogViewModel(diff);
|
|
var closeInvoked = false;
|
|
sut.RequestClose = () => closeInvoked = true;
|
|
|
|
// Act
|
|
sut.SaveCommand.Execute(null);
|
|
|
|
// Assert
|
|
sut.Result.ShouldBeTrue();
|
|
closeInvoked.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void CancelCommand_SetsResultFalse_AndInvokesRequestClose()
|
|
{
|
|
// Arrange
|
|
var diff = CreateEmptyDiff();
|
|
var sut = new DiffPreviewDialogViewModel(diff);
|
|
var closeInvoked = false;
|
|
sut.RequestClose = () => closeInvoked = true;
|
|
|
|
// Act
|
|
sut.CancelCommand.Execute(null);
|
|
|
|
// Assert
|
|
sut.Result.ShouldBeFalse();
|
|
closeInvoked.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void SaveCommand_DoesNotThrow_WhenRequestCloseIsNull()
|
|
{
|
|
// Arrange
|
|
var diff = CreateEmptyDiff();
|
|
var sut = new DiffPreviewDialogViewModel(diff);
|
|
sut.RequestClose = null;
|
|
|
|
// Act & Assert - Should not throw
|
|
Should.NotThrow(() => sut.SaveCommand.Execute(null));
|
|
sut.Result.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void CancelCommand_DoesNotThrow_WhenRequestCloseIsNull()
|
|
{
|
|
// Arrange
|
|
var diff = CreateEmptyDiff();
|
|
var sut = new DiffPreviewDialogViewModel(diff);
|
|
sut.RequestClose = null;
|
|
|
|
// Act & Assert - Should not throw
|
|
Should.NotThrow(() => sut.CancelCommand.Execute(null));
|
|
sut.Result.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_ThrowsOnNullDiff()
|
|
{
|
|
// Act & Assert
|
|
Should.Throw<ArgumentNullException>(() => new DiffPreviewDialogViewModel(null!));
|
|
}
|
|
|
|
[Fact]
|
|
public void Result_InitialValue_IsFalse()
|
|
{
|
|
// Arrange
|
|
var diff = CreateEmptyDiff();
|
|
|
|
// Act
|
|
var sut = new DiffPreviewDialogViewModel(diff);
|
|
|
|
// Assert
|
|
sut.Result.ShouldBeFalse();
|
|
}
|
|
|
|
private static DiffResult CreateEmptyDiff()
|
|
{
|
|
return new DiffResult
|
|
{
|
|
HasChanges = false,
|
|
Lines = [],
|
|
Insertions = 0,
|
|
Deletions = 0
|
|
};
|
|
}
|
|
}
|
|
|
|
public class DiffLineViewModelTests
|
|
{
|
|
[Fact]
|
|
public void Constructor_UnchangedLine_SetsPropertiesCorrectly()
|
|
{
|
|
// Arrange
|
|
var line = new DiffLine
|
|
{
|
|
OldLineNumber = 5,
|
|
NewLineNumber = 5,
|
|
Text = "unchanged content",
|
|
Type = DiffLineType.Unchanged
|
|
};
|
|
|
|
// Act
|
|
var sut = new DiffLineViewModel(line);
|
|
|
|
// Assert
|
|
sut.OldLineNumber.ShouldBe("5");
|
|
sut.NewLineNumber.ShouldBe("5");
|
|
sut.Text.ShouldBe("unchanged content");
|
|
sut.Type.ShouldBe(DiffLineType.Unchanged);
|
|
sut.Background.ShouldBe("Transparent");
|
|
sut.BorderColor.ShouldBe("Transparent");
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_AddedLine_SetsGreenStyling()
|
|
{
|
|
// Arrange
|
|
var line = new DiffLine
|
|
{
|
|
OldLineNumber = null,
|
|
NewLineNumber = 10,
|
|
Text = "new line",
|
|
Type = DiffLineType.Added
|
|
};
|
|
|
|
// Act
|
|
var sut = new DiffLineViewModel(line);
|
|
|
|
// Assert
|
|
sut.OldLineNumber.ShouldBe("");
|
|
sut.NewLineNumber.ShouldBe("10");
|
|
sut.Type.ShouldBe(DiffLineType.Added);
|
|
sut.Background.ShouldBe("#1A3DD68C");
|
|
sut.BorderColor.ShouldBe("#3DD68C");
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_RemovedLine_SetsRedStyling()
|
|
{
|
|
// Arrange
|
|
var line = new DiffLine
|
|
{
|
|
OldLineNumber = 7,
|
|
NewLineNumber = null,
|
|
Text = "deleted line",
|
|
Type = DiffLineType.Removed
|
|
};
|
|
|
|
// Act
|
|
var sut = new DiffLineViewModel(line);
|
|
|
|
// Assert
|
|
sut.OldLineNumber.ShouldBe("7");
|
|
sut.NewLineNumber.ShouldBe("");
|
|
sut.Type.ShouldBe(DiffLineType.Removed);
|
|
sut.Background.ShouldBe("#1AFF6B6B");
|
|
sut.BorderColor.ShouldBe("#FF6B6B");
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_NullLineNumbers_ReturnsEmptyStrings()
|
|
{
|
|
// Arrange
|
|
var line = new DiffLine
|
|
{
|
|
OldLineNumber = null,
|
|
NewLineNumber = null,
|
|
Text = "text",
|
|
Type = DiffLineType.Unchanged
|
|
};
|
|
|
|
// Act
|
|
var sut = new DiffLineViewModel(line);
|
|
|
|
// Assert
|
|
sut.OldLineNumber.ShouldBe("");
|
|
sut.NewLineNumber.ShouldBe("");
|
|
}
|
|
}
|