Add tests for Implicit Results

This commit is contained in:
Christopher Jones 2019-05-23 08:04:57 +10:00
parent cf339bbb85
commit cd7ff4edcf
12 changed files with 226 additions and 411 deletions

View File

@ -1545,64 +1545,6 @@ describe('84. fetchClobAsString1.js', function() {
], done);
}); // 84.3.11
it.skip('84.3.12 works with REF CURSOR', function(done) {
var id = insertID++;
var specialStr = '84.3.12';
var contentLength = 100;
var content = random.getRandomString(contentLength, specialStr);
async.series([
function(cb) {
insertIntoClobTable1(id, content, cb);
},
function(cb) {
var ref_proc = "CREATE OR REPLACE PROCEDURE nodb_ref(clob_cursor OUT SYS_REFCURSOR)\n" +
"AS \n" +
"BEGIN \n" +
" OPEN clob_cursor FOR \n" +
" SELECT C from nodb_clob1 WHERE ID = " + id + "; \n" +
"END;";
connection.execute(
ref_proc,
function(err){
should.not.exist(err);
cb();
}
);
},
function(cb) {
var sql = "BEGIN nodb_ref(:c); END;";
var bindVar = {
c: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
};
connection.execute(
sql,
bindVar,
{
outFormat : oracledb.OBJECT,
resultSet : true
},
function(err) {
// NJS-019: ResultSet cannot be returned for non-query statements
should.exist(err);
(err.message).should.startWith("NJS-019:");
cb();
}
);
},
function(cb) {
var ref_proc_drop = "DROP PROCEDURE nodb_ref";
connection.execute(
ref_proc_drop,
function(err){
should.not.exist(err);
cb();
}
);
}
], done);
}); // 84.3.12
it('84.3.13 fetch CLOB with stream', function(done) {
var id = insertID++;
var specialStr = '84.3.13';
@ -2553,64 +2495,6 @@ describe('84. fetchClobAsString1.js', function() {
], done);
}); // 84.5.11
it.skip('84.5.12 works with REF CURSOR', function(done) {
var id = insertID++;
var specialStr = '84.5.12';
var contentLength = 100;
var content = random.getRandomString(contentLength, specialStr);
async.series([
function(cb) {
insertIntoClobTable1(id, content, cb);
},
function(cb) {
var ref_proc = "CREATE OR REPLACE PROCEDURE nodb_ref(clob_cursor OUT SYS_REFCURSOR)\n" +
"AS \n" +
"BEGIN \n" +
" OPEN clob_cursor FOR \n" +
" SELECT C from nodb_clob1 WHERE ID = " + id + "; \n" +
"END;";
connection.execute(
ref_proc,
function(err){
should.not.exist(err);
cb();
}
);
},
function(cb) {
var sql = "BEGIN nodb_ref(:c); END;";
var bindVar = {
c: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
};
connection.execute(
sql,
bindVar,
{
outFormat : oracledb.ARRAY,
resultSet : true
},
function(err) {
// NJS-019: ResultSet cannot be returned for non-query statements
should.exist(err);
(err.message).should.startWith("NJS-019:");
cb();
}
);
},
function(cb) {
var ref_proc_drop = "DROP PROCEDURE nodb_ref";
connection.execute(
ref_proc_drop,
function(err){
should.not.exist(err);
cb();
}
);
}
], done);
}); // 84.5.12
it('84.5.13 fetch CLOB with stream', function(done) {
var id = insertID++;
var specialStr = '84.5.13';

View File

@ -1492,65 +1492,6 @@ describe('85. fetchClobAsString2.js', function() {
], done);
}); // 85.3.13
it.skip('85.3.14 works with REF CURSOR', function(done) {
var id = insertID++;
var specialStr = '85.3.14';
var contentLength = 100;
var content = random.getRandomString(contentLength, specialStr);
async.series([
function(cb) {
insertIntoClobTable1(id, content, cb);
},
function(cb) {
var ref_proc = "CREATE OR REPLACE PROCEDURE nodb_ref(clob_cursor OUT SYS_REFCURSOR)\n" +
"AS \n" +
"BEGIN \n" +
" OPEN clob_cursor FOR \n" +
" SELECT C from nodb_clob1 WHERE ID = " + id + "; \n" +
"END;";
connection.execute(
ref_proc,
function(err){
should.not.exist(err);
cb();
}
);
},
function(cb) {
var sql = "BEGIN nodb_ref(:c); END;";
var bindVar = {
c: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
};
connection.execute(
sql,
bindVar,
{
outFormat : oracledb.OBJECT,
fetchInfo : { C : { type : oracledb.STRING } },
resultSet : true
},
function(err) {
// NJS-019: ResultSet cannot be returned for non-query statements
should.exist(err);
(err.message).should.startWith("NJS-019:");
cb();
}
);
},
function(cb) {
var ref_proc_drop = "DROP PROCEDURE nodb_ref";
connection.execute(
ref_proc_drop,
function(err){
should.not.exist(err);
cb();
}
);
}
], done);
});
}); // 85.3
describe('85.4 fetch CLOB columns by setting fetchInfo option and outFormat = oracledb.ARRAY', function() {
@ -2338,64 +2279,5 @@ describe('85. fetchClobAsString2.js', function() {
], done);
}); // 85.5.13
it.skip('85.5.14 works with REF CURSOR', function(done) {
var id = insertID++;
var specialStr = '85.5.14';
var contentLength = 100;
var content = random.getRandomString(contentLength, specialStr);
async.series([
function(cb) {
insertIntoClobTable1(id, content, cb);
},
function(cb) {
var ref_proc = "CREATE OR REPLACE PROCEDURE nodb_ref(clob_cursor OUT SYS_REFCURSOR)\n" +
"AS \n" +
"BEGIN \n" +
" OPEN clob_cursor FOR \n" +
" SELECT C from nodb_clob1 WHERE ID = " + id + "; \n" +
"END;";
connection.execute(
ref_proc,
function(err){
should.not.exist(err);
cb();
}
);
},
function(cb) {
var sql = "BEGIN nodb_ref(:c); END;";
var bindVar = {
c: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
};
connection.execute(
sql,
bindVar,
{
outFormat : oracledb.ARRAY,
fetchInfo : { C : { type : oracledb.STRING } },
resultSet : true
},
function(err) {
// NJS-019: ResultSet cannot be returned for non-query statements
should.exist(err);
(err.message).should.startWith("NJS-019:");
cb();
}
);
},
function(cb) {
var ref_proc_drop = "DROP PROCEDURE nodb_ref";
connection.execute(
ref_proc_drop,
function(err){
should.not.exist(err);
cb();
}
);
}
], done);
});
}); // 85.5
});

