Skip to content

Commit 4807195

Browse files
committed
Add wallet file exists test with Db clean up
1 parent 2aad169 commit 4807195

3 files changed

Lines changed: 138 additions & 59 deletions

File tree

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
using System.Diagnostics;
2+
3+
using BTCPayServer.Plugins.Monero.Services;
4+
using BTCPayServer.Tests;
5+
6+
using Microsoft.Extensions.Logging;
7+
8+
using Npgsql;
9+
10+
namespace BTCPayServer.Plugins.IntegrationTests.Monero;
11+
12+
public static class IntegrationTestUtils
13+
{
14+
15+
private static readonly ILogger Logger = LoggerFactory
16+
.Create(builder => builder.AddConsole())
17+
.CreateLogger("IntegrationTestUtils");
18+
19+
public static async Task CleanUpAsync(PlaywrightTester playwrightTester)
20+
{
21+
MoneroRPCProvider moneroRpcProvider = playwrightTester.Server.PayTester.GetService<MoneroRPCProvider>();
22+
if (moneroRpcProvider.IsAvailable("XMR"))
23+
{
24+
await moneroRpcProvider.CloseWallet("XMR");
25+
}
26+
27+
if (playwrightTester.Server.PayTester.InContainer)
28+
{
29+
moneroRpcProvider.DeleteWallet();
30+
await DropDatabaseAsync(
31+
"btcpayserver",
32+
"Host=postgres;Port=5432;Username=postgres;Database=postgres");
33+
}
34+
else
35+
{
36+
await RemoveWalletFromLocalDocker();
37+
await DropDatabaseAsync(
38+
"btcpayserver",
39+
"Host=localhost;Port=39372;Username=postgres;Database=postgres");
40+
}
41+
}
42+
43+
private static async Task DropDatabaseAsync(string dbName, string connectionString)
44+
{
45+
try
46+
{
47+
await using var conn = new NpgsqlConnection(connectionString);
48+
await conn.OpenAsync();
49+
await new NpgsqlCommand($"""
50+
SELECT pg_terminate_backend(pid)
51+
FROM pg_stat_activity
52+
WHERE datname = '{dbName}'
53+
AND pid <> pg_backend_pid();
54+
""", conn).ExecuteNonQueryAsync();
55+
var cmd = new NpgsqlCommand($"DROP DATABASE IF EXISTS {dbName};", conn);
56+
await cmd.ExecuteNonQueryAsync();
57+
Logger.LogInformation("Database {DbName} dropped successfully.", dbName);
58+
}
59+
catch (Exception ex)
60+
{
61+
Logger.LogError("Failed to drop database {DbName}: {ExMessage}", dbName, ex.Message);
62+
}
63+
}
64+
65+
private static async Task RemoveWalletFromLocalDocker()
66+
{
67+
try
68+
{
69+
var removeWalletFromDocker = new ProcessStartInfo
70+
{
71+
FileName = "docker",
72+
Arguments = "exec xmr_wallet sh -c \"rm -rf /wallet/*\"",
73+
RedirectStandardOutput = true,
74+
RedirectStandardError = true
75+
};
76+
77+
using var process = Process.Start(removeWalletFromDocker);
78+
if (process is null)
79+
{
80+
Logger.LogWarning("Failed to start docker process for wallet cleanup.");
81+
return;
82+
}
83+
84+
var stdout = await process.StandardOutput.ReadToEndAsync();
85+
var stderr = await process.StandardError.ReadToEndAsync();
86+
87+
await process.WaitForExitAsync();
88+
89+
if (!string.IsNullOrWhiteSpace(stdout))
90+
{
91+
Logger.LogInformation("Docker wallet cleanup output: {Output}", stdout);
92+
}
93+
94+
if (!string.IsNullOrWhiteSpace(stderr))
95+
{
96+
Logger.LogWarning("Docker wallet cleanup error output: {Error}", stderr);
97+
}
98+
}
99+
catch (Exception ex)
100+
{
101+
Logger.LogError(ex, "Wallet cleanup via Docker failed.");
102+
}
103+
}
104+
}

BTCPayServer.Plugins.IntegrationTests/Monero/MoneroPluginIntegrationTest.cs

Lines changed: 33 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
using System.Diagnostics;
2-
1+
using BTCPayServer.Plugins.Monero.RPC.Models;
32
using BTCPayServer.Plugins.Monero.Services;
43
using BTCPayServer.Rating;
54
using BTCPayServer.Services.Rates;
6-
using BTCPayServer.Tests;
75
using BTCPayServer.Tests.Mocks;
86

