Esempio n. 1
0
        public void Customize(IFixture fixture)
        {
            fixture.Register(UniqueId.CreateNew);

            var serviceProvider  = fixture.Create <IServiceProvider>();
            var containerFactory = serviceProvider.GetRequiredService <IObjectRepositoryContainerFactory>();

            var container = containerFactory.Create <BlobRepository>(RepositoryFixture.GetAvailableFolderPath());

            fixture.Inject(container);
            fixture.Inject <IObjectRepositoryContainer <BlobRepository> >(container);
            fixture.Inject <IObjectRepositoryContainer>(container);

            Car CreateCar(int position) =>
            new Car.Builder(serviceProvider)
            {
                Id   = UniqueId.CreateNew(),
                Name = $"Car {position}",
                Blob = new StringBlob("Car blob")
            }.ToImmutable();
            fixture.Register(() => new BlobRepository(serviceProvider, container,
                                                      UniqueId.CreateNew(),
                                                      "Some repository",
                                                      new Version(1, 0, 0),
                                                      ImmutableList.Create <RepositoryDependency>(),
                                                      new LazyChildren <IMigration>(),
                                                      new LazyChildren <IObjectRepositoryIndex>(),
                                                      new StringBlob("a\nb\nc"),
                                                      new LazyChildren <Car>(ImmutableList.Create(CreateCar(1)))));
        }
        public void PullRequiringMerge(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, IObjectRepositoryContainerFactory containerFactory, Signature signature, string message)
        {
            // Arrange
            sut = container.AddRepository(sut, signature, message);
            var tempPath        = RepositoryFixture.GetAvailableFolderPath();
            var clientContainer = containerFactory.Create <ObjectRepository>(tempPath);

            clientContainer.Clone(container.Repositories.Single().RepositoryDescription.Path);

            // Arrange - Update source repository
            var change = sut.With(sut.Applications[0].Pages[0], p => p.Description, "foo");

            sut = container.Commit(change.Repository, signature, message);

            // Arrange - Update client repository
            var clientChange = sut.With(sut.Applications[0].Pages[0], p => p.Name, "bar");

            clientContainer.Commit(clientChange.Repository, signature, message);

            // Act
            var pullResult = clientContainer.Pull(clientContainer.Repositories.Single().Id);

            pullResult.Apply(signature);

            // Assert
            Assert.That(pullResult.RequiresMergeCommit, Is.True);
            Assert.That(clientContainer.Repositories.Single().Applications[0].Pages[0].Description, Is.EqualTo("foo"));
        }
Esempio n. 3
0
        public void PreMergeGetsFiredWhenPulling(GitHooks sut, ObjectRepository repository, IObjectRepositoryContainer <ObjectRepository> origin, IObjectRepositoryContainerFactory containerFactory, Signature signature, string message)
        {
            // Arrange - Create origin and local repositories
            repository = origin.AddRepository(repository, signature, message);
            var tempPath        = RepositoryFixture.GetAvailableFolderPath();
            var clientContainer = containerFactory.Create <ObjectRepository>(tempPath);

            clientContainer.Clone(origin.Repositories.Single().RepositoryDescription.Path);

            // Arrange - Commit change on origin
            var change = repository.With(repository.Applications[0].Pages[0], p => p.Description, "foo");

            origin.Commit(change.Repository, signature, message);

            // Arrange - suscribe to hook
            MergeStartedEventArgs lastEvent = null;

            sut.MergeStarted += (_, args) => lastEvent = args;

            // Act - Pull commit from origin
            var pullResult = clientContainer.Pull(clientContainer.Repositories.Single().Id);
            var result     = pullResult.Apply(signature);

            // Assert
            Assert.That(lastEvent, Is.Not.Null);
            Assert.That(result, Is.Not.Null);
        }
        public void ObjectRepositoryMergeChunkChangeResolveConflictOnlyOnce(Page page, string resolvedValue)
        {
            // Arrange
            var   path = RepositoryFixture.GetAvailableFolderPath();
            Field mergeBaseNode = page.Fields[0], branchNode = page.Fields[1], headNode = page.Fields[2];

            // Act
            var sut = new ObjectRepositoryPropertyChange(path, _nameProperty, CreateChunk(mergeBaseNode), CreateChunk(branchNode), CreateChunk(headNode));

            sut.Resolve(resolvedValue);
            Assert.Throws <GitObjectDbException>(() => sut.Resolve(resolvedValue));
        }
