@@ -545,3 +545,172 @@ 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 .interfaces import DataStoreMode
598+ from ldclient .testing .impl .datasystem .test_fdv2_persistence import (
599+ StubFeatureStore
600+ )
601+
602+ store = StubFeatureStore ()
603+ data_system_config = DataSystemConfig (
604+ initializers = None ,
605+ primary_synchronizer = None ,
606+ data_store = store ,
607+ data_store_mode = DataStoreMode .READ_ONLY ,
608+ )
609+
610+ fdv2 = FDv2 (Config (sdk_key = "dummy" ), data_system_config )
611+
612+ # Store is not initialized
613+ assert not store .initialized
614+ assert fdv2 .data_availability == DataAvailability .DEFAULTS
615+ assert fdv2 .target_availability == DataAvailability .CACHED
616+
617+
618+ def test_fdv2_availability_no_data_sources_with_readonly_store_initialized ():
619+ """Test that FDv2 returns CACHED for both when no data sources and read-only store is initialized."""
620+ from ldclient .interfaces import DataStoreMode
621+ from ldclient .testing .impl .datasystem .test_fdv2_persistence import (
622+ StubFeatureStore
623+ )
624+
625+ store = StubFeatureStore ()
626+ store .init ({FEATURES : {}})
627+
628+ data_system_config = DataSystemConfig (
629+ initializers = None ,
630+ primary_synchronizer = None ,
631+ data_store = store ,
632+ data_store_mode = DataStoreMode .READ_ONLY ,
633+ )
634+
635+ fdv2 = FDv2 (Config (sdk_key = "dummy" ), data_system_config )
636+
637+ # Store is initialized
638+ assert store .initialized
639+ assert fdv2 .data_availability == DataAvailability .CACHED
640+ assert fdv2 .target_availability == DataAvailability .CACHED
641+
642+
643+ def test_fdv2_availability_no_data_sources_with_readwrite_store_initialized ():
644+ """Test that FDv2 returns CACHED for both when no data sources and read-write store is initialized."""
645+ from ldclient .interfaces import DataStoreMode
646+ from ldclient .testing .impl .datasystem .test_fdv2_persistence import (
647+ StubFeatureStore
648+ )
649+
650+ store = StubFeatureStore ()
651+ store .init ({FEATURES : {}})
652+
653+ data_system_config = DataSystemConfig (
654+ initializers = None ,
655+ primary_synchronizer = None ,
656+ data_store = store ,
657+ data_store_mode = DataStoreMode .READ_WRITE ,
658+ )
659+
660+ fdv2 = FDv2 (Config (sdk_key = "dummy" ), data_system_config )
661+
662+ # Store is initialized
663+ assert store .initialized
664+ assert fdv2 .data_availability == DataAvailability .CACHED
665+ assert fdv2 .target_availability == DataAvailability .CACHED
666+
667+
668+ def test_fdv2_availability_with_data_sources_and_store_uninitialized ():
669+ """Test that FDv2 returns DEFAULTS for data and REFRESHED for target when data sources configured with uninitialized store."""
670+ from ldclient .interfaces import DataStoreMode
671+ from ldclient .testing .impl .datasystem .test_fdv2_persistence import (
672+ StubFeatureStore
673+ )
674+
675+ td = TestDataV2 .data_source ()
676+ store = StubFeatureStore ()
677+
678+ data_system_config = DataSystemConfig (
679+ initializers = None ,
680+ primary_synchronizer = td .build_synchronizer ,
681+ data_store = store ,
682+ data_store_mode = DataStoreMode .READ_WRITE ,
683+ )
684+
685+ fdv2 = FDv2 (Config (sdk_key = "dummy" ), data_system_config )
686+
687+ # Store is not initialized
688+ assert not store .initialized
689+ assert fdv2 .data_availability == DataAvailability .DEFAULTS
690+ assert fdv2 .target_availability == DataAvailability .REFRESHED
691+
692+
693+ def test_fdv2_availability_with_data_sources_and_store_initialized ():
694+ """Test that FDv2 returns CACHED for data and REFRESHED for target when data sources configured with initialized store."""
695+ from ldclient .interfaces import DataStoreMode
696+ from ldclient .testing .impl .datasystem .test_fdv2_persistence import (
697+ StubFeatureStore
698+ )
699+
700+ td = TestDataV2 .data_source ()
701+ store = StubFeatureStore ()
702+ store .init ({FEATURES : {}})
703+
704+ data_system_config = DataSystemConfig (
705+ initializers = None ,
706+ primary_synchronizer = td .build_synchronizer ,
707+ data_store = store ,
708+ data_store_mode = DataStoreMode .READ_WRITE ,
709+ )
710+
711+ fdv2 = FDv2 (Config (sdk_key = "dummy" ), data_system_config )
712+
713+ # Store is initialized but selector not defined yet (synchronizer not started)
714+ assert store .initialized
715+ assert fdv2 .data_availability == DataAvailability .CACHED
716+ assert fdv2 .target_availability == DataAvailability .REFRESHED
0 commit comments