11using Microsoft . Data . Sqlite ;
22using Microsoft . Extensions . Logging . Abstractions ;
3+ using System . Data . Common ;
34using Cosmos . DataTransfer . Interfaces ;
45using Cosmos . DataTransfer . Common ;
56using Cosmos . DataTransfer . Common . UnitTests ;
7+ using Moq ;
8+ using Microsoft . Extensions . Configuration ;
69
710namespace Cosmos . DataTransfer . SqlServerExtension . UnitTests ;
811
912[ TestClass ]
1013public class SqlServerDataSourceExtensionTests
1114{
1215
13- private static async Task < Func < string , ValueTask < System . Data . Common . DbConnection > > > connectionFactory ( CancellationToken cancellationToken = default ( CancellationToken ) ) {
14- var connection = new SqliteConnection ( "" ) ;
16+ private static async Task < Tuple < SqliteFactory , DbConnection > > connectionFactory ( CancellationToken cancellationToken = default ( CancellationToken ) ) {
17+ var provider = SqliteFactory . Instance ;
18+ var connection = provider . CreateConnection ( ) ;
1519 await connection . OpenAsync ( cancellationToken ) ;
1620
1721 var cmd = connection . CreateCommand ( ) ;
@@ -27,25 +31,20 @@ name TEXT
2731 VALUES (2, NULL);" ;
2832 await cmd . ExecuteNonQueryAsync ( cancellationToken ) ;
2933
30- var func = ( string connectionString ) => {
31- return new ValueTask < System . Data . Common . DbConnection > ( connection ) ;
32- } ;
33-
34- return func ;
34+ return Tuple . Create ( provider , connection ) ;
3535 }
3636
3737 [ TestMethod ]
38- public async Task TestReadAsync_QueryText ( ) {
38+ public async Task TestReadAsync ( ) {
39+ var config = new Mock < IConfiguration > ( ) ;
40+ var cancellationToken = new CancellationTokenSource ( 500 ) ;
41+ var ( providerFactory , connection ) = await connectionFactory ( cancellationToken . Token ) ;
42+
3943 var extension = new SqlServerDataSourceExtension ( ) ;
40- var config = TestHelpers . CreateConfig ( new Dictionary < string , string > {
41- { "ConnectionString" , "Sqlite" } ,
42- { "QueryText" , "SELECT * FROM foobar" }
43- } ) ;
4444 Assert . AreEqual ( "SqlServer" , extension . DisplayName ) ;
45-
46- var cancellationToken = new CancellationTokenSource ( 500 ) ;
4745
48- var result = await extension . ReadAsync ( config , NullLogger . Instance , await connectionFactory ( cancellationToken . Token ) , cancellationToken . Token ) . ToListAsync ( ) ;
46+ var result = await extension . ReadAsync ( config . Object , NullLogger . Instance ,
47+ "SELECT * FROM foobar" , Array . Empty < DbParameter > ( ) , connection , providerFactory , cancellationToken . Token ) . ToListAsync ( ) ;
4948 var expected = new List < DictionaryDataItem > {
5049 new DictionaryDataItem ( new Dictionary < string , object ? > { { "id" , ( long ) 1 } , { "name" , "zoo" } } ) ,
5150 new DictionaryDataItem ( new Dictionary < string , object ? > { { "id" , ( long ) 2 } , { "name" , null } } )
@@ -54,24 +53,25 @@ public async Task TestReadAsync_QueryText() {
5453 }
5554
5655 [ TestMethod ]
57- public async Task TestReadAsync_FromFile ( ) {
58- var outputFile = Path . GetTempFileName ( ) ;
59- await File . WriteAllTextAsync ( outputFile , "SELECT * FROM foobar;" ) ;
56+ public async Task TestReadAsyncWithParameters ( ) {
57+ var config = new Mock < IConfiguration > ( ) ;
58+ var cancellationToken = new CancellationTokenSource ( ) ;
59+ var ( providerFactory , connection ) = await connectionFactory ( cancellationToken . Token ) ;
60+
6061 var extension = new SqlServerDataSourceExtension ( ) ;
61- var config = TestHelpers . CreateConfig ( new Dictionary < string , string > {
62- { "ConnectionString" , "Sqlite" } ,
63- { "FilePath" , outputFile }
64- } ) ;
62+ Assert . AreEqual ( "SqlServer" , extension . DisplayName ) ;
6563
66-
67- var cancellationToken = new CancellationTokenSource ( 500 ) ;
64+ var parameter = providerFactory . CreateParameter ( ) ;
65+ parameter . ParameterName = "@x" ;
66+ parameter . DbType = System . Data . DbType . Int32 ;
67+ parameter . Value = 2 ;
6868
69- var result = await extension . ReadAsync ( config , NullLogger . Instance , await connectionFactory ( cancellationToken . Token ) , cancellationToken . Token ) . ToListAsync ( ) ;
70- var expected = new List < DictionaryDataItem > {
71- new DictionaryDataItem ( new Dictionary < string , object ? > { { "id" , ( long ) 1 } , { "name" , "zoo" } } ) ,
72- new DictionaryDataItem ( new Dictionary < string , object ? > { { "id" , ( long ) 2 } , { "name" , null } } )
73- } ;
74- CollectionAssert . That . AreEqual ( expected , result , new DataItemComparer ( ) ) ;
69+ var result = await extension . ReadAsync ( config . Object , NullLogger . Instance ,
70+ "SELECT * FROM foobar WHERE id = @x" ,
71+ new DbParameter [ ] { parameter } , connection , providerFactory , cancellationToken . Token ) . FirstAsync ( ) ;
72+ Assert . That . AreEqual ( result ,
73+ new DictionaryDataItem ( new Dictionary < string , object ? > { { "id" , ( long ) 2 } , { "name" , null } } ) ,
74+ new DataItemComparer ( ) ) ;
7575 }
7676
7777 // Allows for testing against an actual SQL Server by specifying a
@@ -80,10 +80,11 @@ public async Task TestReadAsync_FromFile() {
8080 // <?xml version="1.0" encoding="utf-8"?>
8181 // <RunSettings>
8282 // <TestRunParameters>
83- // <Parameter name="TestReadAsync_LiveSqlServer_ConnectionString" value="< Your connection string> " />
83+ // <Parameter name="TestReadAsync_LiveSqlServer_ConnectionString" value="Your connection string" />
8484 // </TestRunParameters>
8585 // </RunSettings>
86- // run test with dotnet test --settings sql.runsettings
86+ // run test with
87+ // dotnet test --settings sql.runsettings
8788#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable.
8889 public TestContext TestContext { get ; set ; }
8990#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable.
@@ -111,4 +112,4 @@ public async Task TestReadAsync_LiveSqlServer() {
111112 { "zoo" , null }
112113 } ) ) ) ;
113114 }
114- }
115+ }
0 commit comments