Skip to content

Commit 8d0f102

Browse files
a.tischerfredericDelaporte
a.tischer
authored andcommitted
NH-4052 - Aggregate schema validation exception
+ add SchemaValidationException + keep list of validation messages and throw new SchemaValidationException + adjust/ fix unittests
1 parent 567ffe8 commit 8d0f102

File tree

10 files changed

+222
-88
lines changed

10 files changed

+222
-88
lines changed

src/AsyncGenerator.yml

+8
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,14 @@
156156
applyChanges: true
157157
analyzation:
158158
methodConversion:
159+
- conversion: Copy
160+
hasAttributeName: OneTimeSetUpAttribute
161+
- conversion: Copy
162+
hasAttributeName: OneTimeTearDownAttribute
163+
- conversion: Copy
164+
hasAttributeName: SetUpAttribute
165+
- conversion: Copy
166+
hasAttributeName: TearDownAttribute
159167
- conversion: Smart
160168
hasAttributeName: TestAttribute
161169
- conversion: Smart

src/NHibernate.Test/Async/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs

+8-12
Original file line numberDiff line numberDiff line change
@@ -75,20 +75,16 @@ public async Task SchemaExport_Export_CreatesExportScriptAsync()
7575
}
7676

7777
[Test]
78-
public async Task SchemaExport_Validate_CausesValidateExceptionAsync()
78+
public void SchemaExport_Validate_CausesValidateExceptionAsync()
7979
{
8080
Configuration configuration = GetConfiguration();
8181
SchemaValidator validator = new SchemaValidator(configuration);
82-
try
83-
{
84-
await (validator.ValidateAsync());
85-
}
86-
catch (HibernateException he)
87-
{
88-
Assert.IsTrue(he.Message.Contains("Home_Validate"));
89-
return;
90-
}
91-
throw new Exception("Should not get to this exception");
82+
83+
Assert.That(
84+
() => validator.ValidateAsync(),
85+
Throws.TypeOf<SchemaValidationException>()
86+
.And.Message.EqualTo("Schema validation failed: see list of validation errors")
87+
.And.Property("ValidationErrors").Contains("Missing table: Home_Validate"));
9288
}
9389

9490
private Configuration GetConfiguration()
@@ -132,4 +128,4 @@ protected IList Mappings
132128
}
133129
}
134130
}
135-
}
131+
}

src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs

+69-28
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,44 @@ namespace NHibernate.Test.Tools.hbm2ddl.SchemaValidator
1919
[TestFixture]
2020
public class SchemaValidateFixtureAsync
2121
{
22-
[Test]
23-
public async Task ShouldVerifySameTableAsync()
22+
private const string _resourcesPrefix = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.";
23+
private const string _version1Resource = _resourcesPrefix + "1_Version.hbm.xml";
24+
private const string _version2Resource = _resourcesPrefix + "2_Version.hbm.xml";
25+
private const string _version3Resource = _resourcesPrefix + "3_Version.hbm.xml";
26+
private Configuration _configuration1;
27+
private SchemaExport _export1;
28+
29+
[OneTimeSetUp]
30+
public void OneTimeSetUp()
31+
{
32+
_configuration1 = BuildConfiguration(_version1Resource);
33+
}
34+
35+
[SetUp]
36+
public void SetUp()
2437
{
25-
const string resource = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.1_Version.hbm.xml";
26-
var cfg = BuildConfiguration(resource);
38+
_export1 = new SchemaExport(_configuration1);
39+
_export1.Create(true, true);
40+
}
2741

28-
await (new SchemaExport(cfg).ExecuteAsync(true, true, false));
42+
[TearDown]
43+
public void TearDown()
44+
{
45+
_export1.Drop(true, true);
46+
}
2947

30-
var validator = new Tool.hbm2ddl.SchemaValidator((cfg));
31-
await (validator.ValidateAsync());
48+
[Test]
49+
public Task ShouldVerifySameTableAsync()
50+
{
51+
try
52+
{
53+
var validator = new Tool.hbm2ddl.SchemaValidator((_configuration1));
54+
return validator.ValidateAsync();
55+
}
56+
catch (System.Exception ex)
57+
{
58+
return Task.FromException<object>(ex);
59+
}
3260
}
3361

3462
[Test, SetCulture("tr-TR"), SetUICulture("tr-TR")]
@@ -45,36 +73,49 @@ public async Task ShouldVerifySameTableTurkishAsync()
4573
var v = new Version();
4674
Assert.That(v.Id, Is.TypeOf<int>());
4775

76+
var cfg = BuildConfiguration(_version1Resource);
4877

49-
const string resource = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.1_Version.hbm.xml";
50-
var cfg = BuildConfiguration(resource);
78+
var export = new SchemaExport(cfg);
79+
await (export.CreateAsync(true, true));
80+
try
81+
{
82+
var validator = new Tool.hbm2ddl.SchemaValidator(cfg);
83+
await (validator.ValidateAsync());
84+
}
85+
finally
86+
{
87+
await (export.DropAsync(true, true));
88+
}
89+
}
5190

