11package dev .openfeature .sdk ;
22
33import static org .assertj .core .api .Assertions .assertThatCode ;
4- import static org .mockito .ArgumentMatchers .contains ;
5- import static org .mockito .Mockito .never ;
4+ import static org .assertj .core .api .Assertions .assertThatThrownBy ;
65
76import org .junit .jupiter .api .DisplayName ;
87import org .junit .jupiter .api .Test ;
9- import org .mockito .Mockito ;
10- import org .simplify4u .slf4jmock .LoggerMock ;
11- import org .slf4j .Logger ;
128
139class GlobalProviderRegistryTest {
1410
1511 /**
16- * Re-registering a provider with the same API instance should not produce a warning .
12+ * Re-registering a provider with the same API instance should not throw .
1713 * This exercises the {@code existing == this} path in registerGlobalProvider.
1814 */
1915 @ Test
20- @ DisplayName ("no warning when same API instance re-registers the same provider" )
21- void noWarningWhenSameInstanceReRegisters () {
22- Logger mockLogger = Mockito .mock (Logger .class );
23- LoggerMock .setMock (OpenFeatureAPI .class , mockLogger );
24- try {
25- OpenFeatureAPI api = new OpenFeatureAPI ();
26- NoOpProvider provider = new NoOpProvider ();
27-
28- api .registerGlobalProvider (provider );
29- api .registerGlobalProvider (provider ); // same instance, second call
16+ @ DisplayName ("no throw when same API instance re-registers the same provider" )
17+ void noThrowWhenSameInstanceReRegisters () {
18+ OpenFeatureAPI api = new OpenFeatureAPI ();
19+ NoOpProvider provider = new NoOpProvider ();
3020
31- Mockito .verify (mockLogger , never ()).warn (Mockito .anyString ());
32- } finally {
33- LoggerMock .setMock (OpenFeatureAPI .class , null );
34- }
21+ assertThatCode (() -> {
22+ api .registerGlobalProvider (provider );
23+ api .registerGlobalProvider (provider ); // same instance, second call
24+ })
25+ .doesNotThrowAnyException ();
3526 }
3627
3728 /**
3829 * After deregistering a provider, binding it to a different API instance
39- * should not produce a warning — proving the entry was removed.
30+ * should not throw, proving the entry was removed.
4031 */
4132 @ Test
4233 @ DisplayName ("deregister removes provider from global registry" )
4334 void deregisterRemovesProviderFromRegistry () {
44- Logger mockLogger = Mockito .mock (Logger .class );
45- LoggerMock .setMock (OpenFeatureAPI .class , mockLogger );
46- try {
47- OpenFeatureAPI api1 = new OpenFeatureAPI ();
48- OpenFeatureAPI api2 = new OpenFeatureAPI ();
49- NoOpProvider provider = new NoOpProvider ();
50-
51- api1 .registerGlobalProvider (provider );
52- api1 .deregisterGlobalProvider (provider );
35+ OpenFeatureAPI api1 = new OpenFeatureAPI ();
36+ OpenFeatureAPI api2 = new OpenFeatureAPI ();
37+ NoOpProvider provider = new NoOpProvider ();
5338
54- // Should not warn because the provider was deregistered
55- api2 . registerGlobalProvider (provider );
39+ api1 . registerGlobalProvider ( provider );
40+ api1 . deregisterGlobalProvider (provider );
5641
57- Mockito .verify (mockLogger , never ()).warn (Mockito .anyString ());
58- } finally {
59- LoggerMock .setMock (OpenFeatureAPI .class , null );
60- }
42+ // should not throw because the provider was deregistered
43+ assertThatCode (() -> api2 .registerGlobalProvider (provider )).doesNotThrowAnyException ();
6144 }
6245
6346 /**
@@ -67,24 +50,19 @@ void deregisterRemovesProviderFromRegistry() {
6750 @ Test
6851 @ DisplayName ("deregister is a no-op when called by non-owner instance" )
6952 void deregisterIsNoOpForNonOwner () {
70- Logger mockLogger = Mockito .mock (Logger .class );
71- LoggerMock .setMock (OpenFeatureAPI .class , mockLogger );
72- try {
73- OpenFeatureAPI api1 = new OpenFeatureAPI ();
74- OpenFeatureAPI api2 = new OpenFeatureAPI ();
75- NoOpProvider provider = new NoOpProvider ();
53+ OpenFeatureAPI api1 = new OpenFeatureAPI ();
54+ OpenFeatureAPI api2 = new OpenFeatureAPI ();
55+ NoOpProvider provider = new NoOpProvider ();
7656
77- api1 .registerGlobalProvider (provider );
57+ api1 .registerGlobalProvider (provider );
7858
79- // api2 is not the owner — this should be a no-op
80- api2 .deregisterGlobalProvider (provider );
59+ // api2 is not the owner; this should be a no-op
60+ api2 .deregisterGlobalProvider (provider );
8161
82- // api2 re-registering should still warn, because api1 still owns it
83- api2 .registerGlobalProvider (provider );
84- Mockito .verify (mockLogger ).warn (contains ("1.8.4" ));
85- } finally {
86- LoggerMock .setMock (OpenFeatureAPI .class , null );
87- }
62+ // api2 re-registering should still throw, because api1 still owns it
63+ assertThatThrownBy (() -> api2 .registerGlobalProvider (provider ))
64+ .isInstanceOf (IllegalStateException .class )
65+ .hasMessageContaining ("1.8.4" );
8866 }
8967
9068 /**
0 commit comments