From 8718548d63bff94dde3efa0c2a389382cb49572a Mon Sep 17 00:00:00 2001 From: steveb Date: Wed, 6 Dec 2023 19:49:40 +0100 Subject: [PATCH 1/2] fix(typescript): correctly dump typescript files when collections name are complexe --- .../templates/agent-nodejs/typescript/models/index.hbs | 6 +++--- .../templates/agent-nodejs/typescript/models/model.hbs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/services/dumpers/templates/agent-nodejs/typescript/models/index.hbs b/src/services/dumpers/templates/agent-nodejs/typescript/models/index.hbs index 049a15a0b..9ad9d9341 100644 --- a/src/services/dumpers/templates/agent-nodejs/typescript/models/index.hbs +++ b/src/services/dumpers/templates/agent-nodejs/typescript/models/index.hbs @@ -1,17 +1,17 @@ {{#each models as |model|}} -import type { {{capitalise model.collectionName}}Interface } from './{{model.modelFileName}}'; +import type { {{capitalise model.modelName}}Interface } from './{{model.modelFileName}}'; {{/each}} import Mongoose from 'mongoose'; {{#each models as |model|}} -import { {{model.collectionName}}Schema } from './{{model.modelFileName}}'; +import { {{model.modelName}}Schema } from './{{model.modelFileName}}'; {{/each}} const connection = Mongoose.createConnection(process.env.DATABASE_URL); {{#each models as |model|}} -export const {{model.modelName}} = connection.model<{{capitalise model.collectionName}}Interface>('{{model.modelName}}', {{model.collectionName}}Schema, '{{model.collectionName}}'); +export const {{model.modelName}} = connection.model<{{capitalise model.modelName}}Interface>('{{model.modelName}}', {{model.modelName}}Schema, '{{model.collectionName}}'); {{/each}} export default connection; diff --git a/src/services/dumpers/templates/agent-nodejs/typescript/models/model.hbs b/src/services/dumpers/templates/agent-nodejs/typescript/models/model.hbs index 1bc32db52..1532aba76 100644 --- a/src/services/dumpers/templates/agent-nodejs/typescript/models/model.hbs +++ b/src/services/dumpers/templates/agent-nodejs/typescript/models/model.hbs @@ -1,12 +1,12 @@ import Mongoose from 'mongoose'; -interface {{capitalise collectionName}}Interface { +interface {{capitalise modelName}}Interface { {{#each fields as |field|}} {{wsc field.name}}: {{#if (isObject field.type)}}{{>renderNestedInterface type=field.type level=1}}{{else}}{{toInterfaceType field.type}}{{/if}}; {{/each}} } -const {{collectionName}}Schema = new Mongoose.Schema({ +const {{modelName}}Schema = new Mongoose.Schema({ {{#each fields as |field|}} {{wsc field.name}}: {{#if field.ref}}{ type: {{field.type}}, ref: '{{field.ref}}' }{{else if (isObject field.type)}}{{>renderNested type=field.type level=1}}{{else}}{{field.type}}{{/if}}, {{/each}} @@ -14,4 +14,4 @@ const {{collectionName}}Schema = new Mongoose.Schema({ timestamps: {{timestamps}}, }); -export { {{capitalise collectionName}}Interface, {{collectionName}}Schema }; +export { {{capitalise modelName}}Interface, {{modelName}}Schema }; From 1d599e9b300387eb29ee61beeefb60fe1f07e49f Mon Sep 17 00:00:00 2001 From: steveb Date: Thu, 7 Dec 2023 17:16:57 +0100 Subject: [PATCH 2/2] test: add tests --- ...ions-with-special-characters.expected.json | 28 ++++++++++++++ ...gent-nodejs-dumper-mongoose-models.test.ts | 38 +++++++++++++++++++ .../collection-special-characters/index.js | 19 ++++++++++ .../other-special-character.expected.js | 13 +++++++ .../special-character.expected.js | 13 +++++++ .../collection-special-characters/index.ts | 14 +++++++ .../other-special-character.expected.ts | 13 +++++++ .../special-character.expected.ts | 13 +++++++ 8 files changed, 151 insertions(+) create mode 100644 test/services/analyzer/expected/mongo/db-analysis-output/collections-with-special-characters.expected.json create mode 100644 test/services/dumpers/agent-nodejs/expected/javascript/mongo-models/collection-special-characters/index.js create mode 100644 test/services/dumpers/agent-nodejs/expected/javascript/mongo-models/collection-special-characters/other-special-character.expected.js create mode 100644 test/services/dumpers/agent-nodejs/expected/javascript/mongo-models/collection-special-characters/special-character.expected.js create mode 100644 test/services/dumpers/agent-nodejs/expected/typescript/mongo-models/collection-special-characters/index.ts create mode 100644 test/services/dumpers/agent-nodejs/expected/typescript/mongo-models/collection-special-characters/other-special-character.expected.ts create mode 100644 test/services/dumpers/agent-nodejs/expected/typescript/mongo-models/collection-special-characters/special-character.expected.ts diff --git a/test/services/analyzer/expected/mongo/db-analysis-output/collections-with-special-characters.expected.json b/test/services/analyzer/expected/mongo/db-analysis-output/collections-with-special-characters.expected.json new file mode 100644 index 000000000..4571e40ad --- /dev/null +++ b/test/services/analyzer/expected/mongo/db-analysis-output/collections-with-special-characters.expected.json @@ -0,0 +1,28 @@ +{ + "_special:character": { + "fields": [{ + "name": "name", + "type": "String" + }], + "options": { + "timestamps": false + }, + "primaryKeys": [ + "_id" + ], + "references": [] + }, + ":otherSpecial*character": { + "fields": [{ + "name": "age", + "type": "Number" + }], + "options": { + "timestamps": false + }, + "primaryKeys": [ + "_id" + ], + "references": [] + } +} diff --git a/test/services/dumpers/agent-nodejs/agent-nodejs-dumper-mongoose-models.test.ts b/test/services/dumpers/agent-nodejs/agent-nodejs-dumper-mongoose-models.test.ts index 3669a7d92..b37958923 100644 --- a/test/services/dumpers/agent-nodejs/agent-nodejs-dumper-mongoose-models.test.ts +++ b/test/services/dumpers/agent-nodejs/agent-nodejs-dumper-mongoose-models.test.ts @@ -6,6 +6,7 @@ import rimraf from 'rimraf'; import defaultPlan from '../../../../src/context/plan'; import AgentNodeJsDumper from '../../../../src/services/dumpers/agent-nodejs'; import languages from '../../../../src/utils/languages'; +import collectionsWithSpecialCharacters from '../../analyzer/expected/mongo/db-analysis-output/collections-with-special-characters.expected.json'; import deepNestedColumn from '../../analyzer/expected/mongo/db-analysis-output/deep-nested-fields-column.expected.json'; import deepNested from '../../analyzer/expected/mongo/db-analysis-output/deep-nested-fields.expected.json'; import hasMany from '../../analyzer/expected/mongo/db-analysis-output/hasmany.expected.json'; @@ -150,6 +151,43 @@ describe('services > dumpers > agentNodejsDumper > mongoose models', () => { 'Ignoring field so:column from collection persons as it contains column and is not valid.', ); }); + + it('should correctly dump interfaces and classes when collection has special characters', async () => { + expect.assertions(3); + + rimraf.sync(`${appRoot}/test-output/${language.name}/mongodb/`); + + await dump(language, collectionsWithSpecialCharacters); + + const expectedIndex = fs.readFileSync( + `${__dirname}/expected/${language.name}/mongo-models/collection-special-characters/index.${language.fileExtension}`, + 'utf-8', + ); + const generatedIndex = fs.readFileSync( + `${appRoot}/test-output/${language.name}/mongodb/models/index.${language.fileExtension}`, + 'utf8', + ); + const expectedOtherSpecialCharacter = fs.readFileSync( + `${__dirname}/expected/${language.name}/mongo-models/collection-special-characters/other-special-character.expected.${language.fileExtension}`, + 'utf-8', + ); + const generatedOtherSpecialCharacter = fs.readFileSync( + `${appRoot}/test-output/${language.name}/mongodb/models/other-special-character.${language.fileExtension}`, + 'utf8', + ); + const expectedSpecialCharacter = fs.readFileSync( + `${__dirname}/expected/${language.name}/mongo-models/collection-special-characters/special-character.expected.${language.fileExtension}`, + 'utf-8', + ); + const generatedSpecialCharacter = fs.readFileSync( + `${appRoot}/test-output/${language.name}/mongodb/models/special-character.${language.fileExtension}`, + 'utf8', + ); + + expect(generatedIndex).toStrictEqual(expectedIndex); + expect(generatedSpecialCharacter).toStrictEqual(expectedSpecialCharacter); + expect(generatedOtherSpecialCharacter).toStrictEqual(expectedOtherSpecialCharacter); + }); }); }); diff --git a/test/services/dumpers/agent-nodejs/expected/javascript/mongo-models/collection-special-characters/index.js b/test/services/dumpers/agent-nodejs/expected/javascript/mongo-models/collection-special-characters/index.js new file mode 100644 index 000000000..a22807c26 --- /dev/null +++ b/test/services/dumpers/agent-nodejs/expected/javascript/mongo-models/collection-special-characters/index.js @@ -0,0 +1,19 @@ +const fs = require('fs'); +const path = require('path'); +const Mongoose = require('mongoose'); + +const connection = Mongoose.createConnection(process.env.DATABASE_URL); + +fs + .readdirSync(__dirname) + .filter((file) => file !== 'index.js') + .forEach((file) => { + try { + const { schema, modelName, collectionName } = require(path.join(__dirname, file)); + connection.model(modelName, schema, collectionName); + } catch (error) { + console.error(`Model creation error: ${error}`); + } + }); + +module.exports = connection; diff --git a/test/services/dumpers/agent-nodejs/expected/javascript/mongo-models/collection-special-characters/other-special-character.expected.js b/test/services/dumpers/agent-nodejs/expected/javascript/mongo-models/collection-special-characters/other-special-character.expected.js new file mode 100644 index 000000000..42f81e447 --- /dev/null +++ b/test/services/dumpers/agent-nodejs/expected/javascript/mongo-models/collection-special-characters/other-special-character.expected.js @@ -0,0 +1,13 @@ +const Mongoose = require('mongoose'); + +const schema = new Mongoose.Schema({ + age: Number, +}, { + timestamps: false, +}); + +module.exports = { + collectionName: ':otherSpecial*character', + modelName: 'otherSpecialCharacter', + schema, +}; diff --git a/test/services/dumpers/agent-nodejs/expected/javascript/mongo-models/collection-special-characters/special-character.expected.js b/test/services/dumpers/agent-nodejs/expected/javascript/mongo-models/collection-special-characters/special-character.expected.js new file mode 100644 index 000000000..fdc454c0c --- /dev/null +++ b/test/services/dumpers/agent-nodejs/expected/javascript/mongo-models/collection-special-characters/special-character.expected.js @@ -0,0 +1,13 @@ +const Mongoose = require('mongoose'); + +const schema = new Mongoose.Schema({ + name: String, +}, { + timestamps: false, +}); + +module.exports = { + collectionName: '_special:character', + modelName: 'specialCharacter', + schema, +}; diff --git a/test/services/dumpers/agent-nodejs/expected/typescript/mongo-models/collection-special-characters/index.ts b/test/services/dumpers/agent-nodejs/expected/typescript/mongo-models/collection-special-characters/index.ts new file mode 100644 index 000000000..5cf7c7555 --- /dev/null +++ b/test/services/dumpers/agent-nodejs/expected/typescript/mongo-models/collection-special-characters/index.ts @@ -0,0 +1,14 @@ +import type { OtherSpecialCharacterInterface } from './other-special-character'; +import type { SpecialCharacterInterface } from './special-character'; + +import Mongoose from 'mongoose'; + +import { otherSpecialCharacterSchema } from './other-special-character'; +import { specialCharacterSchema } from './special-character'; + +const connection = Mongoose.createConnection(process.env.DATABASE_URL); + +export const otherSpecialCharacter = connection.model('otherSpecialCharacter', otherSpecialCharacterSchema, ':otherSpecial*character'); +export const specialCharacter = connection.model('specialCharacter', specialCharacterSchema, '_special:character'); + +export default connection; diff --git a/test/services/dumpers/agent-nodejs/expected/typescript/mongo-models/collection-special-characters/other-special-character.expected.ts b/test/services/dumpers/agent-nodejs/expected/typescript/mongo-models/collection-special-characters/other-special-character.expected.ts new file mode 100644 index 000000000..3e6dcbee6 --- /dev/null +++ b/test/services/dumpers/agent-nodejs/expected/typescript/mongo-models/collection-special-characters/other-special-character.expected.ts @@ -0,0 +1,13 @@ +import Mongoose from 'mongoose'; + +interface OtherSpecialCharacterInterface { + age: number; +} + +const otherSpecialCharacterSchema = new Mongoose.Schema({ + age: Number, +}, { + timestamps: false, +}); + +export { OtherSpecialCharacterInterface, otherSpecialCharacterSchema }; diff --git a/test/services/dumpers/agent-nodejs/expected/typescript/mongo-models/collection-special-characters/special-character.expected.ts b/test/services/dumpers/agent-nodejs/expected/typescript/mongo-models/collection-special-characters/special-character.expected.ts new file mode 100644 index 000000000..347254c87 --- /dev/null +++ b/test/services/dumpers/agent-nodejs/expected/typescript/mongo-models/collection-special-characters/special-character.expected.ts @@ -0,0 +1,13 @@ +import Mongoose from 'mongoose'; + +interface SpecialCharacterInterface { + name: string; +} + +const specialCharacterSchema = new Mongoose.Schema({ + name: String, +}, { + timestamps: false, +}); + +export { SpecialCharacterInterface, specialCharacterSchema };