Skip to content

Commit 7a98fbb

Browse files
Merge pull request #125 from oracle/json-duality-test
Testing JSON Duality Views
2 parents ea73e9f + 7b4ba85 commit 7a98fbb

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

src/test/java/oracle/r2dbc/impl/OracleStatementImplTest.java

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import oracle.r2dbc.OracleR2dbcTypes;
3737
import oracle.r2dbc.OracleR2dbcWarning;
3838
import oracle.r2dbc.test.DatabaseConfig;
39+
import oracle.r2dbc.test.TestUtils;
3940
import oracle.sql.json.OracleJsonFactory;
4041
import oracle.sql.json.OracleJsonObject;
4142
import org.junit.jupiter.api.Test;
@@ -3092,6 +3093,78 @@ public void testReturnParameterJsonDualityView() {
30923093
}
30933094
}
30943095

3096+
/**
3097+
* Verifies inserts and queries with a JSON Duality View.
3098+
*/
3099+
@Test
3100+
public void testJsonDualityView() {
3101+
// JSON Duality Views were introduced in Oracle Database version 23c, so
3102+
// this test is skipped if the version is older than 23c.
3103+
assumeTrue(databaseVersion() >= 23,
3104+
"JSON Duality Views are not supported by database versions older than" +
3105+
" 23");
3106+
3107+
Connection connection = awaitOne(sharedConnection());
3108+
try {
3109+
awaitExecution(connection.createStatement(
3110+
"CREATE TABLE testJsonDualityViewTable (" +
3111+
"id NUMBER PRIMARY KEY, value VARCHAR(1000))"));
3112+
awaitExecution(connection.createStatement(
3113+
"CREATE JSON DUALITY VIEW testJsonDualityView AS" +
3114+
" SELECT JSON {'id' : t.id, 'value' : t.value}" +
3115+
" FROM testJsonDualityViewTable t" +
3116+
" WITH INSERT UPDATE DELETE"));
3117+
3118+
// Verify an insert
3119+
OracleJsonObject insertObject = new OracleJsonFactory().createObject();
3120+
insertObject.put("id", 1);
3121+
insertObject.put("value", "a");
3122+
Statement insert = connection.createStatement(
3123+
"INSERT INTO testJsonDualityView VALUES (?)")
3124+
.bind(0, insertObject);
3125+
awaitUpdate(1, insert);
3126+
3127+
// Verify a query
3128+
Statement query = connection.createStatement(
3129+
"SELECT data FROM testJsonDualityView");
3130+
Result queryResult = awaitOne(query.execute());
3131+
OracleJsonObject queryObject =
3132+
awaitOne(queryResult.map(row -> row.get(0, OracleJsonObject.class)));
3133+
queryObject =
3134+
new OracleJsonFactory().createObject(queryObject);
3135+
queryObject.remove("_metadata"); // Remove this field for assertEquals
3136+
assertEquals(insertObject, queryObject);
3137+
3138+
// Verify an update that returns generated keys
3139+
OracleJsonObject updateObject = new OracleJsonFactory().createObject();
3140+
updateObject.put("id", 1);
3141+
updateObject.put("value", "b");
3142+
Statement update = connection.createStatement(
3143+
"UPDATE testJsonDualityView v" +
3144+
" SET data = ?" +
3145+
" WHERE v.data.id = ?");
3146+
update.bind(0, updateObject);
3147+
update.bind(1, 1);
3148+
update.returnGeneratedValues("data");
3149+
Result updateResult = awaitOne(update.execute());
3150+
OracleJsonObject generatedUpdateObject =
3151+
awaitOne(updateResult.map(row -> row.get(0, OracleJsonObject.class)));
3152+
generatedUpdateObject =
3153+
new OracleJsonFactory().createObject(generatedUpdateObject);
3154+
generatedUpdateObject.remove("_metadata"); // Remove this field for assertEquals
3155+
assertEquals(updateObject, generatedUpdateObject);
3156+
3157+
}
3158+
finally {
3159+
tryAwaitExecution(connection.createStatement(
3160+
"DROP VIEW testJsonDualityView"));
3161+
tryAwaitExecution(connection.createStatement(
3162+
"DROP TABLE testJsonDualityViewTable"));
3163+
tryAwaitNone(connection.close());
3164+
}
3165+
3166+
}
3167+
30953168
/**
30963169
* Connect to the database configured by {@link DatabaseConfig}, with a
30973170
* the connection configured to use a given {@code executor} for async

0 commit comments

Comments
 (0)