From 6e800889742372c3e372cbd0b89d6ce7f92fddfd Mon Sep 17 00:00:00 2001 From: Nick Hammond Date: Sat, 12 Mar 2022 16:15:41 +0000 Subject: [PATCH 1/8] feat: Add MongoDB ObjectId generation Signed-off-by: Nick Hammond --- src/datatype.ts | 49 +++++++++++++++++++++++++++++++++++++++++++ test/datatype.spec.ts | 24 +++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/src/datatype.ts b/src/datatype.ts index ba2ebdc4685..25e09e9c705 100644 --- a/src/datatype.ts +++ b/src/datatype.ts @@ -296,4 +296,53 @@ export class Datatype { return BigInt(value); } + + /** + * Returns an [ObjectId](https://docs.mongodb.com/manual/reference/method/ObjectId/) string + * + * @param value When provided, and is a valid objectId, this method simply returns it as is. + * + * @example + * faker.datatype.objectId() // e175cac316a79afdd0ad3afb + * faker.datatype.objectId('6228fb6ec55ed495fc1e5f80') // 6228fb6ec55ed495fc1e5f80 + */ + objectId(value?: string): string { + const length = 24; + + if (typeof value === 'string' && value?.length === 24) { + return value; + } + + // a-z0-9 + const charCodeOptions = [ + { + min: 'a'.charCodeAt(0), + max: 'f'.charCodeAt(0), + }, + { + min: '0'.charCodeAt(0), + max: '9'.charCodeAt(0), + }, + ]; + + let returnString = ''; + + for (let i = 0; i < length; i++) { + // randomly chose if a number or letter should be selected + const charCodeOption = + charCodeOptions[ + this.faker.datatype.number({ + min: 0, + max: charCodeOptions.length - 1, + }) + ]; + + // converts the randomly selected UTF-16 number to the corresponding character + returnString += String.fromCharCode( + this.faker.datatype.number(charCodeOption) + ); + } + + return returnString; + } } diff --git a/test/datatype.spec.ts b/test/datatype.spec.ts index bee280d7bf1..c86bc5c309e 100644 --- a/test/datatype.spec.ts +++ b/test/datatype.spec.ts @@ -69,6 +69,9 @@ const seededRuns = [ noArgs: 3745409999962546n, value: 42n, }, + objectId: { + noArgs: 'e175cac316a79afdd0ad3afb', + }, }, }, { @@ -138,6 +141,9 @@ const seededRuns = [ noArgs: 2620209999973798n, value: 42n, }, + objectId: { + noArgs: 'dbdab5c23ea3e1f70cc53cf4', + }, }, }, { @@ -207,6 +213,9 @@ const seededRuns = [ noArgs: 9285209999907148n, value: 42n, }, + objectId: { + noArgs: '47a0124a70679b99c9ad40b0', + }, }, }, ]; @@ -224,6 +233,7 @@ const functionNames = [ 'json', 'array', 'bigInt', + 'objectId', ]; describe('datatype', () => { @@ -619,6 +629,20 @@ describe('datatype', () => { expect(generateBigInt).toBeTypeOf('bigint'); }); }); + + describe('objectId', () => { + it('should generate a objectId value', () => { + const generateObjectId = faker.datatype.objectId(); + expect(generateObjectId).toBeTypeOf('string'); + }); + + it('should return the same value if valid value is passed', () => { + const generateObjectId = faker.datatype.objectId( + '6228fb6ec55ed495fc1e5f80' + ); + expect(generateObjectId).toBe('6228fb6ec55ed495fc1e5f80'); + }); + }); } }); }); From 73f4e58f62f0d4e07edde407c5d42185885ef0af Mon Sep 17 00:00:00 2001 From: Nick Hammond Date: Sat, 12 Mar 2022 17:03:50 +0000 Subject: [PATCH 2/8] refactor: Move ObjectId to database namespace Signed-off-by: Nick Hammond --- src/database.ts | 49 +++++++++++++++++++++++++++++++++++++++++++ src/datatype.ts | 49 ------------------------------------------- test/database.spec.ts | 19 ++++++++++++++++- test/datatype.spec.ts | 24 --------------------- 4 files changed, 67 insertions(+), 74 deletions(-) diff --git a/src/database.ts b/src/database.ts index 3e3b56f95bc..e72db3036be 100644 --- a/src/database.ts +++ b/src/database.ts @@ -59,4 +59,53 @@ export class Database { this.faker.definitions.database.engine ); } + + /** + * Returns an [ObjectId](https://docs.mongodb.com/manual/reference/method/ObjectId/) string + * + * @param value When provided, and is a valid objectId, this method simply returns it as is. + * + * @example + * faker.database.objectId() // e175cac316a79afdd0ad3afb + * faker.database.objectId('6228fb6ec55ed495fc1e5f80') // 6228fb6ec55ed495fc1e5f80 + */ + objectId(value?: string): string { + const length = 24; + + if (typeof value === 'string' && value?.length === 24) { + return value; + } + + // a-z0-9 + const charCodeOptions = [ + { + min: 'a'.charCodeAt(0), + max: 'f'.charCodeAt(0), + }, + { + min: '0'.charCodeAt(0), + max: '9'.charCodeAt(0), + }, + ]; + + let returnString = ''; + + for (let i = 0; i < length; i++) { + // randomly chose if a number or letter should be selected + const charCodeOption = + charCodeOptions[ + this.faker.datatype.number({ + min: 0, + max: charCodeOptions.length - 1, + }) + ]; + + // converts the randomly selected UTF-16 number to the corresponding character + returnString += String.fromCharCode( + this.faker.datatype.number(charCodeOption) + ); + } + + return returnString; + } } diff --git a/src/datatype.ts b/src/datatype.ts index 25e09e9c705..ba2ebdc4685 100644 --- a/src/datatype.ts +++ b/src/datatype.ts @@ -296,53 +296,4 @@ export class Datatype { return BigInt(value); } - - /** - * Returns an [ObjectId](https://docs.mongodb.com/manual/reference/method/ObjectId/) string - * - * @param value When provided, and is a valid objectId, this method simply returns it as is. - * - * @example - * faker.datatype.objectId() // e175cac316a79afdd0ad3afb - * faker.datatype.objectId('6228fb6ec55ed495fc1e5f80') // 6228fb6ec55ed495fc1e5f80 - */ - objectId(value?: string): string { - const length = 24; - - if (typeof value === 'string' && value?.length === 24) { - return value; - } - - // a-z0-9 - const charCodeOptions = [ - { - min: 'a'.charCodeAt(0), - max: 'f'.charCodeAt(0), - }, - { - min: '0'.charCodeAt(0), - max: '9'.charCodeAt(0), - }, - ]; - - let returnString = ''; - - for (let i = 0; i < length; i++) { - // randomly chose if a number or letter should be selected - const charCodeOption = - charCodeOptions[ - this.faker.datatype.number({ - min: 0, - max: charCodeOptions.length - 1, - }) - ]; - - // converts the randomly selected UTF-16 number to the corresponding character - returnString += String.fromCharCode( - this.faker.datatype.number(charCodeOption) - ); - } - - return returnString; - } } diff --git a/test/database.spec.ts b/test/database.spec.ts index 063f214bfd3..162c8b4a150 100644 --- a/test/database.spec.ts +++ b/test/database.spec.ts @@ -9,6 +9,7 @@ const seededRuns = [ type: 'smallint', collation: 'utf8_bin', engine: 'MEMORY', + objectId: 'e175cac316a79afdd0ad3afb', }, }, { @@ -18,6 +19,7 @@ const seededRuns = [ type: 'time', collation: 'utf8_general_ci', engine: 'MyISAM', + objectId: 'dbdab5c23ea3e1f70cc53cf4', }, }, { @@ -27,13 +29,14 @@ const seededRuns = [ type: 'geometry', collation: 'cp1250_general_ci', engine: 'ARCHIVE', + objectId: '47a0124a70679b99c9ad40b0', }, }, ]; const NON_SEEDED_BASED_RUN = 5; -const functionNames = ['column', 'type', 'collation', 'engine']; +const functionNames = ['column', 'type', 'collation', 'engine', 'objectId']; describe('database', () => { afterEach(() => { @@ -95,6 +98,20 @@ describe('database', () => { expect(faker.definitions.database.type).toContain(type); }); }); + + describe('objectId', () => { + it('should generate a objectId value', () => { + const generateObjectId = faker.database.objectId(); + expect(generateObjectId).toBeTypeOf('string'); + }); + + it('should return the same value if valid value is passed', () => { + const generateObjectId = faker.database.objectId( + '6228fb6ec55ed495fc1e5f80' + ); + expect(generateObjectId).toBe('6228fb6ec55ed495fc1e5f80'); + }); + }); } }); }); diff --git a/test/datatype.spec.ts b/test/datatype.spec.ts index c86bc5c309e..bee280d7bf1 100644 --- a/test/datatype.spec.ts +++ b/test/datatype.spec.ts @@ -69,9 +69,6 @@ const seededRuns = [ noArgs: 3745409999962546n, value: 42n, }, - objectId: { - noArgs: 'e175cac316a79afdd0ad3afb', - }, }, }, { @@ -141,9 +138,6 @@ const seededRuns = [ noArgs: 2620209999973798n, value: 42n, }, - objectId: { - noArgs: 'dbdab5c23ea3e1f70cc53cf4', - }, }, }, { @@ -213,9 +207,6 @@ const seededRuns = [ noArgs: 9285209999907148n, value: 42n, }, - objectId: { - noArgs: '47a0124a70679b99c9ad40b0', - }, }, }, ]; @@ -233,7 +224,6 @@ const functionNames = [ 'json', 'array', 'bigInt', - 'objectId', ]; describe('datatype', () => { @@ -629,20 +619,6 @@ describe('datatype', () => { expect(generateBigInt).toBeTypeOf('bigint'); }); }); - - describe('objectId', () => { - it('should generate a objectId value', () => { - const generateObjectId = faker.datatype.objectId(); - expect(generateObjectId).toBeTypeOf('string'); - }); - - it('should return the same value if valid value is passed', () => { - const generateObjectId = faker.datatype.objectId( - '6228fb6ec55ed495fc1e5f80' - ); - expect(generateObjectId).toBe('6228fb6ec55ed495fc1e5f80'); - }); - }); } }); }); From 896c9901fb78425ad3a5847aacaffc3748cadeba Mon Sep 17 00:00:00 2001 From: Nick Hammond Date: Sat, 12 Mar 2022 17:43:38 +0000 Subject: [PATCH 3/8] refactor: Remove objectId parameter Signed-off-by: Nick Hammond --- src/database.ts | 9 +-------- test/database.spec.ts | 7 ------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/database.ts b/src/database.ts index e72db3036be..fe115d203e0 100644 --- a/src/database.ts +++ b/src/database.ts @@ -63,19 +63,12 @@ export class Database { /** * Returns an [ObjectId](https://docs.mongodb.com/manual/reference/method/ObjectId/) string * - * @param value When provided, and is a valid objectId, this method simply returns it as is. - * * @example * faker.database.objectId() // e175cac316a79afdd0ad3afb - * faker.database.objectId('6228fb6ec55ed495fc1e5f80') // 6228fb6ec55ed495fc1e5f80 */ - objectId(value?: string): string { + objectId(): string { const length = 24; - if (typeof value === 'string' && value?.length === 24) { - return value; - } - // a-z0-9 const charCodeOptions = [ { diff --git a/test/database.spec.ts b/test/database.spec.ts index 162c8b4a150..ac4e5e2c0c9 100644 --- a/test/database.spec.ts +++ b/test/database.spec.ts @@ -104,13 +104,6 @@ describe('database', () => { const generateObjectId = faker.database.objectId(); expect(generateObjectId).toBeTypeOf('string'); }); - - it('should return the same value if valid value is passed', () => { - const generateObjectId = faker.database.objectId( - '6228fb6ec55ed495fc1e5f80' - ); - expect(generateObjectId).toBe('6228fb6ec55ed495fc1e5f80'); - }); }); } }); From 9a34dd300b4d220acdde9895b134b0a2945a506c Mon Sep 17 00:00:00 2001 From: Nick Hammond Date: Sat, 12 Mar 2022 17:44:21 +0000 Subject: [PATCH 4/8] docs: Fix erroneous comment Signed-off-by: Nick Hammond --- src/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database.ts b/src/database.ts index fe115d203e0..9ede0b8aa2d 100644 --- a/src/database.ts +++ b/src/database.ts @@ -69,7 +69,7 @@ export class Database { objectId(): string { const length = 24; - // a-z0-9 + // a-f0-9 const charCodeOptions = [ { min: 'a'.charCodeAt(0), From bfa9db38f862c0685a28fcdfd534493e1fd49a0f Mon Sep 17 00:00:00 2001 From: Nick Hammond Date: Sat, 12 Mar 2022 19:30:03 +0000 Subject: [PATCH 5/8] refactor: Utilise datatype.hexadecimal for ID generation Signed-off-by: Nick Hammond --- src/database.ts | 39 ++++----------------------------------- test/database.spec.ts | 20 +++++++++++++------- 2 files changed, 17 insertions(+), 42 deletions(-) diff --git a/src/database.ts b/src/database.ts index 9ede0b8aa2d..b991697ef88 100644 --- a/src/database.ts +++ b/src/database.ts @@ -64,41 +64,10 @@ export class Database { * Returns an [ObjectId](https://docs.mongodb.com/manual/reference/method/ObjectId/) string * * @example - * faker.database.objectId() // e175cac316a79afdd0ad3afb + * faker.database.mongodbObjectId() // e175cac316a79afdd0ad3afb */ - objectId(): string { - const length = 24; - - // a-f0-9 - const charCodeOptions = [ - { - min: 'a'.charCodeAt(0), - max: 'f'.charCodeAt(0), - }, - { - min: '0'.charCodeAt(0), - max: '9'.charCodeAt(0), - }, - ]; - - let returnString = ''; - - for (let i = 0; i < length; i++) { - // randomly chose if a number or letter should be selected - const charCodeOption = - charCodeOptions[ - this.faker.datatype.number({ - min: 0, - max: charCodeOptions.length - 1, - }) - ]; - - // converts the randomly selected UTF-16 number to the corresponding character - returnString += String.fromCharCode( - this.faker.datatype.number(charCodeOption) - ); - } - - return returnString; + mongodbObjectId(): string { + // strip the "0x" from the hexadecimal output + return this.faker.datatype.hexaDecimal(24).replace('0x', '').toLowerCase(); } } diff --git a/test/database.spec.ts b/test/database.spec.ts index ac4e5e2c0c9..053f91d9f9f 100644 --- a/test/database.spec.ts +++ b/test/database.spec.ts @@ -9,7 +9,7 @@ const seededRuns = [ type: 'smallint', collation: 'utf8_bin', engine: 'MEMORY', - objectId: 'e175cac316a79afdd0ad3afb', + mongodbObjectId: '8be4abdd39321ad7d3fe01ff', }, }, { @@ -19,7 +19,7 @@ const seededRuns = [ type: 'time', collation: 'utf8_general_ci', engine: 'MyISAM', - objectId: 'dbdab5c23ea3e1f70cc53cf4', + mongodbObjectId: '5c346ba075bd57f5a62b82d7', }, }, { @@ -29,14 +29,20 @@ const seededRuns = [ type: 'geometry', collation: 'cp1250_general_ci', engine: 'ARCHIVE', - objectId: '47a0124a70679b99c9ad40b0', + mongodbObjectId: 'eadb42f0e3f4a973fab0aeef', }, }, ]; const NON_SEEDED_BASED_RUN = 5; -const functionNames = ['column', 'type', 'collation', 'engine', 'objectId']; +const functionNames = [ + 'column', + 'type', + 'collation', + 'engine', + 'mongodbObjectId', +]; describe('database', () => { afterEach(() => { @@ -99,9 +105,9 @@ describe('database', () => { }); }); - describe('objectId', () => { - it('should generate a objectId value', () => { - const generateObjectId = faker.database.objectId(); + describe('mongodbObjectId', () => { + it('should generate a MongoDB ObjectId value', () => { + const generateObjectId = faker.database.mongodbObjectId(); expect(generateObjectId).toBeTypeOf('string'); }); }); From e9fb6bd28166d45eb4b52851e821d60d983841c1 Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Wed, 6 Apr 2022 00:36:52 +0200 Subject: [PATCH 6/8] chore: apply suggestions --- src/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database.ts b/src/database.ts index b991697ef88..bfc032aa753 100644 --- a/src/database.ts +++ b/src/database.ts @@ -64,7 +64,7 @@ export class Database { * Returns an [ObjectId](https://docs.mongodb.com/manual/reference/method/ObjectId/) string * * @example - * faker.database.mongodbObjectId() // e175cac316a79afdd0ad3afb + * faker.database.mongodbObjectId() // 'e175cac316a79afdd0ad3afb' */ mongodbObjectId(): string { // strip the "0x" from the hexadecimal output From 5e154e5dd37dea411e7703236f740b142bd44d6a Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Wed, 6 Apr 2022 00:38:33 +0200 Subject: [PATCH 7/8] chore: apply suggestions --- src/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database.ts b/src/database.ts index bfc032aa753..9d746fd5a61 100644 --- a/src/database.ts +++ b/src/database.ts @@ -61,7 +61,7 @@ export class Database { } /** - * Returns an [ObjectId](https://docs.mongodb.com/manual/reference/method/ObjectId/) string + * Returns a MongoDB [ObjectId](https://docs.mongodb.com/manual/reference/method/ObjectId/) string. * * @example * faker.database.mongodbObjectId() // 'e175cac316a79afdd0ad3afb' From 1dff5dc915bdce7fc1239e809251accb6e4f5308 Mon Sep 17 00:00:00 2001 From: Shinigami Date: Wed, 6 Apr 2022 09:48:55 +0200 Subject: [PATCH 8/8] chore: use non-deprecated function --- src/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database.ts b/src/database.ts index 9d746fd5a61..8b80c927808 100644 --- a/src/database.ts +++ b/src/database.ts @@ -68,6 +68,6 @@ export class Database { */ mongodbObjectId(): string { // strip the "0x" from the hexadecimal output - return this.faker.datatype.hexaDecimal(24).replace('0x', '').toLowerCase(); + return this.faker.datatype.hexadecimal(24).replace('0x', '').toLowerCase(); } }