Skip to content
Open
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
107 changes: 107 additions & 0 deletions TencentCloud.Tests/CommonClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,5 +162,112 @@ private TencentCloud.Common.CommonClient CreateClient()
return new TencentCloud.Common.CommonClient(
"cvm", "2017-03-12", cred, "ap-guangzhou", clientProfile);
}

[JsonConverter(typeof(Converter))]
public class CustomSSEResponse : AbstractSSEModel
{
public string Response;

private class Converter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
var resp = new CustomSSEResponse();
var jObject = JObject.Load(reader);
resp.Response = jObject.ToString();
return resp;
}

public override bool CanConvert(Type objectType)
{
return objectType == typeof(CustomSSEResponse);
}
}
}

[TestMethod]
public void TestSSEStream()
{
var mod = "hunyuan";
var ver = "2023-09-01";
var act = "ChatCompletions";
var region = "";
var endpoint = "hunyuan.tencentcloudapi.com";

var cred = new Credential
{
SecretId = Environment.GetEnvironmentVariable("TENCENTCLOUD_SECRET_ID"),
SecretKey = Environment.GetEnvironmentVariable("TENCENTCLOUD_SECRET_KEY"),
};

var hpf = new HttpProfile
{
ReqMethod = "POST",
Endpoint = endpoint,
};
var cpf = new ClientProfile(ClientProfile.SIGN_TC3SHA256, hpf);

var client = new TencentCloud.Common.CommonClient(mod, ver, cred, region, cpf);
var param = new Dictionary<string, object>
{
{ "Model", "hunyuan-standard" },
{
"Messages",
new object[] { new Dictionary<string, string> { { "Role", "user" }, { "Content", "hi" } } }
},
{ "Stream", true },
};

var req = new CommonRequest(param);
var resp = client.CallAsync<CustomSSEResponse>(req, act).Result;
Assert.IsTrue(resp.IsStream);
foreach (var e in resp)
Console.WriteLine(e.Data);
}

[TestMethod]
public void TestSSENonStream()
{
var mod = "hunyuan";
var ver = "2023-09-01";
var act = "ChatCompletions";
var region = "";
var endpoint = "hunyuan.tencentcloudapi.com";

var cred = new Credential
{
SecretId = Environment.GetEnvironmentVariable("TENCENTCLOUD_SECRET_ID"),
SecretKey = Environment.GetEnvironmentVariable("TENCENTCLOUD_SECRET_KEY"),
};

var hpf = new HttpProfile
{
ReqMethod = "POST",
Endpoint = endpoint,
};
var cpf = new ClientProfile(ClientProfile.SIGN_TC3SHA256, hpf);

var client = new TencentCloud.Common.CommonClient(mod, ver, cred, region, cpf);
var param = new Dictionary<string, object>
{
{ "Model", "hunyuan-standard" },
{
"Messages",
new object[] { new Dictionary<string, string> { { "Role", "user" }, { "Content", "hi" } } }
},
{ "Stream", false },
};

var req = new CommonRequest(param);
var resp = client.CallAsync<CustomSSEResponse>(req, act).Result;
Assert.IsFalse(resp.IsStream);
Console.WriteLine(resp.Response);
}
}
}
160 changes: 160 additions & 0 deletions TencentCloud.Tests/SerializeTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using TencentCloud.Common;
using TencentCloud.Common.Profile;
using TencentCloud.Cvm.V20170312;
using TencentCloud.Cvm.V20170312.Models;
using TencentCloud.Sms.V20210111;
using TencentCloud.Sms.V20210111.Models;

namespace TencentCloud.Tests
{
[TestClass]
public class SerializeTest
{
public class CustomContractResolver : DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
return propertyName.ToLower();
}
}

[TestMethod]
public void TestSerializeUnaffectedByDefaultSettings()
{
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
ContractResolver = new CustomContractResolver(),
};

var req = new SendSmsRequest();
req.PhoneNumberSet = new[] { "test-number" };
req.SmsSdkAppId = "test-app-id";
req.TemplateId = "test-template-id";
req.ExtendCode = null;

var s = AbstractModel.ToJsonString(req);

Assert.IsTrue(s.Contains("PhoneNumberSet"));
Assert.IsTrue(s.Contains("SmsSdkAppId"));
Assert.IsTrue(s.Contains("TemplateId"));
Assert.IsFalse(s.Contains("ExtendCode"));

Assert.IsFalse(s.Contains("phonenumberset"));
Assert.IsFalse(s.Contains("smssdkappid"));
Assert.IsFalse(s.Contains("templateid"));
Assert.IsFalse(s.Contains("extendcode"));
}

[TestMethod]
public void TestCommonSerializeUnaffectedByDefaultSettings()
{
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
ContractResolver = new CustomContractResolver(),
};

var req = new CommonRequest("{\"FieldA\": 0,\"FieldB\": null}");
var s = req.Serialize();

