diff --git a/Directory.Build.props b/Directory.Build.props
index cc98921..c2a8bf4 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,5 +1,5 @@
- 0.1.6
+ 0.2.0
\ No newline at end of file
diff --git a/src/QAToolKit.Engine.Database.Test/MySqlTestGeneratorTests.cs b/src/QAToolKit.Engine.Database.Test/MySqlTestGeneratorTests.cs
index 43bbe20..b239130 100644
--- a/src/QAToolKit.Engine.Database.Test/MySqlTestGeneratorTests.cs
+++ b/src/QAToolKit.Engine.Database.Test/MySqlTestGeneratorTests.cs
@@ -1,7 +1,6 @@
using ExpectedObjects;
using QAToolKit.Engine.Database.Generators;
using QAToolKit.Engine.Database.Models;
-using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
@@ -163,12 +162,61 @@ public void MySqlObjectExistScriptNullDbKindTest_Success()
}
[Fact]
- public async Task MySqlObjectExistScriptNullOptionsTest_Fails()
+ public async Task MySqlRecordExistScriptTest_Success()
{
- var generator = new MySqlTestGenerator();
+ var generator = new MySqlTestGenerator(options =>
+ {
+ options.AddDatabaseRecordExitsRule(
+ new List()
+ {
+ new DatabaseRule()
+ {
+ TableName = "mytable",
+ PredicateValue = "= 'myname'"
+ }
+ });
+ });
+
+ var results = new List
+ {
+ new DatabaseScript(
+ "mytable",
+ $@"SELECT EXISTS (SELECT 1 FROM mytable WHERE = 'myname');",
+ DatabaseTestType.RecordExist,
+ DatabaseKind.MySQL)
+ }.ToExpectedObject();
+
+ results.ShouldEqual(await generator.Generate());
+ Assert.Equal(DatabaseKind.MySQL, generator.DatabaseKind);
+ }
+ [Fact]
+ public async Task MySqlRecordCountScriptTest_Success()
+ {
+ var generator = new MySqlTestGenerator(options =>
+ {
+ options.AddDatabaseRecordsCountRule(
+ new List()
+ {
+ new DatabaseRule()
+ {
+ TableName = "mytable",
+ PredicateValue = "=100"
+ }
+ });
+ });
+
+ var results = new List
+ {
+ new DatabaseScript(
+ "mytable",
+ $@"SELECT EXISTS (SELECT 1 FROM mytable WHERE (SELECT count(*) FROM mytable)=100);",
+ DatabaseTestType.RecordCount,
+ DatabaseKind.MySQL)
+ }.ToExpectedObject();
+
+ results.ShouldEqual(await generator.Generate());
Assert.Equal(DatabaseKind.MySQL, generator.DatabaseKind);
- await Assert.ThrowsAsync(async () => await generator.Generate());
}
}
}
diff --git a/src/QAToolKit.Engine.Database.Test/PostgresqlTestGeneratorTests.cs b/src/QAToolKit.Engine.Database.Test/PostgresqlTestGeneratorTests.cs
index 8fc8501..f40c72e 100644
--- a/src/QAToolKit.Engine.Database.Test/PostgresqlTestGeneratorTests.cs
+++ b/src/QAToolKit.Engine.Database.Test/PostgresqlTestGeneratorTests.cs
@@ -1,7 +1,6 @@
using ExpectedObjects;
using QAToolKit.Engine.Database.Generators;
using QAToolKit.Engine.Database.Models;
-using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
@@ -163,12 +162,61 @@ public void PostgresqlObjectExistScriptNullDbKindTest_Success()
}
[Fact]
- public async Task PostgresqlObjectExistScriptNullOptionsTest_Fails()
+ public async Task PostgresqlRecordExistScriptTest_Success()
{
- var generator = new PostgresqlTestGenerator();
+ var generator = new PostgresqlTestGenerator(options =>
+ {
+ options.AddDatabaseRecordExitsRule(
+ new List()
+ {
+ new DatabaseRule()
+ {
+ TableName = "mytable",
+ PredicateValue = "= 'myname'"
+ }
+ });
+ });
+
+ var results = new List
+ {
+ new DatabaseScript(
+ "mytable",
+ $@"SELECT EXISTS (SELECT 1 FROM mytable WHERE = 'myname');",
+ DatabaseTestType.RecordExist,
+ DatabaseKind.PostgreSQL)
+ }.ToExpectedObject();
+
+ results.ShouldEqual(await generator.Generate());
+ Assert.Equal(DatabaseKind.PostgreSQL, generator.DatabaseKind);
+ }
+ [Fact]
+ public async Task PostgresqlRecordCountScriptTest_Success()
+ {
+ var generator = new PostgresqlTestGenerator(options =>
+ {
+ options.AddDatabaseRecordsCountRule(
+ new List()
+ {
+ new DatabaseRule()
+ {
+ TableName = "mytable",
+ PredicateValue = "=100"
+ }
+ });
+ });
+
+ var results = new List
+ {
+ new DatabaseScript(
+ "mytable",
+ $@"SELECT EXISTS (SELECT 1 FROM mytable WHERE (SELECT count(*) FROM mytable)=100);",
+ DatabaseTestType.RecordCount,
+ DatabaseKind.PostgreSQL)
+ }.ToExpectedObject();
+
+ results.ShouldEqual(await generator.Generate());
Assert.Equal(DatabaseKind.PostgreSQL, generator.DatabaseKind);
- await Assert.ThrowsAsync(async () => await generator.Generate());
}
}
}
diff --git a/src/QAToolKit.Engine.Database.Test/SqlServerTestGeneratorTests.cs b/src/QAToolKit.Engine.Database.Test/SqlServerTestGeneratorTests.cs
index 87dad97..c6cf3ef 100644
--- a/src/QAToolKit.Engine.Database.Test/SqlServerTestGeneratorTests.cs
+++ b/src/QAToolKit.Engine.Database.Test/SqlServerTestGeneratorTests.cs
@@ -1,7 +1,6 @@
using ExpectedObjects;
using QAToolKit.Engine.Database.Generators;
using QAToolKit.Engine.Database.Models;
-using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
@@ -162,13 +161,63 @@ public void SqlServerObjectExistScriptNullDbKindTest_Success()
Assert.Equal(DatabaseKind.SQLServer, generator.DatabaseKind);
}
+
[Fact]
- public async Task SqlServerObjectExistScriptNullOptionsTest_Fails()
+ public async Task SqlServerRecordExistScriptTest_Success()
{
- var generator = new SqlServerTestGenerator();
+ var generator = new SqlServerTestGenerator(options =>
+ {
+ options.AddDatabaseRecordExitsRule(
+ new List()
+ {
+ new DatabaseRule()
+ {
+ TableName = "mytable",
+ PredicateValue = "= 'myname'"
+ }
+ });
+ });
+
+ var results = new List
+ {
+ new DatabaseScript(
+ "mytable",
+ $@"IF EXISTS(SELECT 1 FROM mytable WHERE = 'myname') BEGIN Select 1 END ELSE BEGIN Select 0 END",
+ DatabaseTestType.RecordExist,
+ DatabaseKind.SQLServer)
+ }.ToExpectedObject();
+
+ results.ShouldEqual(await generator.Generate());
+ Assert.Equal(DatabaseKind.SQLServer, generator.DatabaseKind);
+ }
+ [Fact]
+ public async Task SqlServerRecordCountScriptTest_Success()
+ {
+ var generator = new SqlServerTestGenerator(options =>
+ {
+ options.AddDatabaseRecordsCountRule(
+ new List()
+ {
+ new DatabaseRule()
+ {
+ TableName = "mytable",
+ PredicateValue = "=100"
+ }
+ });
+ });
+
+ var results = new List
+ {
+ new DatabaseScript(
+ "mytable",
+ $@"IF EXISTS(SELECT 1 FROM mytable WHERE (SELECT count(*) FROM mytable)=100) BEGIN Select 1 END ELSE BEGIN Select 0 END",
+ DatabaseTestType.RecordCount,
+ DatabaseKind.SQLServer)
+ }.ToExpectedObject();
+
+ results.ShouldEqual(await generator.Generate());
Assert.Equal(DatabaseKind.SQLServer, generator.DatabaseKind);
- await Assert.ThrowsAsync(async () => await generator.Generate());
}
}
}
diff --git a/src/QAToolKit.Engine.Database/DatabaseTestGeneratorOptions.cs b/src/QAToolKit.Engine.Database/DatabaseTestGeneratorOptions.cs
index 86cec76..de9b083 100644
--- a/src/QAToolKit.Engine.Database/DatabaseTestGeneratorOptions.cs
+++ b/src/QAToolKit.Engine.Database/DatabaseTestGeneratorOptions.cs
@@ -9,6 +9,8 @@ namespace QAToolKit.Engine.Database
public class DatabaseTestGeneratorOptions
{
internal Dictionary DatabaseObjectsExistRules { get; private set; }
+ internal List DatabaseRecordsCountRules { get; private set; }
+ internal List DatabaseRecordsExitsRules { get; private set; }
///
/// Add database object exist rules
@@ -27,5 +29,39 @@ public DatabaseTestGeneratorOptions AddDatabaseObjectExitsRule(string[] objects,
return this;
}
+
+ ///
+ /// Add database record count rules
+ ///
+ ///
+ ///
+ public DatabaseTestGeneratorOptions AddDatabaseRecordsCountRule(List objects)
+ {
+ if (DatabaseRecordsCountRules == null)
+ {
+ DatabaseRecordsCountRules = new List();
+ }
+
+ DatabaseRecordsCountRules.AddRange(objects);
+
+ return this;
+ }
+
+ ///
+ /// Add database record exsit rules
+ ///
+ ///
+ ///
+ public DatabaseTestGeneratorOptions AddDatabaseRecordExitsRule(List objects)
+ {
+ if (DatabaseRecordsExitsRules == null)
+ {
+ DatabaseRecordsExitsRules = new List();
+ }
+
+ DatabaseRecordsExitsRules.AddRange(objects);
+
+ return this;
+ }
}
}
diff --git a/src/QAToolKit.Engine.Database/Generators/MySqlTestGenerator.cs b/src/QAToolKit.Engine.Database/Generators/MySqlTestGenerator.cs
index bb2caf2..4dedea7 100644
--- a/src/QAToolKit.Engine.Database/Generators/MySqlTestGenerator.cs
+++ b/src/QAToolKit.Engine.Database/Generators/MySqlTestGenerator.cs
@@ -45,5 +45,25 @@ protected override string GetStoredProcedureExistScript(string storedProcedure)
{
return $@"SELECT EXISTS(SELECT * FROM information_schema.routines WHERE routine_name = '{storedProcedure}');";
}
+
+ ///
+ /// Get MySQL script to check if record exist
+ ///
+ ///
+ ///
+ protected override string GetRecordExistScript(DatabaseRule recordExist)
+ {
+ return $@"SELECT EXISTS (SELECT 1 FROM {recordExist.TableName} WHERE {recordExist.PredicateValue});";
+ }
+
+ ///
+ /// Get MySQL script to count the records in a table
+ ///
+ ///
+ ///
+ protected override string GetRecordCountScript(DatabaseRule recordCount)
+ {
+ return $@"SELECT EXISTS (SELECT 1 FROM {recordCount.TableName} WHERE (SELECT count(*) FROM {recordCount.TableName}){recordCount.PredicateValue});";
+ }
}
}
diff --git a/src/QAToolKit.Engine.Database/Generators/PostgresqlTestGenerator.cs b/src/QAToolKit.Engine.Database/Generators/PostgresqlTestGenerator.cs
index 1de9529..9ce0e85 100644
--- a/src/QAToolKit.Engine.Database/Generators/PostgresqlTestGenerator.cs
+++ b/src/QAToolKit.Engine.Database/Generators/PostgresqlTestGenerator.cs
@@ -45,5 +45,25 @@ protected override string GetStoredProcedureExistScript(string storedProcedure)
{
return $@"SELECT EXISTS (SELECT * FROM information_schema.routines WHERE routine_name = '{storedProcedure}');";
}
+
+ ///
+ /// Get PostgreSQL script to check if record exist
+ ///
+ ///
+ ///
+ protected override string GetRecordExistScript(DatabaseRule recordExist)
+ {
+ return $@"SELECT EXISTS (SELECT 1 FROM {recordExist.TableName} WHERE {recordExist.PredicateValue});";
+ }
+
+ ///
+ /// Get PostgreSQL script to count the records in a table
+ ///
+ ///
+ ///
+ protected override string GetRecordCountScript(DatabaseRule recordCount)
+ {
+ return $@"SELECT EXISTS (SELECT 1 FROM {recordCount.TableName} WHERE (SELECT count(*) FROM {recordCount.TableName}){recordCount.PredicateValue});";
+ }
}
}
diff --git a/src/QAToolKit.Engine.Database/Generators/RelationalDatabaseTestGenerator.cs b/src/QAToolKit.Engine.Database/Generators/RelationalDatabaseTestGenerator.cs
index 46986a7..6ccaa4b 100644
--- a/src/QAToolKit.Engine.Database/Generators/RelationalDatabaseTestGenerator.cs
+++ b/src/QAToolKit.Engine.Database/Generators/RelationalDatabaseTestGenerator.cs
@@ -41,28 +41,84 @@ public Task> Generate()
{
if (_databaseTestOptions == null)
{
- throw new ArgumentNullException($"DatabaseTestOptions is null.");
+ throw new ArgumentNullException($"{nameof(_databaseTestOptions)} is null.");
}
var results = new List();
results.AddRange(GenerateObjectExistScripts());
+ results.AddRange(GenerateCountRecordsScripts());
+ results.AddRange(GenerateRecordsExistScripts());
return Task.FromResult(results.AsEnumerable());
}
- private IEnumerable GenerateObjectExistScripts()
+ private IEnumerable GenerateCountRecordsScripts()
{
- if (_databaseTestOptions.DatabaseObjectsExistRules == null)
+ var results = new List();
+
+ if (_databaseTestOptions.DatabaseRecordsCountRules != null)
{
- throw new ArgumentNullException($"{nameof(_databaseTestOptions.DatabaseObjectsExistRules)} is null.");
+ results.AddRange(GetRecordCountScripts());
}
+ return results;
+ }
+
+ private IEnumerable GetRecordCountScripts()
+ {
var results = new List();
- results.AddRange(GetTableExistScripts());
- results.AddRange(GetViewExistScripts());
- results.AddRange(GetStoredProcedureExistScripts());
+ foreach (var record in _databaseTestOptions.DatabaseRecordsCountRules)
+ {
+ results.Add(new DatabaseScript(
+ record.TableName,
+ GetRecordCountScript(record),
+ DatabaseTestType.RecordCount,
+ DatabaseKind));
+ }
+
+ return results;
+ }
+
+ private IEnumerable GenerateRecordsExistScripts()
+ {
+ var results = new List();
+
+ if (_databaseTestOptions.DatabaseRecordsExitsRules != null)
+ {
+ results.AddRange(GetRecordsExistScripts());
+ }
+
+ return results;
+ }
+
+ private IEnumerable GetRecordsExistScripts()
+ {
+ var results = new List();
+
+ foreach (var record in _databaseTestOptions.DatabaseRecordsExitsRules)
+ {
+ results.Add(new DatabaseScript(
+ record.TableName,
+ GetRecordExistScript(record),
+ DatabaseTestType.RecordExist,
+ DatabaseKind));
+ }
+
+ return results;
+ }
+
+ private IEnumerable GenerateObjectExistScripts()
+ {
+ var results = new List();
+
+ if (_databaseTestOptions.DatabaseObjectsExistRules != null)
+ {
+ results.AddRange(GetTableExistScripts());
+ results.AddRange(GetViewExistScripts());
+ results.AddRange(GetStoredProcedureExistScripts());
+ }
return results;
}
@@ -150,5 +206,19 @@ private IEnumerable GetStoredProcedureExistScripts()
///
///
protected abstract string GetStoredProcedureExistScript(string storedProcedure);
+
+ ///
+ /// Get script to check if record exist
+ ///
+ ///
+ ///
+ protected abstract string GetRecordExistScript(DatabaseRule recordExist);
+
+ ///
+ /// Get script to count the records in a table
+ ///
+ ///
+ ///
+ protected abstract string GetRecordCountScript(DatabaseRule recordCount);
}
}
diff --git a/src/QAToolKit.Engine.Database/Generators/SqlServerTestGenerator.cs b/src/QAToolKit.Engine.Database/Generators/SqlServerTestGenerator.cs
index 633bbc0..3bb1281 100644
--- a/src/QAToolKit.Engine.Database/Generators/SqlServerTestGenerator.cs
+++ b/src/QAToolKit.Engine.Database/Generators/SqlServerTestGenerator.cs
@@ -45,5 +45,25 @@ protected override string GetStoredProcedureExistScript(string storedProcedure)
{
return $@"IF EXISTS(SELECT 1 FROM sys.procedures WHERE Name = '{storedProcedure}') BEGIN Select 1 END ELSE BEGIN Select 0 END";
}
+
+ ///
+ /// Get SQLServer script to check if record exist
+ ///
+ ///
+ ///
+ protected override string GetRecordExistScript(DatabaseRule recordExist)
+ {
+ return $@"IF EXISTS(SELECT 1 FROM {recordExist.TableName} WHERE {recordExist.PredicateValue}) BEGIN Select 1 END ELSE BEGIN Select 0 END";
+ }
+
+ ///
+ /// Get SQLServer script to count the records in a table
+ ///
+ ///
+ ///
+ protected override string GetRecordCountScript(DatabaseRule recordCount)
+ {
+ return $@"IF EXISTS(SELECT 1 FROM {recordCount.TableName} WHERE (SELECT count(*) FROM {recordCount.TableName}){recordCount.PredicateValue}) BEGIN Select 1 END ELSE BEGIN Select 0 END";
+ }
}
}
diff --git a/src/QAToolKit.Engine.Database/Models/DatabaseRule.cs b/src/QAToolKit.Engine.Database/Models/DatabaseRule.cs
new file mode 100644
index 0000000..3af52fb
--- /dev/null
+++ b/src/QAToolKit.Engine.Database/Models/DatabaseRule.cs
@@ -0,0 +1,17 @@
+namespace QAToolKit.Engine.Database.Models
+{
+ ///
+ /// Database rule
+ ///
+ public class DatabaseRule
+ {
+ ///
+ /// Database table name
+ ///
+ public string TableName { get; set; }
+ ///
+ /// Predicate value
+ ///
+ public string PredicateValue { get; set; }
+ }
+}