195
test/implicitResults.js Normal file
View File

@ -0,0 +1,195 @@
/* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. */
/******************************************************************************
*
* You may not use the identified files except in compliance with the Apache
* License, Version 2.0 (the "License.")
*
* You may obtain a copy of the License at
* http://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
* 192. implicitResults.js
*
* DESCRIPTION
* Test the Implicit Results feauture.
*
*****************************************************************************/
'use strict';
const oracledb = require('oracledb');
const should = require('should');
const dbconfig = require('./dbconfig.js');
const testsUtil = require('./testsUtil.js');
describe('192. implicitResults.js', () => {
const tab1 = 'nodb_tab_impres1';
const tab2 = 'nodb_tab_impres2';
const queryImpres = `
declare
c1 sys_refcursor;
c2 sys_refcursor;
begin
open c1 for
select * from ${tab1};
dbms_sql.return_result(c1);
open c2 for
select * from ${tab2};
dbms_sql.return_result(c2);
end;`;
before(async () => {
try {
const conn = await oracledb.getConnection(dbconfig);
let sql =
`create table ${tab1} (
id number(9) not null,
value varchar2(100) not null
)`;
let plsql = testsUtil.sqlCreateTable(tab1, sql);
await conn.execute(plsql);
let sqlInsertValues =
`DECLARE \n` +
` x NUMBER := 0; \n` +
` n VARCHAR2(100); \n` +
`BEGIN \n` +
` FOR i IN 1..23 LOOP \n` +
` x := x + 1; \n` +
` n := 'Staff ' || x; \n` +
` INSERT INTO ${tab1} VALUES (x, n); \n` +
` END LOOP; \n` +
`END; `;
await conn.execute(sqlInsertValues);
sql = `create table ${tab2} (
id number(9) not null,
tsval timestamp not null
)`;
plsql = testsUtil.sqlCreateTable(tab2, sql);
await conn.execute(plsql);
sqlInsertValues =
`DECLARE \n` +
` x NUMBER := 0; \n` +
` n TIMESTAMP; \n` +
`BEGIN \n` +
` FOR i IN 1..5 LOOP \n` +
` x := x + 1; \n` +
` n := systimestamp + (i / 10); \n` +
` INSERT INTO ${tab2} VALUES (x, n); \n` +
` END LOOP; \n` +
`END; `;
await conn.execute(sqlInsertValues);
await conn.commit();
await conn.close();
} catch(err) {
should.not.exist(err);
}
}); // before()
after(async () => {
try {
const conn = await oracledb.getConnection(dbconfig);
let sql = `DROP TABLE ${tab1} PURGE`;
await conn.execute(sql);
sql = `DROP TABLE ${tab2} PURGE`;
await conn.execute(sql);
await conn.close();
} catch(err) {
should.not.exist(err);
}
}); // after()
it('192.1 implicit results with rows fetched', async () => {
try {
const conn = await oracledb.getConnection(dbconfig);
const results = await conn.execute(queryImpres);
let rows = results.implicitResults[0];
for ( let j = 0; j < rows.length; j++) {
should.strictEqual(rows[j][1], `Staff ${j+1}`);
}
rows = results.implicitResults[1];
const tab2Len = 5;
should.strictEqual(rows.length, tab2Len);
await conn.close();
} catch(err) {
should.not.exist(err);
}
}); // 192.1
it('192.2 implicit Results with Result Sets', async () => {
try {
const conn = await oracledb.getConnection(dbconfig);
const results = await conn.execute(queryImpres, [], { resultSet: true });
// Assert the content of table 1
let rs = await results.implicitResults[0].getRows(100);
for ( let j = 0; j < rs.length; j++) {
should.strictEqual(rs[j][1], `Staff ${j+1}`);
}
// Assert the content of table 2
rs = await results.implicitResults[1];
let row, len = 0;
while ( (row = await rs.getRow()) ) {
(row[1]).should.be.a.Date();
len++;
}
const tab2Len = 5;
should.strictEqual(len, tab2Len);
await rs.close();
await conn.close();
} catch(err) {
should.not.exist(err);
}
}); // 192.2
it('192.3 multiple options, outFormat is OBJECT', async () => {
try {
const conn = await oracledb.getConnection(dbconfig);
let opts = { resultSet: true, outFormat: oracledb.OBJECT };
const results = await conn.execute( queryImpres, [], opts );
let rs = await results.implicitResults[0].getRows(100);
for ( let j = 0; j < rs.length; j++) {
should.strictEqual(rs[j].VALUE, `Staff ${j+1}`);
}
rs = await results.implicitResults[1];
let row, len = 0;
while ( (row = await rs.getRow()) ) {
(row.TSVAL).should.be.a.Date();
len++;
}
const tab2Len = 5;
should.strictEqual(len, tab2Len);
await rs.close();
await conn.close();
} catch(err) {
should.not.exist(err);
}
}); // 192.3
});

