1/*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'
17import dataRdb from '@ohos.data.rdb';
18
19const TAG = "[RDB_JSKITS_TEST]"
20const CREATE_TABLE_TEST = "CREATE TABLE IF NOT EXISTS test (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
21    "name TEXT NOT NULL, " + "age INTEGER, " + "salary REAL, " + "blobType BLOB)";
22
23const STORE_CONFIG = {
24    name: "InsertTest.db",
25}
26
27var rdbStore = undefined;
28
29describe('rdbStoreInsertTest', function () {
30    beforeAll(async function () {
31        console.info(TAG + 'beforeAll')
32        rdbStore = await dataRdb.getRdbStore(STORE_CONFIG, 1);
33        await rdbStore.executeSql(CREATE_TABLE_TEST, null);
34    })
35
36    beforeEach(async function () {
37        console.info(TAG + 'beforeEach')
38        await rdbStore.executeSql("DELETE FROM test");
39    })
40
41    afterEach(async function () {
42        console.info(TAG + 'afterEach')
43    })
44
45    afterAll(async function () {
46        console.info(TAG + 'afterAll')
47        rdbStore = null
48        await dataRdb.deleteRdbStore("InsertTest.db");
49    })
50
51    console.log(TAG + "*************Unit Test Begin*************");
52
53    /**
54     * @tc.name rdb insert test
55     * @tc.number SUB_DDM_AppDataFWK_JSRDB_Insert_0001
56     * @tc.desc rdb insert test
57     */
58    it('testRdbStoreInsert0001', 0, async function (done) {
59        console.log(TAG + "************* testRdbStoreInsert0001 start *************");
60        var u8 = new Uint8Array([1, 2, 3])
61        {
62            const valueBucket = {
63                "name": "zhangsan",
64                "age": 18,
65                "salary": 100.5,
66                "blobType": u8,
67            }
68            await rdbStore.insert("test", valueBucket)
69        }
70        {
71            const valueBucket = {
72                "name": "lisi",
73                "age": 18,
74                "salary": 100.5,
75                "blobType": u8,
76            }
77            await rdbStore.insert("test", valueBucket)
78        }
79        {
80            const valueBucket = {
81                "name": "lisi",
82                "age": 20,
83                "salary": 100.5,
84                "blobType": u8,
85            }
86            await rdbStore.insert("test", valueBucket)
87        }
88
89        let predicates = new dataRdb.RdbPredicates("test");
90        predicates.equalTo("name", "zhangsan")
91        let resultSet = await rdbStore.query(predicates)
92        try {
93            console.log(TAG + "resultSet query done");
94            expect(true).assertEqual(resultSet.goToFirstRow())
95            const id = resultSet.getLong(resultSet.getColumnIndex("id"))
96            const name = resultSet.getString(resultSet.getColumnIndex("name"))
97            const age = resultSet.getLong(resultSet.getColumnIndex("age"))
98            const salary = resultSet.getDouble(resultSet.getColumnIndex("salary"))
99            const blobType = resultSet.getBlob(resultSet.getColumnIndex("blobType"))
100            console.log(TAG + "id=" + id + ", name=" + name + ", age=" + age + ", salary=" + salary + ", blobType=" + blobType);
101            expect(1).assertEqual(id);
102            expect("zhangsan").assertEqual(name)
103            expect(18).assertEqual(age)
104            expect(100.5).assertEqual(salary)
105            expect(1).assertEqual(blobType[0])
106            expect(2).assertEqual(blobType[1])
107            expect(3).assertEqual(blobType[2])
108            expect(false).assertEqual(resultSet.goToNextRow())
109        } catch (e) {
110            console.log("insert1 error " + e);
111        }
112        resultSet.close()
113        resultSet = null
114        done()
115        console.log(TAG + "************* testRdbStoreInsert0001 end *************");
116    })
117
118    /**
119     * @tc.name rdb insert test
120     * @tc.number SUB_DDM_AppDataFWK_JSRDB_Insert_0002
121     * @tc.desc rdb insert test
122     */
123    it('testRdbStoreInsert0002', 0, async function (done) {
124        console.log(TAG + "************* testRdbStoreInsert0002 start *************");
125        var u8 = new Uint8Array([1, 2, 3])
126        {
127            const valueBucket = {
128                "name": "zhangsan",
129                "age": 18,
130                "salary": 100.5,
131                "blobType": u8,
132            }
133            let insertPromise = rdbStore.insert("wrong", valueBucket)
134            insertPromise.then(async (ret) => {
135                expect(1).assertEqual(ret)
136                console.log(TAG + "insert first done: " + ret)
137                expect(null).assertFail()
138            }).catch((err) => {
139                console.log(TAG + "insert with wrong table")
140            })
141        }
142        done()
143        console.log(TAG + "************* testRdbStoreInsert0002 end   *************");
144    })
145
146    /**
147     * @tc.name rdb insert test
148     * @tc.number SUB_DDM_AppDataFWK_JSRDB_Insert_0003
149     * @tc.desc rdb insert test
150     */
151    it('testRdbStoreInsert0003', 0, async function (done) {
152        console.log(TAG + "************* testRdbStoreInsert0003 start *************");
153        var u8 = new Uint8Array([1, 2, 3])
154        {
155            const valueBucket = {
156                "name": "zhangsan",
157                "age": 18,
158                "salary": 100.5,
159                "blobType": u8,
160            }
161            try {
162                let insertPromise = rdbStore.insert(null, valueBucket)
163                insertPromise.then(async (ret) => {
164                    expect(1).assertEqual(ret)
165                    console.log(TAG + "insert first done: " + ret)
166                    expect(null).assertFail()
167                }).catch((err) => {
168                    console.log(TAG + "insert with null table")
169                    expect(null).assertFail()
170                })
171            } catch(err) {
172                console.log("catch err: failed, err: code=" + err.code + " message=" + err.message)
173                expect("401").assertEqual(err.code)
174                done()
175            }
176        }
177        done()
178        console.log(TAG + "************* testRdbStoreInsert0003 end   *************");
179    })
180
181    /**
182     * @tc.name rdb insert Extra long character test
183     * @tc.number SUB_DDM_AppDataFWK_JSRDB_Insert_0004
184     * @tc.desc rdb insert Extra long character test
185     */
186    it('testRdbStoreInsert0004', 0, async function (done) {
187        console.log(TAG + "************* testRdbStoreInsert0004 start *************");
188        var u8 = new Uint8Array([1, 2, 3])
189        var nameStr = "abcd" + "e".repeat(2000) + "./&*$!@()"
190        const valueBucket = {
191            "name": nameStr,
192            "age": 19,
193            "salary": 100.5,
194            "blobType": u8,
195        }
196        await rdbStore.insert("test", valueBucket)
197        let predicates = new dataRdb.RdbPredicates("test");
198        predicates.equalTo("age", 19)
199        let resultSet = await rdbStore.query(predicates)
200        try {
201            console.log(TAG + "resultSet query done");
202            expect(true).assertEqual(resultSet.goToFirstRow())
203            const name = resultSet.getString(resultSet.getColumnIndex("name"))
204            console.log(TAG + "id=" + id + ", name=" + name + ", age=" + age + ", salary=" + salary + ", blobType=" + blobType);
205            expect(nameStr).assertEqual(name)
206        } catch (e) {
207            console.log("insert error " + e);
208        }
209        resultSet.close()
210        resultSet = null
211        done()
212        console.log(TAG + "************* testRdbStoreInsert0004 end   *************");
213    })
214
215    /**
216     * @tc.name rdb insert Extra long character test
217     * @tc.number SUB_DDM_AppDataFWK_JSRDB_Insert_0005
218     * @tc.desc rdb insert Extra long character test
219     */
220    it('testRdbStoreInsert0005', 0, async function (done) {
221        console.log(TAG + "************* testRdbStoreInsert0005 start *************");
222        var u8 = new Uint8Array([1, 2, 3])
223        var nameStr = "苹果是水果" + "e".repeat(2000)
224        const valueBucket = {
225            "name": nameStr,
226            "age": 20,
227            "salary": 100.5,
228            "blobType": u8,
229        }
230        await rdbStore.insert("test", valueBucket)
231        let predicates = new dataRdb.RdbPredicates("test");
232        predicates.equalTo("age", 20)
233        let resultSet = await rdbStore.query(predicates)
234        try {
235            console.log(TAG + "resultSet query done");
236            expect(true).assertEqual(resultSet.goToFirstRow())
237            const name = resultSet.getString(resultSet.getColumnIndex("name"))
238            console.log(TAG + "id=" + id + ", name=" + name + ", age=" + age + ", salary=" + salary + ", blobType=" + blobType);
239            expect(nameStr).assertEqual(name)
240        } catch (e) {
241            console.log("insert error " + e);
242        }
243        resultSet.close()
244        resultSet = null
245        done()
246        console.log(TAG + "************* testRdbStoreInsert0005 end   *************");
247    })
248
249    /**
250     * @tc.name rdb insert Extra long character test
251     * @tc.number SUB_DDM_AppDataFWK_JSRDB_Insert_0006
252     * @tc.desc rdb insert Extra long character test
253     */
254    it('testRdbStoreInsert0006', 0, async function (done) {
255        console.log(TAG + "************* testRdbStoreInsert0006 start *************");
256        var u8 = new Uint8Array([1, 2, 3])
257        var nameStr = "西瓜是水果" + "e".repeat(2000) + "好吃又好看"
258        const valueBucket = {
259            "name": nameStr,
260            "age": 21,
261            "salary": 100.5,
262            "blobType": u8,
263        }
264        await rdbStore.insert("test", valueBucket)
265        let predicates = new dataRdb.RdbPredicates("test");
266        predicates.equalTo("age", 21)
267        let resultSet = await rdbStore.query(predicates)
268        try {
269            console.log(TAG + "resultSet query done");
270            expect(true).assertEqual(resultSet.goToFirstRow())
271            const name = resultSet.getString(resultSet.getColumnIndex("name"))
272            console.log(TAG + "id=" + id + ", name=" + name + ", age=" + age + ", salary=" + salary + ", blobType=" + blobType);
273            expect(nameStr).assertEqual(name)
274        } catch (e) {
275            console.log("insert error " + e);
276        }
277        resultSet.close()
278        resultSet = null
279        done()
280        console.log(TAG + "************* testRdbStoreInsert0006 end   *************");
281    })
282
283    /**
284     * @tc.name rdb getString test
285     * @tc.number SUB_DDM_AppDataFWK_JSRDB_GetString_0001
286     * @tc.desc rdb getString test of the null value
287     */
288    it('testRdbStoreGetString0001', 0, async function (done) {
289        console.log(TAG + "************* testRdbStoreGetString0001 start *************");
290        var u8 = new Uint8Array([1, 2, 3])
291        const valueBucket = {
292            "name": "",
293            "age": 21,
294            "salary": 100.5,
295            "blobType": u8,
296        }
297        await rdbStore.insert("test", valueBucket)
298        let predicates = new dataRdb.RdbPredicates("test");
299        predicates.equalTo("name", "")
300        let resultSet = await rdbStore.query(predicates)
301        try {
302            console.log(TAG + "resultSet query done");
303            expect(true).assertEqual(resultSet.goToFirstRow())
304            const name = resultSet.getString(resultSet.getColumnIndex("name"))
305            expect("").assertEqual(name)
306        } catch (e) {
307            console.log("insert error " + e);
308            expect().assertFail();
309        }
310        resultSet.close()
311        resultSet = null
312        done()
313        console.log(TAG + "************* testRdbStoreGetString0001 end   *************");
314    })
315
316    /**
317     * @tc.name: rdb batchInsert test
318     * @tc.number: SUB_DDM_AppDataFWK_JSRDB_batchInsert_0001
319     * @tc.desc: rdb batchInsert test
320     * @tc.require: issueI5GZGX
321     */
322    it('testRdbStorebatchInsert001', 0, async function () {
323        console.log(TAG + "************* testRdbStorebatchInsert001 start *************");
324
325        var u8 = new Uint8Array([1, 2, 3])
326        const valueBucket = {
327            "name": "zhangsan",
328            "age": 18,
329            "salary": 100.5,
330            "blobType": u8,
331        }
332        let valueBucketArray = new Array();
333        for (let i = 0; i < 100; i++) {
334            valueBucketArray.push(valueBucket);
335        }
336        await rdbStore.batchInsert("test", valueBucketArray);
337        let resultSet = await rdbStore.querySql("SELECT * FROM test");
338        let count = resultSet.rowCount;
339        expect(100).assertEqual(count);
340        resultSet.close()
341        console.log(TAG + "************* testRdbStorebatchInsert001 end *************");
342    })
343
344     /**
345         * @tc.name: rdb batchInsert test
346         * @tc.number: SUB_DDM_AppDataFWK_JSRDB_batchInsert_0001
347         * @tc.desc: rdb batchInsert test
348         * @tc.require: issueI5GZGX
349         */
350      it('testRdbStorebatchInsert002', 0, async function () {
351        console.log(TAG + "************* testRdbStorebatchInsert002 start *************");
352
353        await rdbStore.executeSql("delete from test");
354
355        let valueBucketArray = new Array();
356
357        var u8 = new Uint8Array([1, 2, 3])
358        const valueBucket = {
359            "name": "zhangsan",
360            "age": 18,
361            "salary": 11.5,
362            "blobType": u8,
363        }
364        const valueBucket1 = {
365            "name": "lisi",
366            "age": 15,
367            "salary": 100.5,
368            "blobType": u8,
369        }
370        const valueBucket2 = {
371            "name": "zhaoliu",
372            "salary": 1.5,
373        }
374        const valueBucket3 = {
375            "name": "lisi",
376            "age": 18,
377            "salary": 111.5,
378            "blobType": u8,
379        }
380
381        valueBucketArray.push(valueBucket);
382        valueBucketArray.push(valueBucket1);
383        valueBucketArray.push(valueBucket2);
384        valueBucketArray.push(valueBucket3);
385
386        let errCode = await rdbStore.batchInsert("test", valueBucketArray);
387        expect(4).assertEqual(errCode);
388        let resultSet = await rdbStore.querySql("SELECT * FROM test");
389        let count = resultSet.rowCount;
390        expect(4).assertEqual(count);
391        resultSet.close()
392
393        let predicates = new dataRdb.RdbPredicates("test");
394        predicates.equalTo("salary", 1.5);
395        resultSet = await rdbStore.query(predicates, []);
396        count = resultSet.rowCount;
397        expect(1).assertEqual(count);
398        resultSet.close();
399
400        let secPredicates = new dataRdb.RdbPredicates("test");
401        secPredicates.equalTo("age", 18);
402        resultSet = await rdbStore.query(secPredicates, []);
403        count = resultSet.rowCount;
404        expect(2).assertEqual(count);
405        resultSet.close();
406
407        console.log(TAG + "************* testRdbStorebatchInsert002 end *************");
408    })
409
410     /**
411         * @tc.name: rdb batchInsert test
412         * @tc.number: SUB_DDM_AppDataFWK_JSRDB_batchInsert_0003
413         * @tc.desc: rdb batchInsert not exist column test
414         * @tc.require: issueIB3DGQ
415         */
416     it('testRdbStorebatchInsert003', 0, async function () {
417        console.log(TAG + "************* testRdbStorebatchInsert003 start *************");
418
419        await rdbStore.executeSql("delete from test");
420
421        let valueBucketArray = new Array();
422
423        var u8 = new Uint8Array([1, 2, 3])
424        const valueBucket = {
425            "name": "zhangsan",
426            "age": 18,
427            "salary": 11.5,
428            "blobType": u8,
429            "notexistcolumn": 1,
430        }
431        valueBucketArray.push(valueBucket);
432
433        let errCode = await rdbStore.batchInsert("test", valueBucketArray);
434        expect(-1).assertEqual(errCode);
435        let resultSet = await rdbStore.querySql("SELECT * FROM test");
436        let count = resultSet.rowCount;
437        expect(0).assertEqual(count);
438        resultSet.close()
439        console.log(TAG + "************* testRdbStorebatchInsert003 end *************");
440    })
441    console.log(TAG + "*************Unit Test End*************");
442})