Skip to content

Add upgrade dialog with release notes display #364

Add upgrade dialog with release notes display

Add upgrade dialog with release notes display #364

GitHub Actions / Test Results succeeded Dec 7, 2025 in 0s

151 passed, 1 failed and 0 skipped

Tests failed

Report Passed Failed Skipped Time
TestResults/Papercut.Core.Tests.trx 22✅ 834ms
TestResults/Papercut.Infrastructure.Smtp.Tests.trx 20✅ 914ms
TestResults/Papercut.Message.Tests.trx 40✅ 1s
TestResults/Papercut.Rules.Tests.trx 69✅ 1❌ 5s

✅ TestResults/Papercut.Core.Tests.trx

22 tests were completed in 834ms with 22 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Papercut.Core.Tests.EndpointDefinitionTests 13✅ 41ms
Papercut.Core.Tests.PathTemplateHelperTests 9✅ 34ms

✅ Papercut.Core.Tests.EndpointDefinitionTests

✅ Certificate_Property_IsNullByDefault
✅ Constructor_WithAny_ParsesCorrectly
✅ Constructor_WithBasicParameters_CreatesEndpoint
✅ Constructor_WithCertificate_NoMatchFound_ThrowsInvalidOperationException
✅ Constructor_WithEmptyAddress_ParsesAsAny
✅ Constructor_WithIPv6_ParsesCorrectly
✅ Constructor_WithVariousPorts_StoresCorrectly(25)
✅ Constructor_WithVariousPorts_StoresCorrectly(2525)
✅ Constructor_WithVariousPorts_StoresCorrectly(465)
✅ Constructor_WithVariousPorts_StoresCorrectly(587)
✅ ToIPEndPoint_ReturnsCorrectEndpoint
✅ ToString_WithCertificate_IndicatesTLS
✅ ToString_WithoutCertificate_ReturnsAddressAndPort

✅ Papercut.Core.Tests.PathTemplateHelperTests

✅ RenderPathTemplate_OnLinux_ProducesLinuxStylePaths
✅ RenderPathTemplate_WithBackslashes_NormalizesToOsSeparator
✅ RenderPathTemplate_WithBaseDirectory_ReplacesTemplate
✅ RenderPathTemplate_WithDataDirectory_ReplacesAndNormalizes
✅ RenderPathTemplate_WithDoubleSeparators_RemovesDuplicates
✅ RenderPathTemplate_WithForwardSlashes_NormalizesToOsSeparator
✅ RenderPathTemplate_WithMixedSeparators_NormalizesToOsSeparator
✅ RenderPathTemplate_WithMultiplePathSegments_NormalizesAll
✅ RenderPathTemplate_WithUncPath_PreservesUncPrefix

✅ TestResults/Papercut.Infrastructure.Smtp.Tests.trx

20 tests were completed in 914ms with 20 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Papercut.Infrastructure.Smtp.Tests.IPAllowedListTests 20✅ 33ms

✅ Papercut.Infrastructure.Smtp.Tests.IPAllowedListTests

✅ AllowAll_AllowsAnyIP
✅ Create_WithAsterisk_ReturnsSuccess
✅ Create_WithEmptyString_DefaultsToAllowAll
✅ Create_WithInvalidCIDR_ReturnsFailed
✅ Create_WithInvalidSpec_ReturnsFailed
✅ Create_WithMalformedIP_ReturnsFailed
✅ Create_WithMalformedIPInList_ReturnsFailed
✅ Create_WithNull_DefaultsToAllowAll
✅ Create_WithSpacesInList_HandledCorrectly
✅ Create_WithTrailingWhitespace_HandledCorrectly
✅ Create_WithValidSpec_ReturnsSuccess
✅ Create_WithWhitespace_DefaultsToAllowAll
✅ Integration_CommonPrivateNetworks_WorksCorrectly
✅ Integration_MixedIPv4AndIPv6_WorksCorrectly
✅ IsAllowed_AlwaysAllowsLoopback
✅ IsAllowed_WithCIDR_MatchesRange
✅ IsAllowed_WithMultipleSpecs_MatchesAny
✅ IsAllowed_WithSingleIP_MatchesExact
✅ LocalhostOnly_AllowsLoopback
✅ LocalhostOnly_RejectsNonLoopback

✅ TestResults/Papercut.Message.Tests.trx

40 tests were completed in 1s with 40 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Papercut.Message.Tests.MessageRepositoryStaticTests 12✅ 19ms
Papercut.Message.Tests.MessageRepositoryTests 16✅ 250ms
Papercut.Message.Tests.ReceivedDataMessageHandlerTests 12✅ 100ms

