Skip to content

Commit ce346df

Browse files
Add more integration and unit tests (#6725) (#6730)
* Format AsyncSearchApiTests * Fix ClearScrollRequest code-gen * Port ClearScroll tests * Add Scroll tests * WIP DeleteByQuery tests * Fix failing test * Fix license headers Co-authored-by: Steve Gordon <[email protected]>
1 parent afd0337 commit ce346df

File tree

14 files changed

+846
-143
lines changed

14 files changed

+846
-143
lines changed

src/Elastic.Clients.Elasticsearch/Common/UrlParameters/TaskId/TaskId.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System;
66
using System.Diagnostics;
77
using System.Globalization;
8+
using System.Runtime;
89
using System.Text.Json;
910
using System.Text.Json.Serialization;
1011
using Elastic.Transport;
@@ -71,6 +72,19 @@ public override int GetHashCode()
7172

7273
internal sealed class TaskIdConverter : JsonConverter<TaskId>
7374
{
75+
public override void WriteAsPropertyName(Utf8JsonWriter writer, TaskId value, JsonSerializerOptions options)
76+
{
77+
if (options.TryGetClientSettings(out var settings))
78+
{
79+
writer.WritePropertyName(value.GetString(settings));
80+
return;
81+
}
82+
83+
throw new JsonException("Unable to retrive client settings during property name serialization.");
84+
}
85+
86+
public override TaskId ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => reader.GetString();
87+
7488
public override TaskId? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
7589
{
7690
if (reader.TokenType == JsonTokenType.Null)

src/Elastic.Clients.Elasticsearch/_Generated/Api/ClearScrollRequest.g.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ public sealed partial class ClearScrollRequest : PlainRequestBase<ClearScrollReq
3333
{
3434
internal override ApiUrls ApiUrls => ApiUrlsLookups.NoNamespaceClearScroll;
3535
protected override HttpMethod HttpMethod => HttpMethod.DELETE;
36-
protected override bool SupportsBody => false;
36+
protected override bool SupportsBody => true;
37+
[JsonInclude]
38+
[JsonPropertyName("scroll_id")]
39+
public Elastic.Clients.Elasticsearch.ScrollIds? ScrollId { get; set; }
3740
}
3841

3942
public sealed partial class ClearScrollRequestDescriptor : RequestDescriptorBase<ClearScrollRequestDescriptor, ClearScrollRequestParameters>
@@ -45,9 +48,25 @@ public ClearScrollRequestDescriptor()
4548

4649
internal override ApiUrls ApiUrls => ApiUrlsLookups.NoNamespaceClearScroll;
4750
protected override HttpMethod HttpMethod => HttpMethod.DELETE;
48-
protected override bool SupportsBody => false;
51+
protected override bool SupportsBody => true;
52+
private Elastic.Clients.Elasticsearch.ScrollIds? ScrollIdValue { get; set; }
53+
54+
public ClearScrollRequestDescriptor ScrollId(Elastic.Clients.Elasticsearch.ScrollIds? scrollId)
55+
{
56+
ScrollIdValue = scrollId;
57+
return Self;
58+
}
59+
4960
protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions options, IElasticsearchClientSettings settings)
5061
{
62+
writer.WriteStartObject();
63+
if (ScrollIdValue is not null)
64+
{
65+
writer.WritePropertyName("scroll_id");
66+
JsonSerializer.Serialize(writer, ScrollIdValue, options);
67+
}
68+
69+
writer.WriteEndObject();
5170
}
5271
}
5372
}

tests/Tests.Configuration/tests.default.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
# tracked by git).
66

