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 */
15import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'
16import dataRdb from '@ohos.data.rdb';
17
18const TAG = "[RDB_JSKITS_TEST]"
19const CREATE_TABLE_TEST = "CREATE TABLE IF NOT EXISTS test (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
20    "name TEXT UNIQUE, " + "age INTEGER, " + "salary REAL, " + "blobType BLOB)";
21const STORE_CONFIG = {
22    name: "UpdataTest.db",
23}
24var rdbStore = undefined;
25
26
27describe('rdbStoreUpdateTest', function () {
28    beforeAll(async function () {
29        console.info(TAG + 'beforeAll')
30        rdbStore = await dataRdb.getRdbStore(STORE_CONFIG, 1);
31        await rdbStore.executeSql(CREATE_TABLE_TEST, null);
32    })
33
34    beforeEach(async function () {
35        await rdbStore.executeSql("DELETE FROM test");
36        console.info(TAG + 'beforeEach')
37    })
38
39    afterEach(function () {
40        console.info(TAG + 'afterEach')
41    })
42
43    afterAll(async function () {
44        console.info(TAG + 'afterAll')
45        rdbStore = null
46        await dataRdb.deleteRdbStore("UpdataTest.db");
47    })
48
49    /**
50     * @tc.name resultSet Update test
51     * @tc.number SUB_DDM_AppDataFWK_JSRDB_Update_0001
52     * @tc.desc resultSet Update test
53     */
54    it('testRdbStoreUpdate0001', 0, async function () {
55        console.log(TAG + "************* testRdbStoreUpdate0001 start *************");
56        var u8 = new Uint8Array([1, 2, 3])
57        {
58            const valueBucket = {
59                "name": "zhangsan",
60                "age": 18,
61                "salary": 100.5,
62                "blobType": u8,
63            }
64            let ret = await rdbStore.insert("test", valueBucket)
65            expect(1).assertEqual(ret);
66        }
67        try {
68            var u8 = new Uint8Array([4, 5, 6])
69            const valueBucket = {
70                "name": "lisi",
71                "age": 20,
72                "salary": 200.5,
73                "blobType": u8,
74            }
75            let predicates = await new dataRdb.RdbPredicates("test")
76            await predicates.equalTo("id", "1")
77            let ret = await rdbStore.update(valueBucket, predicates)
78            await expect(1).assertEqual(ret);
79            await console.log(TAG + "update done: " + ret);
80
81            predicates = await new dataRdb.RdbPredicates("test")
82            let resultSet = await rdbStore.query(predicates)
83            try {
84                expect(true).assertEqual(resultSet.goToFirstRow())
85                const id = await resultSet.getLong(resultSet.getColumnIndex("id"))
86                const name = await resultSet.getString(resultSet.getColumnIndex("name"))
87                const age = await resultSet.getLong(resultSet.getColumnIndex("age"))
88                const salary = await resultSet.getDouble(resultSet.getColumnIndex("salary"))
89                const blobType = await resultSet.getBlob(resultSet.getColumnIndex("blobType"))
90
91                await expect(1).assertEqual(id);
92                await expect("lisi").assertEqual(name);
93                await expect(20).assertEqual(age);
94                await expect(200.5).assertEqual(salary);
95                await expect(4).assertEqual(blobType[0]);
96                await expect(5).assertEqual(blobType[1]);
97                await expect(6).assertEqual(blobType[2]);
98                await expect(false).assertEqual(resultSet.goToNextRow())
99            } finally {
100                resultSet.close()
101                resultSet = null
102            }
103        } catch (err) {
104            console.log(TAG + `failed, errcode:${JSON.stringify(err)}.`);
105            expect().assertFail()
106        }
107        console.log(TAG + "************* testRdbStoreUpdate0001 end   *************");
108    })
109
110    /**
111     * @tc.name resultSet Update test
112     * @tc.number SUB_DDM_AppDataFWK_JSRDB_Update_0002
113     * @tc.desc resultSet Update test
114     */
115    it('testRdbStoreUpdate0002', 0, async function () {
116        console.log(TAG + "************* testRdbStoreUpdate0002 start *************");
117        var u8 = new Uint8Array([1, 2, 3])
118        const valueBucket = {
119            "name": "zhangsan",
120            "age": 18,
121            "salary": 100.5,
122            "blobType": u8,
123        }
124        try {
125            let predicates = new dataRdb.RdbPredicates("")
126            await rdbStore.update(valueBucket, predicates)
127            expect().assertFail()
128        } catch (err) {
129            console.log(TAG + `empty failed, errcode:${JSON.stringify(err)}.`);
130            expect("401").assertEqual(err.code)
131        }
132        try {
133            const emptyBucket = {};
134            let predicates = await new dataRdb.RdbPredicates("test")
135            await rdbStore.update(emptyBucket, predicates)
136            expect().assertFail()
137        } catch (err) {
138            console.log(TAG + `test failed, errcode:${JSON.stringify(err)}.`);
139        }
140
141        try {
142            let predicates = await new dataRdb.RdbPredicates("test")
143            await predicates.equalTo("aaa", "null")
144            await rdbStore.update(valueBucket, predicates);
145            expect().assertFail()
146        } catch (err) {
147            console.log(TAG + `aaa failed, errcode:${JSON.stringify(err)}.`);
148        }
149        console.log(TAG + "************* testRdbStoreUpdate0002 end   *************");
150    })
151
152    /**
153     * @tc.name resultSet Update test
154     * @tc.number SUB_DDM_AppDataFWK_JSRDB_Update_0003
155     * @tc.desc resultSet Update test
156     */
157    it('testRdbStoreUpdate0003', 0, async function () {
158        console.log(TAG + "************* testRdbStoreUpdate0003 start *************");
159        var u8 = new Uint8Array([1, 2, 3])
160        const valueBucket = {
161            "name": "zhangsan",
162            "age": 18,
163            "salary": 100.5,
164            "blobType": u8,
165            "wrongColumn": 100.5,
166        }
167        try {
168            let predicates = new dataRdb.RdbPredicates("wrongTable")
169            await rdbStore.update(valueBucket, predicates)
170            expect().assertFail();
171        } catch (err) {
172            console.log(TAG + `wrongTable failed, errcode:${JSON.stringify(err)}.`);
173        }
174        try {
175            let predicates = await new dataRdb.RdbPredicates("test")
176            await rdbStore.update(valueBucket, predicates)
177            expect().assertFail();
178        } catch (err) {
179            console.log(TAG + `test failed, errcode:${JSON.stringify(err)}.`);
180        }
181        console.log(TAG + "************* testRdbStoreUpdate0003 end   *************");
182    })
183
184    /**
185     * @tc.name resultSet Update test
186     * @tc.number SUB_DDM_AppDataFWK_JSRDB_Update_0004
187     * @tc.desc resultSet Update test
188     */
189    it('testRdbStoreUpdate0004', 0, async function () {
190        console.log(TAG + "************* testRdbStoreUpdate0004 start *************");
191        var u8 = new Uint8Array([1, 2, 3])
192        const valueBucket = {
193            "name": "zhangsan",
194            "age": 18,
195            "salary": 100.5,
196            "blobType": u8,
197        }
198        try {
199            let predicates = await new dataRdb.RdbPredicates("test")
200            await predicates.equalTo("aaa", "null")
201            await rdbStore.update(valueBucket, predicates)
202            expect().assertFail();
203        } catch (err) {
204            console.log(TAG + `test failed, errcode:${JSON.stringify(err)}.`);
205        }
206        try {
207            const emptyBucket = {};
208            let predicates = await new dataRdb.RdbPredicates("test")
209            await predicates.equalTo("name", "zhangsan")
210            await predicates.equalTo("age", 18)
211            await predicates.equalTo("null", 100.5)
212            await rdbStore.update(emptyBucket, predicates)
213            expect().assertFail();
214        } catch (err) {
215            console.log(TAG + `emptyBucket failed, errcode:${JSON.stringify(err)}.`);
216        }
217        console.log(TAG + "************* testRdbStoreUpdate0004 end   *************");
218    })
219
220    /**
221     * @tc.name resultSet Update Extra long character test
222     * @tc.number SUB_DDM_AppDataFWK_JSRDB_Update_0005
223     * @tc.desc resultSet Update Extra long character test
224     */
225    it('testRdbStoreUpdate0005', 0, async function () {
226        console.log(TAG + "************* testRdbStoreUpdate0005 start *************");
227        var u8 = new Uint8Array([1, 2, 3])
228        {
229            const valueBucket = {
230                "name": "xiaoming",
231                "age": 18,
232                "salary": 100.5,
233                "blobType": u8,
234            }
235            await rdbStore.insert("test", valueBucket)
236        }
237        try {
238            var u8 = new Uint8Array([4, 5, 6])
239            var nameStr = "abcd" + "e".repeat(2000) + "./&*$!@()"
240            const valueBucket = {
241                "name": nameStr,
242                "age": 20,
243                "salary": 200.5,
244                "blobType": u8,
245            }
246            let predicates = await new dataRdb.RdbPredicates("test")
247            await predicates.equalTo("name", "xiaoming")
248            let ret = await rdbStore.update(valueBucket, predicates)
249            await expect(1).assertEqual(ret);
250            await console.log(TAG + "update done: " + ret);
251
252            predicates = await new dataRdb.RdbPredicates("test")
253            predicates.equalTo("age", 20)
254            let resultSet = await rdbStore.query(predicates)
255            try {
256                expect(true).assertEqual(resultSet.goToFirstRow())
257                const name = await resultSet.getString(resultSet.getColumnIndex("name"))
258                await expect(nameStr).assertEqual(name);
259            } finally {
260                resultSet.close()
261                resultSet = null
262            }
263        } catch (err) {
264            console.log(TAG + `failed, errcode:${JSON.stringify(err)}.`);
265            expect().assertFail();
266        }
267        console.log(TAG + "************* testRdbStoreUpdate0005 end   *************");
268    })
269
270    /**
271     * @tc.name resultSet Update Extra long character test
272     * @tc.number SUB_DDM_AppDataFWK_JSRDB_Update_0006
273     * @tc.desc resultSet Update Extra long character test
274     */
275    it('testRdbStoreUpdate0006', 0, async function () {
276        console.log(TAG + "************* testRdbStoreUpdate0006 start *************");
277        var u8 = new Uint8Array([1, 2, 3])
278        {
279            const valueBucket = {
280                "name": "xiaohua",
281                "age": 18,
282                "salary": 100.5,
283                "blobType": u8,
284            }
285            await rdbStore.insert("test", valueBucket)
286        }
287        try {
288            var u8 = new Uint8Array([4, 5, 6])
289            var nameStr = "橘子是水果" + "e".repeat(2000)
290            const valueBucket = {
291                "name": nameStr,
292                "age": 19,
293                "salary": 200.5,
294                "blobType": u8,
295            }
296            let predicates = await new dataRdb.RdbPredicates("test")
297            await predicates.equalTo("name", "xiaohua")
298            let ret = await rdbStore.update(valueBucket, predicates)
299            await expect(1).assertEqual(ret);
300            await console.log(TAG + "update done: " + ret);
301
302            predicates = await new dataRdb.RdbPredicates("test")
303            predicates.equalTo("age", 19)
304            let resultSet = await rdbStore.query(predicates)
305            try {
306                expect(true).assertEqual(resultSet.goToFirstRow())
307                const name = await resultSet.getString(resultSet.getColumnIndex("name"))
308                await expect(nameStr).assertEqual(name);
309            } finally {
310                resultSet.close()
311                resultSet = null
312            }
313        } catch (err) {
314            console.log(TAG + `failed, errcode:${JSON.stringify(err)}.`);
315            expect().assertFail();
316        }
317        console.log(TAG + "************* testRdbStoreUpdate0006 end   *************");
318    })
319
320    /**
321     * @tc.name resultSet Update Extra long character test
322     * @tc.number SUB_DDM_AppDataFWK_JSRDB_Update_0007
323     * @tc.desc resultSet Update Extra long character test
324     */
325    it('testRdbStoreUpdate0007', 0, async function () {
326        console.log(TAG + "************* testRdbStoreUpdate0007 start *************");
327        var u8 = new Uint8Array([1, 2, 3])
328        {
329            const valueBucket = {
330                "name": "xiaocan",
331                "age": 18,
332                "salary": 100.5,
333                "blobType": u8,
334            }
335            await rdbStore.insert("test", valueBucket)
336        }
337        try {
338            var u8 = new Uint8Array([4, 5, 6])
339            var nameStr = "菠萝是水果" + "e".repeat(2000) + "好吃又不贵"
340            const valueBucket = {
341                "name": nameStr,
342                "age": 21,
343                "salary": 200.5,
344                "blobType": u8,
345            }
346            let predicates = await new dataRdb.RdbPredicates("test")
347            await predicates.equalTo("name", "xiaocan")
348            let ret = await rdbStore.update(valueBucket, predicates);
349            await expect(1).assertEqual(ret);
350            await console.log(TAG + "update done: " + ret);
351
352            predicates = await new dataRdb.RdbPredicates("test")
353            predicates.equalTo("age", 21)
354            let resultSet = await rdbStore.query(predicates)
355            try {
356                expect(true).assertEqual(resultSet.goToFirstRow())
357                const name = await resultSet.getString(resultSet.getColumnIndex("name"))
358                await expect(nameStr).assertEqual(name);
359            } finally {
360                resultSet.close()
361                resultSet = null
362            }
363        } catch (err) {
364            console.log(TAG + `failed, errcode:${JSON.stringify(err)}.`);
365            expect().assertFail();
366        }
367        console.log(TAG + "************* testRdbStoreUpdate0007 end   *************");
368    })
369    console.log(TAG + "*************Unit Test End*************");
370})