// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System.Text.Json.Nodes;
using Microsoft.Teams.Core.Schema;
namespace Microsoft.Teams.Core.UnitTests.Schema;
public class EntitiesTest
{
[Fact]
public void Test_Entity_Deserialization()
{
string json = """
{
"type": "message",
"entities": [
{
"type": "mention",
"mentioned": {
"id": "user1",
"name": "User One"
},
"text": "User One"
}
]
}
""";
CoreActivity activity = CoreActivity.FromJsonString(json);
Assert.NotNull(activity);
Assert.True(activity.Properties.ContainsKey("entities"));
JsonElement entitiesElement = Assert.IsType(activity.Properties["entities"]);
Assert.Equal(JsonValueKind.Array, entitiesElement.ValueKind);
Assert.Equal(1, entitiesElement.GetArrayLength());
JsonElement e1 = entitiesElement[0];
Assert.Equal("mention", e1.GetProperty("type").GetString());
Assert.True(e1.TryGetProperty("mentioned", out JsonElement mentioned));
Assert.True(mentioned.TryGetProperty("id", out _));
Assert.Equal("user1", mentioned.GetProperty("id").GetString());
Assert.Equal("User One", mentioned.GetProperty("name").GetString());
Assert.Equal("User One", e1.GetProperty("text").GetString());
}
[Fact]
public void Entitiy_Serialization()
{
JsonNodeOptions nops = new()
{
PropertyNameCaseInsensitive = false
};
CoreActivity activity = new(ActivityType.Message);
JsonObject mentionEntity = new()
{
["type"] = "mention",
["mentioned"] = new JsonObject
{
["id"] = "user1",
["name"] = "UserOne"
},
["text"] = "User One"
};
activity.Properties["entities"] = new JsonArray(nops, mentionEntity);
string json = activity.ToJson();
Assert.NotNull(json);
Assert.Contains("\"type\": \"mention\"", json);
Assert.Contains("\"id\": \"user1\"", json);
Assert.Contains("\"name\": \"UserOne\"", json);
Assert.Contains("\"text\": \"\\u003Cat\\u003EUser One\\u003C/at\\u003E\"", json);
}
[Fact]
public void Entity_RoundTrip()
{
string json = """
{
"type": "message",
"entities": [
{
"type": "mention",
"mentioned": {
"id": "user1",
"name": "User One"
},
"text": "User One"
}
]
}
""";
CoreActivity activity = CoreActivity.FromJsonString(json);
string serialized = activity.ToJson();
Assert.NotNull(serialized);
Assert.Contains("\"type\": \"mention\"", serialized);
Assert.Contains("\"id\": \"user1\"", serialized);
Assert.Contains("\"name\": \"User One\"", serialized);
Assert.Contains("\"text\": \"\\u003Cat\\u003EUser One\\u003C/at\\u003E\"", serialized);
}
[Fact]
public void Test_Unknown_Entity()
{
string json = """
{
"type": "message",
"entities": [
{
"type": "unknownEntityType",
"someProperty": "someValue"
}
]
}
""";
CoreActivity activity = CoreActivity.FromJsonString(json);
Assert.NotNull(activity);
Assert.True(activity.Properties.ContainsKey("entities"));
JsonElement entitiesElement = Assert.IsType(activity.Properties["entities"]);
Assert.Equal(JsonValueKind.Array, entitiesElement.ValueKind);
Assert.Equal(1, entitiesElement.GetArrayLength());
JsonElement e1 = entitiesElement[0];
Assert.Equal("unknownEntityType", e1.GetProperty("type").GetString());
Assert.Equal("someValue", e1.GetProperty("someProperty").GetString());
}
}