77
# mode either u (unit test), i (integration test) or m (mixed mode)
8-
mode: u
8+
mode: i
99
# the elasticsearch version that should be started
1010
# Can be a snapshot version of sonatype or "latest" to get the latest snapshot of sonatype
11-
elasticsearch_version: 8.5.0-SNAPSHOT
11+
elasticsearch_version: 8.4.2
1212
# cluster filter allows you to only run the integration tests of a particular cluster (cluster suffix not needed)
1313
# cluster_filter:
1414
# whether we want to forcefully reseed on the node, if you are starting the tests with a node already running
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Licensed to Elasticsearch B.V under one or more agreements.
2+
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using Tests.Core.ManagedElasticsearch.NodeSeeders;
6+
7+
namespace Tests.Core.ManagedElasticsearch.Clusters;
8+
9+
public class ReindexCluster : ClientTestClusterBase
10+
{
11+
protected override void SeedNode() => new DefaultSeeder(Client).SeedNodeNoData();
12+
}

tests/Tests/AsyncSearch/AsyncSearchApiTests.cs

Lines changed: 137 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -14,159 +14,157 @@
1414
using Tests.Framework.EndpointTests.TestState;
1515
using System;
1616

17-
namespace Tests.AsyncSearch
17+
namespace Tests.AsyncSearch;
18+
19+
public class AsyncSearchApiTests : CoordinatedIntegrationTestBase<ReadOnlyCluster>
1820
{
19-
public class AsyncSearchApiTests : CoordinatedIntegrationTestBase<ReadOnlyCluster>
20-
{
21-
private const string SubmitStep = nameof(SubmitStep);
22-
private const string StatusStep = nameof(StatusStep);
23-
private const string GetStep = nameof(GetStep);
24-
private const string DeleteStep = nameof(DeleteStep);
21+
private const string SubmitStep = nameof(SubmitStep);
22+
private const string StatusStep = nameof(StatusStep);
23+
private const string GetStep = nameof(GetStep);
24+
private const string DeleteStep = nameof(DeleteStep);
2525

26-
public AsyncSearchApiTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(new CoordinatedUsage(cluster, usage)
26+
public AsyncSearchApiTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(new CoordinatedUsage(cluster, usage)
27+
{
2728
{
28-
{
29-
SubmitStep, u =>
30-
u.Calls<AsyncSearchSubmitRequestDescriptor<Project>, AsyncSearchSubmitRequest<Project>, AsyncSearchSubmitResponse<Project>>(
31-
v => new AsyncSearchSubmitRequest<Project>
29+
SubmitStep, u =>
30+
u.Calls<AsyncSearchSubmitRequestDescriptor<Project>, AsyncSearchSubmitRequest<Project>, AsyncSearchSubmitResponse<Project>>(
31+
v => new AsyncSearchSubmitRequest<Project>
32+
{
33+
Query = new MatchAllQuery(),
34+
KeepOnCompletion = true,
35+
WaitForCompletionTimeout = Duration.MinusOne,
36+
Aggregations = new TermsAggregation("states")
3237
{
33-
Query = new MatchAllQuery(),
34-
KeepOnCompletion = true,
35-
WaitForCompletionTimeout = Duration.MinusOne,
36-
Aggregations = new TermsAggregation("states")
38+
Field = Infer.Field<Project>(p => p.State.Suffix("keyword")),
39+
MinDocCount = 2,
40+
Size = 5,
41+
ShardSize = 100,
42+
ExecutionHint = TermsAggregationExecutionHint.Map,
43+
//Missing = "n/a",
44+
// TODO - Review terms agg and fix this
45+
//Include = new TermsInclude(new[] { StateOfBeing.Stable.ToString(), StateOfBeing.VeryActive.ToString() }),
46+
Order =new []
3747
{
38-
Field = Infer.Field<Project>(p => p.State.Suffix("keyword")),
39-
MinDocCount = 2,
40-
Size = 5,
41-
ShardSize = 100,
42-
ExecutionHint = TermsAggregationExecutionHint.Map,
43-
//Missing = "n/a",
48+
AggregateOrder.KeyAscending,
49+
AggregateOrder.CountDescending
50+
},
51+
Meta = new Dictionary<string, object> { { "foo", "bar" } }
52+
}
53+
},
54+
(v, d) => d
55+
.MatchAll()
56+
.KeepOnCompletion()
57+
.WaitForCompletionTimeout(-1)
58+
.Aggregations(a => a
59+
.Terms("states", st => st
60+
.Field(p => p.State.Suffix("keyword"))
61+
.MinDocCount(2)
62+
.Size(5)
63+
.ShardSize(100)
64+
.ExecutionHint(TermsAggregationExecutionHint.Map)
65+
//.Missing("n/a")
4466
// TODO - Review terms agg and fix this
45-
//Include = new TermsInclude(new[] { StateOfBeing.Stable.ToString(), StateOfBeing.VeryActive.ToString() }),
46-
Order =new []
67+
//.Include(new[] { StateOfBeing.Stable.ToString(), StateOfBeing.VeryActive.ToString() })
68+
.Order(new []
4769
{
4870
AggregateOrder.KeyAscending,
4971
AggregateOrder.CountDescending
50-
},
51-
Meta = new Dictionary<string, object> { { "foo", "bar" } }
52-
}
53-
},
54-
(v, d) => d
55-
.MatchAll()
56-
.KeepOnCompletion()
57-
.WaitForCompletionTimeout(-1)
58-
.Aggregations(a => a
59-
.Terms("states", st => st
60-
.Field(p => p.State.Suffix("keyword"))
61-
.MinDocCount(2)
62-
.Size(5)
63-
.ShardSize(100)
64-
.ExecutionHint(TermsAggregationExecutionHint.Map)
65-
//.Missing("n/a")
66-
// TODO - Review terms agg and fix this
67-
//.Include(new[] { StateOfBeing.Stable.ToString(), StateOfBeing.VeryActive.ToString() })
68-
.Order(new []
69-
{
70-
AggregateOrder.KeyAscending,
71-
AggregateOrder.CountDescending
72-
})
73-
.Meta(m => m
74-
.Add("foo", "bar")
75-
)
72+
})
73+
.Meta(m => m
74+
.Add("foo", "bar")
7675
)
77-
),
78-
(v, c, f) => c.AsyncSearch.Submit(f),
79-
(v, c, f) => c.AsyncSearch.SubmitAsync(f),
80-
(v, c, r) => c.AsyncSearch.Submit<Project>(r),
81-
(v, c, r) => c.AsyncSearch.SubmitAsync<Project>(r),
82-
onResponse: (r, values) => values.ExtendedValue("id", r.Id)
83-
)
84-
},
85-
{
86-
StatusStep, u =>
87-
u.Calls<AsyncSearchStatusRequestDescriptor, AsyncSearchStatusRequest, AsyncSearchStatusResponse>(
88-
v => new AsyncSearchStatusRequest(v),
89-
(v, d) => d,
90-
(v, c, f) => c.AsyncSearch.Status(v, f),
91-
(v, c, f) => c.AsyncSearch.StatusAsync(v, f),
92-
(v, c, r) => c.AsyncSearch.Status(r),
93-
(v, c, r) => c.AsyncSearch.StatusAsync(r),
94-
uniqueValueSelector: values => values.ExtendedValue<string>("id")
95-
)
96-
},
97-
{
98-
GetStep, u =>
99-
u.Calls<GetAsyncSearchRequestDescriptor<Project>, GetAsyncSearchRequest, GetAsyncSearchResponse<Project>>(
100-
v => new GetAsyncSearchRequest(v),
101-
(v, d) => d,
102-
(v, c, f) => c.AsyncSearch.Get(v, f),
103-
(v, c, f) => c.AsyncSearch.GetAsync(v, f),
104-
(v, c, r) => c.AsyncSearch.Get<Project>(r),
105-
(v, c, r) => c.AsyncSearch.GetAsync<Project>(r),
106-
uniqueValueSelector: values => values.ExtendedValue<string>("id")
107-
)
108-
},
109-
{
110-
DeleteStep, u =>
111-
u.Calls<DeleteAsyncSearchRequestDescriptor, DeleteAsyncSearchRequest, DeleteAsyncSearchResponse>(
112-
v => new DeleteAsyncSearchRequest(v),
113-
(v, d) => d,
114-
(v, c, f) => c.AsyncSearch.Delete(v, f),
115-
(v, c, f) => c.AsyncSearch.DeleteAsync(v, f),
116-
(v, c, r) => c.AsyncSearch.Delete(r),
117-
(v, c, r) => c.AsyncSearch.DeleteAsync(r),
118-
uniqueValueSelector: values => values.ExtendedValue<string>("id")
119-
)
120-
},
121-
})
122-
{ }
123-
124-
[I]
125-
public async Task AsyncSearchSubmitResponse() => await Assert<AsyncSearchSubmitResponse<Project>>(SubmitStep, r =>
76+
)
77+
),
78+
(v, c, f) => c.AsyncSearch.Submit(f),
79+
(v, c, f) => c.AsyncSearch.SubmitAsync(f),
80+
(v, c, r) => c.AsyncSearch.Submit<Project>(r),
81+
(v, c, r) => c.AsyncSearch.SubmitAsync<Project>(r),
82+
onResponse: (r, values) => values.ExtendedValue("id", r.Id)
83+
)
84+
},
12685
{
127-
r.ShouldBeValid();
128-
r.Id.Should().NotBeNullOrEmpty();
129-
// TODO - MORE ASSERTIONS
130-
r.Response.Should().NotBeNull();
131-
r.Response.Took.Should().BeGreaterOrEqualTo(0);
132-
});
133-
134-
[I]
135-
public async Task AsyncSearchStatusResponse() => await Assert<AsyncSearchStatusResponse>(StatusStep, r =>
86+
StatusStep, u =>
87+
u.Calls<AsyncSearchStatusRequestDescriptor, AsyncSearchStatusRequest, AsyncSearchStatusResponse>(
88+
v => new AsyncSearchStatusRequest(v),
89+
(v, d) => d,
90+
(v, c, f) => c.AsyncSearch.Status(v, f),
91+
(v, c, f) => c.AsyncSearch.StatusAsync(v, f),
92+
(v, c, r) => c.AsyncSearch.Status(r),
93+
(v, c, r) => c.AsyncSearch.StatusAsync(r),
94+
uniqueValueSelector: values => values.ExtendedValue<string>("id")
95+
)
96+
},
97+
{
98+
GetStep, u =>
99+
u.Calls<GetAsyncSearchRequestDescriptor<Project>, GetAsyncSearchRequest, GetAsyncSearchResponse<Project>>(
100+
v => new GetAsyncSearchRequest(v),
101+
(v, d) => d,
102+
(v, c, f) => c.AsyncSearch.Get(v, f),
103+
(v, c, f) => c.AsyncSearch.GetAsync(v, f),
104+
(v, c, r) => c.AsyncSearch.Get<Project>(r),
105+
(v, c, r) => c.AsyncSearch.GetAsync<Project>(r),
106+
uniqueValueSelector: values => values.ExtendedValue<string>("id")
107+
)
108+
},
136109
{
137-
r.ShouldBeValid();
138-
r.StartTimeInMillis.Should().BeGreaterThan(DateTimeOffset.UtcNow.AddMinutes(-10).ToUnixTimeMilliseconds());
139-
r.StartTimeInMillis.Should().BeLessOrEqualTo(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds());
140-
r.ExpirationTimeInMillis.Should().BeGreaterOrEqualTo(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds());
110+
DeleteStep, u =>
111+
u.Calls<DeleteAsyncSearchRequestDescriptor, DeleteAsyncSearchRequest, DeleteAsyncSearchResponse>(
112+
v => new DeleteAsyncSearchRequest(v),
113+
(v, d) => d,
114+
(v, c, f) => c.AsyncSearch.Delete(v, f),
115+
(v, c, f) => c.AsyncSearch.DeleteAsync(v, f),
116+
(v, c, r) => c.AsyncSearch.Delete(r),
117+
(v, c, r) => c.AsyncSearch.DeleteAsync(r),
118+
uniqueValueSelector: values => values.ExtendedValue<string>("id")
119+
)
120+
},
121+
})
122+
{ }
123+
124+
[I]
125+
public async Task AsyncSearchSubmitResponse() => await Assert<AsyncSearchSubmitResponse<Project>>(SubmitStep, r =>
126+
{
127+
r.ShouldBeValid();
128+
r.Id.Should().NotBeNullOrEmpty();
129+
r.Response.Should().NotBeNull();
130+
r.Response.Took.Should().BeGreaterOrEqualTo(0);
131+
});
141132

