1+ using System . Diagnostics ;
2+
3+ using BTCPayServer . Plugins . Monero . Services ;
14using BTCPayServer . Rating ;
25using BTCPayServer . Services . Rates ;
6+ using BTCPayServer . Tests ;
37using BTCPayServer . Tests . Mocks ;
48
59using Xunit ;
610using Xunit . Abstractions ;
711
812namespace BTCPayServer . Plugins . IntegrationTests . Monero ;
913
10- public class MoneroPluginIntegrationTest ( ITestOutputHelper helper ) : MoneroAndBitcoinIntegrationTestBase ( helper )
14+ public class MoneroPluginIntegrationTest ( ITestOutputHelper helper ) : MoneroAndBitcoinIntegrationTestBase ( helper ) , IAsyncLifetime
1115{
16+ public Task InitializeAsync ( ) => Task . CompletedTask ;
17+
18+ public async Task DisposeAsync ( )
19+ {
20+ try
21+ {
22+ var removeWalletFromDocker = new ProcessStartInfo
23+ {
24+ FileName = "docker" ,
25+ Arguments = "exec xmr_wallet sh -c \" rm -rf /wallet/*\" " ,
26+ RedirectStandardOutput = true ,
27+ RedirectStandardError = true
28+ } ;
29+
30+ using var process = Process . Start ( removeWalletFromDocker ) ;
31+ if ( process is null )
32+ {
33+ return ;
34+ }
35+
36+ var stdout = await process . StandardOutput . ReadToEndAsync ( ) ;
37+ var stderr = await process . StandardError . ReadToEndAsync ( ) ;
38+
39+ await process . WaitForExitAsync ( ) ;
40+
41+ if ( ! string . IsNullOrWhiteSpace ( stdout ) )
42+ {
43+ Console . WriteLine ( stdout ) ;
44+ }
45+
46+ if ( ! string . IsNullOrWhiteSpace ( stderr ) )
47+ {
48+ Console . WriteLine ( stderr ) ;
49+ }
50+ }
51+ catch ( Exception ex )
52+ {
53+ Console . WriteLine ( $ "Cleanup failed: { ex } ") ;
54+ }
55+ }
56+
1257 [ Fact ]
1358 public async Task EnableMoneroPluginSuccessfully ( )
1459 {
@@ -36,20 +81,24 @@ public async Task EnableMoneroPluginSuccessfully()
3681 await s . RegisterNewUser ( true ) ;
3782 await s . CreateNewStore ( preferredExchange : "Kraken" ) ;
3883 await s . Page . Locator ( "a.nav-link[href*='monerolike/XMR']" ) . ClickAsync ( ) ;
39- await s . Page . Locator ( "input#PrimaryAddress" ) . FillAsync ( "43Pnj6ZKGFTJhaLhiecSFfLfr64KPJZw7MyGH73T6PTDekBBvsTAaWEUSM4bmJqDuYLizhA13jQkMRPpz9VXBCBqQQb6y5L" ) ;
40- await s . Page . Locator ( "input#PrivateViewKey" ) . FillAsync ( "1bfa03b0c78aa6bc8292cf160ec9875657d61e889c41d0ebe5c54fd3a2c4b40e" ) ;
84+ await s . Page . Locator ( "input#PrimaryAddress" )
85+ . FillAsync ( "43Pnj6ZKGFTJhaLhiecSFfLfr64KPJZw7MyGH73T6PTDekBBvsTAaWEUSM4bmJqDuYLizhA13jQkMRPpz9VXBCBqQQb6y5L" ) ;
86+ await s . Page . Locator ( "input#PrivateViewKey" )
87+ . FillAsync ( "1bfa03b0c78aa6bc8292cf160ec9875657d61e889c41d0ebe5c54fd3a2c4b40e" ) ;
4188 await s . Page . Locator ( "input#RestoreHeight" ) . FillAsync ( "0" ) ;
4289 await s . Page . Locator ( "input#WalletPassword" ) . FillAsync ( "pass123" ) ;
4390 await s . Page . ClickAsync ( "button[name='command'][value='set-wallet-details']" ) ;
4491 await s . Page . CheckAsync ( "#Enabled" ) ;
4592 await s . Page . SelectOptionAsync ( "#SettlementConfirmationThresholdChoice" , "2" ) ;
4693 await s . Page . ClickAsync ( "#SaveButton" ) ;
47- var classList = await s . Page . Locator ( "svg.icon-checkmark" ) . GetAttributeAsync ( "class" ) ;
94+ var classList = await s . Page
95+ . Locator ( "svg.icon-checkmark" )
96+ . GetAttributeAsync ( "class" ) ;
4897 Assert . Contains ( "text-success" , classList ) ;
4998
5099 // Set rate provider
51- await s . Page . Locator ( "#StoreNav -General" ) . ClickAsync ( ) ;
52- await s . Page . Locator ( "#mainNav #StoreNav -Rates" ) . ClickAsync ( ) ;
100+ await s . Page . Locator ( "#menu-item -General" ) . ClickAsync ( ) ;
101+ await s . Page . Locator ( "#menu-item -Rates" ) . ClickAsync ( ) ;
53102 await s . Page . FillAsync ( "#DefaultCurrencyPairs" , "BTC_USD,XMR_USD,XMR_BTC" ) ;
54103 await s . Page . SelectOptionAsync ( "#PrimarySource_PreferredExchange" , "kraken" ) ;
55104 await s . Page . Locator ( "#page-primary" ) . ClickAsync ( ) ;
@@ -69,7 +118,9 @@ public async Task EnableMoneroPluginSuccessfully()
69118 await s . Page . ClickAsync ( "#DetailsToggle" ) ;
70119
71120 // Verify the total fiat amount is $4.20
72- var totalFiat = await s . Page . Locator ( "#PaymentDetails-TotalFiat dd.clipboard-button" ) . InnerTextAsync ( ) ;
121+ var totalFiat = await s . Page
122+ . Locator ( "#PaymentDetails-TotalFiat dd.clipboard-button" )
123+ . InnerTextAsync ( ) ;
73124 Assert . Equal ( "$4.20" , totalFiat ) ;
74125
75126 await s . Page . GoBackAsync ( ) ;
@@ -92,5 +143,46 @@ public async Task EnableMoneroPluginSuccessfully()
92143 // Select confirmation time to 0
93144 await s . Page . SelectOptionAsync ( "#SettlementConfirmationThresholdChoice" , "3" ) ;
94145 await s . Page . ClickAsync ( "#SaveButton" ) ;
146+
147+ await CleanUp ( s ) ;
148+ }
149+
150+ [ Fact ]
151+ public async Task ShouldFailWhenWrongPrimaryAddress ( )
152+ {
153+ await using var s = CreatePlaywrightTester ( ) ;
154+ await s . StartAsync ( ) ;
155+
156+ await s . RegisterNewUser ( true ) ;
157+ await s . CreateNewStore ( ) ;
158+ await s . Page . Locator ( "a.nav-link[href*='monerolike/XMR']" ) . ClickAsync ( ) ;
159+ await s . Page . Locator ( "input#PrimaryAddress" )
160+ . FillAsync ( "wrongprimaryaddressfSF6ZKGFT7MyGH73T6PTDekBBvsTAaWEUSM4bmJqDuYLizhA13jQkMRPpz9VXBCBqQQb6y5L" ) ;
161+ await s . Page . Locator ( "input#PrivateViewKey" )
162+ . FillAsync ( "1bfa03b0c78aa6bc8292cf160ec9875657d61e889c41d0ebe5c54fd3a2c4b40e" ) ;
163+ await s . Page . Locator ( "input#RestoreHeight" ) . FillAsync ( "0" ) ;
164+ await s . Page . Locator ( "input#WalletPassword" ) . FillAsync ( "pass123" ) ;
165+ await s . Page . ClickAsync ( "button[name='command'][value='set-wallet-details']" ) ;
166+ var errorText = await s . Page
167+ . Locator ( "div.validation-summary-errors li" )
168+ . InnerTextAsync ( ) ;
169+
170+ Assert . Equal ( "Could not generate view wallet from keys: Failed to parse public address" , errorText ) ;
171+
172+ await CleanUp ( s ) ;
173+ }
174+
175+ private static async Task CleanUp ( PlaywrightTester playwrightTester )
176+ {
177+ MoneroRPCProvider moneroRpcProvider = playwrightTester . Server . PayTester . GetService < MoneroRPCProvider > ( ) ;
178+ if ( moneroRpcProvider . IsAvailable ( "XMR" ) )
179+ {
180+ await moneroRpcProvider . CloseWallet ( "XMR" ) ;
181+ await moneroRpcProvider . UpdateSummary ( "XMR" ) ;
182+ }
183+ if ( playwrightTester . Server . PayTester . InContainer )
184+ {
185+ moneroRpcProvider . DeleteWallet ( ) ;
186+ }
95187 }
96188}
0 commit comments