Skip to content

Commit 6270c58

Browse files
authored
feat: handle namespace property for databases (#232)
1 parent e11f79c commit 6270c58

File tree

5 files changed

+58
-2
lines changed

5 files changed

+58
-2
lines changed

src/Packata.Core.Testing/Serialization/Json/TableDialectConverterTests.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ public void ReadJson_TypeDatabase_ReturnsDatabase()
6363
{
6464
""$schema"": ""https://datapackage.org/profiles/2.0/tabledialect.json"",
6565
""type"": ""database"",
66-
""table"": ""Customer""
66+
""table"": ""Customer"",
67+
""namespace"": ""dbo""
6768
}}";
6869
var wrapper = JsonConvert.DeserializeObject<Wrapper>(json, Settings);
6970

@@ -73,6 +74,7 @@ public void ReadJson_TypeDatabase_ReturnsDatabase()
7374
Assert.That(wrapper.Object, Is.TypeOf<TableDatabaseDialect>());
7475
var dbDialect = (TableDatabaseDialect)wrapper.Object!;
7576
Assert.That(dbDialect.Table, Is.EqualTo("Customer"));
77+
Assert.That(dbDialect.Namespace, Is.EqualTo("dbo"));
7678
}
7779
}
7880

src/Packata.Core.Testing/Serialization/Yaml/TableDialectTypeDiscriminatorTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public void ReadJson_TypeDatabase_ReturnsCorrectValue()
6161
dialect:
6262
type: database
6363
table: Customer
64+
namespace: Sales
6465
";
6566

6667
var wrapper = Deserializer.Deserialize<Wrapper>(yaml);
@@ -71,6 +72,7 @@ public void ReadJson_TypeDatabase_ReturnsCorrectValue()
7172
Assert.That(wrapper.Object, Is.TypeOf<TableDatabaseDialect>());
7273
var dialect = (TableDatabaseDialect)wrapper.Object!;
7374
Assert.That(dialect.Table, Is.EqualTo("Customer"));
75+
Assert.That(dialect.Namespace, Is.EqualTo("Sales"));
7476
}
7577
}
7678

src/Packata.Core/TableDatabaseDialect.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,9 @@ public class TableDatabaseDialect : TableDialect
1414
/// The name of the table in the database.
1515
/// </summary>
1616
public string? Table { get; set; }
17+
18+
/// <summary>
19+
/// The name of the database schema (namespace).
20+
/// </summary>
21+
public string? Namespace { get; set; }
1722
}

src/Packata.ResourceReaders.Testing/Tabular/DatabaseReaderTests.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,49 @@ public void ToDataReader_TableDefined_ExpectedCommand()
5959
mockConnectionUrl.VerifyAll();
6060
mockFactory.Verify(x => x.Instantiate("mssql://server/database"), Times.Once);
6161
}
62+
63+
[Test]
64+
public void ToDataReader_TableAndNamespaceDefined_ExpectedCommand()
65+
{
66+
var resource = new Resource
67+
{
68+
Connection = new LiteralConnectionUrl("mssql://server/database"),
69+
Type = "table",
70+
Name = "my-resource",
71+
Dialect = new TableDatabaseDialect() { Table = "Customer", Namespace = "Sales" },
72+
};
73+
var mockCommand = new Mock<IDbCommand>();
74+
mockCommand.Setup(x => x.ExecuteReader()).Returns(Mock.Of<DbDataReader>);
75+
mockCommand.SetupSet(x => x.CommandText = It.IsAny<string>());
76+
77+
var mockConnection = new Mock<IDbConnection>();
78+
mockConnection.Setup(x => x.CreateCommand()).Returns(mockCommand.Object);
79+
80+
var mockRenderer = new Mock<IRenderer>();
81+
mockRenderer.Setup(x => x.Render("Customer", It.IsAny<string>())).Returns("Customer");
82+
mockRenderer.Setup(x => x.Render("Sales", It.IsAny<string>())).Returns("Sales");
83+
84+
var mockDialect = new Mock<IDialect>();
85+
mockDialect.SetupGet(x => x.Renderer).Returns(mockRenderer.Object);
86+
87+
var mockConnectionUrl = new Mock<ConnectionUrl>(It.IsAny<string>());
88+
mockConnectionUrl.Setup(x => x.Open()).Returns(mockConnection.Object);
89+
mockConnectionUrl.SetupGet(x => x.Dialect).Returns(mockDialect.Object);
90+
91+
var schemeRegistryMock = new Mock<ISchemeRegistry>();
92+
93+
var mockFactory = new Mock<ConnectionUrlFactory>(schemeRegistryMock.Object);
94+
mockFactory.Setup(x => x.Instantiate(It.IsAny<string>())).Returns(mockConnectionUrl.Object);
95+
96+
var reader = new DatabaseReader(mockFactory.Object);
97+
var dataReader = reader.ToDataReader(resource);
98+
99+
Assert.That(dataReader, Is.Not.Null);
100+
mockRenderer.VerifyAll();
101+
mockCommand.Verify(x => x.ExecuteReader(), Times.Once);
102+
mockCommand.VerifySet(x => x.CommandText = "SELECT * FROM Sales.Customer", Times.Once);
103+
mockConnection.VerifyAll();
104+
mockConnectionUrl.VerifyAll();
105+
mockFactory.Verify(x => x.Instantiate("mssql://server/database"), Times.Once);
106+
}
62107
}

src/Packata.ResourceReaders/Tabular/DatabaseReader.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ public IDataReader ToDataReader(Resource resource)
3535
using (var connection = connectionUrl.Open())
3636
{
3737
var command = connection.CreateCommand();
38-
command.CommandText = $"SELECT * FROM {connectionUrl.Dialect.Renderer.Render(dialect.Table, "identity")}";
38+
command.CommandText = string.IsNullOrEmpty(dialect.Namespace)
39+
? $"SELECT * FROM {connectionUrl.Dialect.Renderer.Render(dialect.Table, "identity")}"
40+
: $"SELECT * FROM {connectionUrl.Dialect.Renderer.Render(dialect.Namespace, "identity")}.{connectionUrl.Dialect.Renderer.Render(dialect.Table, "identity")}";
3941
return command.ExecuteReader();
4042
}
4143
}

0 commit comments

Comments
 (0)