Skip to content

Commit 29807c9

Browse files
committed
feat(integration): Wire the nine new core audits into DatabaseAuditSuite
Adds a *AuditAssertion for each new core audit (DuplicateForeignKey, PrimaryKeyType, UniqueIndexNotNull in the catalog family; EagerCollectionFetch, MissingVersionAttribute, UnmappedDatabaseObject in the JPA family; OffsetPagination, RepeatedStatement, UnusedIndex in the runtime family - the last one PostgreSQL-only alongside Join/OrderBy/WhereClause) and wires each into DatabaseAuditSuite's roster in family order, plus a matching DatabaseAuditExcludes field/builder method for each (RepeatedStatementAudit also gets a repeatedStatementThreshold, defaulting to a generous 50 as a regression tripwire rather than a precise N+1 count). DatabaseAuditSuite now also constructs a ForeignKeyCatalog collaborator alongside the existing IndexCatalog, needed by DuplicateForeignKeyAudit and UnusedIndexAudit. The roster's List.of(...) needed an explicit <AuditAssertion> type witness - without it javac's common-supertype inference across nine assertion types picked the package-private AbstractAuditAssertion instead of the public AuditAssertion interface, which fails to compile from a different package. The roster-guard test (testSuiteAll_WiresAnAssertionForEveryCoreAudit) now passes again: every core *Audit has a wired *AuditAssertion.
1 parent 896aba3 commit 29807c9

12 files changed

Lines changed: 942 additions & 9 deletions

integration/src/main/java/io/github/databaseaudits/spring/boot/DatabaseAuditSuite.java

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,51 @@
55

66
import javax.sql.DataSource;
77

8+
import io.github.databaseaudits.audit.catalog.DuplicateForeignKeyAudit;
89
import io.github.databaseaudits.audit.catalog.ForeignKeyIndexAudit;
910
import io.github.databaseaudits.audit.catalog.ForeignKeyNotNullAudit;
1011
import io.github.databaseaudits.audit.catalog.ForeignKeyTypeMatchAudit;
1112
import io.github.databaseaudits.audit.catalog.PrimaryKeyPresenceAudit;
13+
import io.github.databaseaudits.audit.catalog.PrimaryKeyTypeAudit;
1214
import io.github.databaseaudits.audit.catalog.RedundantIndexAudit;
15+
import io.github.databaseaudits.audit.catalog.UniqueIndexNotNullAudit;
16+
import io.github.databaseaudits.audit.jpa.EagerCollectionFetchAudit;
17+
import io.github.databaseaudits.audit.jpa.MissingVersionAttributeAudit;
1318
import io.github.databaseaudits.audit.jpa.SchemaEntityValidationAudit;
19+
import io.github.databaseaudits.audit.jpa.UnmappedDatabaseObjectAudit;
20+
import io.github.databaseaudits.audit.runtime.OffsetPaginationAudit;
21+
import io.github.databaseaudits.audit.runtime.RepeatedStatementAudit;
1422
import io.github.databaseaudits.audit.runtime.UnconditionalMutationAudit;
1523
import io.github.databaseaudits.audit.runtime.plan.JoinIndexAudit;
1624
import io.github.databaseaudits.audit.runtime.plan.OrderByIndexAudit;
25+
import io.github.databaseaudits.audit.runtime.plan.UnusedIndexAudit;
1726
import io.github.databaseaudits.audit.runtime.plan.WhereClauseIndexAudit;
1827
import io.github.databaseaudits.capture.SqlCapturingStatementInspector;
28+
import io.github.databaseaudits.catalog.ForeignKeyCatalog;
1929
import io.github.databaseaudits.catalog.IndexCatalog;
2030
import io.github.databaseaudits.jdbc.CatalogQueries;
2131
import io.github.databaseaudits.plan.QueryPlanExplainer;
2232
import io.github.databaseaudits.platform.DatabasePlatform;
2333
import io.github.databaseaudits.spring.boot.assertion.AuditAssertion;
2434
import io.github.databaseaudits.spring.boot.assertion.DatabaseAuditAssertions;
35+
import io.github.databaseaudits.spring.boot.assertion.DuplicateForeignKeyAuditAssertion;
36+
import io.github.databaseaudits.spring.boot.assertion.EagerCollectionFetchAuditAssertion;
2537
import io.github.databaseaudits.spring.boot.assertion.ForeignKeyIndexAuditAssertion;
2638
import io.github.databaseaudits.spring.boot.assertion.ForeignKeyNotNullAuditAssertion;
2739
import io.github.databaseaudits.spring.boot.assertion.ForeignKeyTypeMatchAuditAssertion;
2840
import io.github.databaseaudits.spring.boot.assertion.JoinIndexAuditAssertion;
41+
import io.github.databaseaudits.spring.boot.assertion.MissingVersionAttributeAuditAssertion;
42+
import io.github.databaseaudits.spring.boot.assertion.OffsetPaginationAuditAssertion;
2943
import io.github.databaseaudits.spring.boot.assertion.OrderByIndexAuditAssertion;
3044
import io.github.databaseaudits.spring.boot.assertion.PrimaryKeyPresenceAuditAssertion;
45+
import io.github.databaseaudits.spring.boot.assertion.PrimaryKeyTypeAuditAssertion;
3146
import io.github.databaseaudits.spring.boot.assertion.RedundantIndexAuditAssertion;
47+
import io.github.databaseaudits.spring.boot.assertion.RepeatedStatementAuditAssertion;
3248
import io.github.databaseaudits.spring.boot.assertion.SchemaEntityValidationAuditAssertion;
3349
import io.github.databaseaudits.spring.boot.assertion.UnconditionalMutationAuditAssertion;
50+
import io.github.databaseaudits.spring.boot.assertion.UniqueIndexNotNullAuditAssertion;
51+
import io.github.databaseaudits.spring.boot.assertion.UnmappedDatabaseObjectAuditAssertion;
52+
import io.github.databaseaudits.spring.boot.assertion.UnusedIndexAuditAssertion;
3453
import io.github.databaseaudits.spring.boot.assertion.WhereClauseIndexAuditAssertion;
3554
import jakarta.persistence.EntityManagerFactory;
3655