52-
await (new SchemaExport(cfg).ExecuteAsync(true, true, false));
91+
[Test]
92+
public void ShouldNotVerifyModifiedTableAsync()
93+
{
94+
var cfgV2 = BuildConfiguration(_version2Resource);
95+
var validatorV2 = new Tool.hbm2ddl.SchemaValidator(cfgV2);
5396

54-
var validator = new Tool.hbm2ddl.SchemaValidator(cfg);
55-
await (validator.ValidateAsync());
97+
Assert.That(
98+
() => validatorV2.ValidateAsync(),
99+
Throws.TypeOf<SchemaValidationException>()
100+
.And.Message.EqualTo("Schema validation failed: see list of validation errors")
101+
.And.Property("ValidationErrors").Some.Contains("Missing column: Name in ").IgnoreCase.And.Contains("Version").IgnoreCase);
56102
}
57103

58104
[Test]
59-
public async Task ShouldNotVerifyModifiedTableAsync()
105+
public void ShouldNotVerifyMultiModifiedTableAsync()
60106
{
61-
const string resource1 = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.1_Version.hbm.xml";
62-
var cfgV1 = BuildConfiguration(resource1);
107+
var cfg = BuildConfiguration(_version3Resource);
63108

64-
const string resource2 = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.2_Version.hbm.xml";
65-
var cfgV2 = BuildConfiguration(resource2);
66-
67-
await (new SchemaExport(cfgV1).ExecuteAsync(true, true, false));
109+
var validator = new Tool.hbm2ddl.SchemaValidator(cfg);
68110

69-
var validatorV2 = new Tool.hbm2ddl.SchemaValidator(cfgV2);
70-
try
71-
{
72-
await (validatorV2.ValidateAsync());
73-
}
74-
catch (HibernateException e)
75-
{
76-
Assert.That(e.Message, Does.StartWith("Missing column: Name"));
77-
}
111+
var error = Assert.ThrowsAsync<SchemaValidationException>(() => validator.ValidateAsync());
112+
Assert.That(error,
113+
Has.Message.EqualTo("Schema validation failed: see list of validation errors")
114+
.And.Property("ValidationErrors").Some.Contains("Missing column: Name in ").IgnoreCase.And.Contains("Version").IgnoreCase);
115+
Assert.That(error,
116+
Has.Property("ValidationErrors").Some.Contains("Missing column: Title in ").IgnoreCase.And.Contains("Version").IgnoreCase);
117+
Assert.That(error,
118+
Has.Property("ValidationErrors").Some.Contains("Missing sequence or table: ").IgnoreCase.And.Contains("id_table").IgnoreCase);
78119
}
79120

80121
private static Configuration BuildConfiguration(string resource)

src/NHibernate.Test/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs

+7-11
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,12 @@ public void SchemaExport_Validate_CausesValidateException()
8080
{
8181
Configuration configuration = GetConfiguration();
8282
SchemaValidator validator = new SchemaValidator(configuration);
83-
try
84-
{
85-
validator.Validate();
86-
}
87-
catch (HibernateException he)
88-
{
89-
Assert.IsTrue(he.Message.Contains("Home_Validate"));
90-
return;
91-
}
92-
throw new Exception("Should not get to this exception");
83+
84+
Assert.That(
85+
() => validator.Validate(),
86+
Throws.TypeOf<SchemaValidationException>()
87+
.And.Message.EqualTo("Schema validation failed: see list of validation errors")
88+
.And.Property("ValidationErrors").Contains("Missing table: Home_Validate"));
9389
}
9490

