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 LinkFieldSerialization(IServiceProvider serviceProvider, IObjectRepositoryContainer container, string name, string path)
        {
            // Arrange
            var sut       = CreateJsonRepositorySerializer(serviceProvider, new ModelObjectSerializationContext(container));
            var link      = new LazyLink <Page>(container, new ObjectPath(UniqueId.CreateNew(), path));
            var linkField = new Field.Builder(serviceProvider)
            {
                Id      = UniqueId.CreateNew(),
                Name    = name,
                Content = FieldContent.NewLink(new FieldLinkContent(link))
            }.ToImmutable();

            // Act
            var json = Serialize(sut, linkField);

            using (var stream = new MemoryStream(Encoding.Default.GetBytes(json)))
            {
                var deserialized         = (Field)sut.Deserialize(stream, _ => throw new NotSupportedException());
                var deserializedLazyLink = deserialized.Content.MatchOrDefault(matchLink: c => c.Target);

                // Assert
                Assert.That(deserialized.Id, Is.EqualTo(linkField.Id));
                Assert.That(deserialized.Name, Is.EqualTo(name));
                Assert.That(deserializedLazyLink.Path.Path, Is.EqualTo(path));
            }
        }
        public void CheckUniqueIdUniqueness()
        {
            // Act
            var values = Enumerable.Range(0, 1000).Select(_ => UniqueId.CreateNew()).ToList();

            // Assert
            Assert.That(values.Distinct().Count(), Is.EqualTo(values.Count));
        }
        public void ThrowIfMissingDependency(IObjectRepositoryContainer <ObjectRepository> container, ObjectRepository repository, Signature signature, string message)
        {
            // Arrange
            var wrongDependency = new RepositoryDependency(UniqueId.CreateNew(), "foo", new System.Version(1, 0));

            repository = repository.With(repository, r => r.Dependencies, repository.Dependencies.Add(wrongDependency));
            container.AddRepository(repository, signature, message);

            // Act
            var result = container.Validate();

            // Assert
            Assert.That(result.ToString(), Does.Contain("could not be found"));
        }
Exemple #5
0
        public void IndexUpdateWhenObjectIsBeingAdded(IServiceProvider serviceProvider, ObjectRepository repository, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message, string name)
        {
            // Arrange
            repository = repository.With(c => c
                                         .Add(repository, r => r.Indexes, new Index(serviceProvider, UniqueId.CreateNew(), name, nameof(IModelObject.Name))));
            repository = container.AddRepository(repository, signature, message);
            ComputeKeysCalls.Clear();
            var page = new Page(serviceProvider, UniqueId.CreateNew(), "name", "description", new LazyChildren <Field>(ImmutableList.Create(
                                                                                                                           new Field(serviceProvider, UniqueId.CreateNew(), "name", FieldContent.Default))));

            // Act
            var modified = repository.With(c => c.Add(repository.Applications[0], app => app.Pages, page));

            container.Commit(modified.Repository, signature, message);

            // Assert
            Assert.That(ComputeKeysCalls, Has.Count.EqualTo(2));
        }
Exemple #6
0
        public void CherryPickChildAddition(IServiceProvider serviceProvider, ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message)
        {
            // master:    A---B---C
            //             \
            // newBranch:   D   ->   A---D---C

            // Arrange
            var a = container.AddRepository(sut, signature, message); // A

            // Act
            var b = container.Commit(
                a.With(a.Applications[0], app => app.Name, "unpicked modified name").Repository,
                signature, message); // B
            var page = new Page(serviceProvider, UniqueId.CreateNew(), "name", "description", new LazyChildren <Field>());
            var c    = container.Commit(
                b.With(comp => comp.Add(b.Applications[0], app => app.Pages, page)).Repository,
                signature, message); // C

            a = container.Checkout(a.Id, "newBranch", createNewBranch: true, "HEAD~2");
            var d = container.Commit(
                a.With(a.Applications[0], app => app.Name, "modified name").Repository,
                signature, message); // D
            var cherryPick = container.CherryPick(sut.Id, c.CommitId);
            var repository = container.Repositories.Single();

            // Assert
            Assert.That(cherryPick.Status, Is.EqualTo(CherryPickStatus.CherryPicked));
            var(commits, tip) = repository.Execute(r =>
            {
                var commitFilter = new CommitFilter
                {
                    IncludeReachableFrom = r.Head.Tip,
                    SortBy = CommitSortStrategies.Reverse | CommitSortStrategies.Topological,
                };
                return(r.Commits.QueryBy(commitFilter).Select(commit => commit.Id).ToList(), r.Head.Tip.Id);
            });
            Assert.That(commits, Has.Count.EqualTo(3));
            Assert.That(commits[0], Is.EqualTo(a.CommitId));
            Assert.That(commits[1], Is.EqualTo(d.CommitId));
            Assert.That(commits[2], Is.EqualTo(tip));
            Assert.That(repository.CommitId, Is.EqualTo(tip));
            Assert.That(repository.Applications[0].Name, Is.EqualTo("modified name"));
            Assert.That(repository.Applications[0].Pages, Has.Count.EqualTo(a.Applications[0].Pages.Count + 1));
        }
