Skip to content

Commit be0966d

Browse files
authored
Merge pull request #165 from stefanedwards/add-query-file
Add SQL file for SqlServer
2 parents 79f9d93 + 5d7601b commit be0966d

31 files changed

+774
-74
lines changed

.github/workflows/dotnet-build-test.yml

+12
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,15 @@ jobs:
2929
with:
3030
name: debug-build
3131
path: /home/runner/work/data-migration-desktop-tool/data-migration-desktop-tool/Core/Cosmos.DataTransfer.Core/bin/Debug/net8.0 #path/to/artifact/ # or path/to/artifact
32+
- name: Code Coverage Report
33+
uses: irongut/CodeCoverageSummary@v1.3.0
34+
with:
35+
filename: ./**/coverage.cobertura.xml
36+
badge: true
37+
fail_below_min: false
38+
format: markdown
39+
hide_branch_rate: false
40+
hide_complexity: true
41+
indicators: true
42+
output: both
43+
thresholds: '60 80'

.github/workflows/validate.yml

+12
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,15 @@ jobs:
1818
run: dotnet build
1919
- name: Run unit tests
2020
run: dotnet test --logger "console;verbosity=detailed"
21+
- name: Code Coverage Report
22+
uses: irongut/CodeCoverageSummary@v1.3.0
23+
with:
24+
filename: ./**/coverage.cobertura.xml
25+
badge: true
26+
fail_below_min: false
27+
format: markdown
28+
hide_branch_rate: false
29+
hide_complexity: true
30+
indicators: true
31+
output: both
32+
thresholds: '60 80'

.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ bld/
6868
# Visual Studio 2017 auto generated files
6969
Generated\ Files/
7070

71+
# MSTest .runsettings
72+
*.runsettings
73+
7174
# MSTest test Results
7275
[Tt]est[Rr]esult*/
7376
[Bb]uild[Ll]og.*
@@ -434,3 +437,4 @@ FodyWeavers.xsd
434437
# macOS .DS_Store
435438
**/.DS_Store
436439
/Core/Cosmos.DataTransfer.Core/migrationsettings.json
440+

Directory.Packages.props

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<PackageVersion Include="Microsoft.Azure.Cosmos" Version="3.46.1" />
1818
<PackageVersion Include="Microsoft.Azure.Cosmos.Encryption" Version="2.0.4" />
1919
<PackageVersion Include="Microsoft.Data.SqlClient" Version="6.0.1" />
20+
<PackageVersion Include="Microsoft.Data.Sqlite" Version="9.0.1" />
2021
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
2122
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
2223
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.2" />

Extensions/Csv/Cosmos.DataTransfer.CsvExtension.UnitTests/Cosmos.DataTransfer.CsvExtension.UnitTests.csproj

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,17 @@
1212
<PackageReference Include="Microsoft.NET.Test.Sdk" />
1313
<PackageReference Include="MSTest.TestAdapter" />
1414
<PackageReference Include="MSTest.TestFramework" />
15-
<PackageReference Include="coverlet.collector">
15+
<PackageReference Include="Moq" />
16+
<PackageReference Include="coverlet.collector" />
17+
<PackageReference Include="coverlet.msbuild">
1618
<PrivateAssets>all</PrivateAssets>
1719
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1820
</PackageReference>
19-
<PackageReference Include="Newtonsoft.Json" />
20-
<PackageReference Include="System.Text.Json" />
2121
</ItemGroup>
2222

2323
<ItemGroup>
24-
<ProjectReference Include="..\..\Json\Cosmos.DataTransfer.JsonExtension.UnitTests\Cosmos.DataTransfer.JsonExtension.UnitTests.csproj" />
2524
<ProjectReference Include="..\Cosmos.DataTransfer.CsvExtension\Cosmos.DataTransfer.CsvExtension.csproj" />
25+
<ProjectReference Include="..\..\..\Interfaces\Cosmos.DataTransfer.Common.UnitTests\Cosmos.DataTransfer.Common.UnitTests.csproj" />
2626
</ItemGroup>
2727

2828
<ItemGroup>

