From a837e74bfe7f50f37544a59f64db513a51bf1255 Mon Sep 17 00:00:00 2001 From: Jakob Helgesson Date: Tue, 4 Jan 2022 13:29:48 +0100 Subject: [PATCH] Fix deleteFrom syntax and testing (#31) --- __tests__/live/deleteFrom.spec.ts | 44 +++++++++++++++++++++++++++++ __tests__/raw/deleteFromRaw.spec.ts | 14 +++++---- src/BatchBuilder.ts | 7 +++-- src/QueryBuilder.ts | 9 +++--- src/ScylloClient.ts | 7 +++-- 5 files changed, 66 insertions(+), 15 deletions(-) create mode 100644 __tests__/live/deleteFrom.spec.ts diff --git a/__tests__/live/deleteFrom.spec.ts b/__tests__/live/deleteFrom.spec.ts new file mode 100644 index 0000000..9f9f42d --- /dev/null +++ b/__tests__/live/deleteFrom.spec.ts @@ -0,0 +1,44 @@ +import { ScylloClient } from "../../lib"; + +type User = { + username: string, + uid: number +} + +let DB: ScylloClient<{ 'users': User }>; + +beforeAll(async () => { + DB = new ScylloClient({ + client: { + contactPoints: [ + 'localhost:9042' + ], + localDataCenter: 'datacenter1', + keyspace: 'scyllojestsuite' + } + }); + await DB.awaitConnection(); +}); + +it('Can delete a row from the database', async () => { + await DB.insertInto('users', {uid: 432894398023546, username: 'Jest2'}) + expect(await DB.deleteFrom('users', '*', {uid: 432894398023546})); +}); + +it('Can delete a single field from the database', async () => { + await DB.insertInto('users', {uid: 65098546897342, username: 'Jest3'}) + expect(await DB.deleteFrom('users', ['username'], {uid: 65098546897342})); +}); + +it('Expects deleting a non existent row to throw error', async () => { + expect.assertions(1); + try { + await DB.deleteFrom('users', '*', {uid: 949575482946512, username: 'ThisUserShouldNotExist'}); + } catch (e) { + expect(e).toBeTruthy(); + } +}); + +afterAll(async () => { + await DB.shutdown(); +}); \ No newline at end of file diff --git a/__tests__/raw/deleteFromRaw.spec.ts b/__tests__/raw/deleteFromRaw.spec.ts index e336bd0..31c7e11 100644 --- a/__tests__/raw/deleteFromRaw.spec.ts +++ b/__tests__/raw/deleteFromRaw.spec.ts @@ -1,10 +1,14 @@ -import { selectOneFromRaw } from "../../lib"; +import { deleteFromRaw } from "../../lib"; // fix -it('Can insert a user into the database', async () => { - expect(selectOneFromRaw<{'users': {uid: number, username: string}}, 'users'>('scyllo', 'users', '*', {uid: 1234567890, username: 'Jest'})).toEqual({query: 'SELECT * FROM scyllo.users WHERE uid=? AND username=? LIMIT 1', args: [1234567890, 'Jest']}); +it('Can delete whole row', async () => { + expect(deleteFromRaw<{'users': {uid: number, username: string}}, 'users', 'uid' | 'username', 'uid' | 'username'>('scyllo', 'users', '*', {uid: 1234567890, username: 'Jest'})).toEqual({query: 'DELETE FROM scyllo.users WHERE uid=? AND username=?', args: [1234567890, 'Jest']}); }); -it('Can add extra args to query', async () => { - expect(selectOneFromRaw<{'users': {uid: number, username: string}}, 'users'>('scyllo', 'users', '*', {uid: 1234567890, username: 'Jest'}, "ALLOW FILTERING")).toEqual({query: 'SELECT * FROM scyllo.users WHERE uid=? AND username=? LIMIT 1 ALLOW FILTERING', args: [1234567890, 'Jest']}); +it('Can delete single field', async () => { + expect(deleteFromRaw<{'users': {uid: number, username: string}}, 'users', 'uid' | 'username', 'uid' | 'username'>('scyllo', 'users', ['username'], {uid: 1234567890, username: 'Jest'})).toEqual({query: 'DELETE username FROM scyllo.users WHERE uid=? AND username=?', args: [1234567890, 'Jest']}); +}); + +it('Can delete multiple fields', async () => { + expect(deleteFromRaw<{'users': {uid: number, username: string}}, 'users', 'uid' | 'username', 'uid' | 'username'>('scyllo', 'users', ['username', 'uid'], {uid: 1234567890, username: 'Jest'})).toEqual({query: 'DELETE username,uid FROM scyllo.users WHERE uid=? AND username=?', args: [1234567890, 'Jest']}); }); \ No newline at end of file diff --git a/src/BatchBuilder.ts b/src/BatchBuilder.ts index 377a000..5f871f1 100644 --- a/src/BatchBuilder.ts +++ b/src/BatchBuilder.ts @@ -86,14 +86,15 @@ export class BatchBuilder { deleteFrom< Table extends keyof Tables, - ColumnName extends keyof Tables[Table] + ColumnName extends keyof Tables[Table], + DeletedColumnName extends keyof Tables[Table] >( table: Table, - fields: '*' | ColumnName[], + fields: '*' | DeletedColumnName[], criteria: { [key in ColumnName]?: Tables[Table][key] | string }, extra?: string ) { - const query = deleteFromRaw( + const query = deleteFromRaw( this.keyspace, table, fields, diff --git a/src/QueryBuilder.ts b/src/QueryBuilder.ts index d1c3254..3bdb193 100644 --- a/src/QueryBuilder.ts +++ b/src/QueryBuilder.ts @@ -99,16 +99,17 @@ export const deleteFromRaw = < TableMap extends TableScheme, TableName extends keyof TableMap, ColumnName extends keyof TableMap[TableName], + DeletedColumnName extends keyof TableMap[TableName], >( keyspace: string, table: TableName, - fields: '*' | ColumnName[], + fields: '*' | DeletedColumnName[], criteria: { [key in ColumnName]?: TableMap[TableName][key] | string }, extra?: string, ): QueryBuild => ({ - query: `DELETE ${ - fields == '*' ? '' : fields.join(',') - } ${keyspace}.${table} ${ + query: `DELETE${ + fields == '*' ? '' : ' ' + fields.join(',') + } FROM ${keyspace}.${table} ${ criteria && Object.keys(criteria).length > 0 ? 'WHERE ' + Object.keys(criteria) diff --git a/src/ScylloClient.ts b/src/ScylloClient.ts index ea70f74..d9ada3c 100644 --- a/src/ScylloClient.ts +++ b/src/ScylloClient.ts @@ -251,14 +251,15 @@ export class ScylloClient { */ async deleteFrom< Table extends keyof Tables, - ColumnName extends keyof Tables[Table] + ColumnName extends keyof Tables[Table], + DeletedColumnName extends keyof Tables[Table] >( table: Table, - fields: '*' | ColumnName[], + fields: '*' | DeletedColumnName[], criteria: { [key in ColumnName]?: Tables[Table][key] | string }, extra?: string ): Promise { - const query = deleteFromRaw( + const query = deleteFromRaw( this.keyspace, table, fields,