142-
if (r.IsRunning)
143-
r.CompletionStatus.HasValue.Should().BeFalse();
144-
else
145-
r.CompletionStatus?.Should().Be(200);
133+
[I]
134+
public async Task AsyncSearchStatusResponse() => await Assert<AsyncSearchStatusResponse>(StatusStep, r =>
135+
{
136+
r.ShouldBeValid();
137+
r.StartTimeInMillis.Should().BeGreaterThan(DateTimeOffset.UtcNow.AddMinutes(-10).ToUnixTimeMilliseconds());
138+
r.StartTimeInMillis.Should().BeLessOrEqualTo(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds());
139+
r.ExpirationTimeInMillis.Should().BeGreaterOrEqualTo(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds());
146140

147-
r.Shards.Total.Should().BeGreaterOrEqualTo(1);
148-
});
141+
if (r.IsRunning)
142+
r.CompletionStatus.HasValue.Should().BeFalse();
143+
else
144+
r.CompletionStatus?.Should().Be(200);
149145

150-
[I]
151-
public async Task AsyncSearchGetResponse() => await Assert<GetAsyncSearchResponse<Project>>(GetStep, (s, r) =>
152-
{
153-
r.ShouldBeValid();
154-
r.Id.Should().NotBeNullOrEmpty();
155-
r.StartTimeInMillis.Should().BeGreaterThan(DateTimeOffset.UtcNow.AddMinutes(-10).ToUnixTimeMilliseconds());
156-
r.StartTimeInMillis.Should().BeLessOrEqualTo(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds());
157-
r.ExpirationTimeInMillis.Should().BeGreaterOrEqualTo(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds());
158-
r.Response.Should().NotBeNull();
159-
r.Response.Took.Should().BeGreaterOrEqualTo(0);
160-
r.Response.Hits.Should().HaveCount(10);
161-
var terms = r.Response.Aggregations.GetTerms("states");
162-
terms.Should().NotBeNull();
163-
});
146+
r.Shards.Total.Should().BeGreaterOrEqualTo(1);
147+
});
164148

