Skip to content

Commit 7ec6beb

Browse files
authored
Merge pull request #18 from FrendsPlatform/issue17
Doc update
2 parents f7bd9f6 + 93def91 commit 7ec6beb

File tree

10 files changed

+273
-118
lines changed

10 files changed

+273
-118
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## [1.0.1] - 2023-08-03
4+
### Changed
5+
- Documentation update to Input.Execute parameter.
6+
- Removed unnecessary runtime unloader.
7+
38
## [1.0.0] - 2023-01-23
49
### Added
510
- Initial implementation

Frends.MicrosoftSQL.ExecuteProcedure/Frends.MicrosoftSQL.ExecuteProcedure.Tests/ExceptionUnitTests.cs

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,43 +16,74 @@ docker exec -it sql1 "bash"
1616
GO
1717
*/
1818

19-
[TestMethod]
20-
public async Task TestExecuteProcedure_Invalid_Creds_ThrowError()
19+
Input _input = new();
20+
Options _options = new();
21+
22+
[TestInitialize]
23+
public void Init()
2124
{
22-
var input = new Input()
25+
_input = new()
2326
{
2427
ConnectionString = "Server=127.0.0.1,1433;Database=Master;User Id=SA;Password=WrongPassWord",
28+
Execute = "foo",
29+
ExecuteType = ExecuteTypes.NonQuery,
30+
Parameters = null,
2531
};
2632

27-
var options = new Options()
33+
_options = new()
2834
{
29-
SqlTransactionIsolationLevel = SqlTransactionIsolationLevel.ReadCommitted,
3035
CommandTimeoutSeconds = 2,
31-
ThrowErrorOnFailure = true
36+
SqlTransactionIsolationLevel = SqlTransactionIsolationLevel.ReadCommitted,
37+
ThrowErrorOnFailure = true,
3238
};
39+
}
3340

34-
var ex = await Assert.ThrowsExceptionAsync<Exception>(() => MicrosoftSQL.ExecuteProcedure(input, options, default));
35-
Assert.IsTrue(ex.Message.Contains("SqlException (0x80131904): Login failed for user 'SA'."));
41+
[TestMethod]
42+
public async Task TestExecuteProcedure_Invalid_Creds_ThrowError()
43+
{
44+
var isolationLevel = Enum.GetValues(typeof(SqlTransactionIsolationLevel)).Cast<SqlTransactionIsolationLevel>().ToList();
45+
var executeTypes = Enum.GetValues(typeof(ExecuteTypes)).Cast<ExecuteTypes>().ToList();
46+
47+
foreach (var executeType in executeTypes)
48+
{
49+
foreach (var isolation in isolationLevel)
50+
{
51+
var input = _input;
52+
input.ExecuteType = executeType;
53+
54+
var options = _options;
55+
options.SqlTransactionIsolationLevel = isolation;
56+
57+
var ex = await Assert.ThrowsExceptionAsync<Exception>(() => MicrosoftSQL.ExecuteProcedure(input, options, default));
58+
Assert.IsTrue(ex.Message.Contains("SqlException (0x80131904): Login failed for user 'SA'."), $"ExecuteType: {executeType}, IsolationLevel: {isolation}");
59+
}
60+
}
3661
}
3762

3863
[TestMethod]
3964
public async Task TestExecuteProcedure_Invalid_Creds_ReturnErrorMessage()
4065
{
41-
var input = new Input()
42-
{
43-
ConnectionString = "Server=127.0.0.1,1433;Database=Master;User Id=SA;Password=WrongPassWord",
44-
};
66+
var isolationLevel = Enum.GetValues(typeof(SqlTransactionIsolationLevel)).Cast<SqlTransactionIsolationLevel>().ToList();
67+
var executeTypes = Enum.GetValues(typeof(ExecuteTypes)).Cast<ExecuteTypes>().ToList();
4568

46-
var options = new Options()
69+
foreach (var executeType in executeTypes)
4770
{
48-
SqlTransactionIsolationLevel = SqlTransactionIsolationLevel.ReadCommitted,
49-
CommandTimeoutSeconds = 2,
50-
ThrowErrorOnFailure = false
51-
};
71+
foreach (var isolation in isolationLevel)
72+
{
73+
var input = _input;
74+
input.ExecuteType = executeType;
75+
76+
var options = _options;
77+
options.SqlTransactionIsolationLevel = isolation;
78+
options.ThrowErrorOnFailure = false;
79+
80+
var result = await MicrosoftSQL.ExecuteProcedure(input, options, default);
81+
Assert.IsFalse(result.Success, $"ExecuteType: {executeType}, IsolationLevel: {isolation}");
82+
Assert.IsTrue(result.ErrorMessage.Contains("Login failed for user 'SA'."), $"ExecuteType: {executeType}, IsolationLevel: {isolation}");
83+
Assert.AreEqual(0, result.RecordsAffected, $"ExecuteType: {executeType}, IsolationLevel: {isolation}");
84+
Assert.IsNull(result.Data, $"ExecuteType: {executeType}, IsolationLevel: {isolation}");
85+
}
86+
}
5287

