277 lines
7.5 KiB
C#
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
|
|
}
|