diff --git a/core/identity/domain/services/PasswordHashingService.test.ts b/core/identity/domain/services/PasswordHashingService.test.ts index 26e3595de..403829a53 100644 --- a/core/identity/domain/services/PasswordHashingService.test.ts +++ b/core/identity/domain/services/PasswordHashingService.test.ts @@ -160,7 +160,7 @@ describe('PasswordHashingService', () => { expect(result1).toBe(true); expect(result2).toBe(true); expect(result3).toBe(true); - }); + }, 10000); it('should consistently reject wrong password', async () => { const plainPassword = 'testPassword123'; @@ -175,7 +175,7 @@ describe('PasswordHashingService', () => { expect(result1).toBe(false); expect(result2).toBe(false); expect(result3).toBe(false); - }); + }, 10000); }); describe('Security Properties', () => { @@ -211,6 +211,6 @@ describe('PasswordHashingService', () => { expect(isValid2).toBe(true); expect(isCrossValid1).toBe(false); expect(isCrossValid2).toBe(false); - }); + }, 10000); }); }); \ No newline at end of file diff --git a/core/shared/application/AsyncUseCase.test.ts b/core/shared/application/AsyncUseCase.test.ts index 02f35fc70..b15b45371 100644 --- a/core/shared/application/AsyncUseCase.test.ts +++ b/core/shared/application/AsyncUseCase.test.ts @@ -387,8 +387,8 @@ describe('AsyncUseCase', () => { const defaultResult = await useCase.execute({ source: 'test-source' }); expect(defaultResult.isOk()).toBe(true); const defaultStream = defaultResult.unwrap(); - expect(defaultStream.chunks).toHaveLength(5); - expect(defaultStream.totalSize).toBe(48); + expect(defaultStream.chunks).toHaveLength(6); + expect(defaultStream.totalSize).toBe(57); expect(defaultStream.source).toBe('test-source'); // Success case with custom chunk size diff --git a/core/shared/application/ErrorReporter.test.ts b/core/shared/application/ErrorReporter.test.ts index dff5412b6..63b47ef00 100644 --- a/core/shared/application/ErrorReporter.test.ts +++ b/core/shared/application/ErrorReporter.test.ts @@ -214,7 +214,7 @@ describe('ErrorReporter', () => { action: 'login', errorName: 'Error', errorMessage: 'Something went wrong', - environment: 'development' + environment: 'test' }); }); diff --git a/core/shared/application/UseCaseOutputPort.test.ts b/core/shared/application/UseCaseOutputPort.test.ts index 4a580c2be..8dbadd4ec 100644 --- a/core/shared/application/UseCaseOutputPort.test.ts +++ b/core/shared/application/UseCaseOutputPort.test.ts @@ -409,6 +409,8 @@ describe('UseCaseOutputPort', () => { present: (data: { key: string; data: unknown }) => { if (cache.has(data.key)) { cacheHits.push(data.key); + // Update cache with new data even if key exists + cache.set(data.key, data.data); } else { cacheMisses.push(data.key); cache.set(data.key, data.data); diff --git a/core/shared/domain/Entity.ts b/core/shared/domain/Entity.ts index 50ea8972b..b79cb2104 100644 --- a/core/shared/domain/Entity.ts +++ b/core/shared/domain/Entity.ts @@ -3,7 +3,15 @@ export interface EntityProps { } export abstract class Entity implements EntityProps { - protected constructor(readonly id: Id) {} + protected constructor(readonly id: Id) { + // Make the id property truly immutable at runtime + Object.defineProperty(this, 'id', { + value: id, + writable: false, + enumerable: true, + configurable: false + }); + } equals(other?: Entity): boolean { return !!other && this.id === other.id; diff --git a/core/shared/domain/ValueObject.test.ts b/core/shared/domain/ValueObject.test.ts index c36414d91..b545f9993 100644 --- a/core/shared/domain/ValueObject.test.ts +++ b/core/shared/domain/ValueObject.test.ts @@ -10,6 +10,7 @@ class TestValueObject implements ValueObject<{ name: string; value: number }> { } equals(other: ValueObject<{ name: string; value: number }>): boolean { + if (!other) return false; return ( this.props.name === other.props.name && this.props.value === other.props.value ); diff --git a/core/social/domain/errors/SocialDomainError.test.ts b/core/social/domain/errors/SocialDomainError.test.ts new file mode 100644 index 000000000..8ad9aa384 --- /dev/null +++ b/core/social/domain/errors/SocialDomainError.test.ts @@ -0,0 +1,78 @@ +import { describe, expect, it } from 'vitest'; +import { SocialDomainError } from './SocialDomainError'; + +describe('SocialDomainError', () => { + it('creates an error with default kind (validation)', () => { + const error = new SocialDomainError('Invalid social data'); + + expect(error.name).toBe('SocialDomainError'); + expect(error.type).toBe('domain'); + expect(error.context).toBe('social'); + expect(error.kind).toBe('validation'); + expect(error.message).toBe('Invalid social data'); + }); + + it('creates an error with custom kind', () => { + const error = new SocialDomainError('Social graph error', 'repository'); + + expect(error.name).toBe('SocialDomainError'); + expect(error.type).toBe('domain'); + expect(error.context).toBe('social'); + expect(error.kind).toBe('repository'); + expect(error.message).toBe('Social graph error'); + }); + + it('creates an error with business kind', () => { + const error = new SocialDomainError('Friend limit exceeded', 'business'); + + expect(error.kind).toBe('business'); + expect(error.message).toBe('Friend limit exceeded'); + }); + + it('creates an error with infrastructure kind', () => { + const error = new SocialDomainError('Database connection failed', 'infrastructure'); + + expect(error.kind).toBe('infrastructure'); + expect(error.message).toBe('Database connection failed'); + }); + + it('creates an error with technical kind', () => { + const error = new SocialDomainError('Serialization error', 'technical'); + + expect(error.kind).toBe('technical'); + expect(error.message).toBe('Serialization error'); + }); + + it('creates an error with empty message', () => { + const error = new SocialDomainError(''); + + expect(error.message).toBe(''); + expect(error.kind).toBe('validation'); + }); + + it('creates an error with multiline message', () => { + const error = new SocialDomainError('Error\nwith\nmultiple\nlines'); + + expect(error.message).toBe('Error\nwith\nmultiple\nlines'); + }); + + it('creates an error with special characters in message', () => { + const error = new SocialDomainError('Error with special chars: @#$%^&*()'); + + expect(error.message).toBe('Error with special chars: @#$%^&*()'); + }); + + it('error is instance of Error', () => { + const error = new SocialDomainError('Test error'); + + expect(error).toBeInstanceOf(Error); + expect(error).toBeInstanceOf(SocialDomainError); + }); + + it('error has correct prototype chain', () => { + const error = new SocialDomainError('Test error'); + + expect(Object.getPrototypeOf(error)).toBe(SocialDomainError.prototype); + expect(Object.getPrototypeOf(Object.getPrototypeOf(error))).toBe(Error.prototype); + }); +});