未验证 提交 4443a76b 编写于 作者: X xiaolei li 提交者: GitHub

[TD-12700]<enhence>update node conector test cases to follow selfdecr… (#9714)

* [TD-12700]<enhence>update node conector test cases to follow selfdecribe standard

* [TD-12700]<enhence>:nodejs test cases update

* [TD-12700]<enhence>(connector):modify nodejs test cases to follow self describe standard
上级 60bbbac7
/*
* For a detailed explanation regarding each configuration property, visit:
* https://jestjs.io/docs/configuration
*/
module.exports = {
// All imported modules in your tests should be mocked automatically
// automock: false,
// Stop running tests after `n` failures
// bail: 0,
// The directory where Jest should store its cached dependency information
// cacheDirectory: "/tmp/jest_rt",
// Automatically clear mock calls, instances and results before every test
// clearMocks: true,
// Indicates whether the coverage information should be collected while executing the test
// collectCoverage: true,
// An array of glob patterns indicating a set of files for which coverage information should be collected
// collectCoverageFrom: undefined,
// The directory where Jest should output its coverage files
// coverageDirectory: "coverage",
// An array of regexp pattern strings used to skip coverage collection
// coveragePathIgnorePatterns: [
// "/node_modules/"
// ],
// Indicates which provider should be used to instrument code for coverage
// coverageProvider: "v8",
// A list of reporter names that Jest uses when writing coverage reports
// coverageReporters: [
// "json",
// "text",
// "lcov",
// "clover"
// ],
// An object that configures minimum threshold enforcement for coverage results
// coverageThreshold: undefined,
// A path to a custom dependency extractor
// dependencyExtractor: undefined,
// Make calling deprecated APIs throw helpful error messages
// errorOnDeprecated: false,
// Force coverage collection from ignored files using an array of glob patterns
// forceCoverageMatch: [],
// A path to a module which exports an async function that is triggered once before all test suites
// globalSetup: undefined,
// A path to a module which exports an async function that is triggered once after all test suites
// globalTeardown: undefined,
// A set of global variables that need to be available in all test environments
// globals: {},
// The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers.
// maxWorkers: "50%",
// An array of directory names to be searched recursively up from the requiring module's location
// moduleDirectories: [
// "node_modules"
// ],
// An array of file extensions your modules use
// moduleFileExtensions: [
// "js",
// "jsx",
// "ts",
// "tsx",
// "json",
// "node"
// ],
// A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module
// moduleNameMapper: {},
// An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
// modulePathIgnorePatterns: [],
// Activates notifications for test results
// notify: false,
// An enum that specifies notification mode. Requires { notify: true }
// notifyMode: "failure-change",
// A preset that is used as a base for Jest's configuration
// preset: undefined,
// Run tests from one or more projects
// projects: undefined,
// Use this configuration option to add custom reporters to Jest
// reporters: undefined,
// Automatically reset mock state before every test
// resetMocks: false,
// Reset the module registry before running each individual test
// resetModules: false,
// A path to a custom resolver
// resolver: undefined,
// Automatically restore mock state and implementation before every test
// restoreMocks: false,
// The root directory that Jest should scan for tests and modules within
// rootDir: undefined,
// A list of paths to directories that Jest should use to search for files in
// roots: [
// "<rootDir>"
// ],
// Allows you to use a custom runner instead of Jest's default test runner
// runner: "jest-runner",
// The paths to modules that run some code to configure or set up the testing environment before each test
// setupFiles: [],
// A list of paths to modules that run some code to configure or set up the testing framework before each test
// setupFilesAfterEnv: [],
// The number of seconds after which a test is considered as slow and reported as such in the results.
// slowTestThreshold: 5,
// A list of paths to snapshot serializer modules Jest should use for snapshot testing
// snapshotSerializers: [],
// The test environment that will be used for testing
// testEnvironment: "jest-environment-node",
// Options that will be passed to the testEnvironment
// testEnvironmentOptions: {},
// Adds a location field to test results
// testLocationInResults: false,
// The glob patterns Jest uses to detect test files
// testMatch: [
// "**/__tests__/**/*.[jt]s?(x)",
// "**/?(*.)+(spec|test).[tj]s?(x)"
// ],
testMatch: [
"**/test/cases/*.[jt]s?(x)"
],
// An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
// testPathIgnorePatterns: [
// "/node_modules/"
// ],
// The regexp pattern or array of patterns that Jest uses to detect test files
// testRegex: [],
// This option allows the use of a custom results processor
// testResultsProcessor: undefined,
// This option allows use of a custom test runner
// testRunner: "jest-circus/runner",
// This option sets the URL for the jsdom environment. It is reflected in properties such as location.href
// testURL: "http://localhost",
// Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"
// timers: "real",
// A map from regular expressions to paths to transformers
// transform: undefined,
// An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
// transformIgnorePatterns: [
// "/node_modules/",
// "\\.pnp\\.[^\\/]+$"
// ],
// An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
// unmockedModulePathPatterns: undefined,
// Indicates whether each individual test should be reported during the run
// verbose: undefined,
// An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
// watchPathIgnorePatterns: [],
// Whether to use watchman for file crawling
// watchman: true,
};
...@@ -46,7 +46,6 @@ TaosQuery.prototype.execute = async function execute() { ...@@ -46,7 +46,6 @@ TaosQuery.prototype.execute = async function execute() {
reject(err); reject(err);
} }
resolve(result) resolve(result)
}); });
return executionPromise; return executionPromise;
} }
......
...@@ -7,7 +7,8 @@ ...@@ -7,7 +7,8 @@
"test": "test" "test": "test"
}, },
"scripts": { "scripts": {
"test": "node test/test.js && node test/testMicroseconds.js && node test/testNanoseconds.js && node test/testUnsignedType.js && node test/testSchemalessInsert.js && node test/testJsonTag.js" "test": "jest",
"catalog": "jest --json"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
...@@ -31,5 +32,8 @@ ...@@ -31,5 +32,8 @@
"ref-array-napi": "^1.2.1", "ref-array-napi": "^1.2.1",
"ref-napi": "^1.5.2", "ref-napi": "^1.5.2",
"ref-struct-napi": "^1.1.1" "ref-struct-napi": "^1.1.1"
},
"devDependencies": {
"jest": "^27.4.7"
} }
} }
// const { testMatch } = require('../../jest.config');
const taos = require('../../tdengine');
const { getFeildsFromDll, buildInsertSql, getFieldArr, getResData } = require('../utils/utilTools')
const author = 'xiaolei';
const result = 'passed';
const fileName = __filename.slice(__dirname.length + 1);
// This is a taos connection
let conn;
// This is a Cursor
let c1;
function executeUpdate(sql) {
console.log(sql);
c1.execute(sql);
}
function executeQuery(sql) {
c1.execute(sql, { quiet: true })
var data = c1.fetchall();
let fields = c1.fields;
let resArr = [];
data.forEach(row => {
row.forEach(data => {
if (data instanceof Date) {
// console.log("date obejct:"+data.valueOf());
resArr.push(data.taosTimestamp());
} else {
// console.log("not date:"+data);
resArr.push(data);
}
// console.log(data instanceof Date)
})
})
return { resData: resArr, resFeilds: fields };
}
beforeAll(() => {
conn = taos.connect({ host: "127.0.0.1", user: "root", password: "taosdata", config: "/etc/taos", port: 10 });
c1 = conn.cursor();
executeUpdate("create database if not exists node_test_db keep 3650;");
executeUpdate("use node_test_db;");
});
// Clears the database and adds some testing data.
// Jest will wait for this promise to resolve before running tests.
afterAll(() => {
executeUpdate("drop database if exists node_test_db;");
conn.close();
});
describe("test unsigned type", () => {
test(`name:test unsinged tinnyint ntable;` +
`author:${author};` +
`desc:create,insert,query with unsigned tinnyint;` +
`filename:${fileName};` +
`result:${result}`, () => {
let createSql = "create table if not exists utinnytest(ts timestamp,ut tinyint unsigned,i4 int,rownum nchar(20));";
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let expectResData = [1641827743305, 254, 124, 'row1'
, 1641827743306, 0, -123, 'row2'
, 1641827743307, 54, 0, 'row3'];
let insertSql = buildInsertSql('utinnytest', '', expectResData, [], 4);
executeUpdate(insertSql);
let result = executeQuery("select * from utinnytest;");
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
});
test(`name:test unsinged smallint ntable;` +
`author:${author};` +
`desc:create,insert,query with unsigned smallint;` +
`filename:${fileName};` +
`result:${result}`, () => {
let createSql = "create table if not exists usmalltest(ts timestamp,ut smallint unsigned,i4 int,rownum nchar(20));";
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let expectResData = [1641827743305, 65534, 124, 'row1', 1641827743306, 0, -123, 'row2', 1641827743307, 79, 0, 'row3'];
let insertSql = buildInsertSql('usmalltest', '', expectResData, [], 4);
executeUpdate(insertSql);
let result = executeQuery("select * from usmalltest;");
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
});
test(`name:test unsinged int ntable;` +
`author:${author};` +
`desc:create,insert,query with unsigned int;` +
`filename:${fileName};` +
`result:${result}`, () => {
let createSql = "create table if not exists uinttest(ts timestamp,ui int unsigned,i4 int,rownum nchar(20));";
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let expectResData = [1641827743305, 4294967294, 2147483647, 'row1', 1641827743306, 0, -2147483647, 'row2', 1641827743307, 105, 0, 'row3'];
let insertSql = buildInsertSql('uinttest', '', expectResData, [], 4);
executeUpdate(insertSql);
let result = executeQuery("select * from uinttest;");
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
});
test(`name:test unsinged bigint ntable;` +
`author:${author};` +
`desc:create,insert,query with unsigned bigint;` +
`filename:${fileName};` +
`result:${result}`, () => {
let createSql = "create table if not exists ubigtest(ts timestamp,ui bigint unsigned,i8 bigint,rownum nchar(20));";
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let expectResData = [1641827743305, 18446744073709551614n, 9223372036854775807n, 'row1',
1641827743306, 0n, -9223372036854775807n, 'row2',
1641827743307, 130n, 0n, 'row3'];
let insertSql = buildInsertSql('ubigtest', '', expectResData, [], 4);
executeUpdate(insertSql);
let result = executeQuery("select * from ubigtest;");
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
});
test(`name:test unsinged type ntable;` +
`author:${author};` +
`desc:create,insert,query with mutiple unsinged type;` +
`filename:${fileName};` +
`result:${result}`, () => {
let createSql = "create table if not exists unsigntest(ts timestamp,ut tinyint unsigned,us smallint unsigned,ui int unsigned,ub bigint unsigned,bi bigint);";
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let expectResData = [1641827743305, 254, 65534, 4294967294, 18446744073709551614n, 9223372036854775807n,
1641827743306, 0, 0, 0, 0n, -9223372036854775807n];
let insertSql = buildInsertSql('unsigntest', '', expectResData, [], 6);
executeUpdate(insertSql);
let result = executeQuery("select * from unsigntest;");
// console.log(`result.data:${result.resData}`);
// console.log(`result.feilds:${result.resFeilds}`);
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
});
test(`name:test unsinged type stable max value;` +
`author:${author};` +
`desc:this is a description;` +
`filename:${fileName};` +
`result:${result}`, () => {
let createSql = "create table if not exists max_unsigned_tag_test" +
"(ts timestamp" +
",ut tinyint unsigned" +
",us smallint unsigned" +
",ui int unsigned" +
",ub bigint unsigned" +
",bi bigint)" +
"tags(" +
"ut1 tinyint unsigned" +
",us2 smallint unsigned" +
",ui4 int unsigned" +
",ubi8 bigint unsigned" +
",desc_blob nchar(200)" +
");";
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let colData = [1641827743305, 254, 65534, 4294967294, 18446744073709551614n, 9223372036854775807n,
1641827743306, 0, 0, 0, 0n, -9223372036854775807n,
1641827743307, 201, 44, 2, 8n, 1531n];
let tagData = [254, 65534, 4294967294, 18446744073709551614n, 'max value of unsinged type tag']
let insertSql = buildInsertSql('max_unsigned_tag_test_sub1', 'max_unsigned_tag_test', colData, tagData, 6);
let expectResData = getResData(colData, tagData, 6);
executeUpdate(insertSql);
let result = executeQuery("select * from max_unsigned_tag_test;");
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
});
test(`name:test unsinged type stable minimal value;` +
`author:${author};` +
`desc:this is a description;` +
`filename:${fileName};` +
`result:${result}`, () => {
let createSql = "create table if not exists min_unsigned_tag_test" +
"(ts timestamp" +
",ut tinyint unsigned" +
",us smallint unsigned" +
",ui int unsigned" +
",ub bigint unsigned" +
",bi bigint)" +
"tags(" +
"ut1 tinyint unsigned" +
",us2 smallint unsigned" +
",ui4 int unsigned" +
",ubi8 bigint unsigned" +
",desc_blob nchar(200)" +
");";
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let colData = [1641827743305, 254, 65534, 4294967294, 18446744073709551614n, 9223372036854775807n,
1641827743306, 0, 0, 0, 0n, -9223372036854775807n,
1641827743307, 201, 44, 2, 8n, 1531n];
let tagData = [0, 0, 0, 0n, 'minimal value of unsinged type tag']
let insertSql = buildInsertSql('min_unsigned_tag_test_sub1', 'min_unsigned_tag_test', colData, tagData, 6);
let expectResData = getResData(colData, tagData, 6);
executeUpdate(insertSql);
let result = executeQuery("select * from min_unsigned_tag_test;");
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
console.log("expectResData.length:" + expectResData.length + " actualResData.length:" + actualResData.length);
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
});
test(`name:test unsinged type stable mixed value;` +
`author:${author};` +
`desc:this is a description;` +
`filename:${fileName};` +
`result:${result}`, () => {
let createSql = "create table if not exists mix_unsigned_tag_test" +
"(ts timestamp" +
",ut tinyint unsigned" +
",us smallint unsigned" +
",ui int unsigned" +
",ub bigint unsigned" +
",bi bigint)" +
"tags(" +
"ut1 tinyint unsigned" +
",us2 smallint unsigned" +
",ui4 int unsigned" +
",ubi8 bigint unsigned" +
",desc_blob nchar(200)" +
");";
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let colData = [1641827743305, 254, 65534, 4294967294, 18446744073709551614n, 9223372036854775807n,
1641827743306, 0, 0, 0, 0n, -9223372036854775807n,
1641827743307, 201, 44, 2, 8n, 1531n];
let tagData = [1, 20, 300, 4000n, 'mixed value of unsinged type tag']
let insertSql = buildInsertSql('mix_unsigned_tag_test_sub1', 'mix_unsigned_tag_test', colData, tagData, 6);
let expectResData = getResData(colData, tagData, 6);
executeUpdate(insertSql);
let result = executeQuery("select * from mix_unsigned_tag_test;");
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
});
})
describe("test cn character", () => {
test(`name:test cn ntable;` +
`author:${author};` +
`desc:create,insert,query with cn characters;` +
`filename:${fileName};` +
`result:${result}`, () => {
createSql = "create table if not exists nchartest(ts timestamp,value int,text binary(200),detail nchar(200));"
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let expectResData = [1641827743305, 1, 'taosdata', 'tdengine'
, 1641827743306, 2, 'tasdata', '涛思数据'
, 1641827743307, 3, '涛思数据', 'tdengine'
, 1641827743308, 4, '涛思数据taosdata', 'tdengine'
, 1641827743309, 5, '涛思数据taosdata', 'tdengine涛思数据'];
let insertSql = buildInsertSql('nchartest', '', expectResData, [], 4);
executeUpdate(insertSql);
let result = executeQuery("select * from nchartest;");
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
})
test(`name:test cn stable;` +
`author:${author};` +
`desc:create,insert,query with cn characters;` +
`filename:${fileName};` +
`result:${result}`, () => {
createSql = "create table if not exists nchartest_s(ts timestamp,value int,text binary(200),detail nchar(200))tags(tag_bi binary(50),tag_blob nchar(50));"
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let colData = [1641827743305, 1, 'taosdata', 'tdengine'
, 1641827743306, 2, 'tasdata', '涛思数据'
, 1641827743307, 3, '涛思数据', 'tdengine'
, 1641827743308, 4, '涛思数据taosdata', 'tdengine'
, 1641827743309, 5, '涛思数据taosdata', 'tdengine涛思数据'];
let tagData = ['tags涛思', '数据tags'];
let insertSql = buildInsertSql('sb_1', 'nchartest_s', colData, tagData, 4);
let expectResData = getResData(colData, tagData, 4);
executeUpdate(insertSql);
let result = executeQuery("select * from nchartest_s;");
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
})
})
describe("test schemaless", () => {
test(`name:sml line protocal using string;` +
`author:${author};` +
`desc:using line protocal to schemaless insert with a string;` +
`filename:${fileName};` +
`result:${result}`, () => {
let stablename = 'line_protocal_string';
createSql = `create table if not exists ${stablename}(ts timestamp,c1 bigint,c3 nchar(6),c2 bool,c4 double)`
+ `tags(t1 nchar(4),t2 nchar(4),t3 nchar(4));`
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let colData = [1626006833639, 3n, 'passit', false, 4.000000000];
let tagData = ['3i64', '4f64', '\"t3\"'];
let expectResData = getResData(colData, tagData, 5);
let lineStr = stablename + ",t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639";
c1.schemalessInsert(lineStr, taos.SCHEMALESS_PROTOCOL.TSDB_SML_LINE_PROTOCOL, taos.SCHEMALESS_PRECISION.TSDB_SML_TIMESTAMP_MILLI_SECONDS);
let result = executeQuery(`select * from ${stablename};`);
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
})
test(`name:sml line protocal using Array;` +
`author:${author};` +
`desc:using line protocal to schemaless insert with an Array;` +
`filename:${fileName};` +
`result:${result}`, () => {
let stablename = 'line_protocol_arr';
createSql = `create table if not exists ${stablename}(ts timestamp,c1 bigint,c3 nchar(10),c2 bool,c4 double,c5 double)`
+ `tags(t1 nchar(4),t2 nchar(4),t3 nchar(4),t4 nchar(4));`
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let colData1 = [1626006833641, 3n, 'passitagin', true, 5, 5]
let colData2 = [1626006833639, 3n, 'passit', false, 4, null];
let tagData1 = ['4i64', '5f64', '\"t4\"', '5f64'];
let tagData2 = ['3i64', '4f64', '\"t3\"', null];
let expectResDataTable1 = getResData(colData1, tagData1, 6);
let expectResDataTable2 = getResData(colData2, tagData2, 6);
let expectResData = expectResDataTable1.concat(expectResDataTable2);
let lineStr = [stablename + ",t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000",
stablename + ",t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64 1626006833641000000"
];
c1.schemalessInsert(lineStr, taos.SCHEMALESS_PROTOCOL.TSDB_SML_LINE_PROTOCOL, taos.SCHEMALESS_PRECISION.TSDB_SML_TIMESTAMP_NANO_SECONDS);
let result = executeQuery(`select * from ${stablename};`);
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
})
test(`name:sml json protocal using string;` +
`author:${author};` +
`desc:using json protocal to schemaless insert with a json string;` +
`filename:${fileName};` +
`result:${result}`, () => {
let stablename = 'json_protocol_str';
createSql = `create table if not exists ${stablename}(ts timestamp,value double)`
+ `tags(t1 bool,t2 bool,t3 double,t4 nchar(35));`
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let colData1 = [1626006833000, 10]
let tagData1 = [true, false, 10, '123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>'];
let expectResData = getResData(colData1, tagData1, 2);
let jsonStr = "{"
+ "\"metric\": \"" + stablename + "\","
+ "\"timestamp\": 1626006833000,"
+ "\"value\": 10,"
+ "\"tags\": {"
+ " \"t1\": true,"
+ "\"t2\": false,"
+ "\"t3\": 10,"
+ "\"t4\": \"123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>\""
+ "}"
+ "}";
c1.schemalessInsert(jsonStr, taos.SCHEMALESS_PROTOCOL.TSDB_SML_JSON_PROTOCOL, taos.SCHEMALESS_PRECISION.TSDB_SML_TIMESTAMP_MILLI_SECONDS);
let result = executeQuery(`select * from ${stablename};`);
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
})
test(`name:sml json protocal using Array;` +
`author:${author};` +
`desc:using json protocal to schemaless insert with a json array;` +
`filename:${fileName};` +
`result:${result}`, () => {
let stablename = 'json_protocol_arr';
createSql = `create table if not exists ${stablename}(ts timestamp,value double)`
+ `tags(t1 bool,t2 bool,t3 double,t4 nchar(35));`
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let colData1 = [1626006833000, 10]
let tagData1 = [true, false, 10, '123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>'];
let expectResData = getResData(colData1, tagData1, 2);
let jsonArr = ["{"
+ "\"metric\": \"" + stablename + "\","
+ "\"timestamp\": 1626006833,"
+ "\"value\": 10,"
+ "\"tags\": {"
+ " \"t1\": true,"
+ "\"t2\": false,"
+ "\"t3\": 10,"
+ "\"t4\": \"123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>\""
+ "}"
+ "}"
];
c1.schemalessInsert(jsonArr, taos.SCHEMALESS_PROTOCOL.TSDB_SML_JSON_PROTOCOL, taos.SCHEMALESS_PRECISION.TSDB_SML_TIMESTAMP_SECONDS);
let result = executeQuery(`select * from ${stablename};`);
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
})
})
describe("test support microsecond", () => {
test(`name:ms support ntable;` +
`author:${author};` +
`desc:test normal table supports microseconds;` +
`filename:${fileName};` +
`result:${result}`, () => {
let db = 'nodejs_support_ms_ntable';
let table = 'us_test_ntable';
let expectResData = [1625801548423914, 1, 1625801548423914,
1625801548423915, 2, 1625801548423914,
1625801548423916, 3, 1625801548423914,
1625801548423917, 4, 1625801548423914];
let createDB = `create database if not exists ${db} keep 3650 precision \'us\';`;
let createSql = `create table if not exists ${db}.${table} (ts timestamp, seq int,record_date timestamp);`;
let dropDB = `drop database if exists ${db};`;
let insertSql = buildInsertSql(db + '.' + table, '',expectResData, [], 3);
let querySql = `select * from ${db}.${table};`;
let expectResField = getFieldArr(getFeildsFromDll(createSql));
executeUpdate(dropDB);
executeUpdate(createDB);
executeUpdate(createSql);
executeUpdate(insertSql);
let result = executeQuery(querySql);
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
executeUpdate(dropDB);
});
test(`name:ms support stable;` +
`author:${author};` +
`desc:test stable supports microseconds;` +
`filename:${fileName};` +
`result:${result}`, () => {
let db = 'nodejs_support_ms_stable';
let stable = 'us_test_stable';
let table = "sub_1";
let colData = [1625801548423914, 1, 1625801548423914,
1625801548423915, 2, 1625801548423914,
1625801548423916, 3, 1625801548423914,
1625801548423917, 4, 1625801548423914];
let tagData = [1,1625801548423914];
let createDB = `create database if not exists ${db} keep 3650 precision \'us\';`;
let createSql = `create table if not exists ${db}.${stable} (ts timestamp,seq int,`+
`record_date timestamp)tags(id int,htime timestamp);`;
let dropDB = `drop database if exists ${db};`;
let insertSql = buildInsertSql(db + '.' + table, db + '.' + stable, colData,tagData, 3);
let querySql = `select * from ${db}.${stable};`;
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let expectResData = getResData(colData, tagData, 3);
executeUpdate(dropDB);
executeUpdate(createDB);
executeUpdate(createSql);
executeUpdate(insertSql);
let result = executeQuery(querySql);
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
executeUpdate(dropDB);
})
})
describe("test support nanosecond", () => {
test(`name:ns support ntable;` +
`author:${author};` +
`desc:test normal table supports nanoseconds;` +
`filename:${fileName};` +
`result:${result}`, () => {
let db = 'nodejs_support_ns_ntable';
let table = 'ns_test_ntable';
let expectResData = [1625801548423914100, 1, 1625801548423914
,1625801548423914200, 2, 1625801548423914
];
let createDB = `create database if not exists ${db} keep 3650 precision \'ns\';`;
let createSql = `create table if not exists ${db}.${table} (ts timestamp, seq int,record_date timestamp);`;
let dropDB = `drop database if exists ${db};`;
let insertSql = buildInsertSql(db + '.' + table, '',expectResData, [], 3);
let querySql = `select * from ${db}.${table};`;
let expectResField = getFieldArr(getFeildsFromDll(createSql));
executeUpdate(dropDB);
executeUpdate(createDB);
executeUpdate(createSql);
executeUpdate(insertSql);
console.log(querySql);
let result = executeQuery(querySql);
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
console.log((index));
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
executeUpdate(dropDB);
});
test(`name:ns support stable;` +
`author:${author};` +
`desc:test stable supports nanoseconds;` +
`filename:${fileName};` +
`result:${result}`, () => {
let db = 'nodejs_support_ns_stable';
let stable = 'ns_test_stable';
let table = "sub_1";
let colData = [1625801548423914100, 1, 1625801548423914,
1625801548423914200, 2, 1625801548423914];
let tagData = [1,1625801548423914100];
let createDB = `create database if not exists ${db} keep 3650 precision \'ns\';`;
let createSql = `create table if not exists ${db}.${stable} (ts timestamp,seq int,`+
`record_date timestamp)tags(id int,htime timestamp);`;
let dropDB = `drop database if exists ${db};`;
let insertSql = buildInsertSql(db + '.' + table, db + '.' + stable, colData,tagData, 3);
let querySql = `select * from ${db}.${stable};`;
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let expectResData = getResData(colData, tagData, 3);
executeUpdate(dropDB);
executeUpdate(createDB);
executeUpdate(createSql);
executeUpdate(insertSql);
let result = executeQuery(querySql);
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
executeUpdate(dropDB);
})
})
describe("test json tag", () => {
test(`name:json tag;` +
`author:${author};` +
`desc:create,insert,query with json tag;` +
`filename:${fileName};` +
`result:${result}`, () => {
let tableName = 'jsons1';
let createSql = `create table if not exists ${tableName}(ts timestamp, dataInt int, dataBool bool, dataStr nchar(50), dataStrBin binary(150)) tags(jtag json);`;
executeUpdate(createSql);
let expectResField = getFieldArr(getFeildsFromDll(createSql));
let colData = [1591060618000, 1, false, 'json1', '涛思数据'
, 1591060628000, 23, true, '涛思数据', 'json'
, 1591060638000, 54, false, 'tdengine', 'taosdata'];
let tagData = ['{\"tag1\":\"fff\",\"tag2\":5,\"tag3\":true}']
let insertSql = buildInsertSql('json_sub_1', tableName, colData, tagData, 5);
let expectResData = getResData(colData, tagData, 5);
executeUpdate(insertSql);
let result = executeQuery(`select * from ${tableName};`);
let actualResData = result.resData;
let actualResFields = result.resFeilds;
//assert result data length
expect(expectResData.length).toEqual(actualResData.length);
//assert result data
expectResData.forEach((item, index) => {
expect(item).toEqual(actualResData[index]);
});
//assert result meta data
expectResField.forEach((item, index) => {
expect(item).toEqual(actualResFields[index])
})
})
})
\ No newline at end of file
/**
* This is an util function will return the column info based on the create sql.
* @param {*} sql
* @returns Return an Array about the column names and column type.
*
*/
function getFeildsFromDll(sql) {
let fields = [];
let firstBracket = sql.indexOf('(');
let lastBracket = sql.lastIndexOf(')')
let metaStr = sql.slice(firstBracket, lastBracket + 1);
let splitTags = metaStr.split("tags");
splitTags.forEach((item, index, arr) => {
arr[index] = item.slice(1, item.length - 1)
})
splitTags.forEach((item) => {
let tmp = item.split(",");
tmp.forEach((item) => {
let newItem = item.trim();
let spaceInd = newItem.indexOf(' ', 1)
fields.push(newItem.slice(0, spaceInd));
fields.push(newItem.slice(spaceInd + 1, newItem.length))
})
})
return fields;
}
/**
* Based on the input array, it will generate sql that could be used to insert the data of array into the db.
* @param {*} tableName It could be the table name that you want to insert data.
* @param {*} stable If you want to using stable as template to create table automatically,
* set this to your stable name. Deault if '';
* @param {*} dataArr An Array of data that you want insert (it could be mutilple lines)
* @param {*} tagArr An Array used to store one sub table's tag info
* @param {*} numOfColumn The number of columns that the target table has.
* @returns Return an insert sql string.
*/
function buildInsertSql(tableName, stable = '', dataArr, tagArr = [], numOfColumn) {
let insertSql = "";
let dataPartial = "(";
let tagPart = "(";
dataArr.forEach((item, index) => {
// let item = dataArr[index];
if (typeof item == "string") {
dataPartial += '\'' + item + '\'';
} else {
dataPartial += item;
}
if ((index + 1) % numOfColumn == 0 && (index + 1) != dataArr.length) {
dataPartial += ")("
} else if ((index + 1) % numOfColumn == 0 && (index + 1) == dataArr.length) {
dataPartial += ")"
} else {
dataPartial += ","
}
})
if (stable != '') {
tagArr.forEach((item, index) => {
if (typeof item == "string") {
tagPart += '\'' + item + '\'';
} else {
tagPart += item;
}
if (index != tagArr.length - 1) {
tagPart += ",";
} else {
tagPart += ")";
}
})
}
if (stable == '') {
insertSql += `insert into ${tableName} values ${dataPartial};`
} else {
insertSql += `insert into ${tableName} using ${stable} tags ${tagPart} values ${dataPartial};`
}
return insertSql;
}
/**
* used to mapping the data type of an create clause into TDengine's datatype code
*/
const TDengineTypeCode = {
'null': 0,
'bool': 1,
'tinyint': 2,
'smallint': 3,
'int': 4,
'bigint': 5,
'float': 6,
'double': 7,
'binary': 8,
'timestamp': 9,
'nchar': 10,
'tinyint unsigned': 11,
'smallint unsigned': 12,
'int unsigned': 13,
'bigint unsigned': 14,
'json': 15,
}
/**
* Mapping the data type with corresponing size that has defined in tdengine
*/
const TDengineTypeBytes = {
'null': 0,
'bool': 1,
'tinyint': 1,
'smallint': 2,
'int': 4,
'bigint': 8,
'float': 4,
'double': 8,
'timestamp': 8,
'tinyint unsigned': 1,
'smallint unsigned': 2,
'int unsigned': 4,
'bigint unsigned': 8,
'json': 4096,
}
/**
* Used to create an array of taos feilds object.
* @param {*} arr This should be the return array from the method getFeildsFromDll()
* @returns Return an array of taosFeild Object
*/
function getFieldArr(arr) {
let feild = [];
for (let i = 0; i < arr.length;) {
let bracetPosi = arr[i + 1].indexOf('(');
let type = '';
let size = -1;
if (bracetPosi == -1) {
type = TDengineTypeCode[arr[i + 1]];
size = TDengineTypeBytes[arr[i + 1]];
}else{
type = TDengineTypeCode[arr[i + 1].slice(0, bracetPosi)];
size = Number(arr[i + 1].slice(bracetPosi + 1, arr[i + 1].indexOf(')')));
}
let fieldObj = {
name: arr[i].toLowerCase(),
type: type,
bytes: size
}
feild.push(fieldObj);
i = i + 2;
}
return feild;
}
/**
* Conbine arrays of data info and tag info together, and return a new array. This array construction is simmilar with query result
* from the tdengine by taos shell.This method only can be used by a subtable.
* @param {*} dataArr An array holds columns' data that will be insert into the db.
* @param {*} tagArr An array holds tags' data that is belong to a sub table.
* @param {*} numOfcolumn
* @returns return the an array of column data and tag data.
*/
function getResData(dataArr, tagArr, numOfcolumn) {
let resData = [];
dataArr.forEach((item, index) => {
resData.push(item);
if ((index + 1) % numOfcolumn == 0) {
tagArr.forEach((element) => {
resData.push(element);
}) ;
}
});
return resData;
}
module.exports = { getFeildsFromDll, buildInsertSql, getFieldArr, getResData };
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册