✅ Papercut.Message.Tests.MessageRepositoryStaticTests

✅ MakeValidFileName_WithEmptyString_ReturnsEmptyTextParameter
✅ MakeValidFileName_WithFancyMode_ReplacesQuotesWithUnicode
✅ MakeValidFileName_WithFancyMode_ReplacesSingleQuotesWithUnicode
✅ MakeValidFileName_WithFancyMode_ReplacesSlashWithFractionSlash
✅ MakeValidFileName_WithInvalidChars_ReplacesWithUnderscore
✅ MakeValidFileName_WithInvalidEmptyText_SanitizesEmptyText
✅ MakeValidFileName_WithMixedValidAndInvalid_ReplacesOnlyInvalid
✅ MakeValidFileName_WithNullReplacement_RemovesBadChars
✅ MakeValidFileName_WithNullString_ReturnsEmptyTextParameter
✅ MakeValidFileName_WithOnlyInvalidChars_ReturnsEmptyTextParameter
✅ MakeValidFileName_WithUnicodeCharacters_PreservesValidUnicode
✅ MakeValidFileName_WithValidString_ReturnsUnchanged

✅ Papercut.Message.Tests.MessageRepositoryTests

✅ DeleteMessage_WithExistingFile_DeletesAndReturnsTrue
✅ DeleteMessage_WithNonExistentFile_ReturnsFalse
✅ DeleteMessage_WithReadOnlyFile_RemovesAttributeAndDeletes
✅ GetFullMailFilename_CalledTwice_GeneratesUniqueNames
✅ GetFullMailFilename_WithEmptySubject_UsesDefault
✅ GetFullMailFilename_WithInvalidChars_SanitizesSubject
✅ GetFullMailFilename_WithLongSubject_TruncatesTo40Chars
✅ GetFullMailFilename_WithValidSubject_CreatesFilenameWithSubject
✅ GetMessage_WithExistingFile_ReturnsContent
✅ GetMessage_WithNonExistentFile_ThrowsIOException
✅ LoadMessages_IgnoresNonEmlFiles
✅ LoadMessages_WithMultipleFiles_ReturnsAllMessages
✅ LoadMessages_WithNoFiles_ReturnsEmpty
✅ SaveMessage_LogsSuccess
✅ SaveMessage_WithException_LogsError
✅ SaveMessage_WithValidData_CreatesFile

✅ Papercut.Message.Tests.ReceivedDataMessageHandlerTests

✅ HandleReceivedAsync_WhenPublishFails_LogsFatalError
✅ HandleReceivedAsync_WithBccRecipient_AddsBccToMessage
✅ HandleReceivedAsync_WithCaseInsensitiveRecipients_DetectsBccCorrectly
✅ HandleReceivedAsync_WithDoubleUnderscoreDomain_HandlesSuccessfully
✅ HandleReceivedAsync_WithEmptyFilename_DoesNotPublish
✅ HandleReceivedAsync_WithLooseParser_AcceptsMostFormats
✅ HandleReceivedAsync_WithMultipleNonStandardDomains_HandlesAllSuccessfully
✅ HandleReceivedAsync_WithNullMessageData_ThrowsArgumentNullException
✅ HandleReceivedAsync_WithNullRecipients_ThrowsArgumentNullException
✅ HandleReceivedAsync_WithUnderscorePrefixedDomain_HandlesSuccessfully
✅ HandleReceivedAsync_WithValidMessage_PublishesNewMessageEvent
✅ HandleReceivedAsync_WithValidMessage_SavesMessage

❌ TestResults/Papercut.Rules.Tests.trx

70 tests were completed in 5s with 69 passed, 1 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Papercut.Rules.Tests.ConditionalRuleExtensionsTests 22✅ 189ms
Papercut.Rules.Tests.MailRetentionRuleDispatchTests 21✅ 182ms
Papercut.Rules.Tests.PeriodicRuleIntegrationTests 13✅ 4s
Papercut.Rules.Tests.RulesRunnerTests 13✅ 1❌ 233ms

✅ Papercut.Rules.Tests.ConditionalRuleExtensionsTests