9591
private Configuration GetConfiguration()
@@ -133,4 +129,4 @@ protected IList Mappings
133129
}
134130
}
135131
}
136-
}
132+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0"?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
3+
namespace="NHibernate.Test.Tools.hbm2ddl.SchemaValidator"
4+
assembly="NHibernate.Test">
5+
6+
<class name="Version">
7+
<id name="Id">
8+
<generator class="NHibernate.Id.TableHiLoGenerator">
9+
<param name="table">id_table</param>
10+
<param name="column">next_hi_value_column</param>
11+
</generator>
12+
</id>
13+
<property name="Description"/>
14+
<property name="Name"/>
15+
<property name="Title"/>
16+
</class>
17+
</hibernate-mapping>

src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs

+61-27
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,36 @@ namespace NHibernate.Test.Tools.hbm2ddl.SchemaValidator
88
[TestFixture]
99
public class SchemaValidateFixture
1010
{
11-
[Test]
12-
public void ShouldVerifySameTable()
11+
private const string _resourcesPrefix = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.";
12+
private const string _version1Resource = _resourcesPrefix + "1_Version.hbm.xml";
13+
private const string _version2Resource = _resourcesPrefix + "2_Version.hbm.xml";
14+
private const string _version3Resource = _resourcesPrefix + "3_Version.hbm.xml";
15+
private Configuration _configuration1;
16+
private SchemaExport _export1;
17+
18+
[OneTimeSetUp]
19+
public void OneTimeSetUp()
1320
{
14-
const string resource = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.1_Version.hbm.xml";
15-
var cfg = BuildConfiguration(resource);
21+
_configuration1 = BuildConfiguration(_version1Resource);
22+
}
1623

17-
new SchemaExport(cfg).Execute(true, true, false);
24+
[SetUp]
25+
public void SetUp()
26+
{
27+
_export1 = new SchemaExport(_configuration1);
28+
_export1.Create(true, true);
29+
}
30+
31+
[TearDown]
32+
public void TearDown()
33+
{
34+
_export1.Drop(true, true);
35+
}
1836

19-
var validator = new Tool.hbm2ddl.SchemaValidator((cfg));
37+
[Test]
38+
public void ShouldVerifySameTable()
39+
{
40+
var validator = new Tool.hbm2ddl.SchemaValidator((_configuration1));
2041
validator.Validate();
2142
}
2243

@@ -34,36 +55,49 @@ public void ShouldVerifySameTableTurkish()
3455
var v = new Version();
3556
Assert.That(v.Id, Is.TypeOf<int>());
3657

58+
var cfg = BuildConfiguration(_version1Resource);
3759

38-
const string resource = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.1_Version.hbm.xml";
39-
var cfg = BuildConfiguration(resource);
40-
41-
new SchemaExport(cfg).Execute(true, true, false);
42-
43-
var validator = new Tool.hbm2ddl.SchemaValidator(cfg);
44-
validator.Validate();
60+
var export = new SchemaExport(cfg);
61+
export.Create(true, true);
62+
try
63+
{
64+
var validator = new Tool.hbm2ddl.SchemaValidator(cfg);
65+
validator.Validate();
66+
}
67+
finally
68+
{
69+
export.Drop(true, true);
70+
}
4571
}
4672

4773
[Test]
4874
public void ShouldNotVerifyModifiedTable()
4975
{
50-
const string resource1 = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.1_Version.hbm.xml";
51-
var cfgV1 = BuildConfiguration(resource1);
76+
var cfgV2 = BuildConfiguration(_version2Resource);
77+
var validatorV2 = new Tool.hbm2ddl.SchemaValidator(cfgV2);
78+
79+
Assert.That(
80+
() => validatorV2.Validate(),
81+
Throws.TypeOf<SchemaValidationException>()
82+
.And.Message.EqualTo("Schema validation failed: see list of validation errors")
83+
.And.Property("ValidationErrors").Some.Contains("Missing column: Name in ").IgnoreCase.And.Contains("Version").IgnoreCase);
84+
}
5285

