Skip to content

Commit 62db8b4

Browse files
Merge pull request #14 from FrendsPlatform/Issue10
Rename QueryResult to Data
2 parents 64f8ca9 + 515fb44 commit 62db8b4

File tree

15 files changed

+862
-3747
lines changed

15 files changed

+862
-3747
lines changed

.github/workflows/ExecuteQuery_build_and_test_on_main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ jobs:
1313
uses: FrendsPlatform/FrendsTasks/.github/workflows/linux_build_main.yml@main
1414
with:
1515
workdir: Frends.MicrosoftSQL.ExecuteQuery
16-
prebuild_command: docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Salakala123!" -p 1433:1433 --name sql1 --hostname sql1 -d mcr.microsoft.com/mssql/server:2019-CU18-ubuntu-20.04
16+
prebuild_command: docker-compose -f ./Frends.MicrosoftSQL.ExecuteQuery.Tests/docker-compose.yml up -d
1717
secrets:
1818
badge_service_api_key: ${{ secrets.BADGE_SERVICE_API_KEY }}

.github/workflows/ExecuteQuery_build_and_test_on_push.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
uses: FrendsPlatform/FrendsTasks/.github/workflows/linux_build_test.yml@main
1414
with:
1515
workdir: Frends.MicrosoftSQL.ExecuteQuery
16-
prebuild_command: docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Salakala123!" -p 1433:1433 --name sql1 --hostname sql1 -d mcr.microsoft.com/mssql/server:2019-CU18-ubuntu-20.04
16+
prebuild_command: docker-compose -f ./Frends.MicrosoftSQL.ExecuteQuery.Tests/docker-compose.yml up -d
1717
secrets:
1818
badge_service_api_key: ${{ secrets.BADGE_SERVICE_API_KEY }}
1919
test_feed_api_key: ${{ secrets.TASKS_TEST_FEED_API_KEY }}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## [1.1.0] - 2023-01-27
4+
### Changed
5+
- Naming: Result.QueryResult to Result.Data.
6+
37
## [1.0.0] - 2023-01-18
48
### Added
59
- Initial implementation
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
using Frends.MicrosoftSQL.ExecuteQuery.Definitions;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
using Newtonsoft.Json.Linq;
4+
using System.Data.SqlClient;
5+
6+
namespace Frends.MicrosoftSQL.ExecuteQuery.Tests;
7+
8+
[TestClass]
9+
public class AutoUnitTests
10+
{
11+
/*
12+
docker-compose up
13+
14+
How to use via terminal:
15+
docker exec -it sql1 "bash"
16+
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "Salakala123!"
17+
SELECT * FROM TestTable
18+
GO
19+
*/
20+
21+
private static readonly string _connString = "Server=127.0.0.1,1433;Database=Master;User Id=SA;Password=Salakala123!";
22+
private static readonly string _tableName = "TestTable";
23+
24+
[TestInitialize]
25+
public void Init()
26+
{
27+
using var connection = new SqlConnection(_connString);
28+
connection.Open();
29+
var createTable = connection.CreateCommand();
30+
createTable.CommandText = $@"IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='{_tableName}') BEGIN CREATE TABLE {_tableName} ( Id int, LastName varchar(255), FirstName varchar(255) ); END";
31+
createTable.ExecuteNonQuery();
32+
connection.Close();
33+
connection.Dispose();
34+
}
35+
36+
[TestCleanup]
37+
public void CleanUp()
38+
{
39+
using var connection = new SqlConnection(_connString);
40+
connection.Open();
41+
var createTable = connection.CreateCommand();
42+
createTable.CommandText = $@"IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='{_tableName}') BEGIN DROP TABLE IF EXISTS {_tableName}; END";
43+
createTable.ExecuteNonQuery();
44+
connection.Close();
45+
connection.Dispose();
46+
}
47+
48+
[TestMethod]
49+
public async Task TestExecuteQuery_Auto()
50+
{
51+
var transactionLevels = new List<SqlTransactionIsolationLevel>() {
52+
SqlTransactionIsolationLevel.Unspecified,
53+
SqlTransactionIsolationLevel.Serializable,
54+
SqlTransactionIsolationLevel.None,
55+
SqlTransactionIsolationLevel.ReadUncommitted,
56+
SqlTransactionIsolationLevel.ReadCommitted
57+
};
58+
59+
var inputInsert = new Input()
60+
{
61+
ConnectionString = _connString,
62+
Query = $@"INSERT INTO {_tableName} VALUES (1, 'Suku', 'Etu'), (2, 'Last', 'Forst'), (3, 'Hiiri', 'Mikki')",
63+
ExecuteType = ExecuteTypes.NonQuery,
64+
Parameters = null
65+
};
66+
67+
var inputSelect = new Input()
68+
{
69+
ConnectionString = _connString,
70+
Query = $"select * from {_tableName}",
71+
ExecuteType = ExecuteTypes.Auto,
72+
Parameters = null
73+
};
74+
75+
var inputSelectSingle = new Input()
76+
{
77+
ConnectionString = _connString,
78+
Query = $"select * from {_tableName} where Id = 1",
79+
ExecuteType = ExecuteTypes.Auto,
80+
Parameters = null
81+
};
82+
83+
var inputUpdate = new Input()
84+
{
85+
ConnectionString = _connString,
86+
Query = $@"update {_tableName} set LastName = 'Edit' where Id = 2",
87+
ExecuteType = ExecuteTypes.Auto,
88+
Parameters = null
89+
};
90+
91+
var inputDelete = new Input()
92+
{
93+
ConnectionString = _connString,
94+
Query = $"delete from {_tableName} where Id = 2",
95+
ExecuteType = ExecuteTypes.Auto,
96+
Parameters = null
97+
};
98+
99+
foreach (var level in transactionLevels)
100+
{
101+
Init();
102+
103+
var options = new Options()
104+
{
105+
SqlTransactionIsolationLevel = level,
106+
CommandTimeoutSeconds = 2,
107+
ThrowErrorOnFailure = true
108+
};
109+
110+
// Insert rows
111+
var insert = await MicrosoftSQL.ExecuteQuery(inputInsert, options, default);
112+
Assert.IsTrue(insert.Success);
113+
Assert.AreEqual(3, insert.RecordsAffected);
114+
Assert.IsNull(insert.ErrorMessage);
115+
Assert.AreEqual(3, (int)insert.Data["AffectedRows"]);
116+
Assert.AreEqual(3, GetRowCount()); // Make sure rows inserted before moving on.
117+
118+
// Select all
119+
var select = await MicrosoftSQL.ExecuteQuery(inputSelect, options, default);
120+
Assert.IsTrue(select.Success);
121+
Assert.AreEqual(-1, select.RecordsAffected);
122+
Assert.IsNull(select.ErrorMessage);
123+
Assert.AreEqual(typeof(JArray), select.Data.GetType());
124+
Assert.AreEqual("Suku", (string)select.Data[0]["LastName"]);
125+
Assert.AreEqual("Etu", (string)select.Data[0]["FirstName"]);
126+
Assert.AreEqual("Last", (string)select.Data[1]["LastName"]);
127+
Assert.AreEqual("Forst", (string)select.Data[1]["FirstName"]);
128+
Assert.AreEqual("Hiiri", (string)select.Data[2]["LastName"]);
129+
Assert.AreEqual("Mikki", (string)select.Data[2]["FirstName"]);
130+
Assert.AreEqual(3, GetRowCount()); // double check
131+
132+
// Select single
133+
var selectSingle = await MicrosoftSQL.ExecuteQuery(inputSelectSingle, options, default);
134+
Assert.IsTrue(selectSingle.Success);
135+
Assert.AreEqual(-1, selectSingle.RecordsAffected);
136+
Assert.IsNull(selectSingle.ErrorMessage);
137+
Assert.AreEqual(typeof(JArray), selectSingle.Data.GetType());
138+
Assert.AreEqual("Suku", (string)selectSingle.Data[0]["LastName"]);
139+
Assert.AreEqual("Etu", (string)selectSingle.Data[0]["FirstName"]);
140+
Assert.AreEqual(3, GetRowCount()); // double check
141+
142+
// Update
143+
var update = await MicrosoftSQL.ExecuteQuery(inputUpdate, options, default);
144+
Assert.IsTrue(update.Success);
145+
Assert.AreEqual(1, update.RecordsAffected);
146+
Assert.IsNull(update.ErrorMessage);
147+
Assert.AreEqual(3, GetRowCount()); // double check
148+
var checkUpdateResult = await MicrosoftSQL.ExecuteQuery(inputSelect, options, default);
149+
Assert.AreEqual("Suku", (string)checkUpdateResult.Data[0]["LastName"]);
150+
Assert.AreEqual("Etu", (string)checkUpdateResult.Data[0]["FirstName"]);
151+
Assert.AreEqual("Edit", (string)checkUpdateResult.Data[1]["LastName"]);
152+
Assert.AreEqual("Forst", (string)checkUpdateResult.Data[1]["FirstName"]);
153+
Assert.AreEqual("Hiiri", (string)checkUpdateResult.Data[2]["LastName"]);
154+
Assert.AreEqual("Mikki", (string)checkUpdateResult.Data[2]["FirstName"]);
155+
Assert.AreEqual(3, GetRowCount()); // double check
156+
157+
// Delete
158+
var delete = await MicrosoftSQL.ExecuteQuery(inputDelete, options, default);
159+
Assert.IsTrue(delete.Success);
160+
Assert.AreEqual(1, delete.RecordsAffected);
161+
Assert.IsNull(delete.ErrorMessage);
162+
Assert.AreEqual(2, GetRowCount()); // double check
163+
var checkDeleteResult = await MicrosoftSQL.ExecuteQuery(inputSelect, options, default);
164+
Assert.AreEqual("Suku", (string)checkDeleteResult.Data[0]["LastName"]);
165+
Assert.AreEqual("Etu", (string)checkDeleteResult.Data[0]["FirstName"]);
166+
Assert.AreEqual("Hiiri", (string)checkDeleteResult.Data[1]["LastName"]);
167+
Assert.AreEqual("Mikki", (string)checkDeleteResult.Data[1]["FirstName"]);
168+
169+
CleanUp();
170+
}
171+
}
172+
173+
private static int GetRowCount()
174+
{
175+
using var connection = new SqlConnection(_connString);
176+
connection.Open();
177+
var getRows = connection.CreateCommand();
178+
getRows.CommandText = $"SELECT COUNT(*) FROM {_tableName}";
179+
var count = (int)getRows.ExecuteScalar();
180+
connection.Close();
181+
connection.Dispose();
182+
return count;
183+
}
184+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using Frends.MicrosoftSQL.ExecuteQuery.Definitions;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
using System.Data.SqlClient;
4+
5+
namespace Frends.MicrosoftSQL.ExecuteQuery.Tests;
6+
7+
[TestClass]
8+
public class ExceptionUnitTests
9+
{
10+
/*
11+
docker-compose up
12+
13+
How to use via terminal:
14+
docker exec -it sql1 "bash"
15+
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "Salakala123!"
16+
SELECT * FROM TestTable
17+
GO
18+
*/
19+
20+
private static readonly string _connString = "Server=127.0.0.1,1433;Database=Master;User Id=SA;Password=Salakala123!";
21+
private static readonly string _tableName = "TestTable";
22+
23+
[TestInitialize]
24+
public void Init()
25+
{
26+
using var connection = new SqlConnection(_connString);
27+
connection.Open();
28+
var createTable = connection.CreateCommand();
29+
createTable.CommandText = $@"IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='{_tableName}') BEGIN CREATE TABLE {_tableName} ( Id int, LastName varchar(255), FirstName varchar(255) ); END";
30+
createTable.ExecuteNonQuery();
31+
connection.Close();
32+
connection.Dispose();
33+
}
34+
35+
[TestCleanup]
36+
public void CleanUp()
37+
{
38+
using var connection = new SqlConnection(_connString);
39+
connection.Open();
40+
var createTable = connection.CreateCommand();
41+
createTable.CommandText = $@"IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='{_tableName}') BEGIN DROP TABLE IF EXISTS {_tableName}; END";
42+
createTable.ExecuteNonQuery();
43+
connection.Close();
44+
connection.Dispose();
45+
}
46+
47+
[TestMethod]
48+
public async Task TestExecuteQuery_Invalid_Creds_ThrowError()
49+
{
50+
var input = new Input()
51+
{
52+
ConnectionString = "Server=127.0.0.1,1433;Database=Master;User Id=SA;Password=WrongPassWord",
53+
};
54+
55+
var options = new Options()
56+
{
57+
SqlTransactionIsolationLevel = SqlTransactionIsolationLevel.ReadCommitted,
58+
CommandTimeoutSeconds = 2,
59+
ThrowErrorOnFailure = true
60+
};
61+
62+
var ex = await Assert.ThrowsExceptionAsync<Exception>(() => MicrosoftSQL.ExecuteQuery(input, options, default));
63+
Assert.IsTrue(ex.Message.Contains("Login failed for user 'SA'."));
64+
}
65+
66+
[TestMethod]
67+
public async Task TestExecuteQuery_Invalid_Creds_ReturnErrorMessage()
68+
{
69+
var input = new Input()
70+
{
71+
ConnectionString = "Server=127.0.0.1,1433;Database=Master;User Id=SA;Password=WrongPassWord",
72+
};
73+
74+
var options = new Options()
75+
{
76+
SqlTransactionIsolationLevel = SqlTransactionIsolationLevel.ReadCommitted,
77+
CommandTimeoutSeconds = 2,
78+
ThrowErrorOnFailure = false
79+
};
80+
81+
var result = await MicrosoftSQL.ExecuteQuery(input, options, default);
82+
Assert.IsFalse(result.Success);
83+
Assert.IsTrue(result.ErrorMessage.Contains("Login failed for user 'SA'."));
84+
Assert.AreEqual(0, result.RecordsAffected);
85+
}
86+
}

0 commit comments

Comments
 (0)