97
using Xunit;
@@ -14,7 +12,7 @@ namespace BTCPayServer.Plugins.IntegrationTests.Monero;
1412
public class MoneroPluginIntegrationTest(ITestOutputHelper helper) : MoneroAndBitcoinIntegrationTestBase(helper)
1513
{
1614
[Fact]
17-
public async Task EnableMoneroPluginSuccessfully()
15+
public async Task ShouldEnableMoneroPluginSuccessfully()
1816
{
1917
await using var s = CreatePlaywrightTester();
2018
await s.StartAsync();
@@ -104,7 +102,7 @@ await s.Page.Locator("input#PrivateViewKey")
104102
await s.Page.SelectOptionAsync("#SettlementConfirmationThresholdChoice", "3");
105103
await s.Page.ClickAsync("#SaveButton");
106104

107-
await CleanUp(s);
105+
await IntegrationTestUtils.CleanUpAsync(s);
108106
}
109107

110108
[Fact]
@@ -129,64 +127,41 @@ await s.Page.Locator("input#PrivateViewKey")
129127

130128
Assert.Equal("Could not generate view wallet from keys: Failed to parse public address", errorText);
131129

132-
await CleanUp(s);
130+
await IntegrationTestUtils.CleanUpAsync(s);
133131
}
134132

135-
private static async Task CleanUp(PlaywrightTester playwrightTester)
133+
[Fact]
134+
public async Task ShouldFailWhenWalletFileAlreadyExists()
136135
{
137-
MoneroRPCProvider moneroRpcProvider = playwrightTester.Server.PayTester.GetService<MoneroRPCProvider>();
138-
if (moneroRpcProvider.IsAvailable("XMR"))
139-
{
140-
await moneroRpcProvider.CloseWallet("XMR");
141-
await moneroRpcProvider.UpdateSummary("XMR");
142-
}
136+
await using var s = CreatePlaywrightTester();
137+
await s.StartAsync();
143138

144-
if (playwrightTester.Server.PayTester.InContainer)
145-
{
146-
moneroRpcProvider.DeleteWallet();
147-
}
148-
else
139+
MoneroRPCProvider moneroRpcProvider = s.Server.PayTester.GetService<MoneroRPCProvider>();
140+
await moneroRpcProvider.WalletRpcClients["XMR"].SendCommandAsync<GenerateFromKeysRequest, GenerateFromKeysResponse>("generate_from_keys", new GenerateFromKeysRequest
149141
{
150-
await RemoveWalletFromLocalDocker();
151-
}
152-
}
142+
PrimaryAddress = "43Pnj6ZKGFTJhaLhiecSFfLfr64KPJZw7MyGH73T6PTDekBBvsTAaWEUSM4bmJqDuYLizhA13jQkMRPpz9VXBCBqQQb6y5L",
143+
PrivateViewKey = "1bfa03b0c78aa6bc8292cf160ec9875657d61e889c41d0ebe5c54fd3a2c4b40e",
144+
WalletFileName = "view_wallet",
145+
Password = ""
146+
});
147+
await moneroRpcProvider.CloseWallet("XMR");
153148

154-
static async Task RemoveWalletFromLocalDocker()
155-
{
156-
try
157-
{
158-
var removeWalletFromDocker = new ProcessStartInfo
159-
{
160-
FileName = "docker",
161-
Arguments = "exec xmr_wallet sh -c \"rm -rf /wallet/*\"",
162-
RedirectStandardOutput = true,
163-
RedirectStandardError = true
164-
};
165-
166-
using var process = Process.Start(removeWalletFromDocker);
167-
if (process is null)
168-
{
169-
return;
170-
}
171-
172-
var stdout = await process.StandardOutput.ReadToEndAsync();
173-
var stderr = await process.StandardError.ReadToEndAsync();
174-
175-
await process.WaitForExitAsync();
176-
177-
if (!string.IsNullOrWhiteSpace(stdout))
178-
{
179-
Console.WriteLine(stdout);
180-
}
181-
182-
if (!string.IsNullOrWhiteSpace(stderr))
183-
{
184-
Console.WriteLine(stderr);
185-
}
186-
}
187-
catch (Exception ex)
188-
{
189-
Console.WriteLine($"Cleanup failed: {ex}");
190-
}
149+
await s.RegisterNewUser(true);
150+
await s.CreateNewStore();
151+
await s.Page.Locator("a.nav-link[href*='monerolike/XMR']").ClickAsync();
152+
await s.Page.Locator("input#PrimaryAddress")
153+
.FillAsync("43Pnj6ZKGFTJhaLhiecSFfLfr64KPJZw7MyGH73T6PTDekBBvsTAaWEUSM4bmJqDuYLizhA13jQkMRPpz9VXBCBqQQb6y5L");
154+
await s.Page.Locator("input#PrivateViewKey")
155+
.FillAsync("1bfa03b0c78aa6bc8292cf160ec9875657d61e889c41d0ebe5c54fd3a2c4b40e");
156+
await s.Page.Locator("input#RestoreHeight").FillAsync("0");
157+
await s.Page.Locator("input#WalletPassword").FillAsync("pass123");
158+
await s.Page.ClickAsync("button[name='command'][value='set-wallet-details']");
159+
var errorText = await s.Page
160+
.Locator("div.validation-summary-errors li")
161+
.InnerTextAsync();
162+
163+
Assert.Equal("Could not generate view wallet from keys: Wallet already exists.", errorText);
164+
165+
await IntegrationTestUtils.CleanUpAsync(s);
191166
}
192167
}

submodules/btcpayserver

Submodule btcpayserver updated 195 files

0 commit comments

Comments
 (0)