fix(api): apply feedback

This commit is contained in:
yassinedorbozgithub 2025-06-19 08:13:59 +01:00
parent 200c256abd
commit fda8ed3480

View File

@ -70,17 +70,21 @@ const extractInstances =
await findInstances(type, module, types); await findInstances(type, module, types);
/** /**
* Retrieves a provider metadata * Retrieves constructor parameter types (dependencies) of a NestJS provider class.
* @param provider - provider * Useful for inspecting dependencies to dynamically build NestJS testing modules.
* @returns a provider metadata *
* @param provider - The NestJS provider class to introspect.
* @returns An array of parameter types representing the constructor dependencies.
*/ */
const getParamTypes = (provider: Provider) => const getParamTypes = (provider: Provider) =>
Reflect.getMetadata('design:paramtypes', provider) || []; Reflect.getMetadata('design:paramtypes', provider) || [];
/** /**
* Retrieves an array of providers * Recursively resolves all unique dependencies required by a NestJS provider.
* @param parentClass - parent provider class * Essential for automating provider inclusion in NestJS unit tests.
* @returns an array of providers *
* @param parentClass - The root provider class whose dependency graph is resolved.
* @returns A complete array of unique provider dependencies.
*/ */
const getClassDependencies = (parentClass: Provider): Provider[] => { const getClassDependencies = (parentClass: Provider): Provider[] => {
const dependencies: Provider[] = []; const dependencies: Provider[] = [];
@ -110,10 +114,12 @@ const getClassDependencies = (parentClass: Provider): Provider[] => {
}; };
/** /**
* Retrieves a model * Retrieves a Mongoose model definition from the LifecycleHookManager.
* @param name - model name *
* @param suffix - model name suffix * @param name - The name of the model.
* @returns a model * @param suffix - Optional suffix to trim from the name.
* @returns The model definition.
* @throws If the model cannot be found.
*/ */
const getModel = (name: string, suffix = ''): ModelDefinition => { const getModel = (name: string, suffix = ''): ModelDefinition => {
const modelName = name.replace(suffix, ''); const modelName = name.replace(suffix, '');
@ -127,10 +133,12 @@ const getModel = (name: string, suffix = ''): ModelDefinition => {
}; };
/** /**
* Retrieves an array of nested models * Extracts nested Mongoose models from a collection of providers.
* @param extendedProviders - array of providers (Repositories) * Typically used for automating inclusion of models in test modules.
* @param suffix - suffix *
* @returns an array of nested models * @param extendedProviders - Array of providers to inspect.
* @param suffix - Suffix identifying relevant providers (e.g., 'Repository').
* @returns An array of model definitions.
*/ */
const getNestedModels = ( const getNestedModels = (
extendedProviders: Provider[], extendedProviders: Provider[],
@ -149,9 +157,10 @@ const filterNestedDependencies = (dependency: Provider) =>
dependency.valueOf().toString().slice(0, 6) === 'class '; dependency.valueOf().toString().slice(0, 6) === 'class ';
/** /**
* Checks if a the imports includes a MongooseModule * Identifies nested class-based dependencies to be automatically injected into test modules.
* @param providers - array of providers *
* @returns an array of nested dependencies * @param providers - Array of initial providers.
* @returns Array of additional nested dependencies.
*/ */
const getNestedDependencies = (providers: Provider[]): Provider[] => { const getNestedDependencies = (providers: Provider[]): Provider[] => {
const nestedDependencies = new Set<Provider>(); const nestedDependencies = new Set<Provider>();
@ -176,9 +185,11 @@ const getNestedDependencies = (providers: Provider[]): Provider[] => {
}; };
/** /**
* Checks if a the imports includes a MongooseModule * Determines if models can be automatically injected based on imports.
* @param imports - array of modules * Specifically checks for presence of MongooseModule.
* @returns true if the imports includes a MongooseModule *
* @param imports - Modules imported in the test context.
* @returns True if MongooseModule is included, enabling automatic model injection.
*/ */
const canInjectModels = (imports: buildTestingMocksProps['imports']): boolean => const canInjectModels = (imports: buildTestingMocksProps['imports']): boolean =>
(imports || []).some( (imports || []).some(
@ -186,9 +197,11 @@ const canInjectModels = (imports: buildTestingMocksProps['imports']): boolean =>
); );
/** /**
* Retrieves models * Retrieves model definitions for the provided models array.
* @param models - array of models * Supports both string references and explicit ModelDefinition objects.
* @returns an array of models *
* @param models - Array of models specified by name or definition.
* @returns Array of resolved model definitions.
*/ */
const getModels = (models: TModel[]): ModelDefinition[] => const getModels = (models: TModel[]): ModelDefinition[] =>
models.map((model) => models.map((model) =>
@ -208,6 +221,34 @@ const defaultProviders = [
}, },
]; ];
/**
* Dynamically builds a NestJS TestingModule for unit tests with automated dependency resolution.
* Includes functionality to inject models and nested providers/controllers based on provided configuration.
*
* @param props - Configuration for testing module setup.
* @returns An object containing the compiled NestJS TestingModule and helpers to retrieve or resolve mock instances.
*
* @example
* ```typescript
* describe('UserService', () => {
* let userService: UserService;
*
* beforeAll(async () => {
* const { getMocks } = await buildTestingMocks({
* autoInjectFrom: ['providers'],
* imports: [MongooseModule.forRoot('mongodb://localhost/test')],
* providers: [UserService],
* });
*
* [userService] = await getMocks([UserService]);
* });
*
* it('should be defined', () => {
* expect(userService).toBeDefined();
* });
* });
* ```
*/
export const buildTestingMocks = async ({ export const buildTestingMocks = async ({
models = [], models = [],
imports = [], imports = [],