Skip to content

Commit 19fa420

Browse files
Merge pull request #7 from abhinavminhas/dev
QueryDB Solution Updates
2 parents f97df1e + c195fc0 commit 19fa420

20 files changed

+2028
-32
lines changed

QueryDB.Core.Tests/Docker/docker-compose-mssql.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ services:
88
ports:
99
- "1433:1433"
1010
volumes:
11-
- ./QueryDB.Core.Tests/SeedData:/home
11+
- ../SeedData:/home
1212
healthcheck:
1313
test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P $$SA_PASSWORD -Q \"SELECT 'mssql' AS current_database;\""]
1414
interval: 5s

QueryDB.Core.Tests/Docker/docker-compose-mysql.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ services:
77
ports:
88
- "3306:3306"
99
volumes:
10-
- ./QueryDB.Core.Tests/SeedData:/home
10+
- ../SeedData:/home
1111
healthcheck:
1212
test: ["CMD-SHELL", "mysql -uroot -p$$MYSQL_ROOT_PASSWORD -e 'SELECT DATABASE() AS current_database;'"]
1313
interval: 5s

QueryDB.Core.Tests/Docker/docker-compose-oracle.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ services:
77
ports:
88
- "1521:1521"
99
volumes:
10-
- ./QueryDB.Core.Tests/SeedData:/home
10+
- ../SeedData:/home
1111
shm_size: 4gb
1212
healthcheck:
1313
test: ["CMD-SHELL", "echo \"SELECT 'oracle' AS current_database FROM dual;\" | sqlplus -s sys/$$ORACLE_PWD@localhost:1521/XE as sysdba"]

QueryDB.Core.Tests/Docker/docker-compose-postgres.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ services:
99
ports:
1010
- "5432:5432"
1111
volumes:
12-
- ./QueryDB.Core.Tests/SeedData:/home
12+
- ../SeedData:/home
1313
healthcheck:
1414
test: ["CMD-SHELL", "pg_isready -U sys"]
1515
interval: 5s

QueryDB.Core.Tests/MSSQLTests.cs

Lines changed: 306 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using Microsoft.VisualStudio.TestTools.UnitTesting;
2+
using QueryDB.Exceptions;
23
using System;
4+
using System.Collections.Generic;
35
using System.Linq;
46

57
namespace QueryDB.Core.Tests
@@ -308,6 +310,310 @@ public void Test_MSSQL_FetchData_Entity_Strict_Error_Check()
308310

309311
#endregion
310312