✅ IsConditionalForwardRuleMatch_IgnoresAttachments_OnlyMatchesBodyText
✅ IsConditionalForwardRuleMatch_WithBodyMatchingButHeaderNotMatching_ReturnsFalse
✅ IsConditionalForwardRuleMatch_WithBothHeaderAndBodyMatching_ReturnsTrue
✅ IsConditionalForwardRuleMatch_WithBothNotMatching_ReturnsFalse
✅ IsConditionalForwardRuleMatch_WithCaseInsensitiveBodyMatch_ReturnsTrue
✅ IsConditionalForwardRuleMatch_WithCaseInsensitiveHeaderMatch_ReturnsTrue
✅ IsConditionalForwardRuleMatch_WithComplexRegex_MatchesCorrectly
✅ IsConditionalForwardRuleMatch_WithCustomHeader_MatchesCorrectly
✅ IsConditionalForwardRuleMatch_WithEmptyBody_MatchesEmptyPattern
✅ IsConditionalForwardRuleMatch_WithHeaderMatchingButBodyNotMatching_ReturnsFalse
✅ IsConditionalForwardRuleMatch_WithInvalidRegex_ThrowsException
✅ IsConditionalForwardRuleMatch_WithMatchingBodyPattern_ReturnsTrue
✅ IsConditionalForwardRuleMatch_WithMatchingHeaderPattern_ReturnsTrue
✅ IsConditionalForwardRuleMatch_WithMultilineHeaders_MatchesAcrossLines
✅ IsConditionalForwardRuleMatch_WithNoConditions_ReturnsTrue
✅ IsConditionalForwardRuleMatch_WithNonMatchingBodyPattern_ReturnsFalse
✅ IsConditionalForwardRuleMatch_WithNonMatchingHeaderPattern_ReturnsFalse
✅ IsConditionalForwardRuleMatch_WithNullConditions_ReturnsTrue
✅ IsConditionalForwardRuleMatch_WithNullMessage_ThrowsArgumentNullException
✅ IsConditionalForwardRuleMatch_WithNullRule_ThrowsArgumentNullException
✅ IsConditionalForwardRuleMatch_WithRegexSpecialChars_HandlesCorrectly
✅ IsConditionalForwardRuleMatch_WithWildcardPattern_MatchesAnything

✅ Papercut.Rules.Tests.MailRetentionRuleDispatchTests

✅ Constructor_WithNullLogger_ThrowsArgumentNullException
✅ Constructor_WithNullRepository_ThrowsArgumentNullException
✅ Constructor_WithValidParameters_CreatesInstance
✅ DispatchAsync_WithCancelledToken_ThrowsOperationCanceledException
✅ DispatchAsync_WithDeletionFailure_LogsErrorAndContinues
✅ DispatchAsync_WithDifferentRetentionPeriods_CalculatesCorrectCutoff(1)
✅ DispatchAsync_WithDifferentRetentionPeriods_CalculatesCorrectCutoff(30)
✅ DispatchAsync_WithDifferentRetentionPeriods_CalculatesCorrectCutoff(365)
✅ DispatchAsync_WithDifferentRetentionPeriods_CalculatesCorrectCutoff(7)
✅ DispatchAsync_WithExactCutoffDate_DoesNotDelete
✅ DispatchAsync_WithFileNotFound_LogsWarningAndContinues
✅ DispatchAsync_WithMixedMessages_DeletesOnlyOldOnes
✅ DispatchAsync_WithNegativeRetentionDays_LogsWarningAndReturns
✅ DispatchAsync_WithNoMessages_CompletesWithoutDeletion
✅ DispatchAsync_WithNullRule_ThrowsArgumentNullException
✅ DispatchAsync_WithOldMessages_DeletesThem
✅ DispatchAsync_WithPartialDeletionFailure_ReportsCorrectCounts
✅ DispatchAsync_WithRecentMessages_DoesNotDelete
✅ DispatchAsync_WithSuccessfulDeletion_LogsAllStages
✅ DispatchAsync_WithTokenCancelledDuringDeletion_StopsProcessing
✅ DispatchAsync_WithZeroRetentionDays_LogsWarningAndReturns

✅ Papercut.Rules.Tests.PeriodicRuleIntegrationTests

✅ Container_CanResolve_BackgroundTaskRunner
✅ Container_CanResolve_MailRetentionRule
✅ Container_CanResolve_MailRetentionRuleDispatch
✅ Container_CanResolve_RulesRunner
✅ RunPeriodicBackgroundRules_DoesNotBlockCaller
✅ RunPeriodicBackgroundRules_UsesBackgroundTaskRunner
✅ RunPeriodicBackgroundRules_WithCancellationToken_PropagatesTokenToDispatcher
✅ RunPeriodicBackgroundRules_WithDisabledRule_DoesNotExecute
✅ RunPeriodicBackgroundRules_WithEnabledRule_LogsDebugMessage
✅ RunPeriodicBackgroundRules_WithMailRetentionRule_ExecutesSuccessfully
✅ RunPeriodicBackgroundRules_WithMultipleRules_ExecutesAll
✅ RunPeriodicBackgroundRules_WithOnlyPeriodicRules_ExecutesCorrectly
✅ RunPeriodicBackgroundRules_WithRepositoryException_CapturesErrorAndContinues