Exemple #7
0
        public void LinkWithWrongRepositoryIsDetected(IObjectRepositoryContainer container, ObjectRepository repository)
        {
            // Arrange
            var linkField = repository.Flatten().OfType <Field>().FirstOrDefault(
                f => f.Content.MatchOrDefault(matchLink: l => true));

            // Act
            var failingLink = new LazyLink <Page>(container, new ObjectPath(UniqueId.CreateNew(), "foo"));
            var modified    = repository.With(linkField, f => f.Content, FieldContent.NewLink(new FieldLinkContent(failingLink)));
            var result      = modified.Repository.Validate();

            // Assert
            Assert.That(result, Has.Property(nameof(ValidationResult.IsValid)).False);
            Assert.That(result.Errors, Has.Count.EqualTo(1));
            Assert.That(result.ToString(), Does.Contain("is not added to the dependencies"));
            Assert.That(result.Errors[0], Has.Property(nameof(ValidationFailure.PropertyName)).EqualTo("Content.fieldLinkContent.<Target>k__BackingField.Path"));
            Assert.That(result.Errors[0].Context.Instance, Is.EqualTo(modified));
            Assert.That(result.Errors[0].Context.Parent.Instance, Is.EqualTo(modified.Parent));
        }
Exemple #8
0
        public void ResolveDiffsFieldAddition(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, IServiceProvider serviceProvider, Signature signature, string message, ComputeTreeChangesFactory computeTreeChangesFactory)
        {
            // Arrange
            sut = container.AddRepository(sut, signature, message);
            var field        = new Field(serviceProvider, UniqueId.CreateNew(), "foo", FieldContent.Default);
            var modifiedPage = sut.With(c => c.Add(sut.Applications[0].Pages[0], p => p.Fields, field));
            var commit       = container.Commit(modifiedPage, signature, message);

            // Act
            var changes = computeTreeChangesFactory(container, sut.RepositoryDescription)
                          .Compare(sut.CommitId, commit.CommitId)
                          .SkipIndexChanges();

            // Assert
            Assert.That(changes, Has.Count.EqualTo(1));
            Assert.That(changes[0].Status, Is.EqualTo(ChangeKind.Added));
            Assert.That(changes[0].Old, Is.Null);
            Assert.That(changes[0].New.Name, Is.EqualTo(field.Name));
        }
        public void RebaseChildAddition(IServiceProvider serviceProvider, ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message)
        {
            // master:    A---B
            //             \
            // newBranch:   C   ->   A---C---B

            // Arrange
            var a = container.AddRepository(sut, signature, message); // A

            // Act
            var updateName = a.With(a.Applications[0], app => app.Name, "modified name");
            var b          = container.Commit(updateName.Repository, signature, message); // B

            a = container.Checkout(a.Id, "newBranch", createNewBranch: true, "HEAD~1");
            var page    = new Page(serviceProvider, UniqueId.CreateNew(), "name", "description", new LazyChildren <Field>());
            var addPage = a.With(c => c.Add(a.Applications[0], app => app.Pages, page));

            container.Commit(addPage.Repository, signature, message); // C
            var rebase     = container.Rebase(sut.Id, "master");
            var repository = container.Repositories.Single();

            // Assert
            Assert.That(rebase.Status, Is.EqualTo(RebaseStatus.Complete));
            Assert.That(rebase.TotalStepCount, Is.EqualTo(1));
            var(commits, tip) = repository.Execute(r =>
            {
                var commitFilter = new CommitFilter
                {
                    IncludeReachableFrom = r.Head.Tip,
                    SortBy = CommitSortStrategies.Reverse | CommitSortStrategies.Topological,
                };
                return(r.Commits.QueryBy(commitFilter).Select(c => c.Id).ToList(), r.Head.Tip.Id);
            });
            Assert.That(commits, Has.Count.EqualTo(3));
            Assert.That(commits[0], Is.EqualTo(a.CommitId));
            Assert.That(commits[1], Is.EqualTo(b.CommitId));
            Assert.That(commits[2], Is.EqualTo(tip));
            Assert.That(repository.CommitId, Is.EqualTo(tip));
            Assert.That(repository.Applications[0].Name, Is.EqualTo("modified name"));
            Assert.That(repository.Applications[0].Pages, Has.Count.EqualTo(a.Applications[0].Pages.Count + 1));
        }
