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 ;
@@ -36,20 +40,25 @@ public async Task EnableMoneroPluginSuccessfully()
3640 await s . RegisterNewUser ( true ) ;
3741 await s . CreateNewStore ( preferredExchange : "Kraken" ) ;
3842 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" ) ;
43+ await s . Page . Locator ( "input#PrimaryAddress" )
44+ . FillAsync (
45+ "43Pnj6ZKGFTJhaLhiecSFfLfr64KPJZw7MyGH73T6PTDekBBvsTAaWEUSM4bmJqDuYLizhA13jQkMRPpz9VXBCBqQQb6y5L" ) ;
46+ await s . Page . Locator ( "input#PrivateViewKey" )
47+ . FillAsync ( "1bfa03b0c78aa6bc8292cf160ec9875657d61e889c41d0ebe5c54fd3a2c4b40e" ) ;
4148 await s . Page . Locator ( "input#RestoreHeight" ) . FillAsync ( "0" ) ;
4249 await s . Page . Locator ( "input#WalletPassword" ) . FillAsync ( "pass123" ) ;
4350 await s . Page . ClickAsync ( "button[name='command'][value='set-wallet-details']" ) ;
4451 await s . Page . CheckAsync ( "#Enabled" ) ;
4552 await s . Page . SelectOptionAsync ( "#SettlementConfirmationThresholdChoice" , "2" ) ;
4653 await s . Page . ClickAsync ( "#SaveButton" ) ;
47- var classList = await s . Page . Locator ( "svg.icon-checkmark" ) . GetAttributeAsync ( "class" ) ;
54+ var classList = await s . Page
55+ . Locator ( "svg.icon-checkmark" )
56+ . GetAttributeAsync ( "class" ) ;
4857 Assert . Contains ( "text-success" , classList ) ;
4958
5059 // Set rate provider
51- await s . Page . Locator ( "#StoreNav -General" ) . ClickAsync ( ) ;
52- await s . Page . Locator ( "#mainNav #StoreNav -Rates" ) . ClickAsync ( ) ;
60+ await s . Page . Locator ( "#menu-item -General" ) . ClickAsync ( ) ;
61+ await s . Page . Locator ( "#menu-item -Rates" ) . ClickAsync ( ) ;
5362 await s . Page . FillAsync ( "#DefaultCurrencyPairs" , "BTC_USD,XMR_USD,XMR_BTC" ) ;
5463 await s . Page . SelectOptionAsync ( "#PrimarySource_PreferredExchange" , "kraken" ) ;
5564 await s . Page . Locator ( "#page-primary" ) . ClickAsync ( ) ;
@@ -69,7 +78,9 @@ public async Task EnableMoneroPluginSuccessfully()
6978 await s . Page . ClickAsync ( "#DetailsToggle" ) ;
7079
7180 // Verify the total fiat amount is $4.20
72- var totalFiat = await s . Page . Locator ( "#PaymentDetails-TotalFiat dd.clipboard-button" ) . InnerTextAsync ( ) ;
81+ var totalFiat = await s . Page
82+ . Locator ( "#PaymentDetails-TotalFiat dd.clipboard-button" )
83+ . InnerTextAsync ( ) ;
7384 Assert . Equal ( "$4.20" , totalFiat ) ;
7485
7586 await s . Page . GoBackAsync ( ) ;
@@ -92,5 +103,90 @@ public async Task EnableMoneroPluginSuccessfully()
92103 // Select confirmation time to 0
93104 await s . Page . SelectOptionAsync ( "#SettlementConfirmationThresholdChoice" , "3" ) ;
94105 await s . Page . ClickAsync ( "#SaveButton" ) ;
106+
107+ await CleanUp ( s ) ;
108+ }
109+
110+ [ Fact ]
111+ public async Task ShouldFailWhenWrongPrimaryAddress ( )
112+ {
113+ await using var s = CreatePlaywrightTester ( ) ;
114+ await s . StartAsync ( ) ;
115+
116+ await s . RegisterNewUser ( true ) ;
117+ await s . CreateNewStore ( ) ;
118+ await s . Page . Locator ( "a.nav-link[href*='monerolike/XMR']" ) . ClickAsync ( ) ;
119+ await s . Page . Locator ( "input#PrimaryAddress" )
120+ . FillAsync ( "wrongprimaryaddressfSF6ZKGFT7MyGH73T6PTDekBBvsTAaWEUSM4bmJqDuYLizhA13jQkMRPpz9VXBCBqQQb6y5L" ) ;
121+ await s . Page . Locator ( "input#PrivateViewKey" )
122+ . FillAsync ( "1bfa03b0c78aa6bc8292cf160ec9875657d61e889c41d0ebe5c54fd3a2c4b40e" ) ;
123+ await s . Page . Locator ( "input#RestoreHeight" ) . FillAsync ( "0" ) ;
124+ await s . Page . Locator ( "input#WalletPassword" ) . FillAsync ( "pass123" ) ;
125+ await s . Page . ClickAsync ( "button[name='command'][value='set-wallet-details']" ) ;
126+ var errorText = await s . Page
127+ . Locator ( "div.validation-summary-errors li" )
128+ . InnerTextAsync ( ) ;
129+
130+ Assert . Equal ( "Could not generate view wallet from keys: Failed to parse public address" , errorText ) ;
131+
132+ await CleanUp ( s ) ;
133+ }
134+
135+ private static async Task CleanUp ( PlaywrightTester playwrightTester )
136+ {
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+ }
143+
144+ if ( playwrightTester . Server . PayTester . InContainer )
145+ {
146+ moneroRpcProvider . DeleteWallet ( ) ;
147+ }
148+ else
149+ {
150+ await RemoveWalletFromLocalDocker ( ) ;
151+ }
152+ }
153+
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+ }
95191 }
96192}
0 commit comments