Extensions/Csv/Cosmos.DataTransfer.CsvExtension.UnitTests/CsvFileRoundTripTests.cs

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
using System.Globalization;
2-
using Cosmos.DataTransfer.JsonExtension;
3-
using Cosmos.DataTransfer.JsonExtension.UnitTests;
2+
using Cosmos.DataTransfer.Common.UnitTests;
43
using Microsoft.Extensions.Logging.Abstractions;
5-
using Newtonsoft.Json.Linq;
64

75
namespace Cosmos.DataTransfer.CsvExtension.UnitTests;
86

Extensions/Csv/Cosmos.DataTransfer.CsvExtension.UnitTests/CsvFileSourceTests.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Cosmos.DataTransfer.JsonExtension.UnitTests;
1+
using Cosmos.DataTransfer.Common.UnitTests;
22
using Microsoft.Extensions.Logging.Abstractions;
33

44
namespace Cosmos.DataTransfer.CsvExtension.UnitTests;
@@ -24,7 +24,7 @@ public async Task ReadAsync_WithSimpleFile_ReadsRows()
2424
object? value = dataItem.GetValue("id");
2525
Assert.IsNotNull(value);
2626
Assert.IsNotNull(dataItem.GetValue("name"));
27-
var current = Int32.Parse(value.ToString());
27+
var current = Int32.Parse(value.ToString()!);
2828
Assert.IsTrue(current > lastId);
2929
lastId = current;
3030
}

Extensions/Csv/Cosmos.DataTransfer.CsvExtension.UnitTests/CsvWriterSettingsTests.cs

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
using System.Globalization;
2-
using Cosmos.DataTransfer.JsonExtension.UnitTests;
32
using Microsoft.Extensions.Logging.Abstractions;
43
using System.ComponentModel.DataAnnotations;
54
using Cosmos.DataTransfer.CsvExtension.Settings;
65
using Cosmos.DataTransfer.Interfaces;
7-
using Cosmos.DataTransfer.JsonExtension;
6+
using Cosmos.DataTransfer.Common.UnitTests;
7+
using Moq;
88

99
namespace Cosmos.DataTransfer.CsvExtension.UnitTests;
1010

@@ -113,8 +113,9 @@ public async Task TestDanishCulture() {
113113
};
114114

115115
var sink = new CsvFileSink();
116+
var mockDataSource = new Mock<IDataSourceExtension>();
116117

117-
await sink.WriteAsync(data.ToAsyncEnumerable(), config, new JsonFileSource(), NullLogger.Instance);
118+
await sink.WriteAsync(data.ToAsyncEnumerable(), config, mockDataSource.Object, NullLogger.Instance);
118119
var result = await File.ReadAllTextAsync(outputFile);
119120
Assert.AreEqual("1,2", result);
120121
}

Extensions/Json/Cosmos.DataTransfer.JsonExtension.UnitTests/Cosmos.DataTransfer.JsonExtension.UnitTests.csproj

+3-2
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,18 @@
1313
<PackageReference Include="Microsoft.NET.Test.Sdk" />
1414
<PackageReference Include="MSTest.TestAdapter" />
1515
<PackageReference Include="MSTest.TestFramework" />
16-
<PackageReference Include="coverlet.collector">
16+
<PackageReference Include="coverlet.collector" />
17+
<PackageReference Include="coverlet.msbuild">
1718
<PrivateAssets>all</PrivateAssets>
1819
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1920
</PackageReference>
2021
<PackageReference Include="Newtonsoft.Json" />
2122
<PackageReference Include="System.Linq.Async" />
22-
<PackageReference Include="System.Text.Json" />
2323
</ItemGroup>
2424

2525
<ItemGroup>
2626
<ProjectReference Include="..\Cosmos.DataTransfer.JsonExtension\Cosmos.DataTransfer.JsonExtension.csproj" />
27+
<ProjectReference Include="..\..\..\Interfaces\Cosmos.DataTransfer.Common.UnitTests\Cosmos.DataTransfer.Common.UnitTests.csproj" />
2728
</ItemGroup>
2829

2930
<ItemGroup>

Extensions/Json/Cosmos.DataTransfer.JsonExtension.UnitTests/JsonFileRoundTripTests.cs

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Microsoft.Extensions.Logging.Abstractions;
22
using Newtonsoft.Json.Linq;
3+
using Cosmos.DataTransfer.Common.UnitTests;
34

