Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
aa544a8
MINOR - Data Contracts only execute tests without results
pmbrull Sep 10, 2025
bfa0e23
MINOR - Data Contracts only execute tests without results
pmbrull Sep 10, 2025
088ef37
MINOR - Data Contracts only execute tests without results
pmbrull Sep 22, 2025
031b7e1
add data contract to test cases
pmbrull Sep 23, 2025
4cdcfaf
test case data contract migration
pmbrull Sep 23, 2025
56ee55d
fix tests
pmbrull Sep 23, 2025
9d391e3
Merge remote-tracking branch 'origin/main' into dc-dq-execute-summary
pmbrull Sep 23, 2025
49886c4
Merge branch 'main' into dc-dq-execute-summary
Ashish8689 Sep 23, 2025
2e1dd74
Update generated TypeScript types
github-actions[bot] Sep 23, 2025
b1f39b6
replace testsuiteid with dataContractId
Ashish8689 Sep 25, 2025
917b8d0
Merge remote-tracking branch 'origin/main' into dc-dq-execute-summary
pmbrull Sep 25, 2025
a6da51e
fix migration after merge
pmbrull Sep 25, 2025
dcd3964
Update generated TypeScript types
github-actions[bot] Sep 25, 2025
6a563b9
change the api to get the testCaseResult and need to work on the exec…
Ashish8689 Sep 25, 2025
45064d1
updated the quality execution status with the contract last result
Ashish8689 Sep 26, 2025
b4de2fe
Merge remote-tracking branch 'origin/main' into dc-dq-execute-summary
pmbrull Oct 15, 2025
c7d9ed4
bump main
pmbrull Oct 15, 2025
bf46f45
Merge branch 'main' into dc-dq-execute-summary
Ashish8689 Oct 16, 2025
190cc2c
change the api to get all the testResult now and start picking from them
Ashish8689 Oct 16, 2025
554d673
remove some unwanted changes
Ashish8689 Oct 16, 2025
607b5db
fix sonar
Ashish8689 Oct 16, 2025
64f87cb
Merge branch 'main' into dc-dq-execute-summary
Ashish8689 Oct 17, 2025
bd6848c
Merge remote-tracking branch 'origin/main' into dc-dq-execute-summary
pmbrull Oct 31, 2025
59d859f
fix merge
pmbrull Oct 31, 2025
4c5e799
Update generated TypeScript types
github-actions[bot] Oct 31, 2025
27da6b2
Merge branch 'main' into dc-dq-execute-summary
pmbrull Oct 31, 2025
b451cc4
Merge branch 'main' into dc-dq-execute-summary
pmbrull Nov 5, 2025
4b10e04
Merge branch 'main' into dc-dq-execute-summary
pmbrull Nov 21, 2025
25f3ada
Update generated TypeScript types
github-actions[bot] Nov 21, 2025
9627b0b
Merge branch 'main' into dc-dq-execute-summary
pmbrull Nov 24, 2025
55a1ce4
Merge branch 'main' into dc-dq-execute-summary
pmbrull Nov 25, 2025
ff5ebc6
Merge remote-tracking branch 'origin/main' into dc-dq-execute-summary
pmbrull Dec 4, 2025
351f7b6
Merge branch 'dc-dq-execute-summary' of github.com:open-metadata/Open…
pmbrull Dec 4, 2025
cc8fe1d
Merge branch 'main' into dc-dq-execute-summary
pmbrull Dec 15, 2025
f0c1cce
MINOR - Data Contracts only execute tests without results (#23335)
pmbrull Mar 12, 2026
d774e43
Update generated TypeScript types
github-actions[bot] Mar 12, 2026
3a18beb
Move migrateTestCaseDataContractReferences to v1130 migration
pmbrull Mar 12, 2026
7eeb433
Fix Postgres SQL bugs, duplicate test addition, and dead null check
pmbrull Mar 12, 2026
ca26819
format
pmbrull Mar 12, 2026
c66a999
Escape dataContractId in search filter and fix dead null check in upd…
pmbrull Mar 12, 2026
bc7ea9c
format
pmbrull Mar 12, 2026
27626a2
Fix data contract reference integrity, ES injection, and UI stale fetch
pmbrull Mar 14, 2026
5adf633
Guard pipelineServiceClient null in DataContractRepository
pmbrull Mar 14, 2026
d403a01
Merge branch 'main' into task/fix-conflicts-and-review-pr-23335-d42f1f3d
pmbrull Mar 15, 2026
8ddd0dc
Update generated TypeScript types
github-actions[bot] Mar 15, 2026
165fe28
trigger
pmbrull Mar 15, 2026
a639d55
Merge remote-tracking branch 'origin/main' into task/fix-conflicts-an…
pmbrull Mar 16, 2026
16b14e5
Merge main and resolve conflict in TestCaseResourceIT
pmbrull Mar 16, 2026
35078c3
Merge branch 'main' into task/fix-conflicts-and-review-pr-23335-d42f1f3d
pmbrull Mar 17, 2026
99ccd11
trigger
pmbrull Mar 18, 2026
d8a15fd
Resolve merge conflict in TestCaseResultIndex: keep both dataContract…
pmbrull Mar 20, 2026
0de2589
Merge branch 'main' into task/fix-conflicts-and-review-pr-23335-d42f1f3d
pmbrull Mar 20, 2026
ea32d45
Merge branch 'main' into task/fix-conflicts-and-review-pr-23335-d42f1f3d
pmbrull Mar 23, 2026
ee46b86
Apply Copilot review fixes: division-by-zero guard, FQN fallback, sta…
pmbrull Mar 23, 2026
fc9d186
Merge branch 'main' into task/fix-conflicts-and-review-pr-23335-d42f1f3d
pmbrull Mar 23, 2026
a0f7503
Add unit tests for data contract coverage (SearchListFilter, DataCont…
pmbrull Mar 25, 2026
9a83c63
Merge branch 'main' into task/fix-conflicts-and-review-pr-23335-d42f1f3d
pmbrull Mar 26, 2026
823aded
Merge branch 'main' into task/fix-conflicts-and-review-pr-23335-d42f1f3d
pmbrull Mar 30, 2026
2378874
Fix division-by-zero in validateDQ qualityScore when total is 0
pmbrull Mar 30, 2026
a9a36ba
Merge remote-tracking branch 'origin/main' into task/fix-conflicts-an…
pmbrull Apr 1, 2026
4a53f09
Fix DataContractRepositoryTest: update renamed method and stub mock
pmbrull Apr 1, 2026
107ec18
Fix Copilot review issues: entityLink, NPE, compile status, dangling …
pmbrull Apr 1, 2026
6ebc3ea
Merge origin/main: resolve conflicts, move data contract migration to…
pmbrull Apr 22, 2026
f99d18e
Update generated TypeScript types
github-actions[bot] Apr 22, 2026
6787688
Update openmetadata-ui/src/main/resources/ui/src/components/DataContr…
shrabantipaul-collate Apr 23, 2026
139e857
Merge branch 'main' into task/fix-conflicts-and-review-pr-23335-d42f1f3d
shrabantipaul-collate Apr 23, 2026
f124641
Merge branch 'main' into task/fix-conflicts-and-review-pr-23335-d42f1f3d
shrabantipaul-collate Apr 23, 2026
576e013
fix jest tests
Apr 23, 2026
e3a78b1
MINOR - Data Contracts only execute tests without results
pmbrull Apr 28, 2026
a8aeeea
Merge branch 'task/fix-conflicts-and-review-pr-23335-d42f1f3d' of git…
pmbrull Apr 28, 2026
a7b7357
Merge remote-tracking branch 'origin/main' into task/fix-conflicts-an…
pmbrull Apr 28, 2026
783804f
Merge branch 'main' into task/fix-conflicts-and-review-pr-23335-d42f1f3d
shrabantipaul-collate Apr 28, 2026
fb1bcba
Merge branch 'main' into task/fix-conflicts-and-review-pr-23335-d42f1f3d
shrabantipaul-collate Apr 28, 2026
813253e
Merge branch 'main' into task/fix-conflicts-and-review-pr-23335-d42f1f3d
shrabantipaul-collate Apr 28, 2026
1222175
Merge branch 'main' into task/fix-conflicts-and-review-pr-23335-d42f1f3d
shrabantipaul-collate Apr 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@
import org.openmetadata.it.util.TestNamespace;
import org.openmetadata.schema.api.classification.CreateClassification;
import org.openmetadata.schema.api.classification.CreateTag;
import org.openmetadata.schema.api.data.CreateDataContract;
import org.openmetadata.schema.api.data.CreateTable;
import org.openmetadata.schema.api.tests.CreateTestCase;
import org.openmetadata.schema.api.tests.CreateTestSuite;
import org.openmetadata.schema.entity.classification.Classification;
import org.openmetadata.schema.entity.classification.Tag;
import org.openmetadata.schema.entity.data.DataContract;
import org.openmetadata.schema.entity.data.DatabaseSchema;
import org.openmetadata.schema.entity.data.Table;
import org.openmetadata.schema.entity.services.DatabaseService;
Expand All @@ -40,6 +42,7 @@
import org.openmetadata.schema.type.Column;
import org.openmetadata.schema.type.ColumnDataType;
import org.openmetadata.schema.type.EntityHistory;
import org.openmetadata.schema.type.EntityReference;
import org.openmetadata.schema.type.TagLabel;
import org.openmetadata.schema.type.csv.CsvImportResult;
import org.openmetadata.schema.utils.JsonUtils;
Expand Down Expand Up @@ -4135,6 +4138,95 @@
return value;
}

// ===================================================================
// DATA CONTRACT REFERENCE TESTS
// ===================================================================

@Test
void test_createTestCase_withDataContractReference(TestNamespace ns) {
Table table = createTable(ns);

// Create a data contract for the table
CreateDataContract dcRequest =
new CreateDataContract()
.withName(ns.prefix("tc_dc"))
.withEntity(table.getEntityReference())
.withDescription("Contract for test case reference test");
DataContract contract = SdkClients.adminClient().dataContracts().create(dcRequest);

// Create a test case with dataContract FQN (the mapper resolves it to EntityReference)
CreateTestCase request =
TestCaseBuilder.create(SdkClients.adminClient())
.name(ns.prefix("tc_with_dc"))
.forTable(table)
.testDefinition("tableRowCountToEqual")
.parameter("value", "100")
.build();
request.setDataContract(contract.getFullyQualifiedName());

TestCase testCase = createEntity(request);

assertNotNull(testCase.getDataContract(), "Test case should have dataContract reference");
assertEquals(contract.getId(), testCase.getDataContract().getId());
assertEquals("dataContract", testCase.getDataContract().getType());
}

@Test
void test_createTestCase_withInvalidDataContractReference(TestNamespace ns) {
Table table = createTable(ns);

CreateTestCase request =
TestCaseBuilder.create(SdkClients.adminClient())
.name(ns.prefix("tc_bad_dc"))
.forTable(table)
.testDefinition("tableRowCountToEqual")
.parameter("value", "100")
.build();
request.setDataContract("non.existent.data.contract");

assertThrows(
Exception.class,
() -> createEntity(request),
"Should fail with nonexistent data contract FQN");
}

@Test
void test_testCase_dataContractLinkedViaContractCreate(TestNamespace ns) {
Table table = createTable(ns);

// Create test case first without dataContract
TestCase testCase =
TestCaseBuilder.create(SdkClients.adminClient())
.name(ns.prefix("tc_linked"))
.forTable(table)
.testDefinition("tableRowCountToEqual")
.parameter("value", "100")
.create();

// Verify no dataContract initially
TestCase beforeContract = SdkClients.adminClient().testCases().get(testCase.getId().toString());
assertTrue(
beforeContract.getDataContract() == null,
"Test case should have no dataContract before contract creation");

// Now create a data contract that references this test case
CreateDataContract dcRequest =
new CreateDataContract()
.withName(ns.prefix("dc_link"))
.withEntity(table.getEntityReference())
.withDescription("Contract linking to existing test case")
.withQualityExpectations(
List.of(new EntityReference().withId(testCase.getId()).withType("testCase")));
DataContract contract = SdkClients.adminClient().dataContracts().create(dcRequest);

// Verify test case now has dataContract reference (set by postCreate lifecycle hook)
TestCase afterContract = SdkClients.adminClient().testCases().get(testCase.getId().toString());
assertNotNull(

Check failure on line 4224 in openmetadata-integration-tests/src/test/java/org/openmetadata/it/tests/TestCaseResourceIT.java

View workflow job for this annotation

GitHub Actions / Test Report

TestCaseResourceIT.test_testCase_dataContractLinkedViaContractCreate(TestNamespace)

Test case should have dataContract after contract creation ==> expected: not <null>
Raw output
org.opentest4j.AssertionFailedError: Test case should have dataContract after contract creation ==> expected: not <null>
	at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:152)
	at org.junit.jupiter.api.AssertionFailureBuilder.buildAndThrow(AssertionFailureBuilder.java:132)
	at org.junit.jupiter.api.AssertNotNull.failNull(AssertNotNull.java:49)
	at org.junit.jupiter.api.AssertNotNull.assertNotNull(AssertNotNull.java:35)
	at org.junit.jupiter.api.Assertions.assertNotNull(Assertions.java:312)
	at org.openmetadata.it.tests.TestCaseResourceIT.test_testCase_dataContractLinkedViaContractCreate(TestCaseResourceIT.java:4224)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.tryRemoveAndExec(ForkJoinPool.java:1351)
	at java.base/java.util.concurrent.ForkJoinTask.awaitDone(ForkJoinTask.java:422)
	at java.base/java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:651)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)
