Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
255 changes: 255 additions & 0 deletions Deepgram.Tests/UnitTests/ClientTests/AgentClientTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -389,4 +389,259 @@ public void Agent_Should_Not_Have_MipOptOut_Property()
}

#endregion

#region Tags Tests

[Test]
public void SettingsSchema_Tags_Should_Have_Default_Value_Null()
{
// Arrange & Act
var settings = new SettingsSchema();

// Assert
using (new AssertionScope())
{
settings.Tags.Should().BeNull();
}
}

[Test]
public void SettingsSchema_Tags_Should_Be_Settable()
{
// Arrange & Act
var settings = new SettingsSchema
{
Tags = new List<string> { "test", "demo", "agent" }
};

// Assert
using (new AssertionScope())
{
settings.Tags.Should().NotBeNull();
settings.Tags.Should().HaveCount(3);
settings.Tags.Should().Contain("test");
settings.Tags.Should().Contain("demo");
settings.Tags.Should().Contain("agent");
}
}

[Test]
public void SettingsSchema_Tags_Should_Serialize_To_Json_Array()
{
// Arrange
var settings = new SettingsSchema
{
Tags = new List<string> { "production", "voice-bot", "customer-service" }
};

// Act
var result = settings.ToString();

// Assert
using (new AssertionScope())
{
result.Should().NotBeNull();
result.Should().Contain("tags");
result.Should().Contain("[");
result.Should().Contain("]");
result.Should().Contain("production");
result.Should().Contain("voice-bot");
result.Should().Contain("customer-service");

// Verify it's valid JSON by parsing it
var parsed = JsonDocument.Parse(result);
var tagsArray = parsed.RootElement.GetProperty("tags");
tagsArray.ValueKind.Should().Be(JsonValueKind.Array);
tagsArray.GetArrayLength().Should().Be(3);

var tagsList = new List<string>();
foreach (var tag in tagsArray.EnumerateArray())
{
tagsList.Add(tag.GetString()!);
}
tagsList.Should().Contain("production");
tagsList.Should().Contain("voice-bot");
tagsList.Should().Contain("customer-service");
}
}

[Test]
public void SettingsSchema_Tags_Empty_List_Should_Serialize_As_Empty_Array()
{
// Arrange
var settings = new SettingsSchema
{
Tags = new List<string>()
};

// Act
var result = settings.ToString();

// Assert
using (new AssertionScope())
{
result.Should().NotBeNull();
result.Should().Contain("tags");
result.Should().Contain("[]");

// Verify it's valid JSON by parsing it
var parsed = JsonDocument.Parse(result);
var tagsArray = parsed.RootElement.GetProperty("tags");
tagsArray.ValueKind.Should().Be(JsonValueKind.Array);
tagsArray.GetArrayLength().Should().Be(0);
}
}

[Test]
public void SettingsSchema_Tags_Null_Should_Not_Serialize()
{
// Arrange
var settings = new SettingsSchema
{
Tags = null
};

// Act
var result = settings.ToString();

// Assert
using (new AssertionScope())
{
result.Should().NotBeNull();
result.Should().NotContain("tags");

// Verify it's valid JSON by parsing it
var parsed = JsonDocument.Parse(result);
parsed.RootElement.TryGetProperty("tags", out _).Should().BeFalse();
}
}

[Test]
public void SettingsSchema_With_Tags_Should_Serialize_With_Other_Properties()
{
// Arrange
var settings = new SettingsSchema
{
Experimental = true,
MipOptOut = true,
Tags = new List<string> { "test-tag", "integration" }
};

// Act
var result = settings.ToString();

// Assert
using (new AssertionScope())
{
result.Should().NotBeNull();
result.Should().Contain("experimental");
result.Should().Contain("mip_opt_out");
result.Should().Contain("tags");

// Verify it's valid JSON by parsing it
var parsed = JsonDocument.Parse(result);
parsed.RootElement.GetProperty("experimental").GetBoolean().Should().BeTrue();
parsed.RootElement.GetProperty("mip_opt_out").GetBoolean().Should().BeTrue();

var tagsArray = parsed.RootElement.GetProperty("tags");
tagsArray.ValueKind.Should().Be(JsonValueKind.Array);
tagsArray.GetArrayLength().Should().Be(2);
}
}

