1
1
using Microsoft . Data . Sqlite ;
2
2
using Microsoft . Extensions . Logging . Abstractions ;
3
+ using System . Data . Common ;
3
4
using Cosmos . DataTransfer . Interfaces ;
4
5
using Cosmos . DataTransfer . Common ;
5
6
using Cosmos . DataTransfer . Common . UnitTests ;
7
+ using Moq ;
8
+ using Microsoft . Extensions . Configuration ;
6
9
7
10
namespace Cosmos . DataTransfer . SqlServerExtension . UnitTests ;
8
11
9
12
[ TestClass ]
10
13
public class SqlServerDataSourceExtensionTests
11
14
{
12
15
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 ( ) ;
15
19
await connection . OpenAsync ( cancellationToken ) ;
16
20
17
21
var cmd = connection . CreateCommand ( ) ;
@@ -27,25 +31,20 @@ name TEXT
27
31
VALUES (2, NULL);" ;
28
32
await cmd . ExecuteNonQueryAsync ( cancellationToken ) ;
29
33
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 ) ;
35
35
}
36
36
37
37
[ 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
+
39
43
var extension = new SqlServerDataSourceExtension ( ) ;
40
- var config = TestHelpers . CreateConfig ( new Dictionary < string , string > {
41
- { "ConnectionString" , "Sqlite" } ,
42
- { "QueryText" , "SELECT * FROM foobar" }
43
- } ) ;
44
44
Assert . AreEqual ( "SqlServer" , extension . DisplayName ) ;
45
-
46
- var cancellationToken = new CancellationTokenSource ( 500 ) ;
47
45
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 ( ) ;
49
48
var expected = new List < DictionaryDataItem > {
50
49
new DictionaryDataItem ( new Dictionary < string , object ? > { { "id" , ( long ) 1 } , { "name" , "zoo" } } ) ,
51
50
new DictionaryDataItem ( new Dictionary < string , object ? > { { "id" , ( long ) 2 } , { "name" , null } } )
@@ -54,24 +53,25 @@ public async Task TestReadAsync_QueryText() {
54
53
}
55
54
56
55
[ 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
+
60
61
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 ) ;
65
63
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 ;
68
68
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 ( ) ) ;
75
75
}
76
76
77
77
// Allows for testing against an actual SQL Server by specifying a
@@ -80,10 +80,11 @@ public async Task TestReadAsync_FromFile() {
80
80
// <?xml version="1.0" encoding="utf-8"?>
81
81
// <RunSettings>
82
82
// <TestRunParameters>
83
- // <Parameter name="TestReadAsync_LiveSqlServer_ConnectionString" value="< Your connection string> " />
83
+ // <Parameter name="TestReadAsync_LiveSqlServer_ConnectionString" value="Your connection string" />
84
84
// </TestRunParameters>
85
85
// </RunSettings>
86
- // run test with dotnet test --settings sql.runsettings
86
+ // run test with
87
+ // dotnet test --settings sql.runsettings
87
88
#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.
88
89
public TestContext TestContext { get ; set ; }
89
90
#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() {
111
112
{ "zoo" , null }
112
113
} ) ) ) ;
113
114
}
114
- }
115
+ }
0 commit comments