refactors
This commit is contained in:
@@ -17,10 +17,9 @@ internal static class WebSocketFixtureLoader
|
||||
var root = document.RootElement;
|
||||
|
||||
var session = root.GetProperty("session");
|
||||
var steps = new List<WebSocketFixtureStep>();
|
||||
foreach (var stepElement in root.GetProperty("steps").EnumerateArray())
|
||||
{
|
||||
steps.Add(new WebSocketFixtureStep
|
||||
var steps = root.GetProperty("steps")
|
||||
.EnumerateArray()
|
||||
.Select(stepElement => new WebSocketFixtureStep
|
||||
{
|
||||
Message = new WebSocketMessageEnvelope
|
||||
{
|
||||
@@ -33,16 +32,15 @@ internal static class WebSocketFixtureLoader
|
||||
? binary.EnumerateArray().Select(item => (byte)item.GetInt32()).ToArray()
|
||||
: null
|
||||
},
|
||||
ExpectedReplyTypes = stepElement.GetProperty("expectedReplyTypes")
|
||||
ExpectedReplyTypes = [.. stepElement.GetProperty("expectedReplyTypes")
|
||||
.EnumerateArray()
|
||||
.Select(item => item.GetString() ?? string.Empty)
|
||||
.Where(item => !string.IsNullOrWhiteSpace(item))
|
||||
.ToArray(),
|
||||
.Where(item => !string.IsNullOrWhiteSpace(item))],
|
||||
ExpectedReplies = stepElement.TryGetProperty("expectedReplies", out var expectedReplies) && expectedReplies.ValueKind == JsonValueKind.Array
|
||||
? JsonSerializer.Deserialize<List<ExpectedWebSocketReply>>(expectedReplies.GetRawText(), SerializerOptions) ?? []
|
||||
: []
|
||||
});
|
||||
}
|
||||
})
|
||||
.ToList();
|
||||
|
||||
return new WebSocketFixture
|
||||
{
|
||||
|
||||
@@ -16,18 +16,18 @@ public sealed class FileTurnTelemetrySinkTests
|
||||
sttStrategySelector.Setup(s => s.SelectAsync(It.IsAny<TurnContext>(), It.IsAny<CancellationToken>()))
|
||||
.ThrowsAsync(new Exception("dummy"));
|
||||
|
||||
var turnService = new WebSocketTurnFinalizationService(
|
||||
new ProtocolToTurnContextMapper(),
|
||||
Mock.Of<IConversationBroker>(),
|
||||
new ResponsePlanToSocketMessagesMapper(),
|
||||
var turnService = new WebSocketTurnFinalizationService(Mock.Of<IConversationBroker>(),
|
||||
sttStrategySelector.Object,
|
||||
sink.Object
|
||||
);
|
||||
|
||||
await turnService.HandleTurnAsync(new CloudSession() { TurnState = { BufferedAudioBytes = 100 }}, new WebSocketMessageEnvelope(), "dummy",
|
||||
await turnService.HandleTurnAsync(new CloudSession { TurnState = { BufferedAudioBytes = 100 } },
|
||||
new WebSocketMessageEnvelope(), "dummy",
|
||||
CancellationToken.None);
|
||||
|
||||
sink.Verify(s => s.RecordTranscriptError(It.IsAny<Exception>(), It.IsAny<string>(), It.IsAny<CancellationToken>()), Times.Once());
|
||||
sink.Verify(
|
||||
s => s.RecordTranscriptError(It.IsAny<Exception>(), It.IsAny<string>(), It.IsAny<CancellationToken>()),
|
||||
Times.Once());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -38,21 +38,23 @@ public sealed class FileTurnTelemetrySinkTests
|
||||
sttStrategySelector.Setup(s => s.SelectAsync(It.IsAny<TurnContext>(), It.IsAny<CancellationToken>()))
|
||||
.ThrowsAsync(new InvalidOperationException("ffmpeg failed"));
|
||||
|
||||
var turnService = new WebSocketTurnFinalizationService(
|
||||
new ProtocolToTurnContextMapper(),
|
||||
Mock.Of<IConversationBroker>(),
|
||||
new ResponsePlanToSocketMessagesMapper(),
|
||||
var turnService = new WebSocketTurnFinalizationService(Mock.Of<IConversationBroker>(),
|
||||
sttStrategySelector.Object,
|
||||
sink.Object
|
||||
);
|
||||
|
||||
var session = new CloudSession();
|
||||
session.TurnState.AwaitingTurnCompletion = true;
|
||||
session.TurnState.SawListen = true;
|
||||
session.TurnState.SawContext = true;
|
||||
session.TurnState.BufferedAudioBytes = 12000;
|
||||
session.TurnState.BufferedAudioChunkCount = 5;
|
||||
session.TurnState.FirstAudioReceivedUtc = DateTimeOffset.UtcNow - TimeSpan.FromSeconds(2);
|
||||
var session = new CloudSession
|
||||
{
|
||||
TurnState =
|
||||
{
|
||||
AwaitingTurnCompletion = true,
|
||||
SawListen = true,
|
||||
SawContext = true,
|
||||
BufferedAudioBytes = 12000,
|
||||
BufferedAudioChunkCount = 5,
|
||||
FirstAudioReceivedUtc = DateTimeOffset.UtcNow - TimeSpan.FromSeconds(2)
|
||||
}
|
||||
};
|
||||
|
||||
var replies = await turnService.HandleContextAsync(
|
||||
session,
|
||||
@@ -64,6 +66,8 @@ public sealed class FileTurnTelemetrySinkTests
|
||||
Assert.Equal(12000, session.TurnState.BufferedAudioBytes);
|
||||
Assert.Equal("ffmpeg failed", session.TurnState.LastSttError);
|
||||
|
||||
sink.Verify(s => s.RecordTranscriptError(It.IsAny<Exception>(), It.IsAny<string>(), It.IsAny<CancellationToken>()), Times.Once());
|
||||
sink.Verify(
|
||||
s => s.RecordTranscriptError(It.IsAny<Exception>(), It.IsAny<string>(), It.IsAny<CancellationToken>()),
|
||||
Times.Once());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,11 +16,9 @@ public sealed class JiboWebSocketServiceTests
|
||||
public JiboWebSocketServiceTests()
|
||||
{
|
||||
_store = new InMemoryCloudStateStore();
|
||||
var turnContextMapper = new ProtocolToTurnContextMapper();
|
||||
var contentRepository = new InMemoryJiboExperienceContentRepository();
|
||||
var contentCache = new JiboExperienceContentCache(contentRepository);
|
||||
var conversationBroker = new DemoConversationBroker(new JiboInteractionService(contentCache, new DefaultJiboRandomizer()));
|
||||
var replyMapper = new ResponsePlanToSocketMessagesMapper();
|
||||
var sttSelector = new DefaultSttStrategySelector(
|
||||
[
|
||||
new SyntheticBufferedAudioSttStrategy()
|
||||
@@ -30,10 +28,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
_service = new JiboWebSocketService(
|
||||
_store,
|
||||
new NullWebSocketTelemetrySink(),
|
||||
new WebSocketTurnFinalizationService(
|
||||
turnContextMapper,
|
||||
conversationBroker,
|
||||
replyMapper,
|
||||
new WebSocketTurnFinalizationService(conversationBroker,
|
||||
sttSelector,
|
||||
sink));
|
||||
}
|
||||
@@ -2639,7 +2634,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-context-reset-token",
|
||||
Binary = [9, 9, 9, 9]
|
||||
Binary = "\t\t\t\t"u8.ToArray()
|
||||
});
|
||||
|
||||
var session = _store.FindSessionByToken("hub-context-reset-token");
|
||||
@@ -2681,26 +2676,24 @@ public sealed class JiboWebSocketServiceTests
|
||||
var actualTypes = replies.Select(ReadReplyType).ToArray();
|
||||
Assert.Equal(step.ExpectedReplyTypes, actualTypes);
|
||||
|
||||
if (step.ExpectedReplies.Count > 0)
|
||||
if (step.ExpectedReplies.Count <= 0) continue;
|
||||
|
||||
Assert.Equal(replies.Count, step.ExpectedReplies.Count);
|
||||
|
||||
for (var index = 0; index < step.ExpectedReplies.Count; index += 1)
|
||||
{
|
||||
Assert.Equal(replies.Count, step.ExpectedReplies.Count);
|
||||
var expectedReply = step.ExpectedReplies[index];
|
||||
Assert.Equal(expectedReply.Type, actualTypes[index]);
|
||||
|
||||
for (var index = 0; index < step.ExpectedReplies.Count; index += 1)
|
||||
if (expectedReply.DelayMs.HasValue)
|
||||
{
|
||||
var expectedReply = step.ExpectedReplies[index];
|
||||
Assert.Equal(expectedReply.Type, actualTypes[index]);
|
||||
|
||||
if (expectedReply.DelayMs.HasValue)
|
||||
{
|
||||
Assert.Equal(expectedReply.DelayMs.Value, replies[index].DelayMs);
|
||||
}
|
||||
|
||||
if (expectedReply.JsonSubset is { ValueKind: JsonValueKind.Object } jsonSubset)
|
||||
{
|
||||
using var actualPayload = JsonDocument.Parse(replies[index].Text!);
|
||||
AssertJsonContains(jsonSubset, actualPayload.RootElement);
|
||||
}
|
||||
Assert.Equal(expectedReply.DelayMs.Value, replies[index].DelayMs);
|
||||
}
|
||||
|
||||
if (expectedReply.JsonSubset is not { ValueKind: JsonValueKind.Object } jsonSubset) continue;
|
||||
|
||||
using var actualPayload = JsonDocument.Parse(replies[index].Text!);
|
||||
AssertJsonContains(jsonSubset, actualPayload.RootElement);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2709,6 +2702,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
{
|
||||
Assert.Equal(expected.ValueKind, actual.ValueKind);
|
||||
|
||||
// ReSharper disable once SwitchStatementHandlesSomeKnownEnumValuesWithDefault
|
||||
switch (expected.ValueKind)
|
||||
{
|
||||
case JsonValueKind.Object:
|
||||
|
||||
@@ -158,14 +158,14 @@ public sealed class LocalWhisperCppBufferedAudioSttStrategyTests
|
||||
{
|
||||
Calls.Add((fileName, arguments));
|
||||
|
||||
if (string.Equals(fileName, "ffmpeg", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var outputPath = arguments[^1];
|
||||
File.WriteAllBytes(outputPath, "RIFF"u8);
|
||||
return Task.FromResult(new ExternalProcessResult(0, string.Empty, string.Empty));
|
||||
}
|
||||
if (!string.Equals(fileName, "ffmpeg", StringComparison.OrdinalIgnoreCase))
|
||||
return Task.FromResult(new ExternalProcessResult(0, "[00:00:00.000 --> 00:00:01.000] tell me a joke",
|
||||
string.Empty));
|
||||
|
||||
var outputPath = arguments[^1];
|
||||
File.WriteAllBytes(outputPath, "RIFF"u8);
|
||||
return Task.FromResult(new ExternalProcessResult(0, string.Empty, string.Empty));
|
||||
|
||||
return Task.FromResult(new ExternalProcessResult(0, "[00:00:00.000 --> 00:00:01.000] tell me a joke", string.Empty));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user