53-
const string resource2 = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.2_Version.hbm.xml";
54-
var cfgV2 = BuildConfiguration(resource2);
86+
[Test]
87+
public void ShouldNotVerifyMultiModifiedTable()
88+
{
89+
var cfg = BuildConfiguration(_version3Resource);
5590

56-
new SchemaExport(cfgV1).Execute(true, true, false);
91+
var validator = new Tool.hbm2ddl.SchemaValidator(cfg);
5792

58-
var validatorV2 = new Tool.hbm2ddl.SchemaValidator(cfgV2);
59-
try
60-
{
61-
validatorV2.Validate();
62-
}
63-
catch (HibernateException e)
64-
{
65-
Assert.That(e.Message, Does.StartWith("Missing column: Name"));
66-
}
93+
var error = Assert.Throws<SchemaValidationException>(() => validator.Validate());
94+
Assert.That(error,
95+
Has.Message.EqualTo("Schema validation failed: see list of validation errors")
96+
.And.Property("ValidationErrors").Some.Contains("Missing column: Name in ").IgnoreCase.And.Contains("Version").IgnoreCase);
97+
Assert.That(error,
98+
Has.Property("ValidationErrors").Some.Contains("Missing column: Title in ").IgnoreCase.And.Contains("Version").IgnoreCase);
99+
Assert.That(error,
100+
Has.Property("ValidationErrors").Some.Contains("Missing sequence or table: ").IgnoreCase.And.Contains("id_table").IgnoreCase);
67101
}
68102

69103
private static Configuration BuildConfiguration(string resource)

src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/Version.cs

+6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public class Version
99
private int id;
1010
private string name;
1111
private string description;
12+
private string title;
1213
private Version previous;
1314

1415
public virtual int Id
@@ -29,6 +30,11 @@ public virtual string Description
2930
set { description = value; }
3031
}
3132

33+
public virtual string Title
34+
{
35+
get { return title; }
36+
set { title = value; }
37+
}
3238

3339
public virtual Version Previous
3440
{

src/NHibernate/Cfg/Configuration.cs

+13-3
Original file line numberDiff line numberDiff line change
@@ -2404,6 +2404,7 @@ public void ValidateSchema(Dialect.Dialect dialect, IDatabaseMetadata databaseMe
24042404
string defaultCatalog = PropertiesHelper.GetString(Environment.DefaultCatalog, properties, null);
24052405
string defaultSchema = PropertiesHelper.GetString(Environment.DefaultSchema, properties, null);
24062406

2407+
var validationErrors = new List<string>();
24072408
var iter = TableMappings;
24082409
foreach (var table in iter)
24092410
{
@@ -2421,9 +2422,13 @@ public void ValidateSchema(Dialect.Dialect dialect, IDatabaseMetadata databaseMe
24212422
table.Catalog ?? defaultCatalog,
24222423
table.IsQuoted);
24232424
if (tableInfo == null)
2424-
throw new HibernateException("Missing table: " + table.Name);
2425+
{
2426+
validationErrors.Add("Missing table: " + table.Name);
2427+
}
24252428
else
2426-
table.ValidateColumns(dialect, mapping, tableInfo);
2429+
{
2430+
validationErrors.AddRange(table.ValidateColumns(dialect, mapping, tableInfo));
2431+
}
24272432
}
24282433
}
24292434

@@ -2433,9 +2438,14 @@ public void ValidateSchema(Dialect.Dialect dialect, IDatabaseMetadata databaseMe
24332438
string key = generator.GeneratorKey();
24342439
if (!databaseMetadata.IsSequence(key) && !databaseMetadata.IsTable(key))
24352440
{
2436-
throw new HibernateException(string.Format("Missing sequence or table: " + key));
2441+
validationErrors.Add("Missing sequence or table: " + key);
24372442
}
24382443
}
2444+
2445+
if (validationErrors.Count > 0)
2446+
{
2447+
throw new SchemaValidationException("Schema validation failed: see list of validation errors", validationErrors);
2448+
}
24392449
}
24402450

24412451
private IEnumerable<IPersistentIdentifierGenerator> IterateGenerators(Dialect.Dialect dialect)

0 commit comments

Comments
 (0)