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+ }
0 commit comments