View File

@ -283,11 +283,6 @@ Overview of node-oracledb functional tests
12.7 Testing maxRows
12.7.1 maxRows option is ignored when resultSet option is true
12.7.2 maxRows option is ignored with REF Cursor
12.8 Testing errInvalidResultSet
12.8.1 Negative: UPDATE BIND out with oracledb.CURSOR - bind by name
12.8.2 Negative: UPDATE BIND out with oracledb.CURSOR - bind by position
12.8.3 Negative: INSERT BIND out with oracledb.CURSOR - bind by name
12.8.4 Negative: INSERT BIND out with oracledb.CURSOR - bind by position
13. stream1.js
13.1 Testing QueryStream
@ -324,13 +319,10 @@ Overview of node-oracledb functional tests
14.5 explicitly setting resultSet option to be false takes no effect
14.6 maxRows option is ignored as expect
14.7 Negative - queryStream() has no parameters
14.8 Negative - give invalid SQL as first parameter
14.9 Negatvie - give non-query SQL
14.10 metadata event - single column
14.11 metadata event - multiple columns
14.12 metadata event - all column names occurring
14.13 metadata event - no return rows
14.14 metadata event - negative: non-query SQL
14.15 metadata event - case sensitive columns
14.16 metadata event - large number of columns
14.17 metadata event - single character column
@ -853,8 +845,6 @@ Overview of node-oracledb functional tests
55.7 getting multiple resultSets
55.7.1 can access multiple resultSet on one connection
55.7.2 can access multiple REF Cursor
55.8 Negative - resultSet is only for query statement
55.8.1 resultSet cannot be returned for non-query statements
55.9 test querying a PL/SQL function
55.9.1
55.10 calls getRows() once and then close RS before getting more rows
@ -1788,7 +1778,6 @@ Overview of node-oracledb functional tests
84.3.9 fetch multiple CLOB rows as String
84.3.10 fetch the same CLOB column multiple times
84.3.11 works with update statement
84.3.12 works with REF CURSOR
84.3.13 fetch CLOB with stream
84.3.14 works with setting oracledb.maxRows < actual number of rows in the table
84.3.15 works with setting oracledb.maxRows > actual number of rows in the table
@ -1822,7 +1811,6 @@ Overview of node-oracledb functional tests
84.5.9 fetch multiple CLOB rows as String
84.5.10 fetch the same CLOB column multiple times
84.5.11 works with update statement
84.5.12 works with REF CURSOR
84.5.13 fetch CLOB with stream
84.5.14 works with setting oracledb.maxRows < actual number of rows in the table
84.5.15 works with setting oracledb.maxRows > actual number of rows in the table
@ -1877,7 +1865,6 @@ Overview of node-oracledb functional tests
85.3.11 works with update statement
85.3.12 works with setting oracledb.maxRows < actual number of rows in the table
85.3.13 works with setting oracledb.maxRows > actual number of rows in the table
85.3.14 works with REF CURSOR
85.4 fetch CLOB columns by setting fetchInfo option and outFormat = oracledb.ARRAY
85.4.1 works with NULL value
85.4.2 works with empty String
@ -1907,7 +1894,6 @@ Overview of node-oracledb functional tests
85.5.11 works with update statement
85.5.12 works with setting oracledb.maxRows < actual number of rows in the table
85.5.13 works with setting oracledb.maxRows > actual number of rows in the table
85.5.14 works with REF CURSOR
86. fetchClobAsString3.js
86.1 fetch multiple CLOBs
@ -4481,4 +4467,9 @@ Overview of node-oracledb functional tests
191. currentSchema.js
191.1 the value will be empty until it has been explicitly set
191.2 SQL alternative
191.3 Negative - can not set inexistent schema
191.3 Negative - can not set inexistent schema
192. implicitResults.js
192.1 implicit results with rows fetched
192.2 implicit Results with Result Sets
192.3 multiple options, outFormat is OBJECT

