More test cases to increase the test coverage
This commit is contained in:
parent
343d0ff1be
commit
f6c8f6c7e7
149
test/aq1.js
149
test/aq1.js
|
@ -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
|
||||
});
|
||||
|
|
|
@ -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
|
||||
});
|
|
@ -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
|
||||
});
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2019, 2023, Oracle and/or its affiliates. */
|
||||
/* Copyright (c) 2024, Oracle and/or its affiliates. */
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
|
|
229
test/aq3.js
229
test/aq3.js
|
@ -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
|
||||
});
|
||||
|
|
|
@ -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
|
||||
|
||||
});
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2023, 2024, Oracle and/or its affiliates. */
|
||||
/* Copyright (c) 2024, Oracle and/or its affiliates. */
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2023, Oracle and/or its affiliates. */
|
||||
/* Copyright (c) 2024, Oracle and/or its affiliates. */
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
|
|
|
@ -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() {
|
||||
|
|
83
test/aq8.js
83
test/aq8.js
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
});
|
|
@ -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
|
||||
|
|
|
@ -283,3 +283,6 @@ spec:
|
|||
- test/jsonDualityViews7.js
|
||||
- test/invalidNumber.js
|
||||
- test/bigInt.js
|
||||
- test/aq9.js
|
||||
- test/aq10.js
|
||||
- test/aq11.js
|
||||
|
|
Loading…
Reference in New Issue