More test cases to increase the test coverage

This commit is contained in:
Sharad Chandran R 2024-06-09 18:05:26 +05:30
parent 343d0ff1be
commit f6c8f6c7e7
13 changed files with 1271 additions and 24 deletions

View File

@ -129,7 +129,7 @@ describe('217. aq1.js', function() {
Object.assign(
queue2.deqOptions,
{
visibility: oracledb.AQ_VISIBILITY_IMMEDIATE, // Change the visibility so no explicit commit is required
visibility: oracledb.AQ_VISIBILITY_IMMEDIATE, // Change the visibility so that no explicit commit is required
wait: 25 // seconds it will wait if there are no messages
}
);
@ -204,4 +204,151 @@ describe('217. aq1.js', function() {
assert.deepStrictEqual(messages, []);
}); // 217.6
it('217.7 get delay property', async () => {
/* Enqueue */
const queue1 = await conn.getQueue(rawQueueName);
// Send a message immediately without requiring a commit
queue1.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
const messageString = 'This is my other message';
const message = {
payload: messageString, // the message itself
delay: 5 // Delay the message by 5 seconds
};
const myMsg = await queue1.enqOne(message);
/* Dequeue */
const queue2 = await conn.getQueue(rawQueueName);
Object.assign(
queue2.deqOptions,
{
visibility: oracledb.AQ_VISIBILITY_IMMEDIATE, // Change the visibility so that no explicit commit is required
}
);
queue2.deqOptions.delay = myMsg.delay;
const msg = await queue2.deqOne();
if (msg) {
assert.strictEqual(msg.payload.toString(), messageString);
}
}); // 217.7
it('217.8 get deliveryMode property', async () => {
/* Enqueue */
const queue1 = await conn.getQueue(rawQueueName);
// Send a message immediately without requiring a commit
queue1.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
queue1.enqOptions.deliveryMode = 1; // Delivery mode when enqueuing messages
const messageString = 'This is my other message';
const message = {
payload: messageString // the message itself
};
const myMsg = await queue1.enqOne(message);
// Get the deliveryMode attribute in enqOptions
assert.strictEqual(queue1.enqOptions.deliveryMode, 1);
/* Dequeue */
const queue2 = await conn.getQueue(rawQueueName);
Object.assign(
queue2.deqOptions,
{
visibility: oracledb.AQ_VISIBILITY_IMMEDIATE, // Change the visibility so that no explicit commit is required
}
);
queue2.deqOptions.deliveryMode = myMsg.deliveryMode;
const msg = await queue2.deqOne();
if (msg) {
assert.strictEqual(msg.payload.toString(), messageString);
}
}); // 217.8
it('217.9 get exceptionQueue property', async () => {
/* Enqueue */
const queue1 = await conn.getQueue(rawQueueName);
// Send a message immediately without requiring a commit
queue1.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
const messageString = 'This is my other message';
const message = {
payload: messageString, // the message itself
exceptionQueue: "QueueName" // Name of the exception queue defined when the message was enqueued
};
const myMsg = await queue1.enqOne(message);
/* Dequeue */
const queue2 = await conn.getQueue(rawQueueName);
Object.assign(
queue2.deqOptions,
{
visibility: oracledb.AQ_VISIBILITY_IMMEDIATE, // Change the visibility so that no explicit commit is required
}
);
queue2.deqOptions.exceptionQueue = myMsg.exceptionQueue;
const msg = await queue2.deqOne();
if (msg) {
assert.strictEqual(msg.payload.toString(), messageString);
}
}); // 217.9
it('217.10 set and get visibility attribute', async () => {
/* Enqueue */
const queue1 = await conn.getQueue(rawQueueName);
// Send a message immediately without requiring a commit
queue1.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
const messageString = 'This is my other message';
const message = {
payload: messageString, // the message itself
};
await queue1.enqOne(message);
assert.strictEqual(queue1.enqOptions.visibility, oracledb.AQ_VISIBILITY_IMMEDIATE);
/* Dequeue */
const queue2 = await conn.getQueue(rawQueueName);
Object.assign(
queue2.deqOptions,
{
visibility: oracledb.AQ_VISIBILITY_IMMEDIATE, // Change the visibility so that no explicit commit is required
}
);
const msg = await queue2.deqOne();
assert.strictEqual(queue2.deqOptions.visibility, oracledb.AQ_VISIBILITY_IMMEDIATE);
assert.strictEqual(msg.payload.toString(), messageString);
}); // 217.10
it('217.11 get numAttempts attribute', async () => {
/* Enqueue */
const queue1 = await conn.getQueue(rawQueueName);
// Send a message immediately without requiring a commit
queue1.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
const messageString = 'This is my other message';
const message = {
payload: messageString, // the message itself
};
await queue1.enqOne(message);
/* Dequeue */
const queue2 = await conn.getQueue(rawQueueName);
/*1st dequeue*/
let msg = await queue2.deqOne();
if (msg) {
assert.strictEqual(msg.payload.toString(), messageString);
}
assert.strictEqual(msg.numAttempts, 0); // should be 0
/*rollback*/
await conn.rollback();
/*2nd dequeue attempt*/
msg = await queue2.deqOne();
assert.strictEqual(msg.numAttempts, 1); // should be 1
}); // 217.11
});

172
test/aq10.js Normal file
View File

