public async Task TestFailingUpdate() { var random = new Random(); var nonDefaultEnabledFeatureId = random.Next(); while (FeatureConfiguration.DefaultEnabledFeatureIds.Contains((FeatureId)nonDefaultEnabledFeatureId)) { nonDefaultEnabledFeatureId = random.Next(); } var dummyApiAccess = new DummyFeatureToggleApiAccess { ReturnValue = new List <FeatureDto> { new FeatureDto(nonDefaultEnabledFeatureId, "Test", null, new List <int>(), new List <int>()) } }; IoCManager.RegisterInstance(typeof(IFeatureToggleApiAccess), dummyApiAccess); IFeatureToggleRouter router = await FeatureToggleRouter.CreateAsync(); var feature0Observer = new CachingObserver <bool>(); router.IsFeatureEnabled((FeatureId)nonDefaultEnabledFeatureId).Subscribe(feature0Observer); Assert.IsTrue(feature0Observer.Last); // Make network fail, make sure no change is made and value doesn't revert to default // state (disabled) IoCManager.RegisterInstance(typeof(IFeatureToggleApiAccess), new ThrowingFeatureToggleApiAccess()); await router.RefreshEnabledFeaturesAsync(); Assert.IsTrue(feature0Observer.Last); }
public async Task TestNetworkDown() { var throwingApiAccess = new ThrowingFeatureToggleApiAccess(); IoCManager.RegisterInstance(typeof(IFeatureToggleApiAccess), throwingApiAccess); IFeatureToggleRouter router = await FeatureToggleRouter.CreateAsync(); foreach (var defaultEnabledFeatureId in FeatureConfiguration.DefaultEnabledFeatureIds) { var observer = new CachingObserver <bool>(); router.IsFeatureEnabled(defaultEnabledFeatureId).Subscribe(observer); Assert.IsTrue(observer.Last); } // Now generate some random disabled features and check whether // the router tells us that they are disabled var random = new Random(); for (var i = 0; i < 10;) { var featureId = random.Next(); if (FeatureConfiguration.DefaultEnabledFeatureIds.Contains((FeatureId)featureId)) { continue; } var observer = new CachingObserver <bool>(); router.IsFeatureEnabled((FeatureId)featureId).Subscribe(observer); Assert.IsFalse(observer.Last); i++; } }
public async Task TestSuccessfulUpdate() { var dummyApiAccess = new DummyFeatureToggleApiAccess { ReturnValue = new List <FeatureDto> { new FeatureDto(0, "Test", null, new List <int>(), new List <int>()) } }; IoCManager.RegisterInstance(typeof(IFeatureToggleApiAccess), dummyApiAccess); IFeatureToggleRouter router = await FeatureToggleRouter.CreateAsync(); var feature0Observer = new CachingObserver <bool>(); var feature1Observer = new CachingObserver <bool>(); router.IsFeatureEnabled(0).Subscribe(feature0Observer); router.IsFeatureEnabled((FeatureId)1).Subscribe(feature1Observer); Assert.IsTrue(feature0Observer.Last); Assert.IsFalse(feature1Observer.Last); // Swap feature states dummyApiAccess.ReturnValue = new List <FeatureDto> { new FeatureDto(1, "Test", null, new List <int>(), new List <int>()) }; await router.RefreshEnabledFeaturesAsync(); Assert.IsFalse(feature0Observer.Last); Assert.IsTrue(feature1Observer.Last); }
private async Task InitIoCContainerAsync() { IoCManager.RegisterType <IDataLoader, EmbeddedResourceDataLoader>(); //init serviceaccesslayer IoCManager.RegisterInstance(typeof(IContentApiClient), new ContentApiClient()); //IoCManager.RegisterInstance(typeof(IContentApiClient), new UserApiClient()); // ReSharper disable once ConditionIsAlwaysTrueOrFalse #pragma warning disable 162 if (Constants.UseMockData) { // We can use this since everything goes through the FeatureToggleRouter anyway, // which provides fallback in case the network is down IoCManager.RegisterInstance(typeof(IFeatureToggleApiAccess), new FeatureToggleApiAccess(new ContentApiClient(ServerEndpoints.FeatureTogglesApiPath))); IoCManager.RegisterType <IAchievementsApiAccess, MockAchievementsApiAccess>(); IoCManager.RegisterType <IExhibitsApiAccess, MockExhibitsApiAccess>(); IoCManager.RegisterType <IMediasApiAccess, MockMediaApiAccess>(); IoCManager.RegisterType <IFileApiAccess, MockFileApiAccess>(); IoCManager.RegisterType <IPagesApiAccess, MockPagesApiAccess>(); IoCManager.RegisterType <IRoutesApiAccess, MockRoutesApiAccess>(); IoCManager.RegisterType <ITagsApiAccess, MockTagsApiAccess>(); IoCManager.RegisterType <IAuthApiAccess, MockAuthApiAccess>(); IoCManager.RegisterType <IUserRatingApiAccess, MockUserRatingApiAccess>(); } else { IoCManager.RegisterInstance(typeof(IAchievementsApiAccess), new AchievementsApiAccess(new ContentApiClient(ServerEndpoints.AchievementsApiPath))); IoCManager.RegisterInstance(typeof(IFeatureToggleApiAccess), new FeatureToggleApiAccess(new ContentApiClient(ServerEndpoints.FeatureTogglesApiPath))); IoCManager.RegisterType <IExhibitsApiAccess, ExhibitsApiAccess>(); IoCManager.RegisterType <IMediasApiAccess, MediasApiAccess>(); IoCManager.RegisterType <IFileApiAccess, FileApiAccess>(); IoCManager.RegisterType <IPagesApiAccess, PagesApiAccess>(); IoCManager.RegisterType <IRoutesApiAccess, RoutesApiAccess>(); IoCManager.RegisterType <ITagsApiAccess, TagsApiAccess>(); IoCManager.RegisterType <IAuthApiAccess, AuthApiAccess>(); IoCManager.RegisterType <IQuizApiAccess, QuizApiAccess>(); IoCManager.RegisterInstance(typeof(IUserRatingApiAccess), new UserRatingApiAccess(new ContentApiClient())); } #pragma warning restore 162 //init converters IoCManager.RegisterType <ExhibitConverter>(); IoCManager.RegisterType <MediaToAudioConverter>(); IoCManager.RegisterType <MediaToImageConverter>(); IoCManager.RegisterType <PageConverter>(); IoCManager.RegisterType <RouteConverter>(); IoCManager.RegisterType <TagConverter>(); IoCManager.RegisterType <QuizConverter>(); //init fetchers IoCManager.RegisterInstance(typeof(INewDataCenter), new NewDataCenter()); IoCManager.RegisterType <IMediaDataFetcher, MediaDataFetcher>(); IoCManager.RegisterType <IDataToRemoveFetcher, DataToRemoveFetcher>(); IoCManager.RegisterType <IExhibitsBaseDataFetcher, ExhibitsBaseDataFetcher>(); IoCManager.RegisterType <IFullExhibitDataFetcher, FullExhibitDataFetcher>(); IoCManager.RegisterType <IRoutesBaseDataFetcher, RoutesBaseDataFetcher>(); IoCManager.RegisterType <IBaseDataFetcher, BaseDataFetcher>(); IoCManager.RegisterType <IFullRouteDataFetcher, FullRouteDataFetcher>(); IoCManager.RegisterType <IAchievementFetcher, AchievementFetcher>(); IoCManager.RegisterInstance(typeof(INearbyExhibitManager), new NearbyExhibitManager()); IoCManager.RegisterInstance(typeof(INearbyRouteManager), new NearbyRouteManager()); IoCManager.RegisterInstance(typeof(IUserManager), new UserManager()); IoCManager.RegisterInstance(typeof(IUserRatingManager), new UserRatingManager()); IoCManager.RegisterInstance(typeof(AchievementNotificationViewModel), new AchievementNotificationViewModel()); var featureToggleRouter = await FeatureToggleRouter.CreateAsync(); IoCManager.RegisterInstance(typeof(IFeatureToggleRouter), featureToggleRouter); }