313+
#region Execute Command Tests - << int ExecuteCommand(string sqlStatement) >>
314+
315+
[TestMethod]
316+
[TestCategory(DB_TESTS), TestCategory(MSSQL_TESTS)]
317+
public void Test_MSSQL_ExecuteCommand_DDL_Queries()
318+
{
319+
var createTableSql = Queries.MSSQLQueries.TestDB.DDL.Create_Table;
320+
var alterTableSql = Queries.MSSQLQueries.TestDB.DDL.Alter_Table;
321+
var commentTableSql = Queries.MSSQLQueries.TestDB.DDL.Comment_Table;
322+
var commentTableColumnSql = Queries.MSSQLQueries.TestDB.DDL.Comment_Table_Column;
323+
var truncateTableSql = Queries.MSSQLQueries.TestDB.DDL.Truncate_Table;
324+
var renameTableSql = Queries.MSSQLQueries.TestDB.DDL.Rename_Table;
325+
var dropTableSql = Queries.MSSQLQueries.TestDB.DDL.Drop_Table;
326+
var dDLExecutionCheckSql = Queries.MSSQLQueries.TestDB.DDL.DDL_Execute_check;
327+
var dDLTableCommentCheckSql = Queries.MSSQLQueries.TestDB.DDL.DDL_Table_Comment_check;
328+
var dDLTableColumnCommentCheckSql = Queries.MSSQLQueries.TestDB.DDL.DDL_Table_Column_Comment_check;
329+
330+
var dbContext = new DBContext(DB.MSSQL, MSSQLConnectionString);
331+
dbContext.ExecuteCommand(createTableSql);
332+
dbContext.ExecuteCommand(alterTableSql);
333+
dbContext.ExecuteCommand(commentTableSql);
334+
dbContext.ExecuteCommand(commentTableColumnSql);
335+
dbContext.ExecuteCommand(truncateTableSql);
336+
337+
var tableCount = dbContext
338+
.FetchData(string.Format(dDLExecutionCheckSql, "dbo", "Employee"));
339+
Assert.AreEqual("1", tableCount[0].ReferenceData["Table_Count"]);
340+
var tableComment = dbContext
341+
.FetchData(string.Format(dDLTableCommentCheckSql, "dbo", "Employee"));
342+
Assert.AreEqual("This table stores employee records", tableComment[0].ReferenceData["Table_Comment"]);
343+
var tableColumnComment = dbContext
344+
.FetchData(string.Format(dDLTableColumnCommentCheckSql, "dbo", "Employee"));
345+
Assert.AreEqual("This column stores employee middle name", tableColumnComment[0].ReferenceData["Table_Column_Comment"]);
346+
347+
dbContext.ExecuteCommand(renameTableSql);
348+
349+
tableCount = dbContext
350+
.FetchData(string.Format(dDLExecutionCheckSql, "dbo", "Employee"));
351+
Assert.AreEqual("0", tableCount[0].ReferenceData["Table_Count"]);
352+
tableCount = dbContext
353+
.FetchData(string.Format(dDLExecutionCheckSql, "dbo", "Employees"));
354+
Assert.AreEqual("1", tableCount[0].ReferenceData["Table_Count"]);
355+
356+
dbContext.ExecuteCommand(dropTableSql);
357+
358+
tableCount = dbContext
359+
.FetchData(string.Format(dDLExecutionCheckSql, "dbo", "Employees"));
360+
Assert.AreEqual("0", tableCount[0].ReferenceData["Table_Count"]);
361+
}
362+
363+
[TestMethod]
364+
[TestCategory(DB_TESTS), TestCategory(MSSQL_TESTS)]
365+
public void Test_MSSQL_ExecuteCommand_DML_Queries()
366+
{
367+
var insertSql = Queries.MSSQLQueries.TestDB.DML.InsertSql;
368+
var updateSql = Queries.MSSQLQueries.TestDB.DML.UpdateSql;
369+
var deleteSql = Queries.MSSQLQueries.TestDB.DML.DeleteSql;
370+
var verifyDMLExecution = Queries.MSSQLQueries.TestDB.DML.VerifyDMLExecution;
371+
372+
var dbContext = new DBContext(DB.MSSQL, MSSQLConnectionString);
373+
374+
// Insert
375+
var rows = dbContext.ExecuteCommand(insertSql);
376+
Assert.AreEqual(1, rows);
377+
var data = dbContext.FetchData(verifyDMLExecution);
378+
Assert.IsTrue(data.Count == 1);
379+
var agent = data.FirstOrDefault();
380+
Assert.AreEqual("A020", agent.ReferenceData["Agent_Code"]);
381+
Assert.AreEqual("John", agent.ReferenceData["Agent_Name"]);
382+
Assert.AreEqual("Wick", agent.ReferenceData["Working_Area"]);
383+
Assert.AreEqual("0.11", agent.ReferenceData["Commission"]);
384+
Assert.AreEqual("010-44536178", agent.ReferenceData["Phone_No"]);
385+
Assert.AreEqual("", agent.ReferenceData["Country"]);
386+
387+
// Update
388+
rows = dbContext.ExecuteCommand(updateSql);
389+
Assert.AreEqual(1, rows);
390+
data = dbContext.FetchData(verifyDMLExecution);
391+
Assert.IsTrue(data.Count == 1);
392+
agent = data.FirstOrDefault();
393+
Assert.AreEqual("A020", agent.ReferenceData["Agent_Code"]);
394+
Assert.AreEqual("John", agent.ReferenceData["Agent_Name"]);
395+
Assert.AreEqual("Wick", agent.ReferenceData["Working_Area"]);
396+
Assert.AreEqual("0.15", agent.ReferenceData["Commission"]);
397+
Assert.AreEqual("010-44536178", agent.ReferenceData["Phone_No"]);
398+
Assert.AreEqual("", agent.ReferenceData["Country"]);
399+
400+
// Delete
401+
rows = dbContext.ExecuteCommand(deleteSql);
402+
Assert.AreEqual(1, rows);
403+
data = dbContext.FetchData(verifyDMLExecution);
404+
Assert.IsTrue(data.Count == 0);
405+
}
406+
407+
[TestMethod]
408+
[TestCategory(DB_TESTS), TestCategory(MSSQL_TESTS)]
409+
public void Test_MSSQL_ExecuteCommand_DML_Unsupported_SELECT_Queries()
410+
{
411+
var selectSql = Queries.MSSQLQueries.TestDB.DML.SelectSql;
412+
413+
// Select
414+
try
415+
{
416+
var dbContext = new DBContext(DB.MSSQL, MSSQLConnectionString);
417+
var rows = dbContext.ExecuteCommand(selectSql);
418+
Assert.Fail("No Exception");
419+
}
420+
catch (QueryDBException ex)
421+
{
422+
Assert.AreEqual("SELECT queries are not supported here.", ex.Message);
423+
Assert.AreEqual("UnsupportedCommand", ex.ErrorType);
424+
Assert.AreEqual("'ExecuteCommand' doesn't support SELECT queries.", ex.AdditionalInfo);
425+
}
426+
}
427+
428+
[TestMethod]
429+
[TestCategory(DB_TESTS), TestCategory(MSSQL_TESTS)]
430+
public void Test_MSSQL_ExecuteCommand_DCL_Queries()
431+
{
432+
var login = "test_user";
433+
var user = "test_user";
434+
var password = "Test@1234";
435+
var table = "agents";
436+
var commands = "SELECT, UPDATE";
437+
var checkCommand = "SELECT";
438+
439+
var createLogin = string.Format(Queries.MSSQLQueries.TestDB.DCL.CreateLoginSql_Login_Password, login, password);
440+
var createUser = string.Format(Queries.MSSQLQueries.TestDB.DCL.CreateUserSql_User_Login, user, login);
441+
var grantSql = string.Format(Queries.MSSQLQueries.TestDB.DCL.GrantSql_Command_Table_User, commands, table, user);
442+
var revokeSql = string.Format(Queries.MSSQLQueries.TestDB.DCL.RevokeSql_Command_Table_User, commands, table, user);
443+
var verifyPermissions = string.Format(Queries.MSSQLQueries.TestDB.DCL.VerifyPermission_User_Table_Command, user, table, checkCommand);
444+
var removeUser = string.Format(Queries.MSSQLQueries.TestDB.DCL.RemoveUserSql_User, user);
445+
var removeLogin = string.Format(Queries.MSSQLQueries.TestDB.DCL.RemoveLoginSql_Login, login);
446+
447+
var dbContext = new DBContext(DB.MSSQL, MSSQLConnectionString);
448+
449+
// Create Login
450+
var result = dbContext.ExecuteCommand(createLogin);
451+
Assert.AreEqual(-1, result);
452+
453+
// Create User
454+
result = dbContext.ExecuteCommand(createUser);
455+
Assert.AreEqual(-1, result);
456+
457+
// Existing Permissions
458+
var data = dbContext.FetchData(verifyPermissions).FirstOrDefault();
459+
Assert.AreEqual("0", data.ReferenceData["HasPermission"]);
460+
461+
// Grant
462+
result = dbContext.ExecuteCommand(grantSql);
463+
Assert.AreEqual(-1, result);
464+
data = dbContext.FetchData(verifyPermissions).FirstOrDefault();
465+
Assert.AreEqual("1", data.ReferenceData["HasPermission"]);
466+
467+
// Revoke
468+
result = dbContext.ExecuteCommand(revokeSql);
469+
Assert.AreEqual(-1, result);
470+
data = dbContext.FetchData(verifyPermissions).FirstOrDefault();
471+
Assert.AreEqual("0", data.ReferenceData["HasPermission"]);
472+
473+
// Remove User
474+
result = dbContext.ExecuteCommand(removeUser);
475+
Assert.AreEqual(-1, result);
476+
477+
// Remove Login
478+
result = dbContext.ExecuteCommand(removeLogin);
479+
Assert.AreEqual(-1, result);
480+
}
481+
482+
#endregion
483+
484+
#region Execute Transaction Tests - << bool ExecuteTransaction(List<string> sqlStatements) >>
485+
486+
[TestMethod]
487+
[TestCategory(DB_TESTS), TestCategory(MSSQL_TESTS)]
488+
public void Test_MSSQL_ExecuteTransaction_DDL_Multiple_Queries()
489+
{
490+
var createTableSql = Queries.MSSQLQueries.TestDB.DDL.Create_Table;
491+
var alterTableSql = Queries.MSSQLQueries.TestDB.DDL.Alter_Table;
492+
var truncateTableSql = Queries.MSSQLQueries.TestDB.DDL.Truncate_Table;
493+
var renameTableSql = Queries.MSSQLQueries.TestDB.DDL.Rename_Table;
494+
var dropTableSql = Queries.MSSQLQueries.TestDB.DDL.Drop_Table;
495+
var dDLExecutionCheckSql = Queries.MSSQLQueries.TestDB.DDL.DDL_Execute_check;
496+
497+
// Create, Alter & Truncate
498+
var statements = new List<string>
499+
{
500+
createTableSql,
501+
alterTableSql,
502+
truncateTableSql
503+
};
504+
var dbContext = new DBContext(DB.MSSQL, MSSQLConnectionString);
505+
var result = dbContext.ExecuteTransaction(statements);
506+
Assert.IsTrue(result);
507+
508+
var tableCount = dbContext
509+
.FetchData(string.Format(dDLExecutionCheckSql, "dbo", "Employee"));
510+
Assert.AreEqual("1", tableCount[0].ReferenceData["Table_Count"]);
511+
512+
// Rename & Drop
513+
statements = new List<string>
514+
{
515+
renameTableSql,
516+
dropTableSql
517+
};
518+
result = dbContext.ExecuteTransaction(statements);
519+
Assert.IsTrue(result);
520+
521+
tableCount = dbContext
522+
.FetchData(string.Format(dDLExecutionCheckSql, "dbo", "Employees"));
523+
Assert.AreEqual("0", tableCount[0].ReferenceData["Table_Count"]);
524+
}
525+
526+
[TestMethod]
527+
[TestCategory(DB_TESTS), TestCategory(MSSQL_TESTS)]
528+
public void Test_MSSQL_ExecuteTransaction_DML_Multiple_Queries()
529+
{
530+
var insertSql = Queries.MSSQLQueries.TestDB.DML.InsertSql;
531+
var updateSql = Queries.MSSQLQueries.TestDB.DML.UpdateSql;
532+
var deleteSql = Queries.MSSQLQueries.TestDB.DML.DeleteSql;
533+
var verifyDMLExecution = Queries.MSSQLQueries.TestDB.DML.VerifyDMLExecution;
534+
535+
var statements = new List<string>
536+
{
537+
insertSql,
538+
updateSql
539+
};
540+
var dbContext = new DBContext(DB.MSSQL, MSSQLConnectionString);
541+
542+
// Insert & Update
543+
var result = dbContext.ExecuteTransaction(statements);
544+
Assert.IsTrue(result);
545+
var data = dbContext.FetchData(verifyDMLExecution);
546+
Assert.IsTrue(data.Count == 1);
547+
var agent = data.FirstOrDefault();
548+
Assert.AreEqual("A020", agent.ReferenceData["Agent_Code"]);
549+
Assert.AreEqual("John", agent.ReferenceData["Agent_Name"]);
550+
Assert.AreEqual("Wick", agent.ReferenceData["Working_Area"]);
551+
Assert.AreEqual("0.15", agent.ReferenceData["Commission"]);
552+
Assert.AreEqual("010-44536178", agent.ReferenceData["Phone_No"]);
553+
Assert.AreEqual("", agent.ReferenceData["Country"]);
554+
555+
// Delete
556+
statements = new List<string>
557+
{
558+
deleteSql
559+
};
560+
result = dbContext.ExecuteTransaction(statements);
561+
Assert.IsTrue(result);
562+
data = dbContext.FetchData(verifyDMLExecution);
563+
Assert.IsTrue(data.Count == 0);
564+
}
565+
566+
[TestMethod]
567+
[TestCategory(DB_TESTS), TestCategory(MSSQL_TESTS)]
568+
public void Test_MSSQL_ExecuteTransaction_Incomplete_Transaction_Rollback_On_Error()
569+
{
570+
var insertSql = Queries.MSSQLQueries.TestDB.DML.InsertSql;
571+
var updateSql = Queries.MSSQLQueries.TestDB.DML.UpdateSql;
572+
var updateErrorSql = "UPDATE";
573+
var verifyDMLExecution = Queries.MSSQLQueries.TestDB.DML.VerifyDMLExecution;
574+
575+
var statements = new List<string>
576+
{
577+
insertSql,
578+
updateSql,
579+
updateErrorSql
580+
};
581+
var dbContext = new DBContext(DB.MSSQL, MSSQLConnectionString);
582+
583+
// Insert & Update
584+
var result = dbContext.ExecuteTransaction(statements);
585+
Assert.IsFalse(result);
586+
var data = dbContext.FetchData(verifyDMLExecution);
587+
Assert.IsTrue(data.Count == 0);
588+
}
589+
590+
[TestMethod]
591+
[TestCategory(DB_TESTS), TestCategory(MSSQL_TESTS)]
592+
public void Test_MSSQL_ExecuteTransaction_DML_Unsupported_SELECT_Queries()
593+
{
594+
var selectSql = Queries.MSSQLQueries.TestDB.DML.SelectSql;
595+
596+
// Select
597+
try
598+
{
599+
var statements = new List<string>
600+
{
601+
selectSql
602+
};
603+
var dbContext = new DBContext(DB.MSSQL, MSSQLConnectionString);
604+
var result = dbContext.ExecuteTransaction(statements);
605+
Assert.Fail("No Exception");
606+
}
607+
catch (QueryDBException ex)
608+
{
609+
Assert.AreEqual("SELECT queries are not supported here.", ex.Message);
610+
Assert.AreEqual("UnsupportedCommand", ex.ErrorType);
611+
Assert.AreEqual("'ExecuteTransaction' doesn't support SELECT queries.", ex.AdditionalInfo);
612+
}
613+
}
614+
615+
#endregion
616+
311617
#endregion
312618

313619
}

0 commit comments

Comments
 (0)