Add upgrade dialog with release notes display #364
GitHub Actions / Test Results
succeeded
Dec 7, 2025 in 1s
151 passed, 1 failed and 0 skipped
| Report | Passed | Failed | Skipped | Time |
|---|---|---|---|---|
| TestResults/Papercut.Core.Tests.trx | 22✅ | 1s | ||
| TestResults/Papercut.Infrastructure.Smtp.Tests.trx | 20✅ | 950ms | ||
| 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 1s with 22 passed, 0 failed and 0 skipped.
| Test suite | Passed | Failed | Skipped | Time |
|---|---|---|---|---|
| Papercut.Core.Tests.EndpointDefinitionTests | 13✅ | 63ms | ||
| Papercut.Core.Tests.PathTemplateHelperTests | 9✅ | 50ms |
✅ 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 950ms with 20 passed, 0 failed and 0 skipped.
| Test suite | Passed | Failed | Skipped | Time |
|---|---|---|---|---|
| Papercut.Infrastructure.Smtp.Tests.IPAllowedListTests | 20✅ | 34ms |
✅ 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✅ | 358ms | ||
| Papercut.Message.Tests.ReceivedDataMessageHandlerTests | 12✅ | 117ms |
✅ 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✅ | 184ms | ||
| Papercut.Rules.Tests.MailRetentionRuleDispatchTests | 21✅ | 202ms | ||
| Papercut.Rules.Tests.PeriodicRuleIntegrationTests | 13✅ | 4s | ||
| Papercut.Rules.Tests.RulesRunnerTests | 13✅ | 1❌ | 311ms |
✅ 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
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)
Loading