afterContract.getDataContract(),
"Test case should have dataContract after contract creation");
assertEquals(contract.getId(), afterContract.getDataContract().getId());
}

// ===================================================================
// COLUMN NAME FILTER TESTS (list and search/list endpoints)
// ===================================================================
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8840,6 +8840,46 @@ public TestCaseRecord map(ResultSet rs, StatementContext ctx) throws SQLExceptio
return new TestCaseRecord(rs.getString("json"), rs.getInt("ranked"));
}
}

@ConnectionAwareSqlUpdate(
value =
"UPDATE test_case SET json = JSON_SET(json, '$.dataContract', CAST(:dataContractJson AS JSON)) WHERE id = :id",
connectionType = MYSQL)
@ConnectionAwareSqlUpdate(
value =
"UPDATE test_case SET json = jsonb_set(json, '{dataContract}', :dataContractJson::jsonb, true) WHERE id = :id",
connectionType = POSTGRES)
void updateTestCaseDataContract(
@Bind("id") String id, @Bind("dataContractJson") String dataContractJson);

@ConnectionAwareSqlUpdate(
value = "UPDATE test_case SET json = JSON_REMOVE(json, '$.dataContract') WHERE id = :id",
connectionType = MYSQL)
@ConnectionAwareSqlUpdate(
value = "UPDATE test_case SET json = json - 'dataContract' WHERE id = :id",
connectionType = POSTGRES)
void removeTestCaseDataContract(@Bind("id") String id);