@ -0,0 +1,172 @@
/* Copyright (c) 2024, Oracle and/or its affiliates. */
/******************************************************************************
*
* This software is dual-licensed to you under the Universal Permissive License
* (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl and Apache License
* 2.0 as shown at https://www.apache.org/licenses/LICENSE-2.0. You may choose
* either license.
*
* If you elect to accept the software under the Apache License, Version 2.0,
* the following applies:
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* NAME
* 302. aq10.js
*
* DESCRIPTION
* Test Oracle Advanced Queueing (AQ) condition attribute.
* condition: A String that defines the condition that must be satisfied
* in order for a message to be dequeued.
*****************************************************************************/
'use strict';
const oracledb = require('oracledb');
const dbConfig = require('./dbconfig.js');
const testsUtil = require('./testsUtil.js');
const assert = require('assert');
describe('302. aq10.js', function() {
let isRunnable = true;
let conn;
const AQ_USER = 'NODB_SCHEMA_AQTEST10';
const AQ_USER_PWD = testsUtil.generateRandomPassword();
const objQueueName = "NODB_ADDR_QUEUE";
const objType = "NODB_ADDR_TYP";
const objTable = "NODB_TAB_ADDR";
before(async function() {
const prerequisites = await testsUtil.checkPrerequisites(2100000000, 2100000000);
if (!dbConfig.test.DBA_PRIVILEGE || oracledb.thin || !prerequisites) {
isRunnable = false;
}
if (!isRunnable) this.skip();
await testsUtil.createAQtestUser(AQ_USER, AQ_USER_PWD);
const credential = {
user: AQ_USER,
password: AQ_USER_PWD,
connectString: dbConfig.connectString
};
conn = await oracledb.getConnection(credential);
// Create the Type
let plsql = `
CREATE OR REPLACE TYPE ${objType} AS OBJECT (
NAME VARCHAR2(10),
ADDRESS VARCHAR2(50)
);
`;
await conn.execute(plsql);
// Create and start a queue
plsql = `
BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE(
QUEUE_TABLE => '${AQ_USER}.${objTable}',
QUEUE_PAYLOAD_TYPE => '${objType}'
);
DBMS_AQADM.CREATE_QUEUE(
QUEUE_NAME => '${AQ_USER}.${objQueueName}',
QUEUE_TABLE => '${AQ_USER}.${objTable}'
);
DBMS_AQADM.START_QUEUE(
QUEUE_NAME => '${AQ_USER}.${objQueueName}'
);
END;
`;
await conn.execute(plsql);
});
after (async function() {
if (!isRunnable) return;
await conn.execute(`
BEGIN
DBMS_AQADM.STOP_QUEUE('${AQ_USER}.${objQueueName}');
END; `);
await conn.execute(`
BEGIN
DBMS_AQADM.DROP_QUEUE_TABLE(
QUEUE_TABLE => '${AQ_USER}.${objTable}',
FORCE => TRUE);
END; `);
await conn.execute(`DROP TYPE ${objType}`);
await conn.close();
await testsUtil.dropAQtestUser(AQ_USER);
});
const addrData1 = {
NAME: "John",
ADDRESS: "100 Oracle Parkway Redwood City, CA US 94065"
};
const addrData2 = {
NAME: "Jenny",
ADDRESS: "200 Oracle Parkway Redwood City, CA US 94065"
};
const addrData3 = {
NAME: "Laura",
ADDRESS: "300 Oracle Parkway Redwood City, CA US 94065"
};
it('302.1 condition attribute in dequeue', async () => {
// Enqueue
const queue = await conn.getQueue(
objQueueName,
{ payloadType: objType }
);
const message1 = new queue.payloadTypeClass(addrData1);
await queue.enqOne(message1);
await conn.commit();
const message2 = new queue.payloadTypeClass(addrData2);
await queue.enqOne(message2);
await conn.commit();
const message3 = new queue.payloadTypeClass(addrData3);
await queue.enqOne(message3);
await conn.commit();
// Dequeue
const queue2 = await conn.getQueue(
objQueueName,
{ payloadType: objType }
);
queue2.deqOptions.condition = `tab.user_data.NAME = '${addrData2.NAME}'`;
const msgDeq = await queue2.deqOne();
assert.strictEqual(msgDeq.payload.NAME, addrData2.NAME);
assert.strictEqual(msgDeq.payload.ADDRESS, addrData2.ADDRESS);
}); // 302.1
it('302.2 Negative - wrong identifier in condition attribute', async () => {
// Dequeue
const queue2 = await conn.getQueue(
objQueueName,
{ payloadType: objType }
);
queue2.deqOptions.condition = `someString.NAME = '${addrData2.NAME}'`;
await assert.rejects(
async () => await queue2.deqOne(),
/ORA-00904:/ //ORA-00904: "SOMESTRING"."NAME": invalid identifier
);
assert.strictEqual(queue2.deqOptions.condition, `someString.NAME = '${addrData2.NAME}'`);
}); // 302.2
});

233
test/aq11.js Normal file
View File

