import {describe, it, expect, beforeEach} from 'bun:test'; import {DependencyManager} from '../../src/di/DependencyManager'; import {Logger, Database, UserService} from '../mocks'; describe('When Managing Dependencies', () => { let dependencyManager: DependencyManager; beforeEach(() => { dependencyManager = new DependencyManager(); }); describe('GIVEN classes with no dependencies are registered with the dependency manager', () => { beforeEach(() => { dependencyManager.register('Logger', Logger, [], 'transient'); dependencyManager.register('Database', Database, [], 'transient'); }); it('resolves the class', () => { const logger = dependencyManager.resolve('Logger'); expect(logger).toBeDefined(); expect(logger).toBeInstanceOf(Logger); }); describe('GIVEN the class is registered a second time', () => { it('throws an error', () => { expect(() => dependencyManager.register('Logger', Logger, [])).toThrow('Error: [Logger] is already registered'); }); }); }); describe('GIVEN a singleton class is registered with the dependency manager', () => { beforeEach(() => { dependencyManager.register('Logger', Logger, [], 'singleton'); }); it('resolves the class', () => { const logger = dependencyManager.resolve('Logger'); expect(logger).toBeDefined(); expect(logger).toBeInstanceOf(Logger); }); describe('GIVEN a UserService with Logger dependency is registered', () => { beforeEach(() => { dependencyManager.register('UserService', UserService, ['Logger'], 'singleton'); }); it('resolves the same instance when requested multiple times', () => { const userService = dependencyManager.resolve('UserService'); const userService2 = dependencyManager.resolve('UserService'); expect(userService).toBe(userService2); expect(userService2).toBe(userService); }); }); }); });