Skip to content

Commit

Permalink
re-arch the way we do anlysis tests by making it easier for test clas…
Browse files Browse the repository at this point in the history
…ses to do full blown endpoint testing
  • Loading branch information
Mpdreamz committed Sep 27, 2018
1 parent e15ec06 commit d6f1ae5
Show file tree
Hide file tree
Showing 19 changed files with 1,500 additions and 856 deletions.
2 changes: 1 addition & 1 deletion src/Nest/Analysis/Tokenizers/Tokenizers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public Tokenizers(Dictionary<string, ITokenizer> container)
public void Add(string name, ITokenizer analyzer) => BackingDictionary.Add(name, analyzer);
}

public class TokenizersDescriptor :IsADictionaryDescriptorBase<TokenizersDescriptor, ITokenizers, string, ITokenizer>
public class TokenizersDescriptor : IsADictionaryDescriptorBase<TokenizersDescriptor, ITokenizers, string, ITokenizer>
{
public TokenizersDescriptor() : base(new Tokenizers()) { }

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
using Elastic.Managed.Ephemeral.Plugins;
using Tests.Core.ManagedElasticsearch.NodeSeeders;
using Tests.Core.ManagedElasticsearch.NodeSeeders;
using static Elastic.Managed.Ephemeral.Plugins.ElasticsearchPlugin;

namespace Tests.Core.ManagedElasticsearch.Clusters
{
public class ReadOnlyCluster : ClientTestClusterBase
{
public ReadOnlyCluster() : base(ElasticsearchPlugin.MapperMurmur3) { }
public ReadOnlyCluster() : base(MapperMurmur3, AnalysisKuromoji, AnalysisIcu) { }

protected override void SeedCluster() => new DefaultSeeder(this.Client).SeedNode();
}
Expand Down
2 changes: 1 addition & 1 deletion src/Tests/Tests.Core/Tests.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Tests.Domain\Tests.Domain.csproj" />
<PackageReference Include="Elastic.Xunit" Version="0.1.0-ci20180902T153954" />
<PackageReference Include="Elastic.Xunit" Version="0.1.0-ci20180925T171717" />
<PackageReference Include="xunit" Version="2.3.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
<PackageReference Include="FluentAssertions" Version="4.19.2" />
Expand Down
2 changes: 1 addition & 1 deletion src/Tests/Tests.Domain/Tests.Domain.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Bogus" Version="22.1.2" />
<PackageReference Include="Elastic.Managed" Version="0.1.0-ci20180902T153954" />
<PackageReference Include="Elastic.Managed" Version="0.1.0-ci20180925T171717" />
<ProjectReference Include="..\Tests.Configuration\Tests.Configuration.csproj" />
</ItemGroup>
</Project>
9 changes: 5 additions & 4 deletions src/Tests/Tests/Analysis/AnalysisCrudTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Elastic.Xunit.XunitPlumbing;
using FluentAssertions;
using Nest;
using Tests.Analysis.Tokenizers;
using Tests.Core.Extensions;
using Tests.Core.ManagedElasticsearch.Clusters;
using Tests.Framework;
Expand Down Expand Up @@ -48,8 +49,8 @@ protected virtual CreateIndexRequest CreateInitializer(string indexName) => new
{
Analyzers = Analyzers.AnalyzerUsageTests.InitializerExample.Analysis.Analyzers,
CharFilters = CharFilters.CharFilterUsageTests.InitializerExample.Analysis.CharFilters,
Tokenizers = Tokenizers.TokenizerUsageTests.InitializerExample.Analysis.Tokenizers,
TokenFilters = TokenFilters.TokenFilterUsageTests.InitializerExample.Analysis.TokenFilters,
Tokenizers = AnalysisUsageTests.TokenizersInitializer.Analysis.Tokenizers,
TokenFilters = AnalysisUsageTests.TokenFiltersInitializer.Analysis.TokenFilters,
}
}
};
Expand All @@ -59,8 +60,8 @@ protected virtual CreateIndexRequest CreateInitializer(string indexName) => new
.Analysis(a => a
.Analyzers(t => Promise(Analyzers.AnalyzerUsageTests.FluentExample(s).Value.Analysis.Analyzers))
.CharFilters(t => Promise(CharFilters.CharFilterUsageTests.FluentExample(s).Value.Analysis.CharFilters))
.Tokenizers(t => Promise(Tokenizers.TokenizerUsageTests.FluentExample(s).Value.Analysis.Tokenizers))
.TokenFilters(t => Promise(TokenFilters.TokenFilterUsageTests.FluentExample(s).Value.Analysis.TokenFilters))
.Tokenizers(t => Promise(AnalysisUsageTests.TokenizersFluent.Analysis.Tokenizers))
.TokenFilters(t => Promise(AnalysisUsageTests.TokenFiltersFluent.Analysis.TokenFilters))
)
);

Expand Down
58 changes: 58 additions & 0 deletions src/Tests/Tests/Analysis/AnalysisUsageTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Elastic.Xunit.XunitPlumbing;
using Nest;
using Tests.Analysis.TokenFilters;
using Tests.Core.Client;
using Tests.Search;

namespace Tests.Analysis.Tokenizers
{
public static class AnalysisUsageTests
{
public static IndexSettings TokenizersFluent => Fluent<TokenizersDescriptor, ITokenizerAssertion, ITokenizers>(i => i.Fluent, (a, v) => a.Tokenizers = v.Value);

public static IndexSettings TokenFiltersFluent => Fluent<TokenFiltersDescriptor, ITokenFilterAssertion, ITokenFilters>(i => i.Fluent, (a, v) => a.TokenFilters = v.Value);

public static IndexSettings TokenizersInitializer => Init<Nest.Tokenizers, ITokenizerAssertion, ITokenizer>(i => i.Initializer, (a, v) => a.Tokenizers = v);

public static IndexSettings TokenFiltersInitializer => Init<Nest.TokenFilters, ITokenFilterAssertion, ITokenFilter>(i => i.Initializer, (a, v) => a.TokenFilters = v);

private static IndexSettings Fluent<TContainer, TAssertion, TValue>(Func<TAssertion, Func<string, TContainer, IPromise<TValue>>> fluent, Action<Nest.Analysis, IPromise<TValue>> set)
where TAssertion : IAnalysisAssertion
where TContainer : IPromise<TValue>, new()
where TValue : class => Wrap(an => set(an, Apply<TContainer, TAssertion>((t, a) => fluent(a)(a.Name, t))));

private static IndexSettings Init<TContainer, TAssertion, TInitializer>(Func<TAssertion, TInitializer> value, Action<Nest.Analysis, TContainer> set)
where TAssertion : IAnalysisAssertion
where TContainer : IDictionary<string, TInitializer>, new() => Wrap(an => set(an, Apply<TContainer, TAssertion>((t, a) => t[a.Name] = value(a))));

private static TContainer Apply<TContainer, TAssertion>(Action<TContainer, TAssertion> act)
where TAssertion : IAnalysisAssertion
where TContainer : new() => All<TAssertion>().Aggregate(new TContainer() , (t,a) => { act(t,a); return t; }, t=>t);

private static IndexSettings Wrap(Action<Nest.Analysis> set)
{
var a = new Nest.Analysis();
var s =new IndexSettings { Analysis = a };
set(a);
return s;
}

private static List<TAssertion> All<TAssertion>()
where TAssertion : IAnalysisAssertion
{
var types =
from t in typeof(TokenizerTests).GetNestedTypes()
where typeof(TAssertion).IsAssignableFrom(t) && t.IsClass
let a = t.GetCustomAttributes(typeof(SkipVersionAttribute)).FirstOrDefault() as SkipVersionAttribute
where a != null && !a.Ranges.Any(r=>r.IsSatisfied(TestClient.Configuration.ElasticsearchVersion))
select (TAssertion) Activator.CreateInstance(t);
return types.ToList();
}


}
}
8 changes: 8 additions & 0 deletions src/Tests/Tests/Analysis/IAnalysisAssertion.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Tests.Analysis.Tokenizers
{
public interface IAnalysisAssertion
{
string Name { get; }
object Json { get; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Elastic.Xunit.XunitPlumbing;
using FluentAssertions;
using Nest;
using Tests.Analysis.Tokenizers;
using Tests.Core.ManagedElasticsearch.Clusters;
using Tests.Framework;
using Tests.Framework.Integration;
Expand All @@ -25,8 +26,8 @@ protected override CreateIndexRequest CreateInitializer(string indexName) => new
{
Analyzers = Analyzers.AnalyzerUsageTests.InitializerExample.Analysis.Analyzers,
CharFilters = CharFilters.CharFilterUsageTests.InitializerExample.Analysis.CharFilters,
Tokenizers = Tokenizers.TokenizerUsageTests.InitializerExample.Analysis.Tokenizers,
TokenFilters = TokenFilters.TokenFilterUsageTests.InitializerExample.Analysis.TokenFilters,
Tokenizers = AnalysisUsageTests.TokenizersInitializer.Analysis.Tokenizers,
TokenFilters = AnalysisUsageTests.TokenFiltersInitializer.Analysis.TokenFilters,
Normalizers = Normalizers.NormalizerUsageTests.InitializerExample.Analysis.Normalizers,
}
}
Expand All @@ -37,8 +38,8 @@ protected override CreateIndexRequest CreateInitializer(string indexName) => new
.Analysis(a => a
.Analyzers(t => Promise(Analyzers.AnalyzerUsageTests.FluentExample(s).Value.Analysis.Analyzers))
.CharFilters(t => Promise(CharFilters.CharFilterUsageTests.FluentExample(s).Value.Analysis.CharFilters))
.Tokenizers(t => Promise(Tokenizers.TokenizerUsageTests.FluentExample(s).Value.Analysis.Tokenizers))
.TokenFilters(t => Promise(TokenFilters.TokenFilterUsageTests.FluentExample(s).Value.Analysis.TokenFilters))
.Tokenizers(t => Promise(AnalysisUsageTests.TokenizersFluent.Analysis.Tokenizers))
.TokenFilters(t => Promise(AnalysisUsageTests.TokenFiltersFluent.Analysis.TokenFilters))
.Normalizers(t => Promise(Normalizers.NormalizerUsageTests.FluentExample(s).Value.Analysis.Normalizers))
)
);
Expand Down
12 changes: 12 additions & 0 deletions src/Tests/Tests/Analysis/TokenFilters/ITokenFilterAssertion.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;
using Nest;

namespace Tests.Analysis.Tokenizers
{

public interface ITokenFilterAssertion : IAnalysisAssertion
{
ITokenFilter Initializer { get; }
Func<string, TokenFiltersDescriptor, IPromise<ITokenFilters>> Fluent { get; }
}
}
88 changes: 88 additions & 0 deletions src/Tests/Tests/Analysis/TokenFilters/TokenFilterAssertionBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Elastic.Xunit;
using Elastic.Xunit.XunitPlumbing;
using FluentAssertions;
using Nest;
using Tests.Core.Client;
using Tests.Core.ManagedElasticsearch.Clusters;
using Tests.Core.Serialization;
using Tests.Framework.Integration;

namespace Tests.Analysis.TokenFilters
{

[IntegrationTestCluster(typeof(ReadOnlyCluster))]
public abstract class TokenFilterAssertionBase<TAssertion> where TAssertion : TokenFilterAssertionBase<TAssertion>, new()
{
private static readonly SingleEndpointUsage<ICreateIndexResponse> Usage = new SingleEndpointUsage<ICreateIndexResponse>
(
fluent: (s, c) => c.CreateIndex(s, FluentCall),
fluentAsync: (s, c) => c.CreateIndexAsync(s, FluentCall),
request: (s, c) => c.CreateIndex(InitializerCall(s)),
requestAsync: (s, c) => c.CreateIndexAsync(InitializerCall(s)),
valuePrefix: $"test-{typeof(TAssertion).Name.ToLowerInvariant()}"
)
{
OnAfterCall = c=> c.DeleteIndex(Usage.CallUniqueValues.Value)
};
private static TAssertion AssertionSetup { get; } = new TAssertion();

protected TokenFilterAssertionBase()
{
this.Client = (ElasticXunitRunner.CurrentCluster as ReadOnlyCluster)?.Client ?? TestClient.DefaultInMemoryClient;
Usage.KickOffOnce(this.Client);
}

private IElasticClient Client { get; }

protected abstract string Name { get; }
protected abstract ITokenFilter Initializer { get; }
protected abstract Func<string, TokenFiltersDescriptor, IPromise<ITokenFilters>> Fluent { get; }
protected abstract object Json { get; }

[U] public async Task TestPutSettingsRequest() => await Usage.AssertOnAllResponses(r =>
{
var json = new
{
settings = new
{
analysis = new
{
tokenizer = new Dictionary<string, object>
{
{ AssertionSetup.Name, AssertionSetup.Json}
}
}
}
};
SerializationTestHelper.Expect(json).FromRequest(r);
});

[I] public async Task TestPutSettingsResponse() => await Usage.AssertOnAllResponses(r =>
{
r.ApiCall.HttpStatusCode.Should().Be(200);
});

private static CreateIndexRequest InitializerCall(string index) => new CreateIndexRequest(index)
{
Settings = new IndexSettings
{
Analysis = new Nest.Analysis
{
TokenFilters = new Nest.TokenFilters { { AssertionSetup.Name, AssertionSetup.Initializer } }

}
}
};

private static Func<CreateIndexDescriptor, ICreateIndexRequest> FluentCall => i => i
.Settings(s => s
.Analysis(a => a
.TokenFilters(d => AssertionSetup.Fluent(AssertionSetup.Name, d))
)
);

}
}
Loading

0 comments on commit d6f1ae5

Please sign in to comment.