@@ -100,10 +119,18 @@ public DatabaseAuditSuite(final DataSource dataSource,
100119
final CatalogQueries catalogQueries = new CatalogQueries(dataSource);
101120
final IndexCatalog indexCatalog =
102121
new IndexCatalog(catalogQueries, platform);
122+
final ForeignKeyCatalog foreignKeyCatalog =
123+
new ForeignKeyCatalog(catalogQueries, platform);
103124

104125
// The one legitimate enumeration of the roster, in family order
105126
// (catalog, JPA, runtime); everything else drives it through all().
106-
final List<AuditAssertion> roster = new ArrayList<>(List.of(
127+
// The explicit type witness keeps javac's common-supertype inference
128+
// from picking the package-private AbstractAuditAssertion (compiling
129+
// an inaccessible-type error) instead of the public AuditAssertion.
130+
final List<AuditAssertion> roster = new ArrayList<>(List.<AuditAssertion>of(
131+
new DuplicateForeignKeyAuditAssertion(
132+
new DuplicateForeignKeyAudit(foreignKeyCatalog),
133+
platform),
107134
new ForeignKeyIndexAuditAssertion(new ForeignKeyIndexAudit(
108135
catalogQueries, indexCatalog, platform), platform),
109136
new ForeignKeyNotNullAuditAssertion(
@@ -115,18 +142,38 @@ public DatabaseAuditSuite(final DataSource dataSource,
115142
new PrimaryKeyPresenceAuditAssertion(
116143
new PrimaryKeyPresenceAudit(catalogQueries, platform),
117144
platform),
145+
new PrimaryKeyTypeAuditAssertion(
146+
new PrimaryKeyTypeAudit(catalogQueries, platform),
147+
platform),
118148
new RedundantIndexAuditAssertion(
119149
new RedundantIndexAudit(indexCatalog), platform),
150+
new UniqueIndexNotNullAuditAssertion(
151+
new UniqueIndexNotNullAudit(catalogQueries,
152+
indexCatalog, platform),
153+
platform),
154+
new EagerCollectionFetchAuditAssertion(
155+
EagerCollectionFetchAudit.forEntityManagerFactory(
156+
entityManagerFactory),
157+
platform),
158+
new MissingVersionAttributeAuditAssertion(
159+
MissingVersionAttributeAudit.forEntityManagerFactory(
160+
entityManagerFactory),
161+
platform),
120162
new SchemaEntityValidationAuditAssertion(
121163
SchemaEntityValidationAudit.forEntityManagerFactory(
122164
entityManagerFactory, dataSource),
165+
platform),
166+
new UnmappedDatabaseObjectAuditAssertion(
167+
UnmappedDatabaseObjectAudit.forEntityManagerFactory(
168+
entityManagerFactory, dataSource),
123169
platform)));
124170

125-
// The plan-based runtime audits (Join/OrderBy/WhereClause) are
171+
// The plan-based runtime audits (Join/OrderBy/Unused/WhereClause) are
126172
// PostgreSQL-only — they fail fast on every other platform — so they are
127173
// wired only where the platform can run them; the facade's runtime and
128174
// all-family runs then stay clean on MySQL/MariaDB. The capture-based
129-
// UnconditionalMutation audit runs on every platform.
175+
// OffsetPagination/RepeatedStatement/UnconditionalMutation audits run on
176+
// every platform.
130177
if (platform == DatabasePlatform.POSTGRESQL) {
131178
final QueryPlanExplainer queryPlanExplainer =
132179
new QueryPlanExplainer(dataSource, platform);
@@ -136,10 +183,18 @@ public DatabaseAuditSuite(final DataSource dataSource,
136183
roster.add(new OrderByIndexAuditAssertion(
137184
new OrderByIndexAudit(queryPlanExplainer, sqlCapturer),
138185
platform));
186+
roster.add(new UnusedIndexAuditAssertion(
187+
new UnusedIndexAudit(queryPlanExplainer, sqlCapturer,
188+
indexCatalog, foreignKeyCatalog),
189+
platform));
139190
roster.add(new WhereClauseIndexAuditAssertion(
140191
new WhereClauseIndexAudit(queryPlanExplainer, sqlCapturer),
141192
platform));
142193
}
194+
roster.add(new OffsetPaginationAuditAssertion(
195+
new OffsetPaginationAudit(sqlCapturer), platform));
196+
roster.add(new RepeatedStatementAuditAssertion(
197+
new RepeatedStatementAudit(sqlCapturer), platform));
143198
roster.add(new UnconditionalMutationAuditAssertion(
144199
new UnconditionalMutationAudit(sqlCapturer), platform));
145200

0 commit comments

Comments
 (0)