public void ThrowsWhenExceptionIsNotAClientErrorException() { var exception = new Exception(); var state = new ProcessClientErrorState <TestModel>(); var model = new TestModel(1, SyncStatus.SyncNeeded); Action tryResolve = () => state.Start((exception, model)).Wait(); tryResolve.Should().Throw <ArgumentException>(); }
public async Task ReturnsCheckServerStatusTransitionWhenTheErrorIsTooManyRequestsException() { var exception = new TooManyRequestsException(Substitute.For <IRequest>(), Substitute.For <IResponse>()); var state = new ProcessClientErrorState <TestModel>(); var model = new TestModel(1, SyncStatus.SyncNeeded); var transition = await state.Start((exception, model)); transition.Result.Should().Be(state.UnresolvedTooManyRequests); }
public async Task ReturnsMarkAsUnsyncableWhenTheErrorIsAClientErrorExceptionOtherThanTooManyRequests(Exception exception) { var state = new ProcessClientErrorState <TestModel>(); var model = new TestModel(1, SyncStatus.SyncNeeded); var transition = await state.Start((exception, model)); var parameter = ((Transition <(Exception Reason, TestModel)>)transition).Parameter; transition.Result.Should().Be(state.Unresolved); parameter.Should().Be((exception, model)); }
private static LookForChangeToPushState <TDatabase, TThreadsafe> configureCreateOnlyPush <TModel, TDatabase, TThreadsafe>( ITransitionConfigurator transitions, IStateResult entryPoint, IDataSource <TThreadsafe, TDatabase> dataSource, IAnalyticsService analyticsService, ICreatingApiClient <TModel> creatingApi, ILeakyBucket minutesLeakyBucket, IRateLimiter rateLimiter, WaitForAWhileState waitForAWhileState, Func <TModel, TThreadsafe> toClean, Func <TThreadsafe, string, TThreadsafe> toUnsyncable) where TModel : IIdentifiable, ILastChangedDatable where TDatabase : class, TModel, IDatabaseSyncable where TThreadsafe : class, TDatabase, IThreadSafeModel { var lookForChange = new LookForChangeToPushState <TDatabase, TThreadsafe>(dataSource); var chooseOperation = new ChooseSyncOperationState <TThreadsafe>(); var create = new CreateEntityState <TModel, TDatabase, TThreadsafe>(creatingApi, dataSource, analyticsService, minutesLeakyBucket, rateLimiter, toClean); var processClientError = new ProcessClientErrorState <TThreadsafe>(); var unsyncable = new MarkEntityAsUnsyncableState <TThreadsafe>(dataSource, toUnsyncable); transitions.ConfigureTransition(entryPoint, lookForChange); transitions.ConfigureTransition(lookForChange.ChangeFound, chooseOperation); transitions.ConfigureTransition(chooseOperation.CreateEntity, create); transitions.ConfigureTransition(chooseOperation.UpdateEntity, new InvalidTransitionState($"Updating is not supported for {typeof(TModel).Name} during Push sync.")); transitions.ConfigureTransition(chooseOperation.DeleteEntity, new InvalidTransitionState($"Deleting is not supported for {typeof(TModel).Name} during Push sync.")); transitions.ConfigureTransition(chooseOperation.DeleteEntityLocally, new InvalidTransitionState($"Deleting locally is not supported for {typeof(TModel).Name} during Push sync.")); transitions.ConfigureTransition(create.ClientError, processClientError); transitions.ConfigureTransition(create.ServerError, new FailureState()); transitions.ConfigureTransition(create.UnknownError, new FailureState()); transitions.ConfigureTransition(create.PreventOverloadingServer, waitForAWhileState); transitions.ConfigureTransition(processClientError.UnresolvedTooManyRequests, new FailureState()); transitions.ConfigureTransition(processClientError.Unresolved, unsyncable); transitions.ConfigureTransition(create.EntityChanged, new InvalidTransitionState($"Entity cannot have changed since updating is not supported for {typeof(TModel).Name} during Push sync.")); transitions.ConfigureTransition(create.Done, lookForChange); transitions.ConfigureTransition(unsyncable.Done, lookForChange); return(lookForChange); }