View File

@ -216,4 +216,6 @@ test/plsqlBindList.js
test/fetchRawAsString.js
test/writableProperties2.js
test/fetchBinaryTypesAsString.js
test/currentSchema.js
test/currentSchema.js
test/implicitResults.js

View File

@ -140,7 +140,7 @@ describe("73. poolPing.js", function() {
pool.poolPingInterval = newInterval;
} catch(err) {
should.exist(err);
(err.message).should.equal("Cannot assign to read only property 'poolPingInterval' of object '#<Pool>'")
(err.message).should.equal("Cannot assign to read only property 'poolPingInterval' of object '#<Pool>'");
}
cb();

View File

@ -60,7 +60,7 @@ random.getRandomInt = function(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min;
}
};
random.getIntArray = function(N) {
var arr = Array.apply(null, Array(N));

View File

@ -1388,75 +1388,6 @@ describe('12. resultSet1.js', function() {
});
}
});
});
describe.skip('12.8 Testing errInvalidResultSet', function() {
it('12.8.1 Negative: UPDATE BIND out with oracledb.CURSOR - bind by name', function(done) {
var sql = "update nodb_rs1_emp set employees_name = 'abc' where employees_id = 1 RETURNING employees_name INTO :name";
connection.execute(
sql,
{ name: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } },
{ resultSet: true},
function(err) {
should.strictEqual(
err.message,
'NJS-019: ResultSet cannot be returned for non-query statements'
);
done();
}
);
});
it('12.8.2 Negative: UPDATE BIND out with oracledb.CURSOR - bind by position', function(done) {
var sql = "update nodb_rs1_emp set employees_name = 'abc' where employees_id = 1 RETURNING employees_name INTO :name";
connection.execute(
sql,
[ { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } ],
{ resultSet: true},
function(err) {
should.strictEqual(
err.message,
'NJS-019: ResultSet cannot be returned for non-query statements'
);
done();
}
);
});
it('12.8.3 Negative: INSERT BIND out with oracledb.CURSOR - bind by name', function(done) {
var sql = "insert into nodb_rs1_emp (:id, :name) RETURNING employees_name INTO :out";
connection.execute(
sql,
{
id: { val:1000, type: oracledb.CURSOR, dir: oracledb.BIND_OUT },
name: { val:'hello', type: oracledb.STRING, dir: oracledb.BIND_IN },
out: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
},
{ resultSet: true},
function(err) {
should.strictEqual(
err.message,
'NJS-019: ResultSet cannot be returned for non-query statements'
);
done();
}
);
});
it('12.8.4 Negative: INSERT BIND out with oracledb.CURSOR - bind by position', function(done) {
var sql = "insert into nodb_rs1_emp (:id, :name) RETURNING employees_name INTO :out";
connection.execute(
sql,
[ 1001, 'hello', { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } ],
{ resultSet: true},
function(err) {
should.strictEqual(
err.message,
'NJS-019: ResultSet cannot be returned for non-query statements'
);
done();
}
);
});
});
}); // 12.7
});

