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")); }
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)); }
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)); }
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)); }
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)); }
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 }
static string GetTempPath() => Path.Combine(Path.GetTempPath(), "Repos", UniqueId.CreateNew().ToString());
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)); }
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 }
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")); }