btcpayserver-plugin-builder/PluginBuilder.Tests/DatabaseMigrationTests.cs

89 lines
3.3 KiB
C#

using System.Threading.Tasks;
using Dapper;
using Xunit;
using Xunit.Abstractions;
namespace PluginBuilder.Tests;
public class DatabaseMigrationTests(ITestOutputHelper logs) : UnitTestBase(logs)
{
[Fact]
public async Task CanDropLegacyPluginReviewsUserId()
{
await using var tester = CreateMigrationTester();
await tester.RunScriptsUntil("21.DropLegacyPluginReviewUserFk");
await using (var conn = await tester.Open())
{
const string userId = "review-user";
const string pluginSlug = "review-migration-plugin";
await conn.ExecuteAsync(
"""
INSERT INTO "AspNetUsers"
("Id", "UserName", "NormalizedUserName", "Email", "NormalizedEmail", "EmailConfirmed", "PhoneNumberConfirmed", "TwoFactorEnabled", "LockoutEnabled", "AccessFailedCount")
VALUES
(@UserId, 'review-user', 'REVIEW-USER', 'review@example.com', 'REVIEW@EXAMPLE.COM', TRUE, FALSE, FALSE, FALSE, 0);
INSERT INTO plugins (slug) VALUES (@PluginSlug);
INSERT INTO plugin_reviewers (user_id, source)
VALUES (@UserId, 'system');
INSERT INTO plugin_reviews (plugin_slug, user_id, reviewer_id, rating, body)
SELECT @PluginSlug, @UserId, id, 5, 'Great plugin'
FROM plugin_reviewers
WHERE user_id = @UserId;
""",
new { UserId = userId, PluginSlug = pluginSlug });
Assert.True(await conn.ExecuteScalarAsync<bool>(
"""
SELECT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_name = 'plugin_reviews'
AND column_name = 'user_id'
)
"""));
}
await tester.RunRemainingScripts();
await using var migratedConn = await tester.Open();
var hasUserIdColumn = await migratedConn.ExecuteScalarAsync<bool>(
"""
SELECT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_name = 'plugin_reviews'
AND column_name = 'user_id'
)
""");
var hasLegacyUserIdConstraint = await migratedConn.ExecuteScalarAsync<bool>(
"""
SELECT EXISTS (
SELECT 1
FROM information_schema.table_constraints
WHERE table_name = 'plugin_reviews'
AND constraint_name = 'fk_plugin_reviews_user'
)
""");
var migratedReview = await migratedConn.QuerySingleAsync<(string PluginSlug, long ReviewerId, string ReviewerUserId)>(
"""
SELECT r.plugin_slug AS PluginSlug, r.reviewer_id AS ReviewerId, pr.user_id AS ReviewerUserId
FROM plugin_reviews r
JOIN plugin_reviewers pr ON pr.id = r.reviewer_id
WHERE r.plugin_slug = @PluginSlug
""",
new { PluginSlug = "review-migration-plugin" });
Assert.False(hasUserIdColumn);
Assert.False(hasLegacyUserIdConstraint);
Assert.Equal("review-migration-plugin", migratedReview.PluginSlug);
Assert.True(migratedReview.ReviewerId > 0);
Assert.Equal("review-user", migratedReview.ReviewerUserId);
}
}