53-
var result = await MicrosoftSQL.ExecuteProcedure(input, options, default);
54-
Assert.IsFalse(result.Success);
55-
Assert.IsTrue(result.ErrorMessage.Contains("Login failed for user 'SA'."));
56-
Assert.AreEqual(0, result.RecordsAffected);
5788
}
5889
}

Frends.MicrosoftSQL.ExecuteProcedure/Frends.MicrosoftSQL.ExecuteProcedure.Tests/ExecuteReaderUnitTests.cs

Lines changed: 87 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ docker exec -it sql1 "bash"
2020

2121
private static readonly string _connString = "Server=127.0.0.1,1433;Database=Master;User Id=SA;Password=Salakala123!";
2222
private static readonly string _tableName = "TestTable";
23-
23+
2424
[TestInitialize]
2525
public void Init()
2626
{
@@ -40,6 +40,10 @@ public void Init()
4040
command.CommandText = $"CREATE PROCEDURE SelectAll AS select * from {_tableName}";
4141
command.ExecuteNonQuery();
4242

43+
//Select single parameter
44+
command.CommandText = $"CREATE PROCEDURE SelectSingleParameter (@id INT) AS SELECT * FROM {_tableName} WHERE Id = @id";
45+
command.ExecuteNonQuery();
46+
4347
//Select single
4448
command.CommandText = $"CREATE PROCEDURE SelectSingle AS select * from {_tableName} where Id = 1";
4549
command.ExecuteNonQuery();
@@ -90,7 +94,7 @@ CLOSE cur
9094
public async Task TestExecuteProcedure_ExecuteReader()
9195
{
9296
var transactionLevels = new List<SqlTransactionIsolationLevel>() {
93-
SqlTransactionIsolationLevel.Unspecified,
97+
//SqlTransactionIsolationLevel.Unspecified,
9498
SqlTransactionIsolationLevel.Serializable,
9599
SqlTransactionIsolationLevel.None,
96100
SqlTransactionIsolationLevel.ReadUncommitted,
@@ -148,67 +152,109 @@ public async Task TestExecuteProcedure_ExecuteReader()
148152

149153
// Insert rows
150154
var insert = await MicrosoftSQL.ExecuteProcedure(inputInsert, options, default);
151-
Assert.IsTrue(insert.Success);
152-
Assert.AreEqual(3, insert.RecordsAffected);
153-
Assert.IsNull(insert.ErrorMessage);
154-
Assert.AreEqual(3, GetRowCount());
155+
Assert.IsTrue(insert.Success, $"TransactionLevel: {level}.");
156+
Assert.AreEqual(3, insert.RecordsAffected, $"TransactionLevel: {level}.");
157+
Assert.IsNull(insert.ErrorMessage, $"TransactionLevel: {level}.");
158+
Assert.AreEqual(3, GetRowCount(), $"TransactionLevel: {level}.");
155159

156160
// Select all
157161
var select = await MicrosoftSQL.ExecuteProcedure(inputSelect, options, default);
158-
Assert.IsTrue(select.Success);
159-
Assert.AreEqual(-1, select.RecordsAffected);
160-
Assert.IsNull(select.ErrorMessage);
161-
Assert.AreEqual(typeof(JArray), select.Data.GetType());
162-
Assert.AreEqual("Suku", (string)select.Data[0]["LastName"]);
163-
Assert.AreEqual("Etu", (string)select.Data[0]["FirstName"]);
164-
Assert.AreEqual("Last", (string)select.Data[1]["LastName"]);
165-
Assert.AreEqual("Forst", (string)select.Data[1]["FirstName"]);
166-
Assert.AreEqual("Hiiri", (string)select.Data[2]["LastName"]);
167-
Assert.AreEqual("Mikki", (string)select.Data[2]["FirstName"]);
168-
Assert.AreEqual(3, GetRowCount());
162+
Assert.IsTrue(select.Success, $"TransactionLevel: {level}.");
163+
Assert.AreEqual(-1, select.RecordsAffected, $"TransactionLevel: {level}.");
164+
Assert.IsNull(select.ErrorMessage, $"TransactionLevel: {level}.");
165+
Assert.AreEqual(typeof(JArray), select.Data.GetType(), $"TransactionLevel: {level}.");
166+
Assert.AreEqual("Suku", (string)select.Data[0]["LastName"], $"TransactionLevel: {level}.");
167+
Assert.AreEqual("Etu", (string)select.Data[0]["FirstName"], $"TransactionLevel: {level}.");
168+
Assert.AreEqual("Last", (string)select.Data[1]["LastName"], $"TransactionLevel: {level}.");
169+
Assert.AreEqual("Forst", (string)select.Data[1]["FirstName"], $"TransactionLevel: {level}.");
170+
Assert.AreEqual("Hiiri", (string)select.Data[2]["LastName"], $"TransactionLevel: {level}.");
171+
Assert.AreEqual("Mikki", (string)select.Data[2]["FirstName"], $"TransactionLevel: {level}.");
172+
Assert.AreEqual(3, GetRowCount(), $"TransactionLevel: {level}.");
169173

170174
// Select single
171175
var selectSingle = await MicrosoftSQL.ExecuteProcedure(inputSelectSingle, options, default);
172-
Assert.IsTrue(selectSingle.Success);
173-
Assert.AreEqual(-1, selectSingle.RecordsAffected);
174-
Assert.IsNull(selectSingle.ErrorMessage);
175-
Assert.AreEqual(typeof(JArray), selectSingle.Data.GetType());
176-
Assert.AreEqual("Suku", (string)selectSingle.Data[0]["LastName"]);
177-
Assert.AreEqual("Etu", (string)selectSingle.Data[0]["FirstName"]);
176+
Assert.IsTrue(selectSingle.Success, $"TransactionLevel: {level}.");
177+
Assert.AreEqual(-1, selectSingle.RecordsAffected, $"TransactionLevel: {level}.");
178+
Assert.IsNull(selectSingle.ErrorMessage, $"TransactionLevel: {level}.");
179+
Assert.AreEqual(typeof(JArray), selectSingle.Data.GetType(), $"TransactionLevel: {level}.");
180+
Assert.AreEqual("Suku", (string)selectSingle.Data[0]["LastName"], $"TransactionLevel: {level}.");
181+
Assert.AreEqual("Etu", (string)selectSingle.Data[0]["FirstName"], $"TransactionLevel: {level}.");
178182
Assert.AreEqual(3, GetRowCount());
179183

180184
// Update
181185
var update = await MicrosoftSQL.ExecuteProcedure(inputUpdate, options, default);
182-
Assert.IsTrue(update.Success);
183-
Assert.AreEqual(1, update.RecordsAffected);
184-
Assert.IsNull(update.ErrorMessage);
185-
Assert.AreEqual(3, GetRowCount());
186+
Assert.IsTrue(update.Success, $"TransactionLevel: {level}.");
187+
Assert.AreEqual(1, update.RecordsAffected, $"TransactionLevel: {level}.");
188+
Assert.IsNull(update.ErrorMessage, $"TransactionLevel: {level}.");
189+
Assert.AreEqual(3, GetRowCount(), $"TransactionLevel: {level}.");
186190
var checkUpdateResult = await MicrosoftSQL.ExecuteProcedure(inputSelect, options, default);
187-
Assert.AreEqual("Suku", (string)checkUpdateResult.Data[0]["LastName"]);
188-
Assert.AreEqual("Etu", (string)checkUpdateResult.Data[0]["FirstName"]);
189-
Assert.AreEqual("Edit", (string)checkUpdateResult.Data[1]["LastName"]);
190-
Assert.AreEqual("Forst", (string)checkUpdateResult.Data[1]["FirstName"]);
191-
Assert.AreEqual("Hiiri", (string)checkUpdateResult.Data[2]["LastName"]);
192-
Assert.AreEqual("Mikki", (string)checkUpdateResult.Data[2]["FirstName"]);
191+
Assert.AreEqual("Suku", (string)checkUpdateResult.Data[0]["LastName"], $"TransactionLevel: {level}.");
192+
Assert.AreEqual("Etu", (string)checkUpdateResult.Data[0]["FirstName"], $"TransactionLevel: {level}.");
193+
Assert.AreEqual("Edit", (string)checkUpdateResult.Data[1]["LastName"], $"TransactionLevel: {level}.");
194+
Assert.AreEqual("Forst", (string)checkUpdateResult.Data[1]["FirstName"], $"TransactionLevel: {level}.");
195+
Assert.AreEqual("Hiiri", (string)checkUpdateResult.Data[2]["LastName"], $"TransactionLevel: {level}.");
196+
Assert.AreEqual("Mikki", (string)checkUpdateResult.Data[2]["FirstName"], $"TransactionLevel: {level}.");
193197
Assert.AreEqual(3, GetRowCount());
194198

195199
// Delete
196200
var delete = await MicrosoftSQL.ExecuteProcedure(inputDelete, options, default);
197-
Assert.IsTrue(delete.Success);
198-
Assert.AreEqual(1, delete.RecordsAffected);
199-
Assert.IsNull(delete.ErrorMessage);
200-
Assert.AreEqual(2, GetRowCount());
201+
Assert.IsTrue(delete.Success, $"TransactionLevel: {level}.");
202+
Assert.AreEqual(1, delete.RecordsAffected, $"TransactionLevel: {level}.");
203+
Assert.IsNull(delete.ErrorMessage, $"TransactionLevel: {level}.");
204+
Assert.AreEqual(2, GetRowCount(), $"TransactionLevel: {level}.");
201205
var checkDeleteResult = await MicrosoftSQL.ExecuteProcedure(inputSelect, options, default);
202-
Assert.AreEqual("Suku", (string)checkDeleteResult.Data[0]["LastName"]);
203-
Assert.AreEqual("Etu", (string)checkDeleteResult.Data[0]["FirstName"]);
204-
Assert.AreEqual("Hiiri", (string)checkDeleteResult.Data[1]["LastName"]);
205-
Assert.AreEqual("Mikki", (string)checkDeleteResult.Data[1]["FirstName"]);
206+
Assert.AreEqual("Suku", (string)checkDeleteResult.Data[0]["LastName"], $"TransactionLevel: {level}.");
207+
Assert.AreEqual("Etu", (string)checkDeleteResult.Data[0]["FirstName"], $"TransactionLevel: {level}.");
208+
Assert.AreEqual("Hiiri", (string)checkDeleteResult.Data[1]["LastName"], $"TransactionLevel: {level}.");
209+
Assert.AreEqual("Mikki", (string)checkDeleteResult.Data[1]["FirstName"], $"TransactionLevel: {level}.");
206210

207211
CleanUp();
208212
Init();
209213
}
210214
}
211215

216+
[TestMethod]
217+
public async Task TestExecuteProcedure_ProcedureParameter()
218+
{
219+
var parameter = new ProcedureParameter
220+
{
221+
Name = "id",
222+
Value = "1",
223+
SqlDataType = SqlDataTypes.Auto
224+
};
225+
226+
var inputInsert = new Input()
227+
{
228+
ConnectionString = _connString,
229+
Execute = "InsertValues",
230+
ExecuteType = ExecuteTypes.ExecuteReader,
231+
Parameters = null
232+
};
233+
234+
var parameterInput = new Input()
235+
{
236+
ConnectionString = _connString,
237+
Execute = "SelectSingleParameter",
238+
ExecuteType = ExecuteTypes.ExecuteReader,
239+
Parameters = new ProcedureParameter[] { parameter }
240+
};
241+
242+
var options = new Options()
243+
{
244+
SqlTransactionIsolationLevel = SqlTransactionIsolationLevel.None,
245+
CommandTimeoutSeconds = 2,
246+
ThrowErrorOnFailure = true
247+
};
248+
249+
await MicrosoftSQL.ExecuteProcedure(inputInsert, options, default);
250+
251+
var query = await MicrosoftSQL.ExecuteProcedure(parameterInput, options, default);
252+
Assert.IsTrue(query.Success);
253+
Assert.AreEqual(-1, query.RecordsAffected);
254+
Assert.IsNull(query.ErrorMessage);
255+
Assert.IsTrue(((IEnumerable<dynamic>)query.Data).Any(x => x.Id == 1 && x.LastName == "Suku"));
256+
}
257+
212258
// Simple select query
213259
private static int GetRowCount()
214260
{

Frends.MicrosoftSQL.ExecuteProcedure/Frends.MicrosoftSQL.ExecuteProcedure.Tests/ManualTesting.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using Frends.MicrosoftSQL.ExecuteProcedure.Definitions;
22
using Microsoft.VisualStudio.TestTools.UnitTesting;
33
using System.Data.SqlClient;
4-
using System.Threading;
54

65
namespace Frends.MicrosoftSQL.ExecuteProcedure.Tests;
76

@@ -88,8 +87,8 @@ CLOSE cur
8887
connection.Dispose();
8988
}
9089

91-
// Add following line to ExecuteProcedure.cs: 'throw new Exception();' after 'ExecuteTypes.ExecuteReader: dataReader = await command.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false);' (currently line 112).
92-
[Ignore("To run this test, comment this line after exception has been added to ExecuteProcedure.cs.")]
90+
// Use 'throw new Exception();' in HandleExecutionException class.
91+
[Ignore("Use 'throw new Exception();' in HandleExecutionException class.")]
9392
[TestMethod]
9493
public async Task TestExecuteProcedure_RollbackInsert_ThrowErrorOnFailure_False()
9594
{
@@ -116,8 +115,8 @@ public async Task TestExecuteProcedure_RollbackInsert_ThrowErrorOnFailure_False(
116115
Assert.AreEqual(0, GetRowCount());
117116
}
118117

119-
// Add following line to ExecuteProcedure.cs: 'throw new Exception();' after 'ExecuteTypes.ExecuteReader: dataReader = await command.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false);' (currently line 112).
120-
[Ignore("To run this test, comment this line after exception has been added to ExecuteProcedure.cs.")]
118+
// Use 'throw new Exception();' in HandleExecutionException class.
119+
[Ignore("Use 'throw new Exception();' in HandleExecutionException class.")]
121120
[TestMethod]
122121
public async Task TestExecuteProcedure_RollbackInsert_ThrowErrorOnFailure_True()
123122
{

Frends.MicrosoftSQL.ExecuteProcedure/Frends.MicrosoftSQL.ExecuteProcedure.Tests/NonQueryUnitTests.cs

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ docker exec -it sql1 "bash"
1919

2020
private static readonly string _connString = "Server=127.0.0.1,1433;Database=Master;User Id=SA;Password=Salakala123!";
2121
private static readonly string _tableName = "TestTable";
22-
22+
2323
[TestInitialize]
2424
public void Init()
2525
{
@@ -39,6 +39,10 @@ public void Init()
3939
command.CommandText = $"CREATE PROCEDURE SelectAll AS select * from {_tableName}";
4040
command.ExecuteNonQuery();
4141

42+
//Select single parameter
43+
command.CommandText = $"CREATE PROCEDURE InsertWithParameter (@lastname varchar(255)) AS INSERT INTO {_tableName} VALUES (4, @lastname, 'Etu')";
44+
command.ExecuteNonQuery();
45+
4246
//Select single
4347
command.CommandText = $"CREATE PROCEDURE SelectSingle AS select * from {_tableName} where Id = 1";
4448
command.ExecuteNonQuery();
@@ -88,12 +92,12 @@ CLOSE cur
8892
[TestMethod]
8993
public async Task TestExecuteProcedure_NonQuery()
9094
{
91-
var transactionLevels = new List<SqlTransactionIsolationLevel>() {
95+
var transactionLevels = new List<SqlTransactionIsolationLevel>() {
9296
SqlTransactionIsolationLevel.Unspecified,
9397
SqlTransactionIsolationLevel.Serializable,
9498
SqlTransactionIsolationLevel.None,
9599
SqlTransactionIsolationLevel.ReadUncommitted,
96-
SqlTransactionIsolationLevel.ReadCommitted
100+
SqlTransactionIsolationLevel.ReadCommitted
97101
};
98102

99103
var inputInsert = new Input()
@@ -209,7 +213,37 @@ public async Task TestExecuteProcedure_NonQuery()
209213
}
210214
}
211215

212-
// Simple select query.
216+
[TestMethod]
217+
public async Task TestExecuteProcedure_ProcedureParameter()
218+
{
219+
var parameter = new ProcedureParameter
220+
{
221+
Name = "lastname",
222+
Value = "Parametri",
223+
SqlDataType = SqlDataTypes.Auto
224+
};
225+
226+
var parameterInput = new Input()
227+
{
228+
ConnectionString = _connString,
229+
Execute = "InsertWithParameter",
230+
ExecuteType = ExecuteTypes.NonQuery,
231+
Parameters = new ProcedureParameter[] { parameter }
232+
};
233+
234+
var options = new Options()
235+
{
236+
SqlTransactionIsolationLevel = SqlTransactionIsolationLevel.None,
237+
CommandTimeoutSeconds = 2,
238+
ThrowErrorOnFailure = true
239+
};
240+
241+
var insert = await MicrosoftSQL.ExecuteProcedure(parameterInput, options, default);
242+
Assert.IsTrue(insert.Success);
243+
Assert.AreEqual(1, insert.RecordsAffected);
244+
Assert.IsNull(insert.ErrorMessage);
245+
}
246+
213247
private static int GetRowCount()
214248
{
215249
using var connection = new SqlConnection(_connString);

0 commit comments

Comments
 (0)