Esempio n. 5
0
        static (string, ObjectRepository) PushNewRemoteImpl(ObjectRepository repository, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message)
        {
            var tempPath = RepositoryFixture.GetAvailableFolderPath();

            Repository.Init(tempPath, isBare: true);
            repository = container.AddRepository(repository, signature, message);
            repository.Execute(r => r.Network.Remotes.Add("origin", tempPath));

            var change = repository.With(repository.Applications[0].Pages[0], p => p.Description, "foo");

            repository = container.Commit(change.Repository, signature, message);

            container.Push(repository.Id, "origin");
            return(tempPath, repository);
        }
        public void ObjectRepositoryMergeChunkChangeResolveConflict(Page page, string resolvedValue)
        {
            // Arrange
            var   path = RepositoryFixture.GetAvailableFolderPath();
            Field mergeBaseNode = page.Fields[0], branchNode = page.Fields[1], headNode = page.Fields[2];

            // Act
            var sut = new ObjectRepositoryPropertyChange(path, _nameProperty, CreateChunk(mergeBaseNode), CreateChunk(branchNode), CreateChunk(headNode));

            sut.Resolve(resolvedValue);

            // Assert
            Assert.That(sut.WasInConflict, Is.True);
            Assert.That(sut.IsInConflict, Is.False);
            Assert.That(sut.MergeValue, Is.SameAs(resolvedValue));
        }
Esempio n. 7
0
        public void Fetch(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, IObjectRepositoryContainerFactory containerFactory, Signature signature, string message)
        {
            // Arrange
            sut = container.AddRepository(sut, signature, message);
            var tempPath        = RepositoryFixture.GetAvailableFolderPath();
            var clientContainer = containerFactory.Create <ObjectRepository>(tempPath);

            clientContainer.Clone(container.Repositories.Single().RepositoryDescription.Path);

            // Arrange - Update source repository
            var change       = sut.With(sut.Applications[0].Pages[0], p => p.Description, "foo");
            var commitResult = container.Commit(change.Repository, signature, message);

            // Act
            var fetchResult = clientContainer.Fetch(clientContainer.Repositories.Single().Id);

            // Assert
            Assert.That(fetchResult.CommitId, Is.EqualTo(commitResult.CommitId));
            Assert.That(clientContainer.Repositories.Single().CommitId, Is.EqualTo(sut.CommitId));
        }
        public void ObjectRepositoryMergeChunkChangePropertiesAreMatchingEntryParameterValues(Page page)
        {
            // Arrange
            var   path = RepositoryFixture.GetAvailableFolderPath();
            Field mergeBaseNode = page.Fields[0], branchNode = page.Fields[1], headNode = page.Fields[2];

            // Act
            var sut = new ObjectRepositoryPropertyChange(path, _nameProperty, CreateChunk(mergeBaseNode), CreateChunk(branchNode), CreateChunk(headNode));

            // Assert
            Assert.That(sut.Path, Is.SameAs(path));
            Assert.That(sut.Property, Is.SameAs(_nameProperty));
            Assert.That(sut.Ancestor.Object, Is.SameAs(mergeBaseNode));
            Assert.That(sut.Theirs.Object, Is.SameAs(branchNode));
            Assert.That(sut.Ours.Object, Is.SameAs(headNode));
            Assert.That(sut.Ancestor.Property, Is.SameAs(_nameProperty));
            Assert.That(sut.Theirs.Property, Is.SameAs(_nameProperty));
            Assert.That(sut.Ours.Property, Is.SameAs(_nameProperty));
            Assert.That(sut.Ancestor.Value, Is.SameAs(mergeBaseNode.Name));
            Assert.That(sut.Theirs.Value, Is.SameAs(branchNode.Name));
            Assert.That(sut.Ours.Value, Is.SameAs(headNode.Name));
            Assert.That(sut.WasInConflict, Is.True);
        }
