From c2229e7e051de2f4bea74177139c588a408a0850 Mon Sep 17 00:00:00 2001 From: Deepak Saini Date: Thu, 1 Aug 2024 19:57:18 +0530 Subject: [PATCH 1/6] Json read and write tests --- .../ManualTests/DataCommon/DataTestUtility.cs | 4 + ....Data.SqlClient.ManualTesting.Tests.csproj | 1 + .../ManualTests/SQL/JsonTest/JsonTest.cs | 78 +++++++++++++++++++ .../Config.cs | 1 + 4 files changed, 84 insertions(+) create mode 100644 src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs index 78ac30190a..febde5acbc 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs @@ -94,6 +94,9 @@ public static class DataTestUtility //SQL Server EngineEdition private static string s_sqlServerEngineEdition; + // JSON Coloumn type + public static readonly bool IsJsonSupported = false; + // Azure Synapse EngineEditionId == 6 // More could be read at https://learn.microsoft.com/en-us/sql/t-sql/functions/serverproperty-transact-sql?view=sql-server-ver16#propertyname public static bool IsAzureSynapse @@ -175,6 +178,7 @@ static DataTestUtility() ManagedIdentitySupported = c.ManagedIdentitySupported; IsManagedInstance = c.IsManagedInstance; AliasName = c.AliasName; + IsJsonSupported = c.IsJsonSupported; System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12; diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj index 7a3dad589d..4821357f4c 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj @@ -290,6 +290,7 @@ + diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs new file mode 100644 index 0000000000..ea8ed2f17d --- /dev/null +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs @@ -0,0 +1,78 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Data; +using System.Data.Common; +using Xunit; +using Xunit.Abstractions; + +namespace Microsoft.Data.SqlClient.ManualTesting.Tests +{ + public class JsonTest + { + private readonly ITestOutputHelper _output; + + public JsonTest(ITestOutputHelper output) + { + _output = output; + } + + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsJsonSupported))] + public void TestJsonWrite() + { + AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", true); + + string jsonDataString = "[\r\n {\r\n \"name\": \"Dave\",\r\n \"skills\": [ \"Python\" ]\r\n },\r\n {\r\n \"name\": \"Ron\",\r\n \"surname\": \"Peter\"\r\n }\r\n]"; + + using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString)) + { + connection.Open(); + + string query = "INSERT INTO dbo.JsonTable VALUES (@jsonData)"; + using (SqlCommand command = new SqlCommand(query, connection)) + { + // Add the parameter and set its value + var parameter = new SqlParameter("@jsonData", jsonDataString); + parameter.SqlDbType = SqlDbTypeExtensions.Json; + command.Parameters.Add(parameter); + + for (int i = 0; i < 10; i++) + { + int rowsAffected = command.ExecuteNonQuery(); + _output.WriteLine($"Rows affected: {rowsAffected}"); + } + } + } + } + + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsJsonSupported))] + public void TestJsonRead() + { + AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", true); + + SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString); + connection.Open(); + SqlCommand command = connection.CreateCommand(); + string commandText = "SELECT * FROM dbo.JsonTable"; + command.CommandText = commandText; + SqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) + { + string jsonData = reader.GetString(0); + _output.WriteLine(jsonData); + Assert.NotNull(jsonData); + } + System.Collections.ObjectModel.ReadOnlyCollection schema = reader.GetColumnSchema(); + foreach (DbColumn column in schema) + { + _output.WriteLine("Column Name is " + column.ColumnName); + _output.WriteLine("Column DataType is " + column?.DataType.ToString()); + _output.WriteLine("Column DataTypeName is " + column.DataTypeName); + } + reader.Close(); + connection.Close(); + } + } +} diff --git a/src/Microsoft.Data.SqlClient/tests/tools/Microsoft.Data.SqlClient.TestUtilities/Config.cs b/src/Microsoft.Data.SqlClient/tests/tools/Microsoft.Data.SqlClient.TestUtilities/Config.cs index 3fbe8313ee..1b712ceaf5 100644 --- a/src/Microsoft.Data.SqlClient/tests/tools/Microsoft.Data.SqlClient.TestUtilities/Config.cs +++ b/src/Microsoft.Data.SqlClient/tests/tools/Microsoft.Data.SqlClient.TestUtilities/Config.cs @@ -42,6 +42,7 @@ public class Config public string KerberosDomainUser = null; public bool IsManagedInstance = false; public string AliasName = null; + public bool IsJsonSupported = false; public static Config Load(string configPath = @"config.json") { try From 0f0ed7556b0d0d989a2bca204e9a3cc049387c19 Mon Sep 17 00:00:00 2001 From: Deepak Saini Date: Mon, 5 Aug 2024 22:49:19 +0530 Subject: [PATCH 2/6] added sp tests --- .../ManualTests/SQL/JsonTest/JsonTest.cs | 141 ++++++++++++++---- 1 file changed, 112 insertions(+), 29 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs index ea8ed2f17d..6fb237edbf 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs @@ -5,6 +5,7 @@ using System; using System.Data; using System.Data.Common; +using System.Data.SqlTypes; using Xunit; using Xunit.Abstractions; @@ -24,24 +25,56 @@ public void TestJsonWrite() { AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", true); - string jsonDataString = "[\r\n {\r\n \"name\": \"Dave\",\r\n \"skills\": [ \"Python\" ]\r\n },\r\n {\r\n \"name\": \"Ron\",\r\n \"surname\": \"Peter\"\r\n }\r\n]"; + string jsonDataString = "[{\"name\":\"Dave\",\"skills\":[\"Python\"]},{\"name\":\"Ron\",\"surname\":\"Peter\"}]"; + + string tableName = DataTestUtility.GetUniqueNameForSqlServer("Json_Test"); + string spName = DataTestUtility.GetUniqueNameForSqlServer("spJson_WriteTest"); + + string tableCreate = "CREATE TABLE " + tableName + " (Data json)"; + string tableInsert = "INSERT INTO " + tableName + " VALUES (@jsonData)"; + string spCreate = "CREATE PROCEDURE " + spName + " (@jsonData json) AS " + tableInsert; using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString)) { connection.Open(); - string query = "INSERT INTO dbo.JsonTable VALUES (@jsonData)"; - using (SqlCommand command = new SqlCommand(query, connection)) + using (SqlCommand command = connection.CreateCommand()) { - // Add the parameter and set its value - var parameter = new SqlParameter("@jsonData", jsonDataString); - parameter.SqlDbType = SqlDbTypeExtensions.Json; + //Create Table + command.CommandText = tableCreate; + command.ExecuteNonQuery(); + + //Create SP for writing json values + command.CommandText = spCreate; + command.ExecuteNonQuery(); + + command.CommandText = tableInsert; + var parameter = new SqlParameter("@jsonData", SqlDbTypeExtensions.Json); command.Parameters.Add(parameter); - for (int i = 0; i < 10; i++) + //Test 1 + //Write json value using a parameterized query + parameter.Value = jsonDataString; + int rowsAffected = command.ExecuteNonQuery(); + _output.WriteLine($"Rows affected: {rowsAffected}"); + + //Test 2 + //Write a SqlString type as json + parameter.Value = new SqlString(jsonDataString); + int rowsAffected2 = command.ExecuteNonQuery(); + _output.WriteLine($"Rows affected: {rowsAffected2}"); + + //Test 3 + //Write json value using SP + using (SqlCommand command2 = connection.CreateCommand()) { - int rowsAffected = command.ExecuteNonQuery(); - _output.WriteLine($"Rows affected: {rowsAffected}"); + command2.CommandText = spName; + command2.CommandType = CommandType.StoredProcedure; + var parameter2 = new SqlParameter("@jsonData", SqlDbTypeExtensions.Json); + parameter2.Value = jsonDataString; + command2.Parameters.Add(parameter2); + int rowsAffected3 = command2.ExecuteNonQuery(); + _output.WriteLine($"Rows affected: {rowsAffected3}"); } } } @@ -51,28 +84,78 @@ public void TestJsonWrite() public void TestJsonRead() { AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", true); - - SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString); - connection.Open(); - SqlCommand command = connection.CreateCommand(); - string commandText = "SELECT * FROM dbo.JsonTable"; - command.CommandText = commandText; - SqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) - { - string jsonData = reader.GetString(0); - _output.WriteLine(jsonData); - Assert.NotNull(jsonData); - } - System.Collections.ObjectModel.ReadOnlyCollection schema = reader.GetColumnSchema(); - foreach (DbColumn column in schema) + + string jsonDataString = "[{\"name\":\"Dave\",\"skills\":[\"Python\"]},{\"name\":\"Ron\",\"surname\":\"Peter\"}]"; + + string tableName = DataTestUtility.GetUniqueNameForSqlServer("Json_Test"); + string spName = DataTestUtility.GetUniqueNameForSqlServer("spJson_ReadTest"); + + string tableCreate = "CREATE TABLE " + tableName + " (Data json)"; + string tableInsert = "INSERT INTO " + tableName + " VALUES (@jsonData)"; + string tableRead = "SELECT * FROM " + tableName; + string spCreate = "CREATE PROCEDURE " + spName + "AS " + tableRead; + + using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString)) { - _output.WriteLine("Column Name is " + column.ColumnName); - _output.WriteLine("Column DataType is " + column?.DataType.ToString()); - _output.WriteLine("Column DataTypeName is " + column.DataTypeName); + connection.Open(); + using (SqlCommand command = connection.CreateCommand()) + { + //Create Table + command.CommandText = tableCreate; + command.ExecuteNonQuery(); + + //Create SP for reading from json column + command.CommandText = spCreate; + command.ExecuteNonQuery(); + + //Insert sample json data + //This will be used for reading + command.CommandText = tableInsert; + var parameter = new SqlParameter("@jsonData", SqlDbTypeExtensions.Json); + parameter.Value = jsonDataString; + command.Parameters.Add(parameter); + command.ExecuteNonQuery(); + + //Test 1 + //Read json value using query + command.CommandText = tableRead; + SqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) + { + string jsonData = reader.GetString(0); + _output.WriteLine(jsonData); + Assert.Equal(jsonDataString,jsonData); + } + + //Test 2 + //Read the column metadata + System.Collections.ObjectModel.ReadOnlyCollection schema = reader.GetColumnSchema(); + foreach (DbColumn column in schema) + { + _output.WriteLine("Column Name is " + column.ColumnName); + _output.WriteLine("Column DataType is " + column?.DataType.ToString()); + _output.WriteLine("Column DataTypeName is " + column.DataTypeName); + Assert.Equal("json",column.DataTypeName); + } + reader.Close(); + + //Test 3 + //Read json value using SP + using (SqlCommand command2 = connection.CreateCommand()) + { + command2.CommandText = spName; + command2.CommandType = CommandType.StoredProcedure; + SqlDataReader reader2 = command2.ExecuteReader(); + while (reader2.Read()) + { + string jsonData = reader2.GetString(0); + _output.WriteLine(jsonData); + Assert.NotNull(jsonData); + } + reader2.Close(); + } + } } - reader.Close(); - connection.Close(); } } } From cf0ac23fd1996ee017e796c906ef9a9e59442796 Mon Sep 17 00:00:00 2001 From: Deepak Saini Date: Tue, 6 Aug 2024 14:44:40 +0530 Subject: [PATCH 3/6] remove AppContext Switch --- .../tests/ManualTests/SQL/JsonTest/JsonTest.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs index 6fb237edbf..192b7c4397 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs @@ -22,9 +22,7 @@ public JsonTest(ITestOutputHelper output) [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsJsonSupported))] public void TestJsonWrite() - { - AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", true); - + { string jsonDataString = "[{\"name\":\"Dave\",\"skills\":[\"Python\"]},{\"name\":\"Ron\",\"surname\":\"Peter\"}]"; string tableName = DataTestUtility.GetUniqueNameForSqlServer("Json_Test"); @@ -83,8 +81,6 @@ public void TestJsonWrite() [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsJsonSupported))] public void TestJsonRead() { - AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", true); - string jsonDataString = "[{\"name\":\"Dave\",\"skills\":[\"Python\"]},{\"name\":\"Ron\",\"surname\":\"Peter\"}]"; string tableName = DataTestUtility.GetUniqueNameForSqlServer("Json_Test"); From 8ee27befff62529be49ea04302ad00ea5515ed3e Mon Sep 17 00:00:00 2001 From: Deepak Saini Date: Tue, 6 Aug 2024 15:46:15 +0530 Subject: [PATCH 4/6] resolve some PR comments --- .../ManualTests/SQL/JsonTest/JsonTest.cs | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs index 192b7c4397..1960f88222 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs @@ -55,12 +55,14 @@ public void TestJsonWrite() parameter.Value = jsonDataString; int rowsAffected = command.ExecuteNonQuery(); _output.WriteLine($"Rows affected: {rowsAffected}"); + Assert.Equal(1, rowsAffected); //Test 2 //Write a SqlString type as json parameter.Value = new SqlString(jsonDataString); int rowsAffected2 = command.ExecuteNonQuery(); _output.WriteLine($"Rows affected: {rowsAffected2}"); + Assert.Equal(1, rowsAffected2); //Test 3 //Write json value using SP @@ -73,6 +75,7 @@ public void TestJsonWrite() command2.Parameters.Add(parameter2); int rowsAffected3 = command2.ExecuteNonQuery(); _output.WriteLine($"Rows affected: {rowsAffected3}"); + Assert.Equal(1, rowsAffected3); } } } @@ -120,7 +123,7 @@ public void TestJsonRead() { string jsonData = reader.GetString(0); _output.WriteLine(jsonData); - Assert.Equal(jsonDataString,jsonData); + Assert.Equal(jsonDataString, jsonData); } //Test 2 @@ -131,7 +134,7 @@ public void TestJsonRead() _output.WriteLine("Column Name is " + column.ColumnName); _output.WriteLine("Column DataType is " + column?.DataType.ToString()); _output.WriteLine("Column DataTypeName is " + column.DataTypeName); - Assert.Equal("json",column.DataTypeName); + Assert.Equal("json", column.DataTypeName); } reader.Close(); @@ -141,14 +144,15 @@ public void TestJsonRead() { command2.CommandText = spName; command2.CommandType = CommandType.StoredProcedure; - SqlDataReader reader2 = command2.ExecuteReader(); - while (reader2.Read()) + using (SqlDataReader reader2 = command2.ExecuteReader()) { - string jsonData = reader2.GetString(0); - _output.WriteLine(jsonData); - Assert.NotNull(jsonData); + while (reader2.Read()) + { + string jsonData = reader2.GetString(0); + _output.WriteLine(jsonData); + Assert.Equal(jsonDataString, jsonData); + } } - reader2.Close(); } } } From bafe1327b2f63abbe8944df9717c7d02c67ac76b Mon Sep 17 00:00:00 2001 From: Deepak Saini Date: Wed, 7 Aug 2024 15:53:46 +0530 Subject: [PATCH 5/6] refactored tests --- .../ManualTests/SQL/JsonTest/JsonTest.cs | 75 ++++++++++--------- 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs index 1960f88222..a5bc2c3971 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs @@ -6,6 +6,8 @@ using System.Data; using System.Data.Common; using System.Data.SqlTypes; +using System.Xml.Serialization; +using Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted; using Xunit; using Xunit.Abstractions; @@ -20,11 +22,39 @@ public JsonTest(ITestOutputHelper output) _output = output; } + private static readonly string jsonDataString = "[{\"name\":\"Dave\",\"skills\":[\"Python\"]},{\"name\":\"Ron\",\"surname\":\"Peter\"}]"; + + private void ValidateRowsAffected(int rowsAffected) + { + _output.WriteLine($"Rows affected: {rowsAffected}"); + Assert.Equal(1, rowsAffected); + } + + private void ValidateRows(SqlDataReader reader) + { + while (reader.Read()) + { + string jsonData = reader.GetString(0); + _output.WriteLine(jsonData); + Assert.Equal(jsonDataString, jsonData); + } + } + + private void ValidateSchema(SqlDataReader reader) + { + System.Collections.ObjectModel.ReadOnlyCollection schema = reader.GetColumnSchema(); + foreach (DbColumn column in schema) + { + _output.WriteLine("Column Name is " + column.ColumnName); + _output.WriteLine("Column DataType is " + column?.DataType.ToString()); + _output.WriteLine("Column DataTypeName is " + column.DataTypeName); + Assert.Equal("json", column.DataTypeName); + } + } + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsJsonSupported))] public void TestJsonWrite() { - string jsonDataString = "[{\"name\":\"Dave\",\"skills\":[\"Python\"]},{\"name\":\"Ron\",\"surname\":\"Peter\"}]"; - string tableName = DataTestUtility.GetUniqueNameForSqlServer("Json_Test"); string spName = DataTestUtility.GetUniqueNameForSqlServer("spJson_WriteTest"); @@ -54,15 +84,13 @@ public void TestJsonWrite() //Write json value using a parameterized query parameter.Value = jsonDataString; int rowsAffected = command.ExecuteNonQuery(); - _output.WriteLine($"Rows affected: {rowsAffected}"); - Assert.Equal(1, rowsAffected); + ValidateRowsAffected(rowsAffected); //Test 2 //Write a SqlString type as json parameter.Value = new SqlString(jsonDataString); int rowsAffected2 = command.ExecuteNonQuery(); - _output.WriteLine($"Rows affected: {rowsAffected2}"); - Assert.Equal(1, rowsAffected2); + ValidateRowsAffected(rowsAffected2); //Test 3 //Write json value using SP @@ -74,8 +102,7 @@ public void TestJsonWrite() parameter2.Value = jsonDataString; command2.Parameters.Add(parameter2); int rowsAffected3 = command2.ExecuteNonQuery(); - _output.WriteLine($"Rows affected: {rowsAffected3}"); - Assert.Equal(1, rowsAffected3); + ValidateRowsAffected(rowsAffected3); } } } @@ -84,8 +111,6 @@ public void TestJsonWrite() [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsJsonSupported))] public void TestJsonRead() { - string jsonDataString = "[{\"name\":\"Dave\",\"skills\":[\"Python\"]},{\"name\":\"Ron\",\"surname\":\"Peter\"}]"; - string tableName = DataTestUtility.GetUniqueNameForSqlServer("Json_Test"); string spName = DataTestUtility.GetUniqueNameForSqlServer("spJson_ReadTest"); @@ -118,24 +143,12 @@ public void TestJsonRead() //Test 1 //Read json value using query command.CommandText = tableRead; - SqlDataReader reader = command.ExecuteReader(); - while (reader.Read()) - { - string jsonData = reader.GetString(0); - _output.WriteLine(jsonData); - Assert.Equal(jsonDataString, jsonData); - } + var reader = command.ExecuteReader(); + ValidateRows(reader); //Test 2 //Read the column metadata - System.Collections.ObjectModel.ReadOnlyCollection schema = reader.GetColumnSchema(); - foreach (DbColumn column in schema) - { - _output.WriteLine("Column Name is " + column.ColumnName); - _output.WriteLine("Column DataType is " + column?.DataType.ToString()); - _output.WriteLine("Column DataTypeName is " + column.DataTypeName); - Assert.Equal("json", column.DataTypeName); - } + ValidateSchema(reader); reader.Close(); //Test 3 @@ -144,15 +157,9 @@ public void TestJsonRead() { command2.CommandText = spName; command2.CommandType = CommandType.StoredProcedure; - using (SqlDataReader reader2 = command2.ExecuteReader()) - { - while (reader2.Read()) - { - string jsonData = reader2.GetString(0); - _output.WriteLine(jsonData); - Assert.Equal(jsonDataString, jsonData); - } - } + var reader2 = command2.ExecuteReader(); + ValidateRows(reader2); + reader2.Close(); } } } From 2832d29c291d06addd2ed1d38a1e1e1d8d2d0805 Mon Sep 17 00:00:00 2001 From: Deepak Saini Date: Wed, 7 Aug 2024 18:07:26 +0530 Subject: [PATCH 6/6] add async testing --- .../ManualTests/SQL/JsonTest/JsonTest.cs | 126 +++++++++++++++++- 1 file changed, 124 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs index a5bc2c3971..b4bd08c5dc 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonTest.cs @@ -6,8 +6,7 @@ using System.Data; using System.Data.Common; using System.Data.SqlTypes; -using System.Xml.Serialization; -using Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted; +using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -40,6 +39,16 @@ private void ValidateRows(SqlDataReader reader) } } + private async Task ValidateRowsAsync(SqlDataReader reader) + { + while (await reader.ReadAsync()) + { + string jsonData = reader.GetString(0); + _output.WriteLine(jsonData); + Assert.Equal(jsonDataString, jsonData); + } + } + private void ValidateSchema(SqlDataReader reader) { System.Collections.ObjectModel.ReadOnlyCollection schema = reader.GetColumnSchema(); @@ -108,6 +117,62 @@ public void TestJsonWrite() } } + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsJsonSupported))] + public async Task TestJsonWriteAsync() + { + string tableName = DataTestUtility.GetUniqueNameForSqlServer("Json_Test"); + string spName = DataTestUtility.GetUniqueNameForSqlServer("spJson_WriteTest"); + + string tableCreate = "CREATE TABLE " + tableName + " (Data json)"; + string tableInsert = "INSERT INTO " + tableName + " VALUES (@jsonData)"; + string spCreate = "CREATE PROCEDURE " + spName + " (@jsonData json) AS " + tableInsert; + + using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString)) + { + await connection.OpenAsync(); + + using (SqlCommand command = connection.CreateCommand()) + { + //Create Table + command.CommandText = tableCreate; + await command.ExecuteNonQueryAsync(); + + //Create SP for writing json values + command.CommandText = spCreate; + await command.ExecuteNonQueryAsync(); + + command.CommandText = tableInsert; + var parameter = new SqlParameter("@jsonData", SqlDbTypeExtensions.Json); + command.Parameters.Add(parameter); + + //Test 1 + //Write json value using a parameterized query + parameter.Value = jsonDataString; + int rowsAffected = await command.ExecuteNonQueryAsync(); + ValidateRowsAffected(rowsAffected); + + //Test 2 + //Write a SqlString type as json + parameter.Value = new SqlString(jsonDataString); + int rowsAffected2 = await command.ExecuteNonQueryAsync(); + ValidateRowsAffected(rowsAffected2); + + //Test 3 + //Write json value using SP + using (SqlCommand command2 = connection.CreateCommand()) + { + command2.CommandText = spName; + command2.CommandType = CommandType.StoredProcedure; + var parameter2 = new SqlParameter("@jsonData", SqlDbTypeExtensions.Json); + parameter2.Value = jsonDataString; + command2.Parameters.Add(parameter2); + int rowsAffected3 = await command.ExecuteNonQueryAsync(); + ValidateRowsAffected(rowsAffected3); + } + } + } + } + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsJsonSupported))] public void TestJsonRead() { @@ -164,5 +229,62 @@ public void TestJsonRead() } } } + + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsJsonSupported))] + public async Task TestJsonReadAsync() + { + string tableName = DataTestUtility.GetUniqueNameForSqlServer("Json_Test"); + string spName = DataTestUtility.GetUniqueNameForSqlServer("spJson_ReadTest"); + + string tableCreate = "CREATE TABLE " + tableName + " (Data json)"; + string tableInsert = "INSERT INTO " + tableName + " VALUES (@jsonData)"; + string tableRead = "SELECT * FROM " + tableName; + string spCreate = "CREATE PROCEDURE " + spName + "AS " + tableRead; + + using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString)) + { + await connection.OpenAsync(); + using (SqlCommand command = connection.CreateCommand()) + { + //Create Table + command.CommandText = tableCreate; + await command.ExecuteNonQueryAsync(); + + //Create SP for reading from json column + command.CommandText = spCreate; + await command.ExecuteNonQueryAsync(); + + //Insert sample json data + //This will be used for reading + command.CommandText = tableInsert; + var parameter = new SqlParameter("@jsonData", SqlDbTypeExtensions.Json); + parameter.Value = jsonDataString; + command.Parameters.Add(parameter); + await command.ExecuteNonQueryAsync(); + + //Test 1 + //Read json value using query + command.CommandText = tableRead; + var reader = await command.ExecuteReaderAsync(); + await ValidateRowsAsync(reader); + + //Test 2 + //Read the column metadata + ValidateSchema(reader); + reader.Close(); + + //Test 3 + //Read json value using SP + using (SqlCommand command2 = connection.CreateCommand()) + { + command2.CommandText = spName; + command2.CommandType = CommandType.StoredProcedure; + var reader2 = await command2.ExecuteReaderAsync(); + await ValidateRowsAsync(reader2); + reader2.Close(); + } + } + } + } } }