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