Skip to content

Commit b556bf9

Browse files
committed
[+] Add unit tests for assoc arrays
1 parent e2a98d8 commit b556bf9

File tree

1 file changed

+146
-0
lines changed

1 file changed

+146
-0
lines changed

test/assocArrays.js

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
/*
2+
tests-settings.json:
3+
{
4+
"hostname": "localhost",
5+
"user": "test",
6+
"password": "test"
7+
}
8+
*/
9+
10+
var nodeunit = require("nodeunit");
11+
var oracle = require("../");
12+
13+
var settings;
14+
15+
try {
16+
settings = JSON.parse(require('fs').readFileSync('./tests-settings-custom.json', 'utf8'));
17+
} catch (ex) {}
18+
settings = settings || JSON.parse(require('fs').readFileSync('./tests-settings.json', 'utf8'));
19+
20+
function initDb(connection, cb) {
21+
// Create the TEST_PKG for the test (first spec then body).
22+
23+
var spec = '\
24+
CREATE OR REPLACE PACKAGE "TEST_PKG" IS \
25+
TYPE Y_STRINGS_TABLE IS TABLE OF NVARCHAR2(4000) INDEX BY PLS_INTEGER; \
26+
TYPE Y_NUMBERS_TABLE IS TABLE OF NUMBER INDEX BY PLS_INTEGER; \
27+
PROCEDURE sp_get_numbers(i_arr Y_NUMBERS_TABLE, o_out OUT sys_refcursor); \
28+
PROCEDURE sp_get_strings(i_arr Y_STRINGS_TABLE, o_out OUT sys_refcursor); \
29+
END test_pkg;'
30+
31+
var body = '\
32+
CREATE OR REPLACE PACKAGE BODY "TEST_PKG" IS \
33+
PROCEDURE sp_get_numbers(i_arr Y_NUMBERS_TABLE, o_out OUT sys_refcursor) IS \
34+
vals sys.ODCINumberList := sys.ODCINumberList(); \
35+
BEGIN \
36+
FOR i IN i_arr.first..i_arr.last LOOP \
37+
vals.extend(1); \
38+
vals(i) := i_arr(i); \
39+
END LOOP; \
40+
OPEN o_out FOR SELECT * FROM TABLE(vals); \
41+
END; \
42+
PROCEDURE sp_get_strings(i_arr Y_STRINGS_TABLE, o_out OUT sys_refcursor) IS \
43+
vals sys.ODCIVarchar2List := sys.ODCIVarchar2List(); \
44+
BEGIN \
45+
FOR i IN i_arr.first..i_arr.last LOOP \
46+
vals.extend(1); \
47+
vals(i) := i_arr(i); \
48+
END LOOP; \
49+
OPEN o_out FOR SELECT * FROM TABLE(vals); \
50+
END; \
51+
END test_pkg;';
52+
53+
connection.execute(spec, [], function(err) {
54+
if (err) throw err;
55+
56+
connection.execute(body, [], function(err) {
57+
if (err) throw err;
58+
cb();
59+
});
60+
});
61+
}
62+
63+
64+
exports['AssocArrays'] = nodeunit.testCase({
65+
setUp: function(callback) {
66+
var self = this;
67+
oracle.connect(settings, function(err, connection) {
68+
if (err) return callback(err);
69+
self.connection = connection;
70+
initDb(self.connection, callback);
71+
});
72+
},
73+
74+
tearDown: function(callback) {
75+
if (this.connection) {
76+
this.connection.close();
77+
}
78+
callback();
79+
},
80+
81+
"AssocArrays - Select using a numbers array": function(test) {
82+
var out = new oracle.OutParam(oracle.OCCICURSOR);
83+
var arr = [12.453, -98.31, -5, 5, 3.876e123, -3.876e123];
84+
this.connection.execute('Begin TEST_PKG.sp_get_numbers(:1, :2); End;', [arr, out], function(err, results) {
85+
if(err) { console.error(err); return; }
86+
test.equal(results.returnParam.length, arr.length);
87+
88+
// Loop thru all the values we passed and check that we got them back.
89+
// Due to floating point precision (and exponential notation) we are testing
90+
// that they are "close enough".
91+
arr.forEach(function(val, i) {
92+
var res = results.returnParam[i]['COLUMN_VALUE'];
93+
test.ok(Math.abs(res/val - 1) < 0.001, 'Expected: ' + val + ' Got: ' + res);
94+
});
95+
test.done();
96+
});
97+
},
98+
99+
"AssocArrays - Select using too big positive number": function(test) {
100+
var out = new oracle.OutParam(oracle.OCCICURSOR);
101+
var arr = [12.453, Number.MAX_VALUE, -5, 5, 0];
102+
var self = this;
103+
test.throws(function(){
104+
self.connection.execute('Begin TEST_PKG.sp_get_numbers(:1, :2); End;', [arr, out], function(err, results) {});
105+
});
106+
test.done();
107+
},
108+
109+
"AssocArrays - Select using too big negative number": function(test) {
110+
var out = new oracle.OutParam(oracle.OCCICURSOR);
111+
var arr = [12.453, -1*Number.MAX_VALUE, -5, 5, 0];
112+
var self = this;
113+
test.throws(function(){
114+
self.connection.execute('Begin TEST_PKG.sp_get_numbers(:1, :2); End;', [arr, out], function(err, results) {});
115+
});
116+
test.done();
117+
},
118+
119+
"AssocArrays - Select using strings": function(test) {
120+
var out = new oracle.OutParam(oracle.OCCICURSOR);
121+
var arr = ['1234567890', 'ThE ', 'quick ', ' BrOwN ','fox' ,'Ju m p s', '!!!', 'noo ??', '~!@#$%^&*()_+', ''];
122+
this.connection.execute('Begin TEST_PKG.sp_get_strings(:1, :2); End;', [arr, out], function(err, results) {
123+
if(err) { console.error(err); return; }
124+
test.equal(results.returnParam.length, arr.length);
125+
arr.forEach(function(val, i) {
126+
var res = results.returnParam[i]['COLUMN_VALUE'] || '';
127+
test.equal(res, val);
128+
});
129+
test.done();
130+
});
131+
},
132+
133+
"AssocArrays - Select using UTF8 strings": function(test) {
134+
var out = new oracle.OutParam(oracle.OCCICURSOR);
135+
var arr = ['тест', ' тест ', '12тест34', 'AB тест'];
136+
this.connection.execute('Begin TEST_PKG.sp_get_strings(:1, :2); End;', [arr, out], function(err, results) {
137+
if(err) { console.error(err); return; }
138+
test.equal(results.returnParam.length, arr.length);
139+
arr.forEach(function(val, i) {
140+
var res = results.returnParam[i]['COLUMN_VALUE'] || '';
141+
test.equal(res, val);
142+
});
143+
test.done();
144+
});
145+
}
146+
});

0 commit comments

Comments
 (0)