@ConnectionAwareSqlUpdate(
value =
"UPDATE test_case SET json = JSON_REMOVE(json, '$.dataContract') WHERE id = :id AND JSON_UNQUOTE(JSON_EXTRACT(json, '$.dataContract.id')) = :dataContractId",
connectionType = MYSQL)
@ConnectionAwareSqlUpdate(
value =
"UPDATE test_case SET json = json - 'dataContract' WHERE id = :id AND json->'dataContract'->>'id' = :dataContractId",
connectionType = POSTGRES)
void removeTestCaseDataContractForSpecificContract(
@Bind("id") String id, @Bind("dataContractId") String dataContractId);
Comment on lines +8863 to +8872

@ConnectionAwareSqlUpdate(
value =
"UPDATE test_case SET json = JSON_REMOVE(json, '$.dataContract') WHERE JSON_UNQUOTE(JSON_EXTRACT(json, '$.dataContract.id')) = :dataContractId",
connectionType = MYSQL)
@ConnectionAwareSqlUpdate(
value =
"UPDATE test_case SET json = json - 'dataContract' WHERE json->'dataContract'->>'id' = :dataContractId",
connectionType = POSTGRES)
void removeAllTestCaseDataContractReferences(@Bind("dataContractId") String dataContractId);
}

interface WebAnalyticEventDAO extends EntityDAO<WebAnalyticEvent> {
Expand Down
Loading
Loading