Skip to content

Commit e6cad63

Browse files
committed
NCO-58: Add more functional testing
- Add scope-level streaming and blocking tests for the sync API - Add scope-level end-to-end test for the async API (start→poll→fetch) - Add async metadata verification test at cluster level - Provision bare dataverse in CI workflow for scope-level queries
1 parent 069e628 commit e6cad63

5 files changed

Lines changed: 143 additions & 0 deletions

File tree

.github/workflows/functional-tests.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,15 @@ jobs:
179179
EOF
180180
echo "settings.json written:" && cat tests/Couchbase.Analytics.FunctionalTests/settings.json
181181
182+
- name: Create test dataverse for scope-level queries
183+
run: |
184+
echo "Creating test dataverse testdb.testscope for scope-level functional tests"
185+
curl -sSf -k -u "${CBDINO_USER}:${CBDINO_PASS}" \
186+
"${CBDINO_CONNSTR}/api/v1/request" \
187+
--data-urlencode 'statement=CREATE DATAVERSE testdb.testscope IF NOT EXISTS;'
188+
echo ""
189+
echo "Dataverse created successfully"
190+
182191
- name: Build and Run Functional Tests
183192
run: |
184193
dotnet test tests/Couchbase.Analytics.FunctionalTests/Couchbase.Analytics.FunctionalTests.csproj \

tests/Couchbase.Analytics.FunctionalTests/AsyncAnalyticsTests.cs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,94 @@ await Assert.ThrowsAsync<QueryNotFoundException>(async () =>
144144
await resultHandle.FetchResultsAsync(new FetchResultsOptions());
145145
});
146146
}
147+
148+
[Fact]
149+
public async Task Test_AsyncAnalytics_EndToEnd_Scope()
150+
{
151+
var statement = "select i from array_range(1, 10) as i;";
152+
var queryOptions = new StartQueryOptions()
153+
{
154+
QueryTimeout = TimeSpan.FromSeconds(30)
155+
};
156+
157+
// 1. Start the query via scope
158+
var handle = await _simpleFixture.TestScope.StartQueryAsync(statement, queryOptions);
159+
Assert.NotNull(handle);
160+
161+
// 2. Poll for the query status
162+
QueryStatus? queryStatus = null;
163+
for (var i = 0; i < 20; i++)
164+
{
165+
queryStatus = await handle.FetchStatusAsync(new FetchStatusOptions());
166+
if (queryStatus.ResultsReady)
167+
{
168+
break;
169+
}
170+
await Task.Delay(500);
171+
}
172+
173+
Assert.NotNull(queryStatus);
174+
Assert.True(queryStatus!.ResultsReady);
175+
176+
// 3. Fetch results
177+
var resultHandle = queryStatus.ResultHandle();
178+
Assert.NotNull(resultHandle);
179+
180+
var results = await resultHandle.FetchResultsAsync(new FetchResultsOptions());
181+
Assert.NotNull(results);
182+
183+
var count = 0;
184+
await foreach (var row in results.Rows)
185+
{
186+
count++;
187+
}
188+
189+
Assert.Equal(9, count);
190+
Assert.Equal(9, results.MetaData.Metrics?.ResultCount);
191+
}
192+
193+
[Fact]
194+
public async Task Test_AsyncAnalytics_Metadata_Cluster()
195+
{
196+
var statement = "select i from array_range(1, 100) as i;";
197+
var queryOptions = new StartQueryOptions()
198+
{
199+
QueryTimeout = TimeSpan.FromSeconds(30)
200+
};
201+
202+
var handle = await _simpleFixture.Cluster.StartQueryAsync(statement, queryOptions);
203+
Assert.NotNull(handle);
204+
205+
QueryStatus? queryStatus = null;
206+
for (var i = 0; i < 20; i++)
207+
{
208+
queryStatus = await handle.FetchStatusAsync(new FetchStatusOptions());
209+
_outputHelper.WriteLine($"Status: {queryStatus}");
210+
if (queryStatus.ResultsReady)
211+
{
212+
break;
213+
}
214+
await Task.Delay(500);
215+
}
216+
217+
Assert.NotNull(queryStatus);
218+
Assert.True(queryStatus!.ResultsReady);
219+
220+
var resultHandle = queryStatus.ResultHandle();
221+
var results = await resultHandle.FetchResultsAsync(new FetchResultsOptions());
222+
223+
// Consume all rows
224+
var count = 0;
225+
await foreach (var row in results.Rows)
226+
{
227+
count++;
228+
}
229+
230+
// Verify metrics
231+
Assert.NotNull(results.MetaData);
232+
Assert.NotNull(results.MetaData.Metrics);
233+
Assert.Equal(99, results.MetaData.Metrics!.ResultCount);
234+
Assert.NotNull(results.MetaData.Metrics.ElapsedTime);
235+
Assert.NotNull(results.MetaData.Metrics.ExecutionTime);
236+
}
147237
}

tests/Couchbase.Analytics.FunctionalTests/Fixtures/FixtureSettings.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,10 @@ public class FixtureSettings
3636

3737
[JsonPropertyName("ClientKeyPath2")]
3838
public string? ClientKeyPath2 { get; set; }
39+
40+
[JsonPropertyName("TestDatabase")]
41+
public string TestDatabase { get; set; } = "testdb";
42+
43+
[JsonPropertyName("TestScope")]
44+
public string TestScope { get; set; } = "testscope";
3945
}

tests/Couchbase.Analytics.FunctionalTests/Fixtures/SimpleFixture.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public SimpleFixture()
2020

2121
public Credential Credential { get; private set; }
2222

23+
public Scope TestScope => Cluster.Database(FixtureSettings.TestDatabase).Scope(FixtureSettings.TestScope);
24+
2325
public string CapellaCaCert =
2426
"-----BEGIN CERTIFICATE-----\n" +
2527
"MIIFWzCCA0OgAwIBAgIBATANBgkqhkiG9w0BAQsFADA4MTYwNAYDVQQDEy1kaW5v\n" +

tests/Couchbase.Analytics.FunctionalTests/Internal/AnalyticsServiceTests.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,4 +153,40 @@ public async Task Test_Cancellation_Works_Blocking()
153153

154154
await Assert.ThrowsAsync<AnalyticsTimeoutException>(async () => await task.ConfigureAwait(false));
155155
}
156+
157+
[Fact]
158+
public async Task Test_Streaming_Query_Scope()
159+
{
160+
var statement = "select i from array_range(1, 10) as i;";
161+
162+
var result = await _simpleFixture.TestScope.ExecuteQueryAsync(statement,
163+
new QueryOptions() { Timeout = TimeSpan.FromSeconds(10), AsStreaming = true });
164+
165+
var count = 0;
166+
await foreach (var row in result.Rows)
167+
{
168+
count++;
169+
}
170+
171+
Assert.Equal(9, count);
172+
Assert.Equal(9, result.MetaData.Metrics!.ResultCount);
173+
}
174+
175+
[Fact]
176+
public async Task Test_Blocking_Query_Scope()
177+
{
178+
var statement = "select i from array_range(1, 10) as i;";
179+
180+
var result = await _simpleFixture.TestScope.ExecuteQueryAsync(statement,
181+
new QueryOptions() { Timeout = TimeSpan.FromSeconds(10), AsStreaming = false });
182+
183+
var count = 0;
184+
await foreach (var row in result.Rows)
185+
{
186+
count++;
187+
}
188+
189+
Assert.Equal(9, count);
190+
Assert.Equal(9, result.MetaData.Metrics!.ResultCount);
191+
}
156192
}

0 commit comments

Comments
 (0)