❌ Papercut.Rules.Tests.RulesRunnerTests

✅ Constructor_WithValidParameters_CreatesInstance
❌ RunNewMessageRules_WithCancelledToken_ThrowsOperationCanceledException
	Expected a <System.OperationCanceledException> to be thrown, but no exception was thrown.
✅ RunNewMessageRules_WithDisabledRule_DoesNotDispatch
✅ RunNewMessageRules_WithDispatcherThrowingException_LogsWarningAndContinues
✅ RunNewMessageRules_WithEmptyRules_CompletesSuccessfully
✅ RunNewMessageRules_WithEnabledRule_DispatchesRule
✅ RunNewMessageRules_WithMixedEnabledDisabled_DispatchesOnlyEnabled
✅ RunNewMessageRules_WithMultipleEnabledRules_DispatchesAll
✅ RunNewMessageRules_WithMultipleRules_ExecutesInParallel
✅ RunNewMessageRules_WithNullMessageEntry_ThrowsArgumentNullException
✅ RunNewMessageRules_WithNullRules_ThrowsArgumentNullException
✅ RunNewMessageRules_WithOneRuleFailing_OtherRulesStillExecute
✅ RunNewMessageRules_WithRule_LogsInformationBeforeDispatch
✅ RunNewMessageRules_WithTokenCancelledDuringExecution_StopsProcessing

Annotations

Check failure on line 247 in test/Papercut.Rules.Tests/RulesRunnerTests.cs

See this annotation in the file changed.

@github-actions github-actions / Test Results

Papercut.Rules.Tests.RulesRunnerTests ► RunNewMessageRules_WithCancelledToken_ThrowsOperationCanceledException

Failed test found in:
  TestResults/Papercut.Rules.Tests.trx
Error:
  Expected a <System.OperationCanceledException> to be thrown, but no exception was thrown.
Raw output
Expected a <System.OperationCanceledException> to be thrown, but no exception was thrown.
   at AwesomeAssertions.Execution.LateBoundTestFramework.Throw(String message)
   at AwesomeAssertions.Execution.DefaultAssertionStrategy.HandleFailure(String message)
   at AwesomeAssertions.Execution.AssertionScope.AddPreFormattedFailure(String formattedFailureMessage)
   at AwesomeAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason)
   at AwesomeAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason)
   at AwesomeAssertions.Execution.AssertionChain.FailWith(String message)
   at AwesomeAssertions.Specialized.DelegateAssertionsBase`2.<>c__DisplayClass8_0`1.<ThrowInternal>b__0(AssertionChain chain)
   at AwesomeAssertions.Execution.AssertionChain.WithExpectation(String message, Action`1 chain, Object[] args)
   at AwesomeAssertions.Execution.AssertionChain.WithExpectation(String message, Object arg1, Action`1 chain)
   at AwesomeAssertions.Specialized.DelegateAssertionsBase`2.ThrowInternal[TException](Exception exception, String because, Object[] becauseArgs)
   at AwesomeAssertions.Specialized.AsyncFunctionAssertions`2.ThrowAsync[TException](String because, Object[] becauseArgs)
   at Papercut.Rules.Tests.RulesRunnerTests.RunNewMessageRules_WithCancelledToken_ThrowsOperationCanceledException() in D:\a\Papercut-SMTP\Papercut-SMTP\test\Papercut.Rules.Tests\RulesRunnerTests.cs:line 247
   at NUnit.Framework.Internal.TaskAwaitAdapter.GenericAdapter`1.GetResult()
   at NUnit.Framework.Internal.AsyncToSyncAdapter.Await[TResult](TestExecutionContext context, Func`1 invoke)
   at NUnit.Framework.Internal.AsyncToSyncAdapter.Await(TestExecutionContext context, Func`1 invoke)
   at NUnit.Framework.Internal.Commands.TestMethodCommand.RunTestMethod(TestExecutionContext context)
   at NUnit.Framework.Internal.Commands.TestMethodCommand.Execute(TestExecutionContext context)
   at NUnit.Framework.Internal.Commands.BeforeAndAfterTestCommand.<>c__DisplayClass1_0.<Execute>b__0()
   at NUnit.Framework.Internal.Commands.DelegatingTestCommand.RunTestMethodInThreadAbortSafeZone(TestExecutionContext context, Action action)