165-
[I]
166-
public async Task AsyncSearchDeleteResponse() => await Assert<DeleteAsyncSearchResponse>(DeleteStep, r =>
167-
{
168-
r.ShouldBeValid();
169-
r.Acknowledged.Should().BeTrue();
170-
});
171-
}
149+
[I]
150+
public async Task AsyncSearchGetResponse() => await Assert<GetAsyncSearchResponse<Project>>(GetStep, (s, r) =>
151+
{
152+
r.ShouldBeValid();
153+
r.Id.Should().NotBeNullOrEmpty();
154+
r.StartTimeInMillis.Should().BeGreaterThan(DateTimeOffset.UtcNow.AddMinutes(-10).ToUnixTimeMilliseconds());
155+
r.StartTimeInMillis.Should().BeLessOrEqualTo(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds());
156+
r.ExpirationTimeInMillis.Should().BeGreaterOrEqualTo(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds());
157+
r.Response.Should().NotBeNull();
158+
r.Response.Took.Should().BeGreaterOrEqualTo(0);
159+
r.Response.Hits.Should().HaveCount(10);
160+
var terms = r.Response.Aggregations.GetTerms("states");
161+
terms.Should().NotBeNull();
162+
});
163+
164+
[I]
165+
public async Task AsyncSearchDeleteResponse() => await Assert<DeleteAsyncSearchResponse>(DeleteStep, r =>
166+
{
167+
r.ShouldBeValid();
168+
r.Acknowledged.Should().BeTrue();
169+
});
172170
}

0 commit comments

Comments
 (0)