コード例 #1
0
            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> >());
            }
コード例 #2
0
            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>();
            }
コード例 #3
0
            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>();
            }
コード例 #4
0
            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);
            }
コード例 #5
0
            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);
            }
コード例 #6
0
 protected override void PrepareApiCallFunctionToThrow(Exception e)
 => GetUpdateFunction(api)(Arg.Any <TModel>())
 .Returns(_ => Observable.Throw <TApiModel>(e));