@@ -347,6 +347,87 @@ await ExecuteOnUiThread(() =>
347347 closed . Should ( ) . BeFalse ( ) ;
348348 vm . Container . CanCloseCurrentFlyout . Should ( ) . BeFalse ( ) ;
349349 }
350+
351+ [ Test ]
352+ public async Task CopyToClipboard_Exception_Should_Set_ErrorFlags ( )
353+ {
354+ var check = CreateCheckData ( ) ;
355+ var trustParams = CreateTrustParams ( false , true ) ;
356+
357+ var vm = new ThrowingClipboardViewModel ( check , trustParams , _publicKeysManager . Object , _appSettings . Object ,
358+ _truster . Object , _logger . Object )
359+ {
360+ Container = new FlyoutContainerViewModel { CanCloseCurrentFlyout = false } ,
361+ SafetyKeyParts = null !
362+ } ;
363+
364+ await ExecuteOnUiThread ( async ( ) =>
365+ {
366+ vm . CopyToClipboardCommand . Execute ( ) . Subscribe ( ) ;
367+ await Task . CompletedTask ;
368+ } ) ;
369+
370+ PumpUntil ( ( ) => vm . IsCopyToClipboardOK || vm . IsClipboardCheckError ) ;
371+
372+ vm . IsCopyToClipboardOK . Should ( ) . BeFalse ( ) ;
373+ vm . IsClipboardCheckError . Should ( ) . BeTrue ( ) ;
374+
375+ _logger . Verify ( x => x . Log (
376+ LogLevel . Error ,
377+ It . IsAny < EventId > ( ) ,
378+ It . Is < It . IsAnyType > ( ( v , t ) => v . ToString ( ) ! . Contains ( "CopyToClipboard error" ) ) ,
379+ It . IsAny < Exception > ( ) ,
380+ It . IsAny < Func < It . IsAnyType , Exception , string > > ( )
381+ ) , Times . AtLeastOnce ) ;
382+ }
383+
384+ [ Test ]
385+ public async Task CheckClipboard_Exception_Should_Set_ErrorFlags ( )
386+ {
387+ var check = CreateCheckData ( ) ;
388+ var trustParams = CreateTrustParams ( false , true ) ;
389+
390+ var vm = new ThrowingClipboardViewModel ( check , trustParams , _publicKeysManager . Object , _appSettings . Object ,
391+ _truster . Object , _logger . Object )
392+ {
393+ Container = new FlyoutContainerViewModel { CanCloseCurrentFlyout = false } ,
394+ SafetyKeyParts = null !
395+ } ;
396+
397+ await ExecuteOnUiThread ( async ( ) =>
398+ {
399+ vm . CheckClipboardCommand . Execute ( ) . Subscribe ( ) ;
400+ await Task . CompletedTask ;
401+ } ) ;
402+
403+ PumpUntil ( ( ) => vm . IsClipboardCheckOK || vm . IsClipboardCheckError ) ;
404+
405+ vm . IsClipboardCheckOK . Should ( ) . BeFalse ( ) ;
406+ vm . IsClipboardCheckError . Should ( ) . BeTrue ( ) ;
407+
408+ _logger . Verify ( x => x . Log (
409+ LogLevel . Error ,
410+ It . IsAny < EventId > ( ) ,
411+ It . Is < It . IsAnyType > ( ( v , t ) => v . ToString ( ) ! . Contains ( "CheckClipboard error" ) ) ,
412+ It . IsAny < Exception > ( ) ,
413+ It . IsAny < Func < It . IsAnyType , Exception , string > > ( )
414+ ) , Times . AtLeastOnce ) ;
415+ }
416+
417+ private sealed class ThrowingClipboardViewModel : AddTrustedClientViewModel
418+ {
419+ public ThrowingClipboardViewModel ( PublicKeyCheckData publicKeyCheckData , TrustDataParameters trustDataParameters ,
420+ IPublicKeysManager publicKeysManager , IApplicationSettingsRepository applicationSettingsManager ,
421+ IPublicKeysTruster publicKeysTruster , ILogger < AddTrustedClientViewModel > logger )
422+ : base ( publicKeyCheckData , trustDataParameters , publicKeysManager , applicationSettingsManager , publicKeysTruster , logger , null ! )
423+ {
424+ }
425+
426+ protected override Avalonia . Input . Platform . IClipboard ? GetClipboard ( )
427+ {
428+ throw new InvalidOperationException ( "clipboard-throw" ) ;
429+ }
430+ }
350431}
351432
352433
0 commit comments