@ -0,0 +1,233 @@
/* Copyright (c) 2024, Oracle and/or its affiliates. */
/******************************************************************************
*
* This software is dual-licensed to you under the Universal Permissive License
* (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl and Apache License
* 2.0 as shown at https://www.apache.org/licenses/LICENSE-2.0. You may choose
* either license.
*
* If you elect to accept the software under the Apache License, Version 2.0,
* the following applies:
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* NAME
* 303. aq11.js
*
* DESCRIPTION
* Test Oracle Advanced Queueing (AQ) dequeue option Dequeue Mode.
*
*****************************************************************************/
'use strict';
const oracledb = require('oracledb');
const assert = require('assert');
const dbConfig = require('./dbconfig.js');
const testsUtil = require('./testsUtil.js');
describe('303. aq11.js', function() {
let isRunnable = true, g_index = 0;
let conn, credential;
const AQ_USER = 'NODB_SCHEMA_AQTEST11';
const AQ_USER_PWD = testsUtil.generateRandomPassword();
before(async function() {
if (!dbConfig.test.DBA_PRIVILEGE || oracledb.thin) {
isRunnable = false;
}
if (!isRunnable) {
this.skip();
} else {
await testsUtil.createAQtestUser(AQ_USER, AQ_USER_PWD);
credential = {
user: AQ_USER,
password: AQ_USER_PWD,
connectString: dbConfig.connectString
};
const dbaCredential = {...dbConfig, privilege: oracledb.SYSDBA};
dbaCredential.user = dbConfig.test.DBA_user;
dbaCredential.password = dbConfig.test.DBA_password;
const dbaConn = await oracledb.getConnection(dbaCredential);
await dbaConn.execute(`GRANT EXECUTE ON DBMS_AQ to ${AQ_USER}`);
await dbaConn.execute(`GRANT EXECUTE ON DBMS_AQADM to ${AQ_USER}`);
await dbaConn.execute(`GRANT AQ_ADMINISTRATOR_ROLE TO ${AQ_USER}`);
await dbaConn.execute(`GRANT ADMINISTER DATABASE TRIGGER TO ${AQ_USER}`);
await dbaConn.release();
conn = await oracledb.getConnection(credential);
await conn.execute(`CREATE OR REPLACE TYPE ${AQ_USER}.MESSAGE_TYP AS object(
attr1 NUMBER,
attr2 VARCHAR2(30),
attr3 VARCHAR2(1000))`);
// Create the queue table
await conn.execute(`
BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE(
QUEUE_TABLE => '${AQ_USER}.OBJ_SINGLE_QUEUE_TABLE',
QUEUE_PAYLOAD_TYPE => '${AQ_USER}.MESSAGE_TYP',
COMPATIBLE => '10.0'
);
END;
`);
// Create the queue
await conn.execute(`
BEGIN
DBMS_AQADM.CREATE_QUEUE(
QUEUE_NAME => '${AQ_USER}.OBJECT_SINGLE_QUEUE',
QUEUE_TABLE => '${AQ_USER}.OBJ_SINGLE_QUEUE_TABLE'
);
END;
`);
// Start the queue
await conn.execute(`
BEGIN
DBMS_AQADM.START_QUEUE('${AQ_USER}.OBJECT_SINGLE_QUEUE');
END;
`);
}
}); // before()
after(async function() {
if (!isRunnable) {
return;
} else {
// Stop the queue
await conn.execute(`
BEGIN
DBMS_AQADM.STOP_QUEUE('${AQ_USER}.OBJECT_SINGLE_QUEUE');
END;
`);
// Drop the queue
await conn.execute(`
BEGIN
DBMS_AQADM.DROP_QUEUE('${AQ_USER}.OBJECT_SINGLE_QUEUE');
END;
`);
// Drop the queue table
await conn.execute(`
BEGIN
DBMS_AQADM.DROP_QUEUE_TABLE('${AQ_USER}.OBJ_SINGLE_QUEUE_TABLE');
END;
`);
await conn.execute(`DROP TYPE ${AQ_USER}.MESSAGE_TYP`);
await conn.close();
await testsUtil.dropAQtestUser(AQ_USER);
}
}); // after()
/**
* This test case verifies the behavior of the default dequeue mode (DEQUEUE_REMOVE).
* The following scenarios are tested:
* 1. Create a queue and enqueue messages in the sequence A, B, and C.
* 2. Use connection ONE with auto-commit disabled to dequeue a message with the default option (DEQUEUE_REMOVE).
* 3. Use connection TWO with auto-commit disabled to dequeue a message with the default option (DEQUEUE_REMOVE).
* 4. Close both connection ONE and connection TWO.
* 5. Use connection THREE to dequeue messages starting from the first message with the default option (DEQUEUE_REMOVE).
*
* Expected results:
* - Message A is dequeued by both connection ONE and connection TWO.
* - Connection THREE dequeues messages B and C in sequence.
* - Changing the dequeue mode to DEQUEUE_REMOVE explicitly yields the same result.
*/
it('303.1 enqueue/dequeue with modes', async () => {
const MESSAGE_TYP = `${AQ_USER}.MESSAGE_TYP`;
const SINGLE_QUEUE = `${AQ_USER}.OBJECT_SINGLE_QUEUE`;
// Step 1: Get the queue object for enqueuing messages
const queue1 = await conn.getQueue(SINGLE_QUEUE, {payloadType: MESSAGE_TYP});
// Step 2: Set enqueue options to make the message visible immediately
queue1.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
// Step 3: Enqueue multiple messages
const messages = [
"This is message A",
"This is message B",
"This is message C"
];
for (let i = 0; i < messages.length; i++) {
const messageString = {
ATTR1: g_index++,
ATTR2: 'attr1 value',
ATTR3: messages[i]
};
await queue1.enqOne({ payload: messageString });
await new Promise((resolve) => setTimeout(resolve, 1000));
}
// Step 4: Dequeue with connection ONE
const connOne = await oracledb.getConnection(credential);
const queue2 = await connOne.getQueue(SINGLE_QUEUE, {payloadType: MESSAGE_TYP});
Object.assign(queue2.deqOptions, {
mode: oracledb.AQ_DEQ_MODE_REMOVE,
visibility: oracledb.AQ_VISIBILITY_ON_COMMIT,
navigation: oracledb.AQ_DEQ_NAV_FIRST_MSG,
wait: oracledb.AQ_DEQ_NO_WAIT
});
assert.strictEqual(queue2.deqOptions.mode, oracledb.AQ_DEQ_MODE_REMOVE);
let msg = await queue2.deqOne();
assert.deepStrictEqual(JSON.stringify(msg.payload), '{"ATTR1":0,"ATTR2":"attr1 value","ATTR3":"This is message A"}');
await connOne.close();
// Step 5: Dequeue with connection TWO
const connTwo = await oracledb.getConnection(credential);
const queue3 = await connTwo.getQueue(SINGLE_QUEUE, {payloadType: MESSAGE_TYP});
Object.assign(queue3.deqOptions, {
mode: oracledb.AQ_DEQ_MODE_REMOVE,
visibility: oracledb.AQ_VISIBILITY_ON_COMMIT,
navigation: oracledb.AQ_DEQ_NAV_FIRST_MSG,
});
msg = await queue3.deqOne();
assert.strictEqual(queue3.deqOptions.mode, oracledb.AQ_DEQ_MODE_REMOVE);
assert.deepStrictEqual(JSON.stringify(msg.payload), '{"ATTR1":0,"ATTR2":"attr1 value","ATTR3":"This is message A"}');
await connTwo.commit();
await connTwo.close();
// Step 6: Dequeue with connection THREE
const connThr = await oracledb.getConnection(credential);
const queue4 = await connThr.getQueue(SINGLE_QUEUE, {payloadType: MESSAGE_TYP});
Object.assign(queue4.deqOptions, {
mode: oracledb.AQ_DEQ_MODE_REMOVE,
visibility: oracledb.AQ_VISIBILITY_IMMEDIATE,
navigation: oracledb.AQ_DEQ_NAV_FIRST_MSG,
wait: oracledb.AQ_DEQ_NO_WAIT,
});
msg = await queue4.deqOne();
assert.strictEqual(queue2.deqOptions.mode, oracledb.AQ_DEQ_MODE_REMOVE);
assert.deepStrictEqual(JSON.stringify(msg.payload), '{"ATTR1":1,"ATTR2":"attr1 value","ATTR3":"This is message B"}');
msg = await queue4.deqOne();
assert.deepStrictEqual(JSON.stringify(msg.payload), '{"ATTR1":2,"ATTR2":"attr1 value","ATTR3":"This is message C"}');
await connThr.close();
}); // 303.1
});

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2019, 2023, Oracle and/or its affiliates. */
/* Copyright (c) 2024, Oracle and/or its affiliates. */
/******************************************************************************
*

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2019, 2023, Oracle and/or its affiliates. */
/* Copyright (c) 2024, Oracle and/or its affiliates. */
/******************************************************************************
*
@ -189,4 +189,231 @@ describe('219. aq3.js', function() {
}
}); // 219.7
it('219.8 Get correlation property in deqOne', async () => {
/* Enqueue */
const queue1 = await conn.getQueue(rawQueueName);
const messages = [
"Message 1",
{
correlation: "someId", // Allows a logical grouping of messages
payload: "Message 2"
}
];
const myMsg = await queue1.enqMany(messages);
/* Dequeue */
const queue2 = await conn.getQueue(rawQueueName);
let msg = await queue2.deqOne();
assert.strictEqual(msg.payload.toString(), "Message 1");
queue2.deqOptions.correlation = myMsg[1].correlation;
msg = await queue2.deqOne();
assert.strictEqual(msg.payload.toString(), "Message 2");
assert.strictEqual(queue2.deqOptions.correlation, myMsg[1].correlation);
}); // 219.8
it('219.9 Get correlation property in deqOne by specifying same correlation ID', async () => {
/* Enqueue */
const queue1 = await conn.getQueue(rawQueueName);
// Send a message immediately without requiring a commit
queue1.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
const messages = [
"Message 1",
{
correlation: "someId",
payload: "Message 2"
},
{
correlation: "someId",
payload: "Message 3"
}
];
const myMsg = await queue1.enqMany(messages);
/* Dequeue */
const queue2 = await conn.getQueue(rawQueueName);
let msg = await queue2.deqOne();
assert.strictEqual(msg.payload.toString(), "Message 1");
queue2.deqOptions.correlation = myMsg[1].correlation;
msg = await queue2.deqOne();
assert.strictEqual(msg.payload.toString(), "Message 2");
assert.strictEqual(queue2.deqOptions.correlation, myMsg[1].correlation);
queue2.deqOptions.correlation = myMsg[2].correlation;
msg = await queue2.deqOne();
assert.strictEqual(msg.payload.toString(), "Message 3");
assert.strictEqual(queue2.deqOptions.correlation, myMsg[2].correlation);
}); // 219.9
it('219.10 Negative - Get correlation property in dequeue by changing correlation ID', async () => {
/* Enqueue */
const queue1 = await conn.getQueue(rawQueueName);
// Send a message immediately without requiring a commit
queue1.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
const messages = [
"Message 1",
{
correlation: "someOtherID",
payload: "Message 2"
}
];
const myMsg = await queue1.enqMany(messages);
/* Dequeue */
const queue2 = await conn.getQueue(rawQueueName);
let msg = await queue2.deqOne();
assert.strictEqual(msg.payload.toString(), "Message 1");
queue2.deqOptions.correlation = myMsg[1].correlation;
await assert.rejects(
async () => await queue2.deqOne(),
/ORA-25241:/ /*
ORA-25241: Cannot change correlation ID
from 'someId' to 'two' without FIRST_MESSAGE option
*/
);
queue2.deqOptions.navigation = oracledb.AQ_DEQ_NAV_FIRST_MSG;
msg = await queue2.deqOne();
assert.strictEqual(msg.payload.toString(), "Message 2");
assert.strictEqual(queue2.deqOptions.correlation, myMsg[1].correlation);
}); // 219.10
it('219.11 get correlation property in deqMany', async () => {
/* Enqueue */
const queue1 = await conn.getQueue(rawQueueName);
// Send a message immediately without requiring a commit
queue1.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
const messages = [
"Message 1",
{
correlation: "someOtherID",
payload: "Message 2"
},
{
correlation: "someOtherID",
payload: "Message 3"
},
"Message 4",
"Message 5",
"Message 6",
{
correlation: "someOtherID",
payload: "Message 7"
}
];
const myMsg = await queue1.enqMany(messages);
/* Dequeue */
const queue2 = await conn.getQueue(rawQueueName);
/*
Correlation identifier,
allows multiple messages queued with a user defined identifier to be dequeued together
*/
queue2.deqOptions.correlation = myMsg[1].correlation;
let msg = await queue2.deqMany(4); // get at most 4 messages
assert.strictEqual(msg.length, 3);
assert.strictEqual(msg[0].payload.toString(), "Message 2");
assert.strictEqual(msg[1].payload.toString(), "Message 3");
assert.strictEqual(msg[2].payload.toString(), "Message 7");
/* Dequeue remaining messages */
const queue3 = await conn.getQueue(rawQueueName);
msg = await queue3.deqMany(4); // get at most 4 messages
assert.strictEqual(msg.length, 4);
assert.strictEqual(msg[0].payload.toString(), "Message 1");
assert.strictEqual(msg[1].payload.toString(), "Message 4");
assert.strictEqual(msg[2].payload.toString(), "Message 5");
assert.strictEqual(msg[3].payload.toString(), "Message 6");
assert.strictEqual(queue2.deqOptions.correlation, myMsg[1].correlation);
}); // 219.11
it('219.12 Get priority attribute in deqOne', async () => {
/* Enqueue */
const queue1 = await conn.getQueue(rawQueueName);
const messages = [
{
priority: 2, // Priority of the message when it was enqueued
payload: "Message 1"
},
{
priority: 1, // Priority of the message when it was enqueued
payload: "Message 2"
}
];
const myMsg = await queue1.enqMany(messages);
/* Dequeue */
const queue2 = await conn.getQueue(rawQueueName);
queue2.deqOptions.priority = myMsg[0].priority;
let msg = await queue2.deqOne();
assert.strictEqual(msg.payload.toString(), "Message 1");
queue2.deqOptions.priority = myMsg[1].priority;
msg = await queue2.deqOne();
assert.strictEqual(msg.payload.toString(), "Message 2");
}); // 219.12
it('219.13 Get state attribute in deqOne', async () => {
/* Enqueue */
const queue1 = await conn.getQueue(rawQueueName);
const messageString = 'This is my test message';
const message = {
payload: messageString, // the message itself
};
await queue1.enqOne(message);
/* Dequeue and check state */
const queue2 = await conn.getQueue(rawQueueName);
const msg = await queue2.deqOne();
assert.strictEqual(msg.state, oracledb.AQ_MSG_STATE_READY); // Expect ready state
assert.strictEqual(msg.payload.toString(), messageString);
}); // 219.13
it('219.14 Verify state change on expiration', async () => {
/* Enqueue with expiration */
const queue1 = await conn.getQueue(rawQueueName);
// Send a message immediately without requiring a commit
queue1.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
const messageString = 'This is an expiring message';
const message = {
expiration: 3, // seconds the message will remain in the queue if not dequeued
payload: messageString, // the message itself
};
const options = await queue1.enqOne(message);
assert.strictEqual(options.state, oracledb.AQ_MSG_STATE_READY);
await new Promise(resolve => setTimeout(resolve, 6000)); // Wait 6 seconds (longer than expiration)
/* Dequeue and check state */
const queue2 = await conn.getQueue(rawQueueName);
Object.assign(
queue2.deqOptions,
{
visibility: oracledb.AQ_VISIBILITY_IMMEDIATE, // Change the visibility so no explicit commit is required
wait: 1 // seconds it will wait if there are no messages
}
);
const msg = await queue2.deqOne();
// Message might have expired (expected behavior).
assert.strictEqual(msg, undefined);
assert.strictEqual(queue2.deqOptions.wait, 1);
}); // 219.14
});

