// // Copyright (c) Stella Operations. Licensed under BUSL-1.1. // using System.Text.Json; using StellaOps.Signals.Scm.Models; using StellaOps.Signals.Scm.Webhooks; using Xunit; namespace StellaOps.Signals.Tests.Scm; /// /// Unit tests for SCM event mappers. /// @sprint SPRINT_20251229_013_SIGNALS_scm_ci_connectors /// 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 }