[Test]
public void SettingsSchema_Tags_Should_Support_Special_Characters()
{
// Arrange
var settings = new SettingsSchema
{
Tags = new List<string> { "test-with-dashes", "test_with_underscores", "test with spaces", "test.with.dots" }
};

// Act
var result = settings.ToString();

// Assert
using (new AssertionScope())
{
result.Should().NotBeNull();

// Verify it's valid JSON by parsing it
var parsed = JsonDocument.Parse(result);
var tagsArray = parsed.RootElement.GetProperty("tags");
tagsArray.ValueKind.Should().Be(JsonValueKind.Array);
tagsArray.GetArrayLength().Should().Be(4);

var tagsList = new List<string>();
foreach (var tag in tagsArray.EnumerateArray())
{
tagsList.Add(tag.GetString()!);
}
tagsList.Should().Contain("test-with-dashes");
tagsList.Should().Contain("test_with_underscores");
tagsList.Should().Contain("test with spaces");
tagsList.Should().Contain("test.with.dots");
}
}

[Test]
public void SettingsSchema_Tags_Schema_Should_Match_API_Specification()
{
// Arrange - Test various scenarios as per API specification
var settingsWithTags = new SettingsSchema { Tags = new List<string> { "search-filter", "analytics", "production" } };
var settingsWithoutTags = new SettingsSchema { Tags = null };
var settingsWithEmptyTags = new SettingsSchema { Tags = new List<string>() };

// Act
var withTagsResult = settingsWithTags.ToString();
var withoutTagsResult = settingsWithoutTags.ToString();
var emptyTagsResult = settingsWithEmptyTags.ToString();

// Assert
using (new AssertionScope())
{
// With tags should serialize array
var withTagsParsed = JsonDocument.Parse(withTagsResult);
var tagsArray = withTagsParsed.RootElement.GetProperty("tags");
tagsArray.ValueKind.Should().Be(JsonValueKind.Array);
tagsArray.GetArrayLength().Should().Be(3);

// Without tags should not include tags property
var withoutTagsParsed = JsonDocument.Parse(withoutTagsResult);
withoutTagsParsed.RootElement.TryGetProperty("tags", out _).Should().BeFalse();

// Empty tags should serialize as empty array
var emptyTagsParsed = JsonDocument.Parse(emptyTagsResult);
var emptyTagsArray = emptyTagsParsed.RootElement.GetProperty("tags");
emptyTagsArray.ValueKind.Should().Be(JsonValueKind.Array);
emptyTagsArray.GetArrayLength().Should().Be(0);
}
}

[Test]
public void Agent_Should_Not_Have_Tags_Property()
{
// Arrange
var agent = new Agent
{
Language = "en",
Greeting = "Hello, I'm your agent"
};

// Act
var result = agent.ToString();

// Assert
using (new AssertionScope())
{
result.Should().NotBeNull();
result.Should().NotContain("tags");

// Verify it's valid JSON by parsing it
var parsed = JsonDocument.Parse(result);
parsed.RootElement.TryGetProperty("tags", out _).Should().BeFalse();
}
}

#endregion
}
7 changes: 7 additions & 0 deletions Deepgram/Models/Agent/v2/WebSocket/Settings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ public class SettingsSchema
[JsonPropertyName("experimental")]
public bool? Experimental { get; set; }

/// <summary>
/// Tags to associate with the request.
/// </summary>
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("tags")]
public List<string>? Tags { get; set; }

/// <summary>
/// To opt out of Deepgram Model Improvement Program
/// </summary>
Expand Down
Loading
Loading