View File

@ -600,32 +600,6 @@ describe('55. resultSet2.js', function() {
});
});
describe.skip('55.8 Negative - resultSet is only for query statement', function() {
before(function(done){
setUp(connection, tableName, done);
});
after(function(done) {
clearUp(connection, tableName, done);
});
it('55.8.1 resultSet cannot be returned for non-query statements', function(done) {
connection.should.be.ok();
connection.execute(
"UPDATE nodb_rs2_emp SET employees_name = 'Alan' WHERE employees_id = 100",
[],
{ resultSet: true },
function(err) {
should.exist(err);
// console.log(err);
err.message.should.startWith('NJS-019:');
done();
}
);
});
});
describe('55.9 test querying a PL/SQL function', function() {
before(function(done){
setUp(connection, tableName, done);

View File

@ -230,41 +230,6 @@ describe('14. stream2.js', function() {
done();
});
it.skip('14.8 Negative - give invalid SQL as first parameter', function(done) {
var stream = connection.queryStream('foobar');
stream.on('error', function(err) {
should.exist(err);
should.strictEqual(
err.message,
"NJS-019: ResultSet cannot be returned for non-query statements"
);
done();
});
stream.on('data', function(data) {
should.not.exist(data);
});
});
it.skip('14.9 Negatvie - give non-query SQL', function(done) {
var sql = "INSERT INTO nodb_stream2 VALUES (300, 'staff 300', EMPTY_CLOB())";
var stream = connection.queryStream(sql);
stream.on('error', function(err) {
should.exist(err);
should.strictEqual(
err.message,
"NJS-019: ResultSet cannot be returned for non-query statements"
);
done();
});
stream.on('data', function(data) {
should.not.exist(data);
});
});
it('14.10 metadata event - single column', function(done) {
var sql = 'SELECT employee_name FROM nodb_stream2 WHERE employee_id = :id';
var stream = connection.queryStream(sql, { id: 40 });
@ -370,30 +335,6 @@ describe('14. stream2.js', function() {
stream.on('end', done);
});
it.skip('14.14 metadata event - negative: non-query SQL', function(done) {
var sql = "INSERT INTO nodb_stream2 VALUES (300, 'staff 300', EMPTY_CLOB())";
var stream = connection.queryStream(sql);
var metaDataRead = false;
stream.on('metadata', function() {
metaDataRead = true;
});
stream.on('error', function(err) {
should.exist(err);
should.strictEqual(
err.message,
"NJS-019: ResultSet cannot be returned for non-query statements"
);
should.strictEqual(metaDataRead, false);
done();
});
stream.on('data', function(data) {
should.not.exist(data);
});
});
it('14.15 metadata event - case sensitive columns', function(done) {
async.series([
function(cb) {

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. */
/* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. */
/******************************************************************************
*
@ -47,7 +47,7 @@ testsUtil.assertThrowsAsync = async function(fn, RegExp) {
}
};
testsUtil.createTable = async function(tableName, sql) {
testsUtil.sqlCreateTable = function(tableName, sql) {
let sqlCreateTab =
`BEGIN \n` +
` DECLARE \n` +
@ -61,10 +61,25 @@ testsUtil.createTable = async function(tableName, sql) {
` END; \n` +
` EXECUTE IMMEDIATE (' ${sql} '); \n` +
`END; `;
return sqlCreateTab;
};
testsUtil.createTable = async function(tableName, sql) {
let plsql = testsUtil.sqlCreateTable(tableName, sql);
try {
const conn = await oracledb.getConnection(dbconfig);
await conn.execute(sqlCreateTab);
await conn.execute(plsql);
await conn.close();
} catch(err) {
console.log('Error in creating table:\n', err);
}
};
testsUtil.dropTable = async function(tableName) {
let sql = `DROP TABLE ${tableName} PURGE`;
try {
const conn = await oracledb.getConnection(dbconfig);
await conn.execute(sql);
await conn.close();
} catch(err) {
console.log('Error in creating table:\n', err);

View File

@ -76,7 +76,7 @@ describe('189. writableProperties2.js', function() {
should.not.exist(err);
}
}
})
});
it('189.1 Allows overwriting of public methods on SodaDatabase instance', async function() {
try {