View File

@ -176,8 +176,9 @@ describe('267. aq4.js', function() {
{ consumerName: "sub1" }
);
const msg = await queue2.deqOne ();
const msg = await queue2.deqOne();
assert.strictEqual(msg.payload.NAME, "scott");
assert.strictEqual(queue2.deqOptions.consumerName, "sub1");
await conn.commit();
}); // 267.2
@ -275,6 +276,7 @@ describe('267. aq4.js', function() {
const msg = await queue2.deqOne();
assert.strictEqual(msg, null);
assert.strictEqual(queue2.deqOptions.consumerName, "sub3");
await conn.commit();
},
/ORA-25242:/
@ -322,6 +324,7 @@ describe('267. aq4.js', function() {
);
const msgs = await queue2.deqMany(5);
assert.strictEqual(msgs.length, 4);
assert.strictEqual(queue2.deqOptions.consumerName, "sub1");
}); // 267.9
@ -348,6 +351,7 @@ describe('267. aq4.js', function() {
);
const msgs = await queue2.deqMany(5);
assert.strictEqual(msgs.length, 0);
assert.strictEqual(queue2.deqOptions.consumerName, "abc");
}); // 267.10
it('267.11 recipient list with enqMany invalid datatype in dequeue', async () => {
@ -367,5 +371,4 @@ describe('267. aq4.js', function() {
/NJS-007:/
);
}); // 267.11
});

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2023, 2024, Oracle and/or its affiliates. */
/* Copyright (c) 2024, Oracle and/or its affiliates. */
/******************************************************************************
*

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2023, Oracle and/or its affiliates. */
/* Copyright (c) 2024, Oracle and/or its affiliates. */
/******************************************************************************
*

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2023, 2024, Oracle and/or its affiliates. */
/* Copyright (c) 2024, Oracle and/or its affiliates. */
/******************************************************************************
*
@ -131,7 +131,6 @@ describe('283. aq7.js', function() {
{payloadType: oracledb.DB_TYPE_JSON});
Object.assign(queue4.deqOptions,
{
// consumerName: "sub1",
navigation: oracledb.AQ_DEQ_NAV_FIRST_MSG,
wait: oracledb.AQ_DEQ_NO_WAIT
}
@ -146,6 +145,7 @@ describe('283. aq7.js', function() {
assert.equal(msgs[0].payload.empId, 101);
assert.equal(msgs[1].payload.empId, 102);
assert.equal(msgs[2].payload.empId, 103);
assert.strictEqual(queue4.deqOptions.navigation, oracledb.AQ_DEQ_NAV_FIRST_MSG);
}); // 283.2
it('283.3 Map JS object directly into JSON - enqOne/deqOne', async () => {
@ -205,6 +205,7 @@ describe('283. aq7.js', function() {
assert.equal(msgs[0].payload.empCity, "City1");
assert.equal(msgs[1].payload.empCity, "City2");
assert.equal(msgs[2].payload.empCity, "City3");
assert.strictEqual(queue2.deqOptions.navigation, oracledb.AQ_DEQ_NAV_FIRST_MSG);
}); // 283.4
it('283.5 enqOne and deqOne Null & Boolean in JSON', async function() {
@ -263,6 +264,7 @@ describe('283. aq7.js', function() {
assert.equal(msgs[0].payload.empCity, true);
assert.equal(msgs[1].payload.empCity, false);
assert.equal(msgs[2].payload.empCity, true);
assert.strictEqual(queue2.deqOptions.navigation, oracledb.AQ_DEQ_NAV_FIRST_MSG);
}); // 283.6
it('283.7 enqOne and deqOne with JSON val as array type', async function() {
@ -311,6 +313,7 @@ describe('283. aq7.js', function() {
assert.deepStrictEqual(msgs[0].payload.empName1, ["Employee #1", 101]);
assert.deepStrictEqual(msgs[1].payload.empName2, ["Employee #2", 102]);
assert.deepStrictEqual(msgs[2].payload.empName3, ["Employee #3", 103]);
assert.strictEqual(queue4.deqOptions.navigation, oracledb.AQ_DEQ_NAV_FIRST_MSG);
}); // 283.8
it('283.9 enqOne and deqOne JSON val as object type', async function() {
@ -366,6 +369,7 @@ describe('283. aq7.js', function() {
{ "name": "Employee2", "age": 30, "city": "New York" });
assert.deepStrictEqual(msgs[2].payload.empDetails3,
{ "name": "Employee3", "age": 28, "city": "New Land" });
assert.strictEqual(queue4.deqOptions.navigation, oracledb.AQ_DEQ_NAV_FIRST_MSG);
}); // 283.10
it('283.11 enqOne and deqOne CLOB value into a JSON key', async function() {

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2023, Oracle and/or its affiliates. */
/* Copyright (c) 2024, Oracle and/or its affiliates. */
/******************************************************************************
*
@ -27,7 +27,7 @@
*
* DESCRIPTION
* Test Oracle Advanced Queueing (AQ).
* Test cases for fetching items based on msgid in deqOne().
* Test cases for fetching items based on the msgid and originalMsgId attributes while dequeuing.
*
*****************************************************************************/
'use strict';
@ -110,14 +110,19 @@ describe('285. aq8.js', function() {
queue2.deqOptions.msgId = msg3.msgId;
msg = await queue2.deqOne();
assert(msg.payload.toString(), messageString3);
assert.deepStrictEqual(queue2.deqOptions.msgId, msg3.msgId);
queue2.deqOptions.msgId = msg2.msgId;
msg = await queue2.deqOne ();
assert(msg.payload.toString(), messageString2);
assert.deepStrictEqual(queue2.deqOptions.msgId.toString('hex'),
msg2.msgId.toString('hex'));
queue2.deqOptions.msgId = msg1.msgId;
msg = await queue2.deqOne();
assert(msg.payload.toString(), messageString1);
assert.deepStrictEqual(queue2.deqOptions.msgId.toString('hex'),
msg1.msgId.toString('hex'));
}); // 285.1.1
it('285.1.2 query by msgId in enqMany and deqOne in non-sequential order', async () => {
@ -141,18 +146,26 @@ describe('285. aq8.js', function() {
queue2.deqOptions.msgId = messages[3].msgId;
let msg = await queue2.deqOne();
assert(msg.payload.toString(), "This is my message 4");
assert.deepStrictEqual(queue2.deqOptions.msgId.toString('hex'),
messages[3].msgId.toString('hex'));
queue2.deqOptions.msgId = messages[2].msgId;
msg = await queue2.deqOne();
assert(msg.payload.toString(), "This is my message 3");
assert.deepStrictEqual(queue2.deqOptions.msgId.toString('hex'),
messages[2].msgId.toString('hex'));
queue2.deqOptions.msgId = messages[1].msgId;
msg = await queue2.deqOne();
assert(msg.payload.toString(), "This is my message 2");
assert.deepStrictEqual(queue2.deqOptions.msgId.toString('hex'),
messages[1].msgId.toString('hex'));
queue2.deqOptions.msgId = messages[0].msgId;
msg = await queue2.deqOne();
assert(msg.payload.toString(), "This is my message 1");
assert.deepStrictEqual(queue2.deqOptions.msgId.toString('hex'),
messages[0].msgId.toString('hex'));
}); // 285.1.2
it('285.1.3 enqOne and deqOne by msgId as string in random order', async () => {
@ -172,14 +185,17 @@ describe('285. aq8.js', function() {
queue2.deqOptions.msgId = msg3.msgId;
msg = await queue2.deqOne();
assert(msg.payload.toString(), messageString3);
assert.deepStrictEqual(queue2.deqOptions.msgId.toString('hex'), msg3.msgId.toString('hex'));
queue2.deqOptions.msgId = msg2.msgId;
msg = await queue2.deqOne ();
assert(msg.payload.toString(), messageString2);
assert.deepStrictEqual(queue2.deqOptions.msgId.toString('hex'), msg2.msgId.toString('hex'));
queue2.deqOptions.msgId = msg1.msgId;
msg = await queue2.deqOne();
assert(msg.payload.toString(), messageString1);
assert.deepStrictEqual(queue2.deqOptions.msgId.toString('hex'), msg1.msgId.toString('hex'));
}); // 285.1.3
it('285.1.4 query by msgId in enqMany and deqOne in random order', async () => {
@ -230,6 +246,69 @@ describe('285. aq8.js', function() {
);
}); // 285.1.5
it('285.1.6 enqOne and deqOne by originalMsgId attribute as string in non-sequential order', async () => {
let msg;
const messageString1 = "This is my message 1",
messageString2 = "This is my message 2",
messageString3 = "This is my message 3";
// Enqueue
const queue1 = await conn.getQueue(rawQueueName);
const msg1 = await queue1.enqOne(messageString1);
const msg2 = await queue1.enqOne(messageString2);
const msg3 = await queue1.enqOne(messageString3);
await conn.commit ();
const queue2 = await conn.getQueue(rawQueueName);
queue2.deqOptions.originalMsgId = msg2.originalMsgId;
msg = await queue2.deqOne ();
assert(msg.payload.toString(), messageString2);
queue2.deqOptions.originalMsgId = msg3.originalMsgId;
msg = await queue2.deqOne();
assert(msg.payload.toString(), messageString3);
queue2.deqOptions.originalMsgId = msg1.originalMsgId;
msg = await queue2.deqOne();
assert(msg.payload.toString(), messageString1);
}); // 285.1.6
it('285.1.7 query by originalMsgId in enqMany and deqOne in random order', async () => {
const queue1 = await conn.getQueue(rawQueueName);
queue1.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
const messages1 = [
"This is my message 1",
"This is my message 2",
{
expiration: 10,
payload: "This is my message 3"
},
"This is my message 4"
];
const messages = await queue1.enqMany(messages1);
/*Dequeue*/
const queue2 = await conn.getQueue(rawQueueName);
queue2.deqOptions.originalMsgId = messages[2].originalMsgId;
let msg = await queue2.deqOne();
assert(msg.payload.toString(), "This is my message 3");
queue2.deqOptions.originalMsgId = messages[3].originalMsgId;
msg = await queue2.deqOne();
assert(msg.payload.toString(), "This is my message 4");
queue2.deqOptions.originalMsgId = messages[0].originalMsgId;
msg = await queue2.deqOne();
assert(msg.payload.toString(), "This is my message 1");
queue2.deqOptions.originalMsgId = messages[1].originalMsgId;
msg = await queue2.deqOne();
assert(msg.payload.toString(), "This is my message 2");
}); // 285.1.7
});
describe('285.2 query by msgId in QUEUE_PAYLOAD_TYPE as JSON', function() {

353
test/aq9.js Normal file
View File

@ -0,0 +1,353 @@
/* Copyright (c) 2024, Oracle and/or its affiliates. */
/******************************************************************************
*
* This software is dual-licensed to you under the Universal Permissive License
* (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl and Apache License
* 2.0 as shown at https://www.apache.org/licenses/LICENSE-2.0. You may choose
* either license.
*
* If you elect to accept the software under the Apache License, Version 2.0,
* the following applies:
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* NAME
* 301. aq9.js
*
* DESCRIPTION
* Test Oracle Advanced Queueing (AQ) transformation attribute.
*
*****************************************************************************/
'use strict';
const oracledb = require('oracledb');
const assert = require('assert');
const dbConfig = require('./dbconfig.js');
const testsUtil = require('./testsUtil.js');
describe('301. aq9.js', function() {
let isRunnable = true;
let conn;
const AQ_USER = 'NODB_SCHEMA_AQTEST9';
const AQ_USER_PWD = testsUtil.generateRandomPassword();
const MESSAGE_TYP = `${AQ_USER}.MESSAGE_TYP`;
const ORDER_TYP = `${AQ_USER}.ORDER_TYP`;
before(async function() {
if (!dbConfig.test.DBA_PRIVILEGE || oracledb.thin) {
isRunnable = false;
}
if (!isRunnable) {
this.skip();
} else {
await testsUtil.createAQtestUser(AQ_USER, AQ_USER_PWD);
const credential = {
user: AQ_USER,
password: AQ_USER_PWD,
connectString: dbConfig.connectString
};
const dbaCredential = {...dbConfig, privilege: oracledb.SYSDBA};
dbaCredential.user = dbConfig.test.DBA_user;
dbaCredential.password = dbConfig.test.DBA_password;
const dbaConn = await oracledb.getConnection(dbaCredential);
await dbaConn.execute(`GRANT EXECUTE ON DBMS_AQ to ${AQ_USER}`);
await dbaConn.execute(`GRANT EXECUTE ON DBMS_AQADM to ${AQ_USER}`);
await dbaConn.execute(`GRANT AQ_ADMINISTRATOR_ROLE TO ${AQ_USER}`);
await dbaConn.execute(`GRANT ADMINISTER DATABASE TRIGGER TO ${AQ_USER}`);
await dbaConn.release();
conn = await oracledb.getConnection(credential);
await conn.execute(
`CREATE OR REPLACE TYPE ${AQ_USER}.MESSAGE_TYP AS object(
attr1 NUMBER,
attr2 VARCHAR2(30),
attr3 VARCHAR2(1000))`
);
await conn.execute(`
CREATE OR REPLACE TYPE ${AQ_USER}.ORDER_TYP AS object(
sender_id NUMBER,
subject VARCHAR2(30),
text VARCHAR2(1000))`
);
await conn.execute(`
BEGIN
DBMS_TRANSFORM.CREATE_TRANSFORMATION(
schema => '${AQ_USER}',
name => 'message_order_transform',
from_schema => '${AQ_USER}',
from_type => 'MESSAGE_TYP',
to_schema => '${AQ_USER}',
to_type => 'ORDER_TYP',
transformation => '${AQ_USER}.ORDER_TYP(
source.user_data.attr1,
source.user_data.attr2,
source.user_data.attr3)');
END;
`);
await conn.execute(`
BEGIN
DBMS_TRANSFORM.CREATE_TRANSFORMATION(
schema => '${AQ_USER}',
name => 'order_message_transform',
from_schema => '${AQ_USER}',
from_type => 'ORDER_TYP',
to_schema => '${AQ_USER}',
to_type => 'MESSAGE_TYP',
transformation => '${AQ_USER}.MESSAGE_TYP(
source.user_data.sender_id,
source.user_data.subject,
source.user_data.text)');
END;
`);
// create a single consumer OBJECT queue:
await conn.execute(`
BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE(
QUEUE_TABLE => '${AQ_USER}.OBJ_SINGLE_QUEUE_TABLE',
QUEUE_PAYLOAD_TYPE => '${AQ_USER}.ORDER_TYP',
COMPATIBLE => '10.0');
END; `);
await conn.execute(`
BEGIN
DBMS_AQADM.CREATE_QUEUE(
QUEUE_NAME => '${AQ_USER}.OBJECT_SINGLE_QUEUE',
QUEUE_TABLE => '${AQ_USER}.OBJ_SINGLE_QUEUE_TABLE');
END; `);
await conn.execute(`
BEGIN
DBMS_AQADM.START_QUEUE('${AQ_USER}.OBJECT_SINGLE_QUEUE');
END; `);
// create a multi consumer OBJECT queue:
await conn.execute(`
BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE(
QUEUE_TABLE => '${AQ_USER}.OBJ_MULTIPLE_QUEUE_TABLE',
QUEUE_PAYLOAD_TYPE => '${AQ_USER}.ORDER_TYP',
MULTIPLE_CONSUMERS => TRUE,
COMPATIBLE => '10.0');
END; `);
await conn.execute(`
BEGIN
DBMS_AQADM.CREATE_QUEUE(
QUEUE_NAME => '${AQ_USER}.OBJECT_MULTIPLE_QUEUE',
QUEUE_TABLE => '${AQ_USER}.OBJ_MULTIPLE_QUEUE_TABLE');
END; `);
await conn.execute(`
BEGIN
DBMS_AQADM.START_QUEUE('${AQ_USER}.OBJECT_MULTIPLE_QUEUE');
END; `);
}
}); // before()
after(async function() {
if (!isRunnable) {
return;
} else {
await conn.execute(`
BEGIN
DBMS_TRANSFORM.DROP_TRANSFORMATION(
schema => '${AQ_USER}',
name => 'message_order_transform');
END; `);
await conn.execute(`
BEGIN
DBMS_TRANSFORM.DROP_TRANSFORMATION(
schema => '${AQ_USER}',
name => 'order_message_transform');
END; `);
await conn.execute(`
BEGIN
DBMS_AQADM.STOP_QUEUE('${AQ_USER}.OBJECT_SINGLE_QUEUE');
END; `);
await conn.execute(`
BEGIN
DBMS_AQADM.DROP_QUEUE_TABLE(
QUEUE_TABLE => '${AQ_USER}.OBJ_SINGLE_QUEUE_TABLE',
FORCE => TRUE);
END; `);
await conn.execute(`
BEGIN
DBMS_AQADM.STOP_QUEUE('${AQ_USER}.OBJECT_MULTIPLE_QUEUE');
END; `);
await conn.execute(`
BEGIN
DBMS_AQADM.DROP_QUEUE_TABLE(
QUEUE_TABLE => '${AQ_USER}.OBJ_MULTIPLE_QUEUE_TABLE',
FORCE => TRUE);
END; `);
await conn.execute(`DROP TYPE ${AQ_USER}.MESSAGE_TYP`);
await conn.close();
await testsUtil.dropAQtestUser(AQ_USER);
}
}); // after()
// Test with single consumer queue
// enqueue with transformation, message_order_transform
it('301.1 Enqueue messages with transformation single user queue', async () => {
const queue1 = await conn.getQueue('OBJECT_SINGLE_QUEUE', {payloadType: MESSAGE_TYP});
const messageString = {
ATTR1: 1, // Ensure attribute names and types match MESSAGE_TYP
ATTR2: 'Some important data',
ATTR3: 'Some text'
};
// Send a message immediately without requiring a commit
queue1.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
queue1.enqOptions.transformation = 'message_order_transform';
await queue1.enqOne({
payload: messageString
});
assert.strictEqual(queue1.enqOptions.transformation, 'message_order_transform');
// Dequeue operation without transformation
const queue2 = await conn.getQueue(
'OBJECT_SINGLE_QUEUE',
{ payloadType: ORDER_TYP }
);
Object.assign(
queue2.deqOptions
);
assert.strictEqual(queue2.deqOptions.transformation, '');
const msg = await queue2.deqOne();
assert.deepStrictEqual(JSON.stringify(msg.payload),
'{"SENDER_ID":1,"SUBJECT":"Some important data","TEXT":"Some text"}');
}); // 301.1
// Test with multi consumer queue
// enqueue with transformation, message_order_transform
it('301.2 Enqueue messages with transformation on multiple users', async () => {
const queue1 = await conn.getQueue('OBJECT_MULTIPLE_QUEUE', {payloadType: MESSAGE_TYP});
const messageString = {
ATTR1: 1, // Ensure attribute names and types match MESSAGE_TYP
ATTR2: 'Some important data',
ATTR3: 'Some text'
};
queue1.enqOptions.transformation = 'message_order_transform';
await queue1.enqOne({
payload: messageString,
recipients: ["sub1"]
});
assert.strictEqual(queue1.enqOptions.transformation, 'message_order_transform');
await conn.commit();
// Dequeue operation without transformation
const queue2 = await conn.getQueue(
'OBJECT_MULTIPLE_QUEUE',
{ payloadType: ORDER_TYP }
);
Object.assign(
queue2.deqOptions,
{ consumerName: "sub1" }
);
assert.strictEqual(queue2.deqOptions.transformation, '');
const msg = await queue2.deqOne();
assert.deepStrictEqual(JSON.stringify(msg.payload),
'{"SENDER_ID":1,"SUBJECT":"Some important data","TEXT":"Some text"}');
}); // 301.2
// Test with single consumer queue
// enqueue with transformation, message_order_transform
it('301.3 Enqueue and dequeue messages with transformation on single user queue', async () => {
const queue1 = await conn.getQueue('OBJECT_SINGLE_QUEUE', {payloadType: MESSAGE_TYP});
const messageString = {
ATTR1: 1, // Ensure attribute names and types match MESSAGE_TYP
ATTR2: 'Some important data',
ATTR3: 'Some text'
};
queue1.enqOptions.transformation = 'message_order_transform';
await queue1.enqOne({
payload: messageString
});
assert.strictEqual(queue1.enqOptions.transformation, 'message_order_transform');
await conn.commit();
// Dequeue operation with transformation
const queue2 = await conn.getQueue(
'OBJECT_SINGLE_QUEUE',
{ payloadType: MESSAGE_TYP }
);
Object.assign(
queue2.deqOptions
);
queue2.deqOptions.transformation = 'order_message_transform';
assert.strictEqual(queue2.deqOptions.transformation, 'order_message_transform');
const msg = await queue2.deqOne();
assert.deepStrictEqual(JSON.stringify(msg.payload),
'{"ATTR1":1,"ATTR2":"Some important data","ATTR3":"Some text"}');
}); 301.3;
// Test with multi consumer queue
// enqueue with transformation, message_order_transform
// dequeue with transformation, order_message_transform
it('301.4 Enqueue and dequeue messages with transformation on multiple user queue', async () => {
const queue1 = await conn.getQueue('OBJECT_MULTIPLE_QUEUE', {payloadType: MESSAGE_TYP});
const messageString = {
ATTR1: 1, // Ensure attribute names and types match MESSAGE_TYP
ATTR2: 'Some important data',
ATTR3: 'Some text'
};
queue1.enqOptions.transformation = 'message_order_transform';
await queue1.enqOne({
payload: messageString,
recipients: ["sub1"]
});
assert.strictEqual(queue1.enqOptions.transformation, 'message_order_transform');
await conn.commit();
// Dequeue operation with transformation
const queue2 = await conn.getQueue(
'OBJECT_MULTIPLE_QUEUE',
{ payloadType: MESSAGE_TYP }
);
Object.assign(
queue2.deqOptions,
{ consumerName: "sub1" }
);
queue2.deqOptions.transformation = 'order_message_transform';
assert.strictEqual(queue2.deqOptions.transformation, 'order_message_transform');
const msg = await queue2.deqOne();
assert.deepStrictEqual(JSON.stringify(msg.payload),
'{"ATTR1":1,"ATTR2":"Some important data","ATTR3":"Some text"}');
}); 301.4;
});

View File

@ -4645,6 +4645,10 @@ oracledb.OUT_FORMAT_OBJECT and resultSet = true
217.4 one message in enqMany/deqMany
217.5 deqOne on empty queue
217.6 deqMany on empty queue
217.7 get delay property
217.8 get deliveryMode property
217.9 get exceptionQueue property
217.10 get numAttempts attribute
218. aq2.js
218.1 examples/aqobject.js
@ -4666,6 +4670,13 @@ oracledb.OUT_FORMAT_OBJECT and resultSet = true
219.5 Negative - Set "maxMessages" argument to be 0
219.6 Enqueue a Buffer
219.7 enqMany() mixes enqueuing string and buffer
219.8 Get correlation property in deqOne
219.9 Get correlation property in deqOne by specifying same correlation ID
219.10 Negative - Get correlation property in dequeue by changing correlation ID
219.11 get correlation property in deqMany
219.12 Get priority attribute in deqOne
219.13 Get state attribute in deqOne
219.14 Verify state change on expiration
220. examineOwnedProperties.js
220.1 Only examine "owned" properties on objects
@ -5559,21 +5570,23 @@ oracledb.OUT_FORMAT_OBJECT and resultSet = true
285. aq8.js
285.1 query by messages, payload as RAW Type
285.1.1 enqOne and deqOne by msgId as string in reverse order
285.1.2 query by msgId in enqMany and deqOne in reverse order
285.1.3 enqOne and deqOne by msgId as string in non-sequential order
285.1.4 query by msgId in enqMany and deqOne in non-sequential order
285.1.5 Negative - Invalid msgId in deqOptions
285.1.1 enqOne and deqOne by msgId as string in non-sequential order
285.1.2 query by msgId in enqMany and deqOne in non-sequential order
285.1.3 enqOne and deqOne by msgId as string in random order
285.1.4 query by msgId in enqMany and deqOne in random order
285.1.5 Negative - Invalid msgId in deqOptions
285.1.6 enqOne and deqOne by originalMsgId attribute as string in non-sequential order
285.1.7 query by originalMsgId in enqMany and deqOne in random order
285.2 query by msgId in QUEUE_PAYLOAD_TYPE as JSON
285.2.1 enqOne and deqOne Json val as array type in reverse order
285.2.2 enqOne and deqOne Json val as array type in non-sequential order
285.2.3 enqMany and deqOne Json val as array type in reverse order
285.2.4 enqMany and deqOne Json val as array type in non-sequential order
285.2.1 enqOne and deqOne Json val as array type in non-sequential order
285.2.2 enqOne and deqOne Json val as array type in random order
285.2.3 enqMany and deqOne Json val as array type in non-sequential order
285.2.4 enqMany and deqOne Json val as array type in random order
285.3 query by msgId as Oracle Database Object AQ Messages
285.3.1 msgId in enqOne/deqOne in reverse order
285.3.2 msgId in enqOne/deqOne in non-sequential order
285.3.3 msgId in enqOne/deqOne in reverse order
285.3.4 msgId in enqOne/deqOne in non-sequential order
285.3.1 msgId in enqOne/deqOne in non-sequential order
285.3.2 msgId in enqOne/deqOne in random order
285.3.3 msgId in enqOne/deqOne in non-sequential order
285.3.4 msgId in enqOne/deqOne in random order
286. listIndexes.js
286.1 listIndexes before creating any indexes
@ -5852,3 +5865,16 @@ oracledb.OUT_FORMAT_OBJECT and resultSet = true
300.2.1 fetches the value as number(default)
300.2.2 use fetchTypeHandler to get BigInt value
300.2.3 fetches values greater than Number.MAX_SAFE_INTEGER correctly
301. aq9.js
301.1 Enqueue messages with transformation single user queue
301.2 Enqueue messages with transformation on multiple users
301.3 Enqueue and dequeue messages with transformation on single user queue
301.4 Enqueue and dequeue messages with transformation on multiple user queue
302. aq10.js
302.1 condition attribute in dequeue
302.2 Negative - wrong identifier in condition attribute
303. aq11.js
303.1 enqueue/dequeue with modes

View File

@ -283,3 +283,6 @@ spec:
- test/jsonDualityViews7.js
- test/invalidNumber.js
- test/bigInt.js
- test/aq9.js
- test/aq10.js
- test/aq11.js