Assert.IsTrue(s.Contains("FieldA"));
Assert.IsFalse(s.Contains("fielda"));

Assert.IsTrue(s.Contains("FieldB"));
Assert.IsFalse(s.Contains("fielda"));
}

[TestMethod]
public void TestApiSerializeUnaffectedByDefaultSettings()
{
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
ContractResolver = new CustomContractResolver(),
};

var cred = new Credential
{
SecretId = Environment.GetEnvironmentVariable("TENCENTCLOUD_SECRET_ID"),
SecretKey = Environment.GetEnvironmentVariable("TENCENTCLOUD_SECRET_KEY"),
};

var clientProfile = new ClientProfile();

var client = new SmsClient(cred, "ap-guangzhou", clientProfile);

var req = new SendSmsRequest();
req.PhoneNumberSet = new[] { "test-number" };
req.SmsSdkAppId = "test-app-id";
req.TemplateId = "test-template-id";

try
{
client.SendSmsSync(req);
}
catch (TencentCloudSDKException e)
{
if (e.ErrorCode != "UnauthorizedOperation.SmsSdkAppIdVerifyFail")
{
// unexpected error
throw;
}
}
}

[TestMethod]
public void TestDeserializeUnaffectedByDefaultSettings()
{
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
MissingMemberHandling = MissingMemberHandling.Error,
};

var val = AbstractModel.FromJsonString<DescribeRegionsResponse>(
"{" +
" \"RegionSet\":[{}, {}]," +
" \"UnknownField\":0" +
"}"
);
Assert.IsTrue(val.RegionSet != null);
Assert.IsTrue(val.RegionSet.Length == 2);
Assert.IsTrue(val.TotalCount == null);
}

[TestMethod]
public void TestApiDeserializeUnaffectedByDefaultSettings()
{
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
ContractResolver = new CustomContractResolver(),
};

var cred = new Credential
{
SecretId = Environment.GetEnvironmentVariable("TENCENTCLOUD_SECRET_ID"),
SecretKey = Environment.GetEnvironmentVariable("TENCENTCLOUD_SECRET_KEY"),
};

var clientProfile = new ClientProfile();
var client = new CvmClient(cred, "ap-guangzhou", clientProfile);

var resp = client.DescribeRegionsSync(new DescribeRegionsRequest());
Console.WriteLine(AbstractModel.ToJsonString(resp));
Assert.IsTrue(resp.RegionSet != null);
Assert.IsTrue(resp.TotalCount != null);
}

[TestMethod]
public void TestSerializeIgnoreNull()
{
var req = new SendSmsRequest();
req.PhoneNumberSet = new[] { "test-number" };
req.ExtendCode = null;

var s = AbstractModel.ToJsonString(req);

Assert.IsTrue(s.Contains("PhoneNumberSet"));
Assert.IsFalse(s.Contains("ExtendCode"));
}
}
}
12 changes: 5 additions & 7 deletions TencentCloud/Common/AbstractClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@
* under the License.
*/

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using TencentCloud.Common.Http;
using TencentCloud.Common.Profile;

Expand Down Expand Up @@ -155,7 +155,7 @@ protected async Task<string> InternalRequest(AbstractModel request, string actio
JsonResponseModel<JsonResponseErrModel> errResp = null;
try
{
errResp = JsonConvert.DeserializeObject<JsonResponseModel<JsonResponseErrModel>>(strResp);
errResp = AbstractModel.FromJsonString<JsonResponseModel<JsonResponseErrModel>>(strResp);
}
catch (JsonSerializationException e)
{
Expand Down Expand Up @@ -251,7 +251,7 @@ private async Task<T> ReadJsonResponseAsync<T>(HttpResponseMessage response)
JsonResponseModel<JsonResponseErrModel> errResp = null;
try
{
errResp = JsonConvert.DeserializeObject<JsonResponseModel<JsonResponseErrModel>>(strResp);
errResp = AbstractModel.FromJsonString<JsonResponseModel<JsonResponseErrModel>>(strResp);
}
catch (JsonSerializationException e)
{
Expand All @@ -264,7 +264,7 @@ private async Task<T> ReadJsonResponseAsync<T>(HttpResponseMessage response)
errResp.Response.Error.Message, errResp.Response.Error.Code, errResp.Response.RequestId);
}

return JsonConvert.DeserializeObject<JsonResponseModel<T>>(strResp).Response;
return AbstractModel.FromJsonString<JsonResponseModel<T>>(strResp).Response;
}

/// <summary>
Expand Down Expand Up @@ -496,9 +496,7 @@ private byte[] BuildRequestPayload(AbstractModel request)
}

// Default: Serialize the request object to JSON
return Encoding.UTF8.GetBytes(
JsonConvert.SerializeObject(request, Formatting.None,
new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));
return Encoding.UTF8.GetBytes(AbstractModel.ToJsonString(request));
}

/// <summary>
Expand Down
Loading