Esempio n. 9
0
        public void Customize(IFixture fixture)
        {
            fixture.Register(UniqueId.CreateNew);

            var serviceProvider  = fixture.Create <IServiceProvider>();
            var containerFactory = serviceProvider.GetRequiredService <IObjectRepositoryContainerFactory>();

            var path = ContainerPath ?? RepositoryFixture.GetAvailableFolderPath();

            fixture.Customizations.Add(new ObjectRepositoryContainerSpecimenBuilder(path));
            var container = fixture.Freeze <IObjectRepositoryContainer <ObjectRepository> >();

            ObjectRepository lastRepository = default;
            var createdPages = new List <Page>();

            Page CreatePage(int position)
            {
                var page = new Page.Builder(serviceProvider)
                {
                    Id          = UniqueId.CreateNew(),
                    Name        = $"Page {position}",
                    Description = $"Description for {position}",
                    Fields      = new LazyChildren <Field>(
                        Enumerable.Range(1, FieldPerPageCount).Select(f =>
                                                                      CreateField(f))
                        .OrderBy(f => f.Id).ToImmutableList())
                }.ToImmutable();

                createdPages.Add(page);
                return(page);
            }

            Field CreateField(int position) =>
            new Field.Builder(serviceProvider)
            {
                Id      = UniqueId.CreateNew(),
                Name    = $"Field {position}",
                Content = createdPages.Any() && position % 3 == 0 ?
                          FieldContent.NewLink(new FieldLinkContent(new LazyLink <Page>(container, PickRandomPage(_ => true)))) :
                          FieldContent.Default
            }.ToImmutable();

            ObjectRepository CreateModule()
            {
                createdPages.Clear();
                lastRepository = new ObjectRepository(serviceProvider, container,
                                                      UniqueId.CreateNew(),
                                                      "Some repository",
                                                      new Version(1, 0, 0),
                                                      ImmutableList.Create <RepositoryDependency>(),
                                                      new LazyChildren <IMigration>(),
                                                      new LazyChildren <IObjectRepositoryIndex>(
                                                          ImmutableList.Create <IObjectRepositoryIndex>(new LinkFieldReferrerIndex(serviceProvider, UniqueId.CreateNew(), nameof(LinkFieldReferrerIndex)))),
                                                      new LazyChildren <Application>(
                                                          Enumerable.Range(1, ApplicationCount).Select(a =>
                                                                                                       new Application(serviceProvider, UniqueId.CreateNew(), $"Application {a}", new LazyChildren <Page>(
                                                                                                                           Enumerable.Range(1, PagePerApplicationCount).Select(p =>
                                                                                                                                                                               CreatePage(p))
                                                                                                                           .OrderBy(p => p.Id).ToImmutableList())))
                                                          .OrderBy(a => a.Id).ToImmutableList()));
                return(lastRepository);
            }

            Application PickRandomApplication() => (lastRepository ?? CreateModule()).Applications.PickRandom();
            Page PickRandomPage(Func <Page, bool> predicate) =>
            !createdPages.Any() ?
            PickRandomApplication().Pages.Last(predicate) :
            createdPages.Last(predicate);
            Field PickRandomField() => PickRandomPage(_ => true).Fields.PickRandom();

            fixture.Register(PickRandomApplication);
            fixture.Register(() => PickRandomPage(_ => true));
            fixture.Register(PickRandomField);
            fixture.Register(CreateModule);
        }