diff --git a/Directory.Packages.props b/Directory.Packages.props index d6766a96..b2467d33 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -39,7 +39,7 @@ - + diff --git a/test/OpenFeature.Providers.MultiProvider.Tests/MultiProviderTests.cs b/test/OpenFeature.Providers.MultiProvider.Tests/MultiProviderTests.cs index b8e0131b..6f919f5e 100644 --- a/test/OpenFeature.Providers.MultiProvider.Tests/MultiProviderTests.cs +++ b/test/OpenFeature.Providers.MultiProvider.Tests/MultiProviderTests.cs @@ -449,7 +449,7 @@ public async Task EvaluateAsync_WithStrategySkippingProvider_DoesNotCallSkippedP this._mockStrategy.ShouldEvaluateThisProvider(Arg.Any>(), this._evaluationContext) .Returns(callInfo => { - var context = callInfo.Arg>(); + var context = callInfo.Arg>()!; return context.ProviderName == Provider1Name; // Only evaluate provider1 }); this._mockStrategy.DetermineFinalResult(Arg.Any>(), TestFlagKey, defaultValue, this._evaluationContext, Arg.Any>>()) diff --git a/test/OpenFeature.Providers.MultiProvider.Tests/MultiProviderTrackingTests.cs b/test/OpenFeature.Providers.MultiProvider.Tests/MultiProviderTrackingTests.cs index 7f703ada..1830e925 100644 --- a/test/OpenFeature.Providers.MultiProvider.Tests/MultiProviderTrackingTests.cs +++ b/test/OpenFeature.Providers.MultiProvider.Tests/MultiProviderTrackingTests.cs @@ -177,14 +177,14 @@ public async Task Track_WithCustomStrategy_RespectsStrategyDecision() // Only allow tracking with the first provider customStrategy.ShouldTrackWithThisProvider( - Arg.Is>(ctx => ctx.ProviderName == Provider1Name), + Arg.Is>(ctx => ctx!.ProviderName == Provider1Name), Arg.Any(), Arg.Any(), Arg.Any() ).Returns(true); customStrategy.ShouldTrackWithThisProvider( - Arg.Is>(ctx => ctx.ProviderName != Provider1Name), + Arg.Is>(ctx => ctx!.ProviderName != Provider1Name), Arg.Any(), Arg.Any(), Arg.Any() diff --git a/test/OpenFeature.Providers.MultiProvider.Tests/ProviderExtensionsTests.cs b/test/OpenFeature.Providers.MultiProvider.Tests/ProviderExtensionsTests.cs index dcf1dfe9..c66a2902 100644 --- a/test/OpenFeature.Providers.MultiProvider.Tests/ProviderExtensionsTests.cs +++ b/test/OpenFeature.Providers.MultiProvider.Tests/ProviderExtensionsTests.cs @@ -443,7 +443,7 @@ public async Task EvaluateAsync_WhenAfterHookThrowsException_LogsWarningButSucce this._mockLogger.Received(1).Log( LogLevel.Warning, Arg.Any(), - Arg.Is(v => v.ToString()!.Contains("Provider after/finally hook execution failed")), + Arg.Is(v => v!.ToString()!.Contains("Provider after/finally hook execution failed")), Arg.Is(ex => ex == hookException), Arg.Any>()); } diff --git a/test/OpenFeature.Tests/OpenFeatureEventTests.cs b/test/OpenFeature.Tests/OpenFeatureEventTests.cs index b32eb9bc..ff38e23a 100644 --- a/test/OpenFeature.Tests/OpenFeatureEventTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureEventTests.cs @@ -51,7 +51,7 @@ public async Task Event_Executor_Should_Propagate_Events_ToGlobal_Handler() eventHandler.DidNotReceive().Invoke(newEventPayload); - eventHandler.DidNotReceive().Invoke(Arg.Is(payload => payload.Type == ProviderEventTypes.ProviderStale)); + eventHandler.DidNotReceive().Invoke(Arg.Is(payload => payload!.Type == ProviderEventTypes.ProviderStale)); } [Fact] @@ -79,28 +79,28 @@ await Utils.AssertUntilAsync(_ => eventHandler .Received() .Invoke( Arg.Is( - payload => payload.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderReady + payload => payload!.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderReady ))); await Utils.AssertUntilAsync(_ => eventHandler .Received() .Invoke( Arg.Is( - payload => payload.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderConfigurationChanged + payload => payload!.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderConfigurationChanged ))); await Utils.AssertUntilAsync(_ => eventHandler .Received() .Invoke( Arg.Is( - payload => payload.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderError + payload => payload!.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderError ))); await Utils.AssertUntilAsync(_ => eventHandler .Received() .Invoke( Arg.Is( - payload => payload.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderStale + payload => payload!.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderStale ))); } @@ -124,7 +124,7 @@ await Utils.AssertUntilAsync(_ => eventHandler .Received() .Invoke( Arg.Is( - payload => payload.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderReady + payload => payload!.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderReady ))); } @@ -148,7 +148,7 @@ await Utils.AssertUntilAsync(_ => eventHandler .Received() .Invoke( Arg.Is( - payload => payload.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderReady + payload => payload!.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderReady ))); } @@ -174,7 +174,7 @@ await Utils.AssertUntilAsync(_ => eventHandler .Received() .Invoke( Arg.Is( - payload => payload.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderError + payload => payload!.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderError ))); } @@ -199,7 +199,7 @@ await Utils.AssertUntilAsync(_ => eventHandler .Received() .Invoke( Arg.Is( - payload => payload.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderStale + payload => payload!.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderStale ))); } @@ -227,10 +227,10 @@ public async Task API_Level_Event_Handlers_Should_Be_Exchangeable() await newTestProvider.SendEventAsync(ProviderEventTypes.ProviderConfigurationChanged, TestContext.Current.CancellationToken); await Utils.AssertUntilAsync( - _ => eventHandler.Received(2).Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderReady)) + _ => eventHandler.Received(2).Invoke(Arg.Is(payload => payload!.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderReady)) ); await Utils.AssertUntilAsync( - _ => eventHandler.Received(2).Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderConfigurationChanged)) + _ => eventHandler.Received(2).Invoke(Arg.Is(payload => payload!.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderConfigurationChanged)) ); } @@ -254,7 +254,7 @@ public async Task API_Level_Event_Handlers_Should_Be_Removable() var newTestProvider = new TestProvider(); await Api.Instance.SetProviderAsync(newTestProvider, TestContext.Current.CancellationToken); - eventHandler.Received(1).Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name)); + eventHandler.Received(1).Invoke(Arg.Is(payload => payload!.ProviderName == testProvider.GetMetadata().Name)); } [Fact] @@ -280,10 +280,10 @@ public async Task API_Level_Event_Handlers_Should_Be_Executed_When_Other_Handler await Api.Instance.SetProviderAsync(testProvider, TestContext.Current.CancellationToken); await Utils.AssertUntilAsync( - _ => failingEventHandler.Received().Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name)) + _ => failingEventHandler.Received().Invoke(Arg.Is(payload => payload!.ProviderName == testProvider.GetMetadata().Name)) ); await Utils.AssertUntilAsync( - _ => eventHandler.Received().Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name)) + _ => eventHandler.Received().Invoke(Arg.Is(payload => payload!.ProviderName == testProvider.GetMetadata().Name)) ); } @@ -306,7 +306,7 @@ public async Task Client_Level_Event_Handlers_Should_Be_Registered() myClient.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); - eventHandler.Received().Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name)); + eventHandler.Received().Invoke(Arg.Is(payload => payload!.ProviderName == testProvider.GetMetadata().Name)); } [Fact] @@ -336,10 +336,10 @@ public async Task Client_Level_Event_Handlers_Should_Be_Executed_When_Other_Hand await Api.Instance.SetProviderAsync(myClient.GetMetadata().Name!, testProvider, TestContext.Current.CancellationToken); await Utils.AssertUntilAsync( - _ => failingEventHandler.Received().Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name)) + _ => failingEventHandler.Received().Invoke(Arg.Is(payload => payload!.ProviderName == testProvider.GetMetadata().Name)) ); await Utils.AssertUntilAsync( - _ => eventHandler.Received().Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name)) + _ => eventHandler.Received().Invoke(Arg.Is(payload => payload!.ProviderName == testProvider.GetMetadata().Name)) ); } @@ -369,11 +369,11 @@ public async Task Client_Level_Event_Handlers_Should_Be_Registered_To_Default_Pr myClientWithNoBoundProvider.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); myClientWithBoundProvider.AddHandler(ProviderEventTypes.ProviderReady, clientEventHandler); - eventHandler.Received().Invoke(Arg.Is(payload => payload.ProviderName == apiProvider.GetMetadata().Name)); - eventHandler.DidNotReceive().Invoke(Arg.Is(payload => payload.ProviderName == clientProvider.GetMetadata().Name)); + eventHandler.Received().Invoke(Arg.Is(payload => payload!.ProviderName == apiProvider.GetMetadata().Name)); + eventHandler.DidNotReceive().Invoke(Arg.Is(payload => payload!.ProviderName == clientProvider.GetMetadata().Name)); - clientEventHandler.Received().Invoke(Arg.Is(payload => payload.ProviderName == clientProvider.GetMetadata().Name)); - clientEventHandler.DidNotReceive().Invoke(Arg.Is(payload => payload.ProviderName == apiProvider.GetMetadata().Name)); + clientEventHandler.Received().Invoke(Arg.Is(payload => payload!.ProviderName == clientProvider.GetMetadata().Name)); + clientEventHandler.DidNotReceive().Invoke(Arg.Is(payload => payload!.ProviderName == apiProvider.GetMetadata().Name)); } [Fact] @@ -403,7 +403,7 @@ public async Task Client_Level_Event_Handlers_Should_Be_Receive_Events_From_Name // verify that the client received the event from the default provider as there is no named provider registered yet await Utils.AssertUntilAsync( _ => clientEventHandler.Received(1) - .Invoke(Arg.Is(payload => payload.ProviderName == defaultProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderConfigurationChanged)) + .Invoke(Arg.Is(payload => payload!.ProviderName == defaultProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderConfigurationChanged)) ); // set the other provider specifically for the client @@ -415,12 +415,12 @@ await Utils.AssertUntilAsync( // now the client should have received only the event from the named provider await Utils.AssertUntilAsync( - _ => clientEventHandler.Received(1).Invoke(Arg.Is(payload => payload.ProviderName == clientProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderConfigurationChanged)) + _ => clientEventHandler.Received(1).Invoke(Arg.Is(payload => payload!.ProviderName == clientProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderConfigurationChanged)) ); // for the default provider, the number of received events should stay unchanged await Utils.AssertUntilAsync( _ => clientEventHandler.Received(1) - .Invoke(Arg.Is(payload => payload.ProviderName == defaultProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderConfigurationChanged)) + .Invoke(Arg.Is(payload => payload!.ProviderName == defaultProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderConfigurationChanged)) ); } @@ -444,7 +444,7 @@ public async Task Client_Level_Event_Handlers_Should_Be_Informed_About_Ready_Sta // add the event handler after the provider has already transitioned into the ready state myClient.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); - eventHandler.Received().Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name)); + eventHandler.Received().Invoke(Arg.Is(payload => payload!.ProviderName == testProvider.GetMetadata().Name)); } [Fact] @@ -468,7 +468,7 @@ public async Task Client_Level_Event_Handlers_Should_Be_Removable() // wait for the first event to be received await Utils.AssertUntilAsync( - _ => eventHandler.Received(1).Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name)) + _ => eventHandler.Received(1).Invoke(Arg.Is(payload => payload!.ProviderName == testProvider.GetMetadata().Name)) ); myClient.RemoveHandler(ProviderEventTypes.ProviderReady, eventHandler); @@ -478,7 +478,7 @@ await Utils.AssertUntilAsync( // wait a bit and make sure we only have received the first event, but nothing after removing the event handler await Utils.AssertUntilAsync( - _ => eventHandler.Received(1).Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name)) + _ => eventHandler.Received(1).Invoke(Arg.Is(payload => payload!.ProviderName == testProvider.GetMetadata().Name)) ); } diff --git a/test/OpenFeature.Tests/OpenFeatureHookTests.cs b/test/OpenFeature.Tests/OpenFeatureHookTests.cs index 9acffa45..23a8e962 100644 --- a/test/OpenFeature.Tests/OpenFeatureHookTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureHookTests.cs @@ -151,7 +151,7 @@ public async Task Evaluation_Context_Must_Be_Mutable_Before_Hook() await client.GetBooleanValueAsync("test", false, EvaluationContext.Empty, new FlagEvaluationOptions(ImmutableList.Create(hook1, hook2), ImmutableDictionary.Empty), TestContext.Current.CancellationToken); _ = hook1.Received(1).BeforeAsync(Arg.Any>(), Arg.Any>(), TestContext.Current.CancellationToken); - _ = hook2.Received(1).BeforeAsync(Arg.Is>(a => a.EvaluationContext.GetValue("test").AsString == "test"), Arg.Any>(), TestContext.Current.CancellationToken); + _ = hook2.Received(1).BeforeAsync(Arg.Is>(a => a!.EvaluationContext.GetValue("test").AsString == "test"), Arg.Any>(), TestContext.Current.CancellationToken); } [Fact] @@ -162,11 +162,11 @@ public async Task HookData_Must_Be_Mutable() hook.BeforeAsync(Arg.Any>(), Arg.Any>(), TestContext.Current.CancellationToken).Returns(EvaluationContext.Empty).AndDoes(info => { - info.Arg>().Data.Set("test-a", true); + info.Arg>()!.Data.Set("test-a", true); }); hook.AfterAsync(Arg.Any>(), Arg.Any>(), Arg.Any>(), TestContext.Current.CancellationToken).Returns(new ValueTask()).AndDoes(info => { - info.Arg>().Data.Set("test-b", "test-value"); + info.Arg>()!.Data.Set("test-b", "test-value"); }); await Api.Instance.SetProviderAsync(new NoOpFeatureProvider(), TestContext.Current.CancellationToken); @@ -175,10 +175,10 @@ public async Task HookData_Must_Be_Mutable() await client.GetBooleanValueAsync("test", false, EvaluationContext.Empty, new FlagEvaluationOptions(ImmutableList.Create(hook), ImmutableDictionary.Empty), TestContext.Current.CancellationToken); _ = hook.Received(1).AfterAsync(Arg.Is>(hookContext => - (bool)hookContext.Data.Get("test-a") == true + (bool)hookContext!.Data.Get("test-a") ), Arg.Any>(), Arg.Any>(), TestContext.Current.CancellationToken); _ = hook.Received(1).FinallyAsync(Arg.Is>(hookContext => - (bool)hookContext.Data.Get("test-a") == true && (string)hookContext.Data.Get("test-b") == "test-value" + (bool)hookContext!.Data.Get("test-a") && (string)hookContext.Data.Get("test-b") == "test-value" ), Arg.Any>(), Arg.Any>(), TestContext.Current.CancellationToken); } @@ -192,22 +192,22 @@ public async Task HookData_Must_Be_Unique_Per_Hook() hook1.BeforeAsync(Arg.Any>(), Arg.Any>(), TestContext.Current.CancellationToken).Returns(EvaluationContext.Empty).AndDoes(info => { - info.Arg>().Data.Set("hook-1-value-a", true); - info.Arg>().Data.Set("same", true); + info.Arg>()!.Data.Set("hook-1-value-a", true); + info.Arg>()!.Data.Set("same", true); }); hook1.AfterAsync(Arg.Any>(), Arg.Any>(), Arg.Any>(), TestContext.Current.CancellationToken).Returns(new ValueTask()).AndDoes(info => { - info.Arg>().Data.Set("hook-1-value-b", "test-value-hook-1"); + info.Arg>()!.Data.Set("hook-1-value-b", "test-value-hook-1"); }); hook2.BeforeAsync(Arg.Any>(), Arg.Any>(), TestContext.Current.CancellationToken).Returns(EvaluationContext.Empty).AndDoes(info => { - info.Arg>().Data.Set("hook-2-value-a", false); - info.Arg>().Data.Set("same", false); + info.Arg>()!.Data.Set("hook-2-value-a", false); + info.Arg>()!.Data.Set("same", false); }); hook2.AfterAsync(Arg.Any>(), Arg.Any>(), Arg.Any>(), TestContext.Current.CancellationToken).Returns(new ValueTask()).AndDoes(info => { - info.Arg>().Data.Set("hook-2-value-b", "test-value-hook-2"); + info.Arg>()!.Data.Set("hook-2-value-b", "test-value-hook-2"); }); await Api.Instance.SetProviderAsync(new NoOpFeatureProvider(), TestContext.Current.CancellationToken); @@ -217,19 +217,19 @@ public async Task HookData_Must_Be_Unique_Per_Hook() ImmutableDictionary.Empty), TestContext.Current.CancellationToken); _ = hook1.Received(1).AfterAsync(Arg.Is>(hookContext => - (bool)hookContext.Data.Get("hook-1-value-a") == true && (bool)hookContext.Data.Get("same") == true + (bool)hookContext!.Data.Get("hook-1-value-a") && (bool)hookContext.Data.Get("same") ), Arg.Any>(), Arg.Any>(), TestContext.Current.CancellationToken); _ = hook1.Received(1).FinallyAsync(Arg.Is>(hookContext => - (bool)hookContext.Data.Get("hook-1-value-a") == true && + (bool)hookContext!.Data.Get("hook-1-value-a") && (bool)hookContext.Data.Get("same") == true && (string)hookContext.Data.Get("hook-1-value-b") == "test-value-hook-1" && hookContext.Data.Count == 3 ), Arg.Any>(), Arg.Any>(), TestContext.Current.CancellationToken); _ = hook2.Received(1).AfterAsync(Arg.Is>(hookContext => - (bool)hookContext.Data.Get("hook-2-value-a") == false && (bool)hookContext.Data.Get("same") == false + !(bool)hookContext!.Data.Get("hook-2-value-a") && !(bool)hookContext.Data.Get("same") ), Arg.Any>(), Arg.Any>(), TestContext.Current.CancellationToken); _ = hook2.Received(1).FinallyAsync(Arg.Is>(hookContext => - (bool)hookContext.Data.Get("hook-2-value-a") == false && + !(bool)hookContext!.Data.Get("hook-2-value-a") && (bool)hookContext.Data.Get("same") == false && (string)hookContext.Data.Get("hook-2-value-b") == "test-value-hook-2" && hookContext.Data.Count == 3 ), Arg.Any>(), Arg.Any>(), TestContext.Current.CancellationToken); @@ -308,7 +308,7 @@ public async Task Evaluation_Context_Must_Be_Merged_In_Correct_Order() // after proper merging, all properties should equal true _ = provider.Received(1).ResolveBooleanValueAsync(Arg.Any(), Arg.Any(), Arg.Is(y => - (y.GetValue(propGlobal).AsBoolean ?? false) + (y!.GetValue(propGlobal).AsBoolean ?? false) && (y.GetValue(propClient).AsBoolean ?? false) && (y.GetValue(propTransaction).AsBoolean ?? false) && (y.GetValue(propGlobalToOverwrite).AsBoolean ?? false)