using System; using System.Collections.Generic; using System.Linq; using Gallium; using Nitride.Entities; using Xunit; using Xunit.Abstractions; namespace Nitride.Tests.Entities; public class CreateOrUpdateIndexTests : NitrideTestBase, IDisposable { private readonly NitrideTestContext context; private readonly IOperation op; private readonly EntityScanner scanner; public CreateOrUpdateIndexTests(ITestOutputHelper output) : base(output) { this.context = this.CreateContext(); this.scanner = this.context.Resolve() .WithGetKeysFromEntity(e => e.GetOptional>()); this.op = this.context.Resolve() .WithScanner(this.scanner) .WithGetIndexKey( x => x.Get() .Contains("index") ? x.Get() .Replace("index", "cat") : null) .WithCreateIndex( ( key, list) => new Entity().Add(key.Replace("cat", "index")) .Add(list.ToList())) .WithUpdateIndex( ( index, key, list) => index.Add(list.ToList())); } [Fact] public void CreateMultipleIndexes() { List input = new() { new Entity().Add("page1") .Add(new List { "cat1" }), new Entity().Add("page2") .Add(new List { "cat2" }), new Entity().Add("page3") .Add(new List { "cat1" }), }; List?>> actual = this.GetActual(input); Assert.Equal( new[] { new Tuple?>("index1", new List { "page1", "page3" }), new Tuple?>("index2", new List { "page2" }), new Tuple?>("page1", null), new Tuple?>("page2", null), new Tuple?>("page3", null), }, actual); } [Fact] public void CreateNestedIndexes() { List input = new() { new Entity().Add("index2") .Add(new List { "cat1" }), new Entity().Add("page2") .Add(new List { "cat2" }), new Entity().Add("page3") .Add(new List { "cat1" }), }; List?>> actual = this.GetActual(input); Assert.Equal( new[] { new Tuple?>("index1", new List { "index2", "page3" }), new Tuple?>("index2", new List { "page2" }), new Tuple?>("page2", null), new Tuple?>("page3", null), }, actual); } [Fact] public void CreateSimpleIndex() { List input = new() { new Entity().Add("page1") .Add(new List { "cat1" }), }; List?>> actual = this.GetActual(input); Assert.Equal( new[] { new Tuple?>("index1", new List { "page1" }), new Tuple?>("page1", null), }, actual); } /// public void Dispose() { this.context.Dispose(); } [Fact] public void UpdateSimpleIndex() { List input = new() { new Entity().Add("index1"), new Entity().Add("page1") .Add(new List { "cat1" }), }; var output = this.scanner.Run(input) .ToList() .Run(this.op) .ToList(); var actual = output .Select( x => new Tuple?>( x.Get(), x.GetOptional>() ?.Select(y => y.Get()) .OrderBy(y => y) .ToList())) .OrderBy(x => x.Item1) .ToList(); Assert.Equal( new[] { new Tuple?>("index1", new List { "page1" }), new Tuple?>("page1", null), }, actual); } private List?>> GetActual(List input) { var output = this.scanner.Run(input) .ToList() .Run(this.op) .ToList(); var actual = output .Select( x => new Tuple?>( x.Get(), x.GetOptional>() ?.Select(y => y.Get()) .OrderBy(y => y) .ToList())) .OrderBy(x => x.Item1) .ToList(); return actual; } }