45
namespace Cosmos.DataTransfer.JsonExtension.UnitTests
56
{

Extensions/Json/Cosmos.DataTransfer.JsonExtension.UnitTests/JsonFileSinkTests.cs

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Cosmos.DataTransfer.Interfaces;
2+
using Cosmos.DataTransfer.Common.UnitTests;
23
using Microsoft.Extensions.Logging.Abstractions;
34
using Newtonsoft.Json;
45

Extensions/Json/Cosmos.DataTransfer.JsonExtension.UnitTests/JsonSinkTests.cs

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Cosmos.DataTransfer.Interfaces;
2+
using Cosmos.DataTransfer.Common.UnitTests;
23
using Microsoft.Extensions.Logging.Abstractions;
34
using Newtonsoft.Json;
45

Extensions/Json/Cosmos.DataTransfer.JsonExtension.UnitTests/JsonSourceTests.cs

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Cosmos.DataTransfer.Interfaces;
2+
using Cosmos.DataTransfer.Common.UnitTests;
23
using Microsoft.Extensions.Logging.Abstractions;
34

45
namespace Cosmos.DataTransfer.JsonExtension.UnitTests

Extensions/SqlServer/Cosmos.DataTransfer.SqlServerExtension.UnitTests/Cosmos.DataTransfer.SqlServerExtension.UnitTests.csproj

+11-5
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,34 @@
66
<Nullable>enable</Nullable>
77

88
<IsPackable>false</IsPackable>
9+
<CollectCoverage>true</CollectCoverage>
10+
<CoverletOutputFormat>cobertura</CoverletOutputFormat>
11+
<CoverletOutput>../../../Extensions/SqlServer/Cosmos.DataTransfer.SqlServerExtension/coverage.cobertura.xml</CoverletOutput>
912
</PropertyGroup>
1013

1114
<ItemGroup>
15+
<PackageReference Include="Microsoft.Data.Sqlite" />
1216
<PackageReference Include="Microsoft.Extensions.Configuration" />
1317
<PackageReference Include="Microsoft.NET.Test.Sdk" />
1418
<PackageReference Include="MSTest.TestAdapter" />
1519
<PackageReference Include="MSTest.TestFramework" />
16-
<PackageReference Include="coverlet.collector">
20+
<PackageReference Include="System.Linq.Async" />
21+
<PackageReference Include="Moq" />
22+
<PackageReference Include="coverlet.collector" />
23+
<PackageReference Include="coverlet.msbuild">
1724
<PrivateAssets>all</PrivateAssets>
1825
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1926
</PackageReference>
20-
<PackageReference Include="Newtonsoft.Json" />
21-
<PackageReference Include="System.Linq.Async" />
22-
<PackageReference Include="System.Text.Json" />
2327
</ItemGroup>
2428

2529
<ItemGroup>
30+
<ProjectReference Include="..\..\..\Interfaces\Cosmos.DataTransfer.Common.UnitTests\Cosmos.DataTransfer.Common.UnitTests.csproj" />
2631
<ProjectReference Include="..\Cosmos.DataTransfer.SqlServerExtension\Cosmos.DataTransfer.SqlServerExtension.csproj" />
2732
</ItemGroup>
2833

34+
2935
<ItemGroup>
30-
<None Update="Data\FlatFile.json">
36+
<None Update="Data\SqlStatement.sql">
3137
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
3238
</None>
3339
</ItemGroup>

Extensions/SqlServer/Cosmos.DataTransfer.SqlServerExtension.UnitTests/Data/FlatFile.json

-18
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
SELECT * FROM foobar;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
using Microsoft.Data.Sqlite;
2+
using Microsoft.Extensions.Logging.Abstractions;
3+
using System.Data.Common;
4+
using Cosmos.DataTransfer.Interfaces;
5+
using Cosmos.DataTransfer.Common;
6+
using Cosmos.DataTransfer.Common.UnitTests;
7+
using Moq;
8+
using Microsoft.Extensions.Configuration;
9+
10+
namespace Cosmos.DataTransfer.SqlServerExtension.UnitTests;
11+
12+
[TestClass]
13+
public class SqlServerDataSourceExtensionTests
14+
{
15+
16+
private static async Task<Tuple<SqliteFactory,DbConnection>> connectionFactory(CancellationToken cancellationToken = default(CancellationToken)) {
17+
var provider = SqliteFactory.Instance;
18+
var connection = provider.CreateConnection();
19+
await connection.OpenAsync(cancellationToken);
20+
21+
var cmd = connection.CreateCommand();
22+
cmd.CommandText = @"CREATE TABLE foobar (
23+
id INTEGER NOT NULL,
24+
name TEXT
25+
);";
26+
await cmd.ExecuteNonQueryAsync(cancellationToken);
27+
cmd.CommandText = @"INSERT INTO foobar (id, name)
28+
VALUES (1, 'zoo');";
29+
await cmd.ExecuteNonQueryAsync(cancellationToken);
30+
cmd.CommandText = @"INSERT INTO foobar (id, name)
31+
VALUES (2, NULL);";
32+
await cmd.ExecuteNonQueryAsync(cancellationToken);
33+
34+
return Tuple.Create(provider, connection);
35+
}
36+
37+
[TestMethod]
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+
43+
var extension = new SqlServerDataSourceExtension();
44+
Assert.AreEqual("SqlServer", extension.DisplayName);
45+
46+
var result = await extension.ReadAsync(config.Object, NullLogger.Instance,
47+
"SELECT * FROM foobar", Array.Empty<DbParameter>(), connection, providerFactory, cancellationToken.Token).ToListAsync();
48+
var expected = new List<DictionaryDataItem> {
49+
new DictionaryDataItem(new Dictionary<string, object?> { { "id", (long)1 }, { "name", "zoo" } }),
50+
new DictionaryDataItem(new Dictionary<string, object?> { { "id", (long)2 }, { "name", null } })
51+
};
52+
CollectionAssert.That.AreEqual(expected, result, new DataItemComparer());
53+
}
54+
55+
[TestMethod]
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+
61+
var extension = new SqlServerDataSourceExtension();
62+
Assert.AreEqual("SqlServer", extension.DisplayName);
63+
64+
var parameter = providerFactory.CreateParameter();
65+
parameter.ParameterName = "@x";
66+
parameter.DbType = System.Data.DbType.Int32;
67+
parameter.Value = 2;
68+
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+
}
76+
77+
// Allows for testing against an actual SQL Server by specifying a
78+
// connectionstring in either a .runsettings-file or environment variable.
79+
// Example: Using sql.runsettings
80+
// <?xml version="1.0" encoding="utf-8"?>
81+
// <RunSettings>
82+
// <TestRunParameters>
83+
// <Parameter name="TestReadAsync_LiveSqlServer_ConnectionString" value="Your connection string" />
84+
// </TestRunParameters>
85+
// </RunSettings>
86+
// run test with
87+
// dotnet test --settings sql.runsettings
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.
89+
public TestContext TestContext { get; set; }
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.
91+
[TestMethod]
92+
[Timeout(1000)]
93+
public async Task TestReadAsync_LiveSqlServer() {
94+
var connectionString = (string?)TestContext.Properties["TestReadAsync_LiveSqlServer_ConnectionString"];
95+
connectionString ??= Environment.GetEnvironmentVariable("TestReadAsync_LiveSqlServer_ConnectionString");
96+
if (connectionString is null) {
97+
Assert.Inconclusive("Could not run, as no connection string to live SQL Server was provided.");
98+
}
99+
100+
var extension = new SqlServerDataSourceExtension();
101+
var config = TestHelpers.CreateConfig(new Dictionary<string, string> {
102+
{ "ConnectionString", connectionString! },
103+
{ "QueryText", "SELECT 1, 'foo' as bar, NULL as zoo;" }
104+
});
105+
106+
var result = await extension.ReadAsync(config, NullLogger.Instance).FirstAsync();
107+
108+
Assert.IsTrue(new DataItemComparer().Equals(result,
109+
new DictionaryDataItem(new Dictionary<string, object?> {
110+
{ "", 1 },
111+
{ "bar", "foo" },
112+
{ "zoo", null }
113+
})));
114+
}
115+
}

Extensions/SqlServer/Cosmos.DataTransfer.SqlServerExtension.UnitTests/SqlServerExtensionTests.cs

-8
This file was deleted.

0 commit comments

Comments
 (0)