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 data_rdb from '@ohos.data.rdb'
17import ability_featureAbility from '@ohos.ability.featureAbility'
18import data_dataSharePredicates from '@ohos.data.dataSharePredicates'
19
20const TAG = "[RDB_JSKITS_TEST]"
21const CREATE_TABLE_TEST = "CREATE TABLE IF NOT EXISTS test (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, "
22    + "name TEXT NOT NULL, " + "age INTEGER, " + "salary REAL, " + "blobType BLOB)"
23const DROP_TABLE_TEST = "drop table test"
24
25const STORE_CONFIG = {
26    name: "DataShareTest.db",
27}
28var rdbStore = undefined
29var context = ability_featureAbility.getContext()
30
31describe('rdbStoreDataSharePredicatesTest', function () {
32    beforeAll(async function () {
33        console.info(TAG + 'beforeAll')
34        rdbStore = await data_rdb.getRdbStore(context, STORE_CONFIG, 1)
35    })
36
37    beforeEach(async function () {
38        console.info(TAG + 'beforeEach')
39        await rdbStore.executeSql(CREATE_TABLE_TEST, null)
40    })
41
42    afterEach(async function () {
43        console.info(TAG + 'afterEach')
44        await rdbStore.executeSql(DROP_TABLE_TEST, null)
45    })
46
47    afterAll(async function () {
48        console.info(TAG + 'afterAll')
49        rdbStore = null
50        await data_rdb.deleteRdbStore(context, "DataShareTest.db")
51    })
52
53    console.log(TAG + "*************Unit Test Begin*************")
54
55
56    /**
57     * @tc.name rdb DataShare insert test
58     * @tc.number testRdbStoreDataShareFunc0010
59     * @tc.desc rdb DataShare Func insert test
60     */
61    it('testRdbStoreDataShareFunc0001', 0, async function (done) {
62        console.log(TAG + "************* testRdbStoreDataShareFunc0001 start *************")
63        let u8 = new Uint8Array([1, 2, 3])
64        const valueBucket = {
65            "name": "zhangsan",
66            "age": 18,
67            "salary": 100.5,
68            "blobType": u8,
69        }
70        let insertPromise = rdbStore.insert("test", valueBucket)
71        insertPromise.then(async (ret) => {
72            expect(1).assertEqual(ret)
73            console.log(TAG + "Insert done: " + ret)
74        }).catch((err) => {
75            console.log(TAG + "Insert err: " + err)
76            expect(false).assertTrue()
77        })
78        await insertPromise
79        console.log("insert end")
80
81        let predicates = new data_rdb.RdbPredicates("test")
82        predicates.equalTo("name", "zhangsan")
83        let resultSet = await rdbStore.query(predicates)
84        try {
85            console.log(TAG + "resultSet query done")
86            expect(true).assertEqual(resultSet.goToFirstRow())
87            const name = resultSet.getString(resultSet.getColumnIndex("name"))
88            const age = resultSet.getLong(resultSet.getColumnIndex("age"))
89            const salary = resultSet.getDouble(resultSet.getColumnIndex("salary"))
90            const blobType = resultSet.getBlob(resultSet.getColumnIndex("blobType"))
91            expect("zhangsan").assertEqual(name)
92            expect(18).assertEqual(age)
93            expect(100.5).assertEqual(salary)
94            expect(1).assertEqual(blobType[0])
95            expect(2).assertEqual(blobType[1])
96            expect(3).assertEqual(blobType[2])
97        } catch (err) {
98            expect(false).assertTrue()
99        }
100        resultSet.close()
101        resultSet = null
102
103        done()
104        console.log(TAG + "************* testRdbStoreDataShareFunc0001 end *************")
105    })
106
107
108    /**
109     * @tc.name rdb DataShare update test
110     * @tc.number testRdbStoreDataShareFunc0020
111     * @tc.desc rdb DataShare update promise Func test
112     */
113    it('testRdbStoreDataShareFunc0002', 0, async function (done) {
114        console.log(TAG + "************* testRdbStoreDataShareFunc0002 start *************")
115        let u8 = new Uint8Array([1, 2, 3])
116        let valueBucket = {
117            "name": "zhangsan",
118            "age": 18,
119            "salary": 100.5,
120            "blobType": u8,
121        }
122        await rdbStore.insert("test", valueBucket)
123
124        u8 = new Uint8Array([4, 5, 6])
125        valueBucket = {
126            "name": "lisi",
127            "age": 28,
128            "salary": 200.5,
129            "blobType": u8,
130        }
131
132        let predicates = new data_dataSharePredicates.DataSharePredicates()
133        predicates.equalTo("name", "zhangsan")
134        let promiseUpdate = rdbStore.update("test", valueBucket, predicates)
135        promiseUpdate.then(async (ret) => {
136            expect(1).assertEqual(ret)
137            console.log(TAG + "Update done: " + ret)
138        }).catch((err) => {
139            console.log(TAG + "Update err: " + err)
140            expect(false).assertTrue()
141        })
142        await promiseUpdate
143
144        let rdbPredicates = await new data_rdb.RdbPredicates("test")
145        rdbPredicates.equalTo("name", "lisi")
146        let resultSet = await rdbStore.query(rdbPredicates)
147        expect(true).assertEqual(resultSet.goToFirstRow())
148        const id = resultSet.getLong(resultSet.getColumnIndex("id"))
149        const name = resultSet.getString(resultSet.getColumnIndex("name"))
150        const age = resultSet.getLong(resultSet.getColumnIndex("age"))
151        const salary = resultSet.getDouble(resultSet.getColumnIndex("salary"))
152        const blobType = resultSet.getBlob(resultSet.getColumnIndex("blobType"))
153
154        expect("lisi").assertEqual(name)
155        expect(28).assertEqual(age)
156        expect(200.5).assertEqual(salary)
157        expect(4).assertEqual(blobType[0])
158        expect(5).assertEqual(blobType[1])
159        expect(6).assertEqual(blobType[2])
160
161        console.log(TAG + "dataShare update: {id=" + id + ", name=" + name + ", " +
162            "age=" + age + ", salary=" + salary + ", blobType=" + blobType)
163        resultSet.close()
164        resultSet = null
165
166        done()
167        console.log(TAG + "************* testRdbStoreDelete0002 end *************")
168    })
169
170    /**
171     * @tc.name rdb DataShare update test
172     * @tc.number testRdbStoreDataShareFunc0030
173     * @tc.desc rdb DataShare update callback Func test
174     */
175    it('testRdbStoreDataShareFunc0003', 0, async function (done) {
176        console.log(TAG + "************* testRdbStoreDataShareFunc0003 start *************")
177        let u8 = new Uint8Array([1, 2, 3])
178        let valueBucket = {
179            "name": "zhangsan",
180            "age": 18,
181            "salary": 100.5,
182            "blobType": u8,
183        }
184        await rdbStore.insert("test", valueBucket)
185
186        u8 = new Uint8Array([4, 5, 6])
187        valueBucket = {
188            "name": "lisi",
189            "age": 28,
190            "salary": 200.5,
191            "blobType": u8,
192        }
193
194        let predicates = new data_dataSharePredicates.DataSharePredicates()
195        predicates.equalTo("name", "zhangsan")
196
197        await rdbStore.update("test", valueBucket, predicates, async function (err, ret) {
198            if (err) {
199                console.info("Update err: " + err)
200                expect(false).assertTrue()
201            }
202            expect(1).assertEqual(ret)
203            console.log("Update done: " + ret)
204            let rdbPredicates = await new data_rdb.RdbPredicates("test")
205            rdbPredicates.equalTo("name", "lisi")
206            let resultSet = await rdbStore.query(rdbPredicates)
207            expect(1).assertEqual(resultSet.rowCount)
208            expect(true).assertEqual(resultSet.goToFirstRow())
209            const id = resultSet.getLong(resultSet.getColumnIndex("id"))
210            const name = resultSet.getString(resultSet.getColumnIndex("name"))
211            const age = resultSet.getLong(resultSet.getColumnIndex("age"))
212            const salary = resultSet.getDouble(resultSet.getColumnIndex("salary"))
213            const blobType = resultSet.getBlob(resultSet.getColumnIndex("blobType"))
214
215            expect("lisi").assertEqual(name)
216            expect(28).assertEqual(age)
217            expect(200.5).assertEqual(salary)
218            expect(4).assertEqual(blobType[0])
219            expect(5).assertEqual(blobType[1])
220            expect(6).assertEqual(blobType[2])
221            console.log(TAG + "dataShare update: {id=" + id + ", name=" + name + ", " +
222                "age=" + age + ", salary=" + salary + ", blobType=" + blobType)
223            resultSet.close()
224            resultSet = null
225        })
226
227        done()
228        console.log(TAG + "************* testRdbStoreDelete0003 end *************")
229    })
230
231    /**
232     * @tc.name rdb DataShare query test
233     * @tc.number testRdbStoreDataShareFunc0040
234     * @tc.desc rdb DataShare query promise Func test
235     */
236    it('testRdbStoreDataShareFunc0004', 0, async function (done) {
237        console.log(TAG + "************* testRdbStoreDataShareFunc0004 start *************")
238        let u8 = new Uint8Array([4, 5, 6])
239        let valueBucket = {
240            "name": "zhangsan",
241            "age": 18,
242            "salary": 100.5,
243            "blobType": u8,
244        }
245        await rdbStore.insert("test", valueBucket)
246
247        let predicates = new data_dataSharePredicates.DataSharePredicates()
248        predicates.equalTo("name", "zhangsan")
249        let queryPromise = rdbStore.query("test", predicates)
250        queryPromise.then((resultSet) => {
251            console.log(TAG + "DataShare Query done: ")
252            expect(true).assertEqual(resultSet.goToFirstRow())
253            const name = resultSet.getString(resultSet.getColumnIndex("name"))
254            const age = resultSet.getLong(resultSet.getColumnIndex("age"))
255            const salary = resultSet.getDouble(resultSet.getColumnIndex("salary"))
256            const blobType = resultSet.getBlob(resultSet.getColumnIndex("blobType"))
257            resultSet.close()
258            expect("zhangsan").assertEqual(name)
259            expect(18).assertEqual(age)
260            expect(100.5).assertEqual(salary)
261            expect(4).assertEqual(blobType[0])
262            expect(5).assertEqual(blobType[1])
263            expect(6).assertEqual(blobType[2])
264
265        }).catch((err) => {
266            console.log(TAG + "Query err: " + err)
267            expect(false).assertTrue()
268        })
269        await queryPromise
270
271        done()
272        console.log(TAG + "************* testRdbStoreDataShareFunc0004 end *************")
273    })
274
275    /**
276     * @tc.name rdb DataShare query test
277     * @tc.number testRdbStoreDataShareFunc0050
278     * @tc.desc rdb DataShare query callback Func test
279     */
280    it('testRdbStoreDataShareFunc0005', 0, async function (done) {
281        console.log(TAG + "************* testRdbStoreDataShareFunc0005 start *************")
282        let u8 = new Uint8Array([4, 5, 6])
283        let valueBucket = {
284            "name": "zhangsan",
285            "age": 18,
286            "salary": 100.5,
287            "blobType": u8,
288        }
289        await rdbStore.insert("test", valueBucket)
290
291        let predicates = new data_dataSharePredicates.DataSharePredicates()
292        predicates.equalTo("name", "zhangsan")
293
294        await rdbStore.query("test", predicates, ["ID", "NAME", "AGE", "SALARY", "blobType"],
295            function (err, resultSet) {
296                if (err) {
297                    console.info("Query err: " + err)
298                    expect(false).assertTrue()
299                }
300                expect(true).assertEqual(resultSet.goToFirstRow())
301                const name = resultSet.getString(resultSet.getColumnIndex("name"))
302                const age = resultSet.getLong(resultSet.getColumnIndex("age"))
303                const salary = resultSet.getDouble(resultSet.getColumnIndex("salary"))
304                const blobType = resultSet.getBlob(resultSet.getColumnIndex("blobType"))
305                resultSet.close()
306                expect("zhangsan").assertEqual(name)
307                expect(18).assertEqual(age)
308                expect(100.5).assertEqual(salary)
309                expect(4).assertEqual(blobType[0])
310                expect(5).assertEqual(blobType[1])
311                expect(6).assertEqual(blobType[2])
312            })
313
314        done()
315        console.log(TAG + "************* testRdbStoreDataShareFunc0005 end *************")
316    })
317
318    /**
319     * @tc.name rdb DataShare delete test
320     * @tc.number testRdbStoreDataShareFunc0060
321     * @tc.desc rdb DataShare delete Func test
322     */
323    it('testRdbStoreDataShareFunc0006', 0, async function (done) {
324        console.log(TAG + "************* testRdbStoreDataShareFunc0006 start *************")
325        let u8 = new Uint8Array([1, 2, 3])
326        let valueBucket = {
327            "name": "zhangsan",
328            "age": 18,
329            "salary": 100.5,
330            "blobType": u8,
331        }
332
333        await rdbStore.insert("test", valueBucket)
334        let predicates = new data_dataSharePredicates.DataSharePredicates()
335        predicates.equalTo("name", "zhangsan")
336        let deletePromise = rdbStore.delete("test", predicates)
337        deletePromise.then(async (ret) => {
338            expect(1).assertEqual(ret)
339            console.log(TAG + "Delete done: " + ret)
340        }).catch((err) => {
341            console.log(TAG + "Delete err: " + err)
342            expect(false).assertTrue()
343        })
344        await deletePromise
345
346        let rdbPredicates = await new data_rdb.RdbPredicates("test")
347        rdbPredicates.equalTo("name", "zhangsan")
348        let resultSet = await rdbStore.query(rdbPredicates)
349        expect(false).assertEqual(resultSet.goToFirstRow())
350        resultSet.close()
351        resultSet = null
352
353        done()
354        console.log(TAG + "************* testRdbStoreDataShareFunc0006 end *************")
355    })
356
357    /**
358     * @tc.name rdb DataShare delete test
359     * @tc.number testRdbStoreDataShareFunc0070
360     * @tc.desc rdb DataShare delete Func test
361     */
362    it('testRdbStoreDataShareFunc0007', 0, async function (done) {
363        console.log(TAG + "************* testRdbStoreDataShareFunc0007 start *************")
364        let u8 = new Uint8Array([1, 2, 3])
365        let valueBucket = {
366            "name": "zhangsan",
367            "age": 18,
368            "salary": 100.5,
369            "blobType": u8,
370        }
371        await rdbStore.insert("test", valueBucket)
372
373        let predicates = new data_dataSharePredicates.DataSharePredicates()
374        predicates.equalTo("name", "zhangsan")
375
376        await rdbStore.delete("test", predicates, async function (err, ret) {
377            if (err) {
378                console.info("Delete err: " + err)
379                expect(false).assertTrue()
380            }
381            expect(1).assertEqual(ret)
382            console.log("Delete done: " + ret)
383            let rdbPredicates = await new data_rdb.RdbPredicates("test")
384            rdbPredicates.equalTo("name", "zhangsan")
385            let resultSet = await rdbStore.query(rdbPredicates)
386            expect(false).assertEqual(resultSet.goToFirstRow())
387            resultSet.close()
388            resultSet = null
389        })
390
391        done()
392        console.log(TAG + "************* testRdbStoreDataShareFunc0007 end *************")
393    })
394    console.log(TAG + "*************Unit Test End*************")
395})