public void ReturnsTheUpdatingSuccessfulTransitionWhenEntityDoesNotChangeLocallyAndAllFunctionsAreCalledWithCorrectParameters() { var state = createUpdateState(api, repository); var at = new DateTimeOffset(2017, 9, 1, 12, 34, 56, TimeSpan.Zero); var entity = CreateDirtyEntity(1, at); var serverEntity = CreateDirtyEntity(2, at); var localEntity = CreateDirtyEntity(3, at); var updatedEntity = CreateDirtyEntity(4, at); GetUpdateFunction(api)(entity) .Returns(Observable.Return(serverEntity)); repository .GetById(entity.Id) .Returns(Observable.Return(localEntity)); repository .BatchUpdate(Arg.Any <IEnumerable <(long, TModel)> >(), Arg.Any <Func <TModel, TModel, ConflictResolutionMode> >()) .Returns(Observable.Return(new[] { new UpdateResult <TModel>(localEntity.Id, updatedEntity) })); var transition = state.Start(entity).SingleAsync().Wait(); var parameter = ((Transition <TModel>)transition).Parameter; transition.Result.Should().Be(state.UpdatingSucceeded); parameter.ShouldBeEquivalentTo(updatedEntity, options => options.IncludingProperties()); repository.Received().BatchUpdate( Arg.Is <IEnumerable <(long Id, TModel Entity)> >( x => x.First().Id == entity.Id && x.First().Entity.Id == serverEntity.Id), Arg.Any <Func <TModel, TModel, ConflictResolutionMode> >()); }
public void ReturnsTheUnknownErrorTransitionWhenHttpFailsWithNonApiError() { var state = createUpdateState(api, repository); var entity = CreateDirtyEntity(1); GetUpdateFunction(api)(Arg.Any <TModel>()) .Returns(_ => Observable.Throw <TApiModel>(new TestException())); var transition = state.Start(entity).SingleAsync().Wait(); var parameter = ((Transition <(Exception Reason, TModel)>)transition).Parameter; transition.Result.Should().Be(state.UnknownError); parameter.Reason.Should().BeOfType <TestException>(); }
public void ReturnsTheClientErrorTransitionWhenHttpFailsWithClientError(ClientErrorException exception) { var state = createUpdateState(api, repository); var entity = CreateDirtyEntity(1); GetUpdateFunction(api)(Arg.Any <TModel>()) .Returns(_ => Observable.Throw <TApiModel>(exception)); var transition = state.Start(entity).SingleAsync().Wait(); var parameter = ((Transition <(Exception Reason, TModel)>)transition).Parameter; transition.Result.Should().Be(state.ClientError); parameter.Reason.Should().BeAssignableTo <ClientErrorException>(); }
public void UpdateApiCallIsCalledWithTheInputEntity() { var state = createUpdateState(api, repository); var entity = CreateDirtyEntity(1); GetUpdateFunction(api)(entity) .Returns(Observable.Return(Substitute.For <TApiModel>())); repository .BatchUpdate(Arg.Any <IEnumerable <(long, TModel)> >(), Arg.Any <Func <TModel, TModel, ConflictResolutionMode> >()) .Returns(Observable.Return(new[] { new UpdateResult <TModel>(entity.Id, entity) })); state.Start(entity).SingleAsync().Wait(); AssertUpdateReceived(api, entity); }
public void ReturnsTheEntityChangedTransitionWhenEntityChangesLocally() { var state = createUpdateState(api, repository); var at = new DateTimeOffset(2017, 9, 1, 12, 34, 56, TimeSpan.Zero); var entity = CreateDirtyEntity(1, at); GetUpdateFunction(api)(Arg.Any <TModel>()) .Returns(Observable.Return(entity)); repository .BatchUpdate(Arg.Any <IEnumerable <(long, TModel)> >(), Arg.Any <Func <TModel, TModel, ConflictResolutionMode> >()) .Returns(Observable.Return(new[] { new IgnoreResult <TModel>(entity.Id) })); var transition = state.Start(entity).SingleAsync().Wait(); var parameter = ((Transition <TModel>)transition).Parameter; transition.Result.Should().Be(state.EntityChanged); parameter.Id.Should().Be(entity.Id); }
protected override void PrepareApiCallFunctionToThrow(Exception e) => GetUpdateFunction(api)(Arg.Any <TModel>()) .Returns(_ => Observable.Throw <TApiModel>(e));