Files
git.stella-ops.org/src/Signals/__Tests/StellaOps.Signals.Tests/Scm/ScmEventMapperTests.cs

277 lines
7.5 KiB
C#

// <copyright file="ScmEventMapperTests.cs" company="Stella Operations">
// Copyright (c) Stella Operations. Licensed under BUSL-1.1.
// </copyright>
using System.Text.Json;
using StellaOps.Signals.Scm.Models;
using StellaOps.Signals.Scm.Webhooks;
using Xunit;
namespace StellaOps.Signals.Tests.Scm;
/// <summary>
/// Unit tests for SCM event mappers.
/// @sprint SPRINT_20251229_013_SIGNALS_scm_ci_connectors
/// </summary>
public sealed class ScmEventMapperTests
{
#region GitHub Event Mapper Tests
[Fact]
public void GitHubMapper_PushEvent_MapsCorrectly()
{
// Arrange
var mapper = new GitHubEventMapper();
var payload = CreateGitHubPushPayload();
// Act
var result = mapper.Map("push", "delivery-123", payload);
// Assert
Assert.NotNull(result);
Assert.Equal(ScmProvider.GitHub, result.Provider);
Assert.Equal(ScmEventType.Push, result.EventType);
Assert.Equal("delivery-123", result.EventId);
Assert.Equal("refs/heads/main", result.Ref);
Assert.NotNull(result.Repository);
Assert.Equal("owner/repo", result.Repository.FullName);
}
[Fact]
public void GitHubMapper_PullRequestMergedEvent_MapsCorrectly()
{
// Arrange
var mapper = new GitHubEventMapper();
var payload = CreateGitHubPrMergedPayload();
// Act
var result = mapper.Map("pull_request", "delivery-456", payload);
// Assert
Assert.NotNull(result);
Assert.Equal(ScmProvider.GitHub, result.Provider);
Assert.Equal(ScmEventType.PullRequestMerged, result.EventType);
Assert.NotNull(result.PullRequest);
Assert.Equal(42, result.PullRequest.Number);
Assert.Equal("closed", result.PullRequest.State);
}
[Fact]
public void GitHubMapper_ReleaseEvent_MapsCorrectly()
{
// Arrange
var mapper = new GitHubEventMapper();
var payload = CreateGitHubReleasePayload();
// Act
var result = mapper.Map("release", "delivery-789", payload);
// Assert
Assert.NotNull(result);
Assert.Equal(ScmProvider.GitHub, result.Provider);
Assert.Equal(ScmEventType.ReleasePublished, result.EventType);
Assert.NotNull(result.Release);
Assert.Equal("v1.0.0", result.Release.TagName);
}
[Fact]
public void GitHubMapper_UnknownEvent_ReturnsUnknownType()
{
// Arrange
var mapper = new GitHubEventMapper();
var payload = JsonSerializer.SerializeToElement(new { });
// Act
var result = mapper.Map("unknown_event", "delivery-000", payload);
// Assert
Assert.NotNull(result);
Assert.Equal(ScmEventType.Unknown, result.EventType);
}
#endregion
#region GitLab Event Mapper Tests
[Fact]
public void GitLabMapper_PushEvent_MapsCorrectly()
{
// Arrange
var mapper = new GitLabEventMapper();
var payload = CreateGitLabPushPayload();
// Act
var result = mapper.Map("Push Hook", "delivery-123", payload);
// Assert
Assert.NotNull(result);
Assert.Equal(ScmProvider.GitLab, result.Provider);
Assert.Equal(ScmEventType.Push, result.EventType);
Assert.Equal("refs/heads/main", result.Ref);
}
[Fact]
public void GitLabMapper_MergeRequestEvent_MapsCorrectly()
{
// Arrange
var mapper = new GitLabEventMapper();
var payload = CreateGitLabMrMergedPayload();
// Act
var result = mapper.Map("Merge Request Hook", "delivery-456", payload);
// Assert
Assert.NotNull(result);
Assert.Equal(ScmProvider.GitLab, result.Provider);
Assert.Equal(ScmEventType.PullRequestMerged, result.EventType);
}
#endregion
#region Gitea Event Mapper Tests
[Fact]
public void GiteaMapper_PushEvent_MapsCorrectly()
{
// Arrange
var mapper = new GiteaEventMapper();
var payload = CreateGiteaPushPayload();
// Act
var result = mapper.Map("push", "delivery-123", payload);
// Assert
Assert.NotNull(result);
Assert.Equal(ScmProvider.Gitea, result.Provider);
Assert.Equal(ScmEventType.Push, result.EventType);
}
#endregion
#region Helper Methods
private static JsonElement CreateGitHubPushPayload()
{
var payload = new
{
@ref = "refs/heads/main",
after = "abc123def456",
repository = new
{
id = 12345,
full_name = "owner/repo",
clone_url = "https://github.com/owner/repo.git"
},
sender = new
{
login = "testuser",
id = 1
}
};
return JsonSerializer.SerializeToElement(payload);
}
private static JsonElement CreateGitHubPrMergedPayload()
{
var payload = new
{
action = "closed",
pull_request = new
{
number = 42,
merged = true,
title = "Test PR",
head = new { sha = "abc123" },
@base = new { @ref = "main" }
},
repository = new
{
id = 12345,
full_name = "owner/repo"
}
};
return JsonSerializer.SerializeToElement(payload);
}
private static JsonElement CreateGitHubReleasePayload()
{
var payload = new
{
action = "published",
release = new
{
tag_name = "v1.0.0",
name = "Release 1.0.0",
draft = false,
prerelease = false
},
repository = new
{
id = 12345,
full_name = "owner/repo"
}
};
return JsonSerializer.SerializeToElement(payload);
}
private static JsonElement CreateGitLabPushPayload()
{
var payload = new
{
@ref = "refs/heads/main",
after = "abc123def456",
project = new
{
id = 12345,
path_with_namespace = "group/project",
git_http_url = "https://gitlab.com/group/project.git"
},
user_name = "testuser"
};
return JsonSerializer.SerializeToElement(payload);
}
private static JsonElement CreateGitLabMrMergedPayload()
{
var payload = new
{
object_kind = "merge_request",
object_attributes = new
{
iid = 42,
state = "merged",
action = "merge",
title = "Test MR"
},
project = new
{
id = 12345,
path_with_namespace = "group/project"
}
};
return JsonSerializer.SerializeToElement(payload);
}
private static JsonElement CreateGiteaPushPayload()
{
var payload = new
{
@ref = "refs/heads/main",
after = "abc123def456",
repository = new
{
id = 12345,
full_name = "owner/repo",
clone_url = "https://gitea.example.com/owner/repo.git"
},
sender = new
{
login = "testuser"
}
};
return JsonSerializer.SerializeToElement(payload);
}
#endregion
}