Exemple #10
0
        public void IndexUpdateWhenBlobIsBeingChanged(IServiceProvider serviceProvider, BlobRepository repository, IObjectRepositoryContainer <BlobRepository> container, Signature signature, string message, string name)
        {
            // Arrange
            repository = repository.With(c => c
                                         .Add(repository, r => r.Indexes, new Index(serviceProvider, UniqueId.CreateNew(), name, nameof(Car.Blob))));
            repository = container.AddRepository(repository, signature, message);
            IndexTests.ComputeKeysCalls.Clear();

            // Act
            var modified = repository.With(repository, r => r.Blob, new StringBlob("modified blob"));

            container.Commit(modified.Repository, signature, message);

            // Assert
            Assert.That(IndexTests.ComputeKeysCalls, Has.Count.EqualTo(2)); // Two calls to ComputeKeys for before/after
        }
Exemple #11
0
 static string GetTempPath() =>
 Path.Combine(Path.GetTempPath(), "Repos", UniqueId.CreateNew().ToString());
Exemple #12
0
        public void IndexUpdateWhenObjectIsBeingRemoved(IServiceProvider serviceProvider, ObjectRepository repository, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message, string name)
        {
            // Arrange
            repository = repository.With(c => c
                                         .Add(repository, r => r.Indexes, new Index(serviceProvider, UniqueId.CreateNew(), name, nameof(IModelObject.Name))));
            repository = container.AddRepository(repository, signature, message);
            ComputeKeysCalls.Clear();

            // Act
            var modified = repository.With(c => c.Remove(repository.Applications[0], app => app.Pages, repository.Applications[0].Pages[0]));

            container.Commit(modified.Repository, signature, message);

            // Assert
            var nestedCount = repository.Applications[0].Pages[0].Flatten().Count();

            Assert.That(ComputeKeysCalls, Has.Count.EqualTo(nestedCount));
        }
Exemple #13
0
        public void IndexUpdateWhenPropertyIsBeingChanged(IServiceProvider serviceProvider, ObjectRepository repository, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message, string name)
        {
            // Arrange
            repository = repository.With(c => c
                                         .Add(repository, r => r.Indexes, new Index(serviceProvider, UniqueId.CreateNew(), name, nameof(IModelObject.Name))));
            repository = container.AddRepository(repository, signature, message);
            ComputeKeysCalls.Clear();

            // Act
            var modified = repository.With(repository.Applications[0].Pages[1], p => p.Description, "modified description");

            container.Commit(modified.Repository, signature, message);

            // Assert
            Assert.That(ComputeKeysCalls, Has.Count.EqualTo(2)); // Two calls to ComputeKeys for before/after
        }
Exemple #14
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);
        }
        public void MergeFileAdditionChange(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, IServiceProvider serviceProvider, Signature signature, string message, ComputeTreeChangesFactory computeTreeChangesFactory)
        {
            // master:    A---C---D
            //             \     /
            // newBranch:   B---'

            // Arrange
            sut = container.AddRepository(sut, signature, message); // A

            // Act
            sut = container.Checkout(sut.Id, "newBranch", createNewBranch: true);
            var updateName = sut.With(c => c.Add(sut.Applications[0].Pages[0], p => p.Fields, new Field(serviceProvider, UniqueId.CreateNew(), "new field", FieldContent.Default)));

            container.Commit(updateName.Repository, signature, message); // B
            var a = container.Checkout(sut.Id, "master");
            var updateDescription = a.With(a.Applications[0].Pages[0], p => p.Description, "modified description");
            var commitC           = container.Commit(updateDescription.Repository, signature, message); // C
            var mergeCommit       = container.Merge(sut.Id, "newBranch").Apply(signature);              // D

            // Assert
            var changes = computeTreeChangesFactory(container, container[sut.Id].RepositoryDescription)
                          .Compare(commitC.CommitId, mergeCommit)
                          .SkipIndexChanges();

            Assert.That(changes, Has.Count.EqualTo(1));
            Assert.That(changes[0].Status, Is.EqualTo(ChangeKind.Added));
            Assert.That(changes[0].New.Name, Is.EqualTo("new field"));
        }