@@ -545,3 +545,162 @@ def listener(_: FlagChange):
545545 fdv2 .stop ()
546546 finally :
547547 os .remove (path )
548+
549+
550+ def test_fdv2_availability_without_data_sources ():
551+ """Test that FDv2 returns DEFAULTS for both data and target availability when not configured with data sources or a fallback data store."""
552+ # No initializers, no primary synchronizer - not configured with data sources
553+ data_system_config = DataSystemConfig (
554+ initializers = None ,
555+ primary_synchronizer = None ,
556+ )
557+
558+ fdv2 = FDv2 (Config (sdk_key = "dummy" ), data_system_config )
559+
560+ # Should return CACHED since not configured with data sources
561+ assert fdv2 .data_availability == DataAvailability .DEFAULTS
562+ assert fdv2 .target_availability == DataAvailability .DEFAULTS
563+
564+
565+ def test_fdv2_availability_offline ():
566+ """Test that FDv2 returns DEFAULTS for target availability and data availability when offline."""
567+ data_system_config = DataSystemConfig (
568+ initializers = None ,
569+ primary_synchronizer = None ,
570+ )
571+
572+ fdv2 = FDv2 (Config (sdk_key = "dummy" , offline = True ), data_system_config )
573+
574+ assert fdv2 .data_availability == DataAvailability .DEFAULTS
575+ assert fdv2 .target_availability == DataAvailability .DEFAULTS
576+
577+
578+ def test_fdv2_availability_with_data_sources_no_store ():
579+ """Test that FDv2 returns DEFAULTS for data and REFRESHED for target when configured with data sources but no store and uninitialized."""
580+ td = TestDataV2 .data_source ()
581+
582+ data_system_config = DataSystemConfig (
583+ initializers = None ,
584+ primary_synchronizer = td .build_synchronizer ,
585+ )
586+
587+ fdv2 = FDv2 (Config (sdk_key = "dummy" ), data_system_config )
588+
589+ # Store is not initialized, and we have data sources configured
590+ assert not fdv2 ._store .is_initialized ()
591+ assert fdv2 .data_availability == DataAvailability .DEFAULTS
592+ assert fdv2 .target_availability == DataAvailability .REFRESHED
593+
594+
595+ def test_fdv2_availability_no_data_sources_with_readonly_store_uninitialized ():
596+ """Test that FDv2 returns DEFAULTS for both when no data sources and read-only store is uninitialized."""
597+ from ldclient .testing .impl .datasystem .test_fdv2_persistence import StubFeatureStore
598+ from ldclient .interfaces import DataStoreMode
599+
600+ store = StubFeatureStore ()
601+ data_system_config = DataSystemConfig (
602+ initializers = None ,
603+ primary_synchronizer = None ,
604+ data_store = store ,
605+ data_store_mode = DataStoreMode .READ_ONLY ,
606+ )
607+
608+ fdv2 = FDv2 (Config (sdk_key = "dummy" ), data_system_config )
609+
610+ # Store is not initialized
611+ assert not store .initialized
612+ assert fdv2 .data_availability == DataAvailability .DEFAULTS
613+ assert fdv2 .target_availability == DataAvailability .CACHED
614+
615+
616+ def test_fdv2_availability_no_data_sources_with_readonly_store_initialized ():
617+ """Test that FDv2 returns CACHED for both when no data sources and read-only store is initialized."""
618+ from ldclient .testing .impl .datasystem .test_fdv2_persistence import StubFeatureStore
619+ from ldclient .interfaces import DataStoreMode
620+
621+ store = StubFeatureStore ()
622+ store .init ({FEATURES : {}})
623+
624+ data_system_config = DataSystemConfig (
625+ initializers = None ,
626+ primary_synchronizer = None ,
627+ data_store = store ,
628+ data_store_mode = DataStoreMode .READ_ONLY ,
629+ )
630+
631+ fdv2 = FDv2 (Config (sdk_key = "dummy" ), data_system_config )
632+
633+ # Store is initialized
634+ assert store .initialized
635+ assert fdv2 .data_availability == DataAvailability .CACHED
636+ assert fdv2 .target_availability == DataAvailability .CACHED
637+
638+
639+ def test_fdv2_availability_no_data_sources_with_readwrite_store_initialized ():
640+ """Test that FDv2 returns CACHED for both when no data sources and read-write store is initialized."""
641+ from ldclient .testing .impl .datasystem .test_fdv2_persistence import StubFeatureStore
642+ from ldclient .interfaces import DataStoreMode
643+
644+ store = StubFeatureStore ()
645+ store .init ({FEATURES : {}})
646+
647+ data_system_config = DataSystemConfig (
648+ initializers = None ,
649+ primary_synchronizer = None ,
650+ data_store = store ,
651+ data_store_mode = DataStoreMode .READ_WRITE ,
652+ )
653+
654+ fdv2 = FDv2 (Config (sdk_key = "dummy" ), data_system_config )
655+
656+ # Store is initialized
657+ assert store .initialized
658+ assert fdv2 .data_availability == DataAvailability .CACHED
659+ assert fdv2 .target_availability == DataAvailability .CACHED
660+
661+
662+ def test_fdv2_availability_with_data_sources_and_store_uninitialized ():
663+ """Test that FDv2 returns DEFAULTS for data and REFRESHED for target when data sources configured with uninitialized store."""
664+ from ldclient .testing .impl .datasystem .test_fdv2_persistence import StubFeatureStore
665+ from ldclient .interfaces import DataStoreMode
666+
667+ td = TestDataV2 .data_source ()
668+ store = StubFeatureStore ()
669+
670+ data_system_config = DataSystemConfig (
671+ initializers = None ,
672+ primary_synchronizer = td .build_synchronizer ,
673+ data_store = store ,
674+ data_store_mode = DataStoreMode .READ_WRITE ,
675+ )
676+
677+ fdv2 = FDv2 (Config (sdk_key = "dummy" ), data_system_config )
678+
679+ # Store is not initialized
680+ assert not store .initialized
681+ assert fdv2 .data_availability == DataAvailability .DEFAULTS
682+ assert fdv2 .target_availability == DataAvailability .REFRESHED
683+
684+
685+ def test_fdv2_availability_with_data_sources_and_store_initialized ():
686+ """Test that FDv2 returns CACHED for data and REFRESHED for target when data sources configured with initialized store."""
687+ from ldclient .testing .impl .datasystem .test_fdv2_persistence import StubFeatureStore
688+ from ldclient .interfaces import DataStoreMode
689+
690+ td = TestDataV2 .data_source ()
691+ store = StubFeatureStore ()
692+ store .init ({FEATURES : {}})
693+
694+ data_system_config = DataSystemConfig (
695+ initializers = None ,
696+ primary_synchronizer = td .build_synchronizer ,
697+ data_store = store ,
698+ data_store_mode = DataStoreMode .READ_WRITE ,
699+ )
700+
701+ fdv2 = FDv2 (Config (sdk_key = "dummy" ), data_system_config )
702+
703+ # Store is initialized but selector not defined yet (synchronizer not started)
704+ assert store .initialized
705+ assert fdv2 .data_availability == DataAvailability .CACHED
706+ assert fdv2 .target_availability == DataAvailability .REFRESHED
0 commit comments