Skip to content

Commit d6f1ae5

Browse files
committed
re-arch the way we do anlysis tests by making it easier for test classes to do full blown endpoint testing
1 parent e15ec06 commit d6f1ae5

19 files changed

+1500
-856
lines changed

src/Nest/Analysis/Tokenizers/Tokenizers.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public Tokenizers(Dictionary<string, ITokenizer> container)
1919
public void Add(string name, ITokenizer analyzer) => BackingDictionary.Add(name, analyzer);
2020
}
2121

22-
public class TokenizersDescriptor :IsADictionaryDescriptorBase<TokenizersDescriptor, ITokenizers, string, ITokenizer>
22+
public class TokenizersDescriptor : IsADictionaryDescriptorBase<TokenizersDescriptor, ITokenizers, string, ITokenizer>
2323
{
2424
public TokenizersDescriptor() : base(new Tokenizers()) { }
2525

src/Tests/Tests.Core/ManagedElasticsearch/Clusters/ReadOnlyCluster.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
using Elastic.Managed.Ephemeral.Plugins;
2-
using Tests.Core.ManagedElasticsearch.NodeSeeders;
1+
using Tests.Core.ManagedElasticsearch.NodeSeeders;
2+
using static Elastic.Managed.Ephemeral.Plugins.ElasticsearchPlugin;
33

44
namespace Tests.Core.ManagedElasticsearch.Clusters
55
{
66
public class ReadOnlyCluster : ClientTestClusterBase
77
{
8-
public ReadOnlyCluster() : base(ElasticsearchPlugin.MapperMurmur3) { }
8+
public ReadOnlyCluster() : base(MapperMurmur3, AnalysisKuromoji, AnalysisIcu) { }
99

1010
protected override void SeedCluster() => new DefaultSeeder(this.Client).SeedNode();
1111
}

src/Tests/Tests.Core/Tests.Core.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
</ItemGroup>
1212
<ItemGroup>
1313
<ProjectReference Include="..\Tests.Domain\Tests.Domain.csproj" />
14-
<PackageReference Include="Elastic.Xunit" Version="0.1.0-ci20180902T153954" />
14+
<PackageReference Include="Elastic.Xunit" Version="0.1.0-ci20180925T171717" />
1515
<PackageReference Include="xunit" Version="2.3.1" />
1616
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
1717
<PackageReference Include="FluentAssertions" Version="4.19.2" />

src/Tests/Tests.Domain/Tests.Domain.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
</ItemGroup>
1313
<ItemGroup>
1414
<PackageReference Include="Bogus" Version="22.1.2" />
15-
<PackageReference Include="Elastic.Managed" Version="0.1.0-ci20180902T153954" />
15+
<PackageReference Include="Elastic.Managed" Version="0.1.0-ci20180925T171717" />
1616
<ProjectReference Include="..\Tests.Configuration\Tests.Configuration.csproj" />
1717
</ItemGroup>
1818
</Project>

src/Tests/Tests/Analysis/AnalysisCrudTests.cs

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Elastic.Xunit.XunitPlumbing;
33
using FluentAssertions;
44
using Nest;
5+
using Tests.Analysis.Tokenizers;
56
using Tests.Core.Extensions;
67
using Tests.Core.ManagedElasticsearch.Clusters;
78
using Tests.Framework;
@@ -48,8 +49,8 @@ protected override LazyResponses Create() => Calls<CreateIndexDescriptor, Create
4849
{
4950
Analyzers = Analyzers.AnalyzerUsageTests.InitializerExample.Analysis.Analyzers,
5051
CharFilters = CharFilters.CharFilterUsageTests.InitializerExample.Analysis.CharFilters,
51-
Tokenizers = Tokenizers.TokenizerUsageTests.InitializerExample.Analysis.Tokenizers,
52-
TokenFilters = TokenFilters.TokenFilterUsageTests.InitializerExample.Analysis.TokenFilters,
52+
Tokenizers = AnalysisUsageTests.TokenizersInitializer.Analysis.Tokenizers,
53+
TokenFilters = AnalysisUsageTests.TokenFiltersInitializer.Analysis.TokenFilters,
5354
}
5455
}
5556
};
@@ -59,8 +60,8 @@ protected virtual ICreateIndexRequest CreateFluent(string indexName, CreateIndex
5960
.Analysis(a => a
6061
.Analyzers(t => Promise(Analyzers.AnalyzerUsageTests.FluentExample(s).Value.Analysis.Analyzers))
6162
.CharFilters(t => Promise(CharFilters.CharFilterUsageTests.FluentExample(s).Value.Analysis.CharFilters))
62-
.Tokenizers(t => Promise(Tokenizers.TokenizerUsageTests.FluentExample(s).Value.Analysis.Tokenizers))
63-
.TokenFilters(t => Promise(TokenFilters.TokenFilterUsageTests.FluentExample(s).Value.Analysis.TokenFilters))
63+
.Tokenizers(t => Promise(AnalysisUsageTests.TokenizersFluent.Analysis.Tokenizers))
64+
.TokenFilters(t => Promise(AnalysisUsageTests.TokenFiltersFluent.Analysis.TokenFilters))
6465
)
6566
);
6667

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Reflection;
5+
using Elastic.Xunit.XunitPlumbing;
6+
using Nest;
7+
using Tests.Analysis.TokenFilters;
8+
using Tests.Core.Client;
9+
using Tests.Search;
10+
11+
namespace Tests.Analysis.Tokenizers
12+
{
13+
public static class AnalysisUsageTests
14+
{
15+
public static IndexSettings TokenizersFluent => Fluent<TokenizersDescriptor, ITokenizerAssertion, ITokenizers>(i => i.Fluent, (a, v) => a.Tokenizers = v.Value);
16+
17+
public static IndexSettings TokenFiltersFluent => Fluent<TokenFiltersDescriptor, ITokenFilterAssertion, ITokenFilters>(i => i.Fluent, (a, v) => a.TokenFilters = v.Value);
18+
19+
public static IndexSettings TokenizersInitializer => Init<Nest.Tokenizers, ITokenizerAssertion, ITokenizer>(i => i.Initializer, (a, v) => a.Tokenizers = v);
20+
21+
public static IndexSettings TokenFiltersInitializer => Init<Nest.TokenFilters, ITokenFilterAssertion, ITokenFilter>(i => i.Initializer, (a, v) => a.TokenFilters = v);
22+
23+
private static IndexSettings Fluent<TContainer, TAssertion, TValue>(Func<TAssertion, Func<string, TContainer, IPromise<TValue>>> fluent, Action<Nest.Analysis, IPromise<TValue>> set)
24+
where TAssertion : IAnalysisAssertion
25+
where TContainer : IPromise<TValue>, new()
26+
where TValue : class => Wrap(an => set(an, Apply<TContainer, TAssertion>((t, a) => fluent(a)(a.Name, t))));
27+
28+
private static IndexSettings Init<TContainer, TAssertion, TInitializer>(Func<TAssertion, TInitializer> value, Action<Nest.Analysis, TContainer> set)
29+
where TAssertion : IAnalysisAssertion
30+
where TContainer : IDictionary<string, TInitializer>, new() => Wrap(an => set(an, Apply<TContainer, TAssertion>((t, a) => t[a.Name] = value(a))));
31+
32+
private static TContainer Apply<TContainer, TAssertion>(Action<TContainer, TAssertion> act)
33+
where TAssertion : IAnalysisAssertion
34+
where TContainer : new() => All<TAssertion>().Aggregate(new TContainer() , (t,a) => { act(t,a); return t; }, t=>t);
35+
36+
private static IndexSettings Wrap(Action<Nest.Analysis> set)
37+
{
38+
var a = new Nest.Analysis();
39+
var s =new IndexSettings { Analysis = a };
40+
set(a);
41+
return s;
42+
}
43+
44+
private static List<TAssertion> All<TAssertion>()
45+
where TAssertion : IAnalysisAssertion
46+
{
47+
var types =
48+
from t in typeof(TokenizerTests).GetNestedTypes()
49+
where typeof(TAssertion).IsAssignableFrom(t) && t.IsClass
50+
let a = t.GetCustomAttributes(typeof(SkipVersionAttribute)).FirstOrDefault() as SkipVersionAttribute
51+
where a != null && !a.Ranges.Any(r=>r.IsSatisfied(TestClient.Configuration.ElasticsearchVersion))
52+
select (TAssertion) Activator.CreateInstance(t);
53+
return types.ToList();
54+
}
55+
56+
57+
}
58+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Tests.Analysis.Tokenizers
2+
{
3+
public interface IAnalysisAssertion
4+
{
5+
string Name { get; }
6+
object Json { get; }
7+
}
8+
}

src/Tests/Tests/Analysis/Normalizers/AnalysisWithNormalizerCrudTests.cs

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Elastic.Xunit.XunitPlumbing;
33
using FluentAssertions;
44
using Nest;
5+
using Tests.Analysis.Tokenizers;
56
using Tests.Core.ManagedElasticsearch.Clusters;
67
using Tests.Framework;
78
using Tests.Framework.Integration;
@@ -25,8 +26,8 @@ public AnalysisWithNormalizerCrudTests(WritableCluster cluster, EndpointUsage us
2526
{
2627
Analyzers = Analyzers.AnalyzerUsageTests.InitializerExample.Analysis.Analyzers,
2728
CharFilters = CharFilters.CharFilterUsageTests.InitializerExample.Analysis.CharFilters,
28-
Tokenizers = Tokenizers.TokenizerUsageTests.InitializerExample.Analysis.Tokenizers,
29-
TokenFilters = TokenFilters.TokenFilterUsageTests.InitializerExample.Analysis.TokenFilters,
29+
Tokenizers = AnalysisUsageTests.TokenizersInitializer.Analysis.Tokenizers,
30+
TokenFilters = AnalysisUsageTests.TokenFiltersInitializer.Analysis.TokenFilters,
3031
Normalizers = Normalizers.NormalizerUsageTests.InitializerExample.Analysis.Normalizers,
3132
}
3233
}
@@ -37,8 +38,8 @@ protected override ICreateIndexRequest CreateFluent(string indexName, CreateInde
3738
.Analysis(a => a
3839
.Analyzers(t => Promise(Analyzers.AnalyzerUsageTests.FluentExample(s).Value.Analysis.Analyzers))
3940
.CharFilters(t => Promise(CharFilters.CharFilterUsageTests.FluentExample(s).Value.Analysis.CharFilters))
40-
.Tokenizers(t => Promise(Tokenizers.TokenizerUsageTests.FluentExample(s).Value.Analysis.Tokenizers))
41-
.TokenFilters(t => Promise(TokenFilters.TokenFilterUsageTests.FluentExample(s).Value.Analysis.TokenFilters))
41+
.Tokenizers(t => Promise(AnalysisUsageTests.TokenizersFluent.Analysis.Tokenizers))
42+
.TokenFilters(t => Promise(AnalysisUsageTests.TokenFiltersFluent.Analysis.TokenFilters))
4243
.Normalizers(t => Promise(Normalizers.NormalizerUsageTests.FluentExample(s).Value.Analysis.Normalizers))
4344
)
4445
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
using Nest;
3+
4+
namespace Tests.Analysis.Tokenizers
5+
{
6+
7+
public interface ITokenFilterAssertion : IAnalysisAssertion
8+
{
9+
ITokenFilter Initializer { get; }
10+
Func<string, TokenFiltersDescriptor, IPromise<ITokenFilters>> Fluent { get; }
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading.Tasks;
4+
using Elastic.Xunit;
5+
using Elastic.Xunit.XunitPlumbing;
6+
using FluentAssertions;
7+
using Nest;
8+
using Tests.Core.Client;
9+
using Tests.Core.ManagedElasticsearch.Clusters;
10+
using Tests.Core.Serialization;
11+
using Tests.Framework.Integration;
12+
13+
namespace Tests.Analysis.TokenFilters
14+
{
15+
16+
[IntegrationTestCluster(typeof(ReadOnlyCluster))]
17+
public abstract class TokenFilterAssertionBase<TAssertion> where TAssertion : TokenFilterAssertionBase<TAssertion>, new()
18+
{
19+
private static readonly SingleEndpointUsage<ICreateIndexResponse> Usage = new SingleEndpointUsage<ICreateIndexResponse>
20+
(
21+
fluent: (s, c) => c.CreateIndex(s, FluentCall),
22+
fluentAsync: (s, c) => c.CreateIndexAsync(s, FluentCall),
23+
request: (s, c) => c.CreateIndex(InitializerCall(s)),
24+
requestAsync: (s, c) => c.CreateIndexAsync(InitializerCall(s)),
25+
valuePrefix: $"test-{typeof(TAssertion).Name.ToLowerInvariant()}"
26+
)
27+
{
28+
OnAfterCall = c=> c.DeleteIndex(Usage.CallUniqueValues.Value)
29+
};
30+
private static TAssertion AssertionSetup { get; } = new TAssertion();
31+
32+
protected TokenFilterAssertionBase()
33+
{
34+
this.Client = (ElasticXunitRunner.CurrentCluster as ReadOnlyCluster)?.Client ?? TestClient.DefaultInMemoryClient;
35+
Usage.KickOffOnce(this.Client);
36+
}
37+
38+
private IElasticClient Client { get; }
39+
40+
protected abstract string Name { get; }
41+
protected abstract ITokenFilter Initializer { get; }
42+
protected abstract Func<string, TokenFiltersDescriptor, IPromise<ITokenFilters>> Fluent { get; }
43+
protected abstract object Json { get; }
44+
45+
[U] public async Task TestPutSettingsRequest() => await Usage.AssertOnAllResponses(r =>
46+
{
47+
var json = new
48+
{
49+
settings = new
50+
{
51+
analysis = new
52+
{
53+
tokenizer = new Dictionary<string, object>
54+
{
55+
{ AssertionSetup.Name, AssertionSetup.Json}
56+
}
57+
}
58+
}
59+
};
60+
SerializationTestHelper.Expect(json).FromRequest(r);
61+
});
62+
63+
[I] public async Task TestPutSettingsResponse() => await Usage.AssertOnAllResponses(r =>
64+
{
65+
r.ApiCall.HttpStatusCode.Should().Be(200);
66+
});
67+
68+
private static CreateIndexRequest InitializerCall(string index) => new CreateIndexRequest(index)
69+
{
70+
Settings = new IndexSettings
71+
{
72+
Analysis = new Nest.Analysis
73+
{
74+
TokenFilters = new Nest.TokenFilters { { AssertionSetup.Name, AssertionSetup.Initializer } }
75+
76+
}
77+
}
78+
};
79+
80+
private static Func<CreateIndexDescriptor, ICreateIndexRequest> FluentCall => i => i
81+
.Settings(s => s
82+
.Analysis(a => a
83+
.TokenFilters(d => AssertionSetup.Fluent(AssertionSetup.Name, d))
84+
)
85+
);
86+
87+
}
88+
}

0 commit comments

Comments
 (0)