90dc-core 1.16.17 → 1.16.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -16,6 +16,7 @@ export { Log } from "./lib/utils/Logger.js";
16
16
  export { SecretManager } from "./lib/utils/SecretManager.js";
17
17
  export { initializeSentry, isSentryEnabled, scrubObject, captureRequestBody, extractUserContext, buildRequestContext, buildResponseContext, reportErrorToSentry, reportMessageToSentry, type ErrorReportOptions, type SeverityLevel, } from "./lib/utils/SentryUtil.js";
18
18
  export { createMockContext, createMockUser, createAuthenticatedContext, mockDatabase, flushPromises, assertions, executeRoute, type BaseContext, type AuthenticatedContext, type RouterContext, type RouterMiddleware, type RouterLayer, type RouterLike, type SequelizeModelMethods, } from "./lib/testing/testHelpers.js";
19
+ export { TEST_UUIDS, TEST_DATES, TEST_DATA, isValidUUID, generateTestEmail, createTestUser, createTestCoach, createTestHeadCoach, createTestFinanceUser, createTestAdmin, createTestClient, wait, freezeTime, testAssertions, mockResponses, isObject, isArray, } from "./lib/testing/testFixtures.js";
19
20
  export { ConfigValidator, BaseConfigSchema, CommonSchemas, createConfig, ConfigurationError, type BaseConfig } from "./lib/config/ConfigValidator.js";
20
21
  export { AppError, ValidationError, AuthenticationError, ForbiddenError, NotFoundError, ConflictError, UnprocessableEntityError, RateLimitError, InternalServerError, ServiceUnavailableError, DatabaseError, ExternalAPIError, isAppError, isOperationalError, toAppError } from "./lib/Errors/AppError.js";
21
22
  export { ErrorMiddleware, } from "./lib/middlewares/ErrorMiddleware.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wCAAwC,CAAC;AAGvD,cAAc,yBAAyB,CAAA;AAGvC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAA;AAChF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAA;AAChG,YAAY,EACV,wBAAwB,EACxB,yBAAyB,EACzB,aAAa,GACd,MAAM,8BAA8B,CAAA;AACrC,YAAY,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAGlF,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,iBAAiB,EAAC,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,GAAG,EAAC,MAAM,uBAAuB,CAAA;AACzC,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACnB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,0BAA0B,EAC1B,YAAY,EACZ,aAAa,EACb,UAAU,EACV,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,qBAAqB,GAC3B,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,KAAK,UAAU,EAChB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EACL,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,aAAa,EACb,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,UAAU,EACX,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,eAAe,GAChB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAG5F,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAGvF,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,cAAc,EAAE,KAAK,cAAc,EAAC,MAAM,2BAA2B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wCAAwC,CAAC;AAGvD,cAAc,yBAAyB,CAAA;AAGvC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAA;AAChF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAA;AAChG,YAAY,EACV,wBAAwB,EACxB,yBAAyB,EACzB,aAAa,GACd,MAAM,8BAA8B,CAAA;AACrC,YAAY,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAGlF,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,iBAAiB,EAAC,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,GAAG,EAAC,MAAM,uBAAuB,CAAA;AACzC,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACnB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,0BAA0B,EAC1B,YAAY,EACZ,aAAa,EACb,UAAU,EACV,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,qBAAqB,GAC3B,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,IAAI,EACJ,UAAU,EACV,cAAc,EACd,aAAa,EACb,QAAQ,EACR,OAAO,GACR,MAAM,+BAA+B,CAAA;AAGtC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,KAAK,UAAU,EAChB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EACL,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,aAAa,EACb,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,UAAU,EACX,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,eAAe,GAChB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAG5F,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAGvF,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,cAAc,EAAE,KAAK,cAAc,EAAC,MAAM,2BAA2B,CAAA"}
package/dist/index.js CHANGED
@@ -19,6 +19,8 @@ export { SecretManager } from "./lib/utils/SecretManager.js";
19
19
  export { initializeSentry, isSentryEnabled, scrubObject, captureRequestBody, extractUserContext, buildRequestContext, buildResponseContext, reportErrorToSentry, reportMessageToSentry } from "./lib/utils/SentryUtil.js";
20
20
  //Testing Utilities
21
21
  export { createMockContext, createMockUser, createAuthenticatedContext, mockDatabase, flushPromises, assertions, executeRoute } from "./lib/testing/testHelpers.js";
22
+ // Testing Fixtures
23
+ export { TEST_UUIDS, TEST_DATES, TEST_DATA, isValidUUID, generateTestEmail, createTestUser, createTestCoach, createTestHeadCoach, createTestFinanceUser, createTestAdmin, createTestClient, wait, freezeTime, testAssertions, mockResponses, isObject, isArray } from "./lib/testing/testFixtures.js";
22
24
  //Config
23
25
  export { ConfigValidator, BaseConfigSchema, CommonSchemas, createConfig, ConfigurationError } from "./lib/config/ConfigValidator.js";
24
26
  //Errors
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["//Interfaces\nexport * from \"./lib/models/ProgramInterfaces.js\";\nexport * from \"./lib/models/ExerciseInterfaces.js\";\nexport * from \"./lib/models/WorkoutInterfaces.js\";\nexport * from \"./lib/models/UserInterfaces.js\";\nexport * from \"./lib/models/NotificationInterfaces.js\";\n\n//DB Models - Export all models and model arrays\nexport * from \"./lib/dbmodels/index.js\"\n\n//Clients\nexport { EmailClient } from \"./lib/clients/EmailClient.js\"\nexport { PushNotificationClient } from \"./lib/clients/PushNotificationClient.js\"\nexport { FirebasePushNotificationClient } from \"./lib/clients/FirebasePushNotificationClient.js\"\nexport type {\n SendTemplateEmailRequest,\n BatchTemplateEmailRequest,\n EmailResponse,\n} from \"./lib/clients/EmailClient.js\"\nexport type { NotificationPayload } from \"./lib/clients/PushNotificationClient.js\"\n\n//Utils\nexport {AuthenticationUtil} from \"./lib/utils/AuthenticationUtil.js\"\nexport {NotificationsUtil} from \"./lib/utils/NotificationsUtil.js\"\nexport {NotificationClient} from \"./lib/utils/NotificationClient.js\"\nexport {Log} from \"./lib/utils/Logger.js\"\nexport {SecretManager} from \"./lib/utils/SecretManager.js\"\nexport {\n initializeSentry,\n isSentryEnabled,\n scrubObject,\n captureRequestBody,\n extractUserContext,\n buildRequestContext,\n buildResponseContext,\n reportErrorToSentry,\n reportMessageToSentry,\n type ErrorReportOptions,\n type SeverityLevel,\n} from \"./lib/utils/SentryUtil.js\"\n\n//Testing Utilities\nexport {\n createMockContext,\n createMockUser,\n createAuthenticatedContext,\n mockDatabase,\n flushPromises,\n assertions,\n executeRoute,\n type BaseContext,\n type AuthenticatedContext,\n type RouterContext,\n type RouterMiddleware,\n type RouterLayer,\n type RouterLike,\n type SequelizeModelMethods,\n} from \"./lib/testing/testHelpers.js\"\n\n//Config\nexport {\n ConfigValidator,\n BaseConfigSchema,\n CommonSchemas,\n createConfig,\n ConfigurationError,\n type BaseConfig\n} from \"./lib/config/ConfigValidator.js\"\n\n//Errors\nexport {\n AppError,\n ValidationError,\n AuthenticationError,\n ForbiddenError,\n NotFoundError,\n ConflictError,\n UnprocessableEntityError,\n RateLimitError,\n InternalServerError,\n ServiceUnavailableError,\n DatabaseError,\n ExternalAPIError,\n isAppError,\n isOperationalError,\n toAppError\n} from \"./lib/Errors/AppError.js\"\n\n//Middlewares\nexport {\n ErrorMiddleware,\n} from \"./lib/middlewares/ErrorMiddleware.js\"\nexport { validate, type ValidationConfig } from \"./lib/middlewares/ValidationMiddleware.js\";\n\n//Controllers\nexport { BaseController, type RouteConfig } from \"./lib/controllers/BaseController.js\";\n\n\nexport {RedisClient} from \"./lib/classes/Redis.js\"\nexport {DatabaseClient, type DatabaseConfig} from \"./lib/classes/Database.js\""],"names":["EmailClient","PushNotificationClient","FirebasePushNotificationClient","AuthenticationUtil","NotificationsUtil","NotificationClient","Log","SecretManager","initializeSentry","isSentryEnabled","scrubObject","captureRequestBody","extractUserContext","buildRequestContext","buildResponseContext","reportErrorToSentry","reportMessageToSentry","createMockContext","createMockUser","createAuthenticatedContext","mockDatabase","flushPromises","assertions","executeRoute","ConfigValidator","BaseConfigSchema","CommonSchemas","createConfig","ConfigurationError","AppError","ValidationError","AuthenticationError","ForbiddenError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","ServiceUnavailableError","DatabaseError","ExternalAPIError","isAppError","isOperationalError","toAppError","ErrorMiddleware","validate","BaseController","RedisClient","DatabaseClient"],"mappings":"AAAA,YAAY;AACZ,cAAc,oCAAoC;AAClD,cAAc,qCAAqC;AACnD,cAAc,oCAAoC;AAClD,cAAc,iCAAiC;AAC/C,cAAc,yCAAyC;AAEvD,gDAAgD;AAChD,cAAc,iBAAyB;AAEvC,SAAS;AACT,SAASA,WAAW,QAAQ,+BAA8B;AAC1D,SAASC,sBAAsB,QAAQ,0CAAyC;AAChF,SAASC,8BAA8B,QAAQ,kDAAiD;AAQhG,OAAO;AACP,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,iBAAiB,QAAO,mCAAkC;AAClE,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,GAAG,QAAO,wBAAuB;AACzC,SAAQC,aAAa,QAAO,+BAA8B;AAC1D,SACEC,gBAAgB,EAChBC,eAAe,EACfC,WAAW,EACXC,kBAAkB,EAClBC,kBAAkB,EAClBC,mBAAmB,EACnBC,oBAAoB,EACpBC,mBAAmB,EACnBC,qBAAqB,QAGhB,4BAA2B;AAElC,mBAAmB;AACnB,SACEC,iBAAiB,EACjBC,cAAc,EACdC,0BAA0B,EAC1BC,YAAY,EACZC,aAAa,EACbC,UAAU,EACVC,YAAY,QAQP,+BAA8B;AAErC,QAAQ;AACR,SACEC,eAAe,EACfC,gBAAgB,EAChBC,aAAa,EACbC,YAAY,EACZC,kBAAkB,QAEb,kCAAiC;AAExC,QAAQ;AACR,SACEC,QAAQ,EACRC,eAAe,EACfC,mBAAmB,EACnBC,cAAc,EACdC,aAAa,EACbC,aAAa,EACbC,wBAAwB,EACxBC,cAAc,EACdC,mBAAmB,EACnBC,uBAAuB,EACvBC,aAAa,EACbC,gBAAgB,EAChBC,UAAU,EACVC,kBAAkB,EAClBC,UAAU,QACL,2BAA0B;AAEjC,aAAa;AACb,SACEC,eAAe,QACV,uCAAsC;AAC7C,SAASC,QAAQ,QAA+B,4CAA4C;AAE5F,aAAa;AACb,SAASC,cAAc,QAA0B,sCAAsC;AAGvF,SAAQC,WAAW,QAAO,yBAAwB;AAClD,SAAQC,cAAc,QAA4B,4BAA2B"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["//Interfaces\nexport * from \"./lib/models/ProgramInterfaces.js\";\nexport * from \"./lib/models/ExerciseInterfaces.js\";\nexport * from \"./lib/models/WorkoutInterfaces.js\";\nexport * from \"./lib/models/UserInterfaces.js\";\nexport * from \"./lib/models/NotificationInterfaces.js\";\n\n//DB Models - Export all models and model arrays\nexport * from \"./lib/dbmodels/index.js\"\n\n//Clients\nexport { EmailClient } from \"./lib/clients/EmailClient.js\"\nexport { PushNotificationClient } from \"./lib/clients/PushNotificationClient.js\"\nexport { FirebasePushNotificationClient } from \"./lib/clients/FirebasePushNotificationClient.js\"\nexport type {\n SendTemplateEmailRequest,\n BatchTemplateEmailRequest,\n EmailResponse,\n} from \"./lib/clients/EmailClient.js\"\nexport type { NotificationPayload } from \"./lib/clients/PushNotificationClient.js\"\n\n//Utils\nexport {AuthenticationUtil} from \"./lib/utils/AuthenticationUtil.js\"\nexport {NotificationsUtil} from \"./lib/utils/NotificationsUtil.js\"\nexport {NotificationClient} from \"./lib/utils/NotificationClient.js\"\nexport {Log} from \"./lib/utils/Logger.js\"\nexport {SecretManager} from \"./lib/utils/SecretManager.js\"\nexport {\n initializeSentry,\n isSentryEnabled,\n scrubObject,\n captureRequestBody,\n extractUserContext,\n buildRequestContext,\n buildResponseContext,\n reportErrorToSentry,\n reportMessageToSentry,\n type ErrorReportOptions,\n type SeverityLevel,\n} from \"./lib/utils/SentryUtil.js\"\n\n//Testing Utilities\nexport {\n createMockContext,\n createMockUser,\n createAuthenticatedContext,\n mockDatabase,\n flushPromises,\n assertions,\n executeRoute,\n type BaseContext,\n type AuthenticatedContext,\n type RouterContext,\n type RouterMiddleware,\n type RouterLayer,\n type RouterLike,\n type SequelizeModelMethods,\n} from \"./lib/testing/testHelpers.js\"\n\n// Testing Fixtures\nexport {\n TEST_UUIDS,\n TEST_DATES,\n TEST_DATA,\n isValidUUID,\n generateTestEmail,\n createTestUser,\n createTestCoach,\n createTestHeadCoach,\n createTestFinanceUser,\n createTestAdmin,\n createTestClient,\n wait,\n freezeTime,\n testAssertions,\n mockResponses,\n isObject,\n isArray,\n} from \"./lib/testing/testFixtures.js\"\n\n//Config\nexport {\n ConfigValidator,\n BaseConfigSchema,\n CommonSchemas,\n createConfig,\n ConfigurationError,\n type BaseConfig\n} from \"./lib/config/ConfigValidator.js\"\n\n//Errors\nexport {\n AppError,\n ValidationError,\n AuthenticationError,\n ForbiddenError,\n NotFoundError,\n ConflictError,\n UnprocessableEntityError,\n RateLimitError,\n InternalServerError,\n ServiceUnavailableError,\n DatabaseError,\n ExternalAPIError,\n isAppError,\n isOperationalError,\n toAppError\n} from \"./lib/Errors/AppError.js\"\n\n//Middlewares\nexport {\n ErrorMiddleware,\n} from \"./lib/middlewares/ErrorMiddleware.js\"\nexport { validate, type ValidationConfig } from \"./lib/middlewares/ValidationMiddleware.js\";\n\n//Controllers\nexport { BaseController, type RouteConfig } from \"./lib/controllers/BaseController.js\";\n\n\nexport {RedisClient} from \"./lib/classes/Redis.js\"\nexport {DatabaseClient, type DatabaseConfig} from \"./lib/classes/Database.js\""],"names":["EmailClient","PushNotificationClient","FirebasePushNotificationClient","AuthenticationUtil","NotificationsUtil","NotificationClient","Log","SecretManager","initializeSentry","isSentryEnabled","scrubObject","captureRequestBody","extractUserContext","buildRequestContext","buildResponseContext","reportErrorToSentry","reportMessageToSentry","createMockContext","createMockUser","createAuthenticatedContext","mockDatabase","flushPromises","assertions","executeRoute","TEST_UUIDS","TEST_DATES","TEST_DATA","isValidUUID","generateTestEmail","createTestUser","createTestCoach","createTestHeadCoach","createTestFinanceUser","createTestAdmin","createTestClient","wait","freezeTime","testAssertions","mockResponses","isObject","isArray","ConfigValidator","BaseConfigSchema","CommonSchemas","createConfig","ConfigurationError","AppError","ValidationError","AuthenticationError","ForbiddenError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","ServiceUnavailableError","DatabaseError","ExternalAPIError","isAppError","isOperationalError","toAppError","ErrorMiddleware","validate","BaseController","RedisClient","DatabaseClient"],"mappings":"AAAA,YAAY;AACZ,cAAc,oCAAoC;AAClD,cAAc,qCAAqC;AACnD,cAAc,oCAAoC;AAClD,cAAc,iCAAiC;AAC/C,cAAc,yCAAyC;AAEvD,gDAAgD;AAChD,cAAc,iBAAyB;AAEvC,SAAS;AACT,SAASA,WAAW,QAAQ,+BAA8B;AAC1D,SAASC,sBAAsB,QAAQ,0CAAyC;AAChF,SAASC,8BAA8B,QAAQ,kDAAiD;AAQhG,OAAO;AACP,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,iBAAiB,QAAO,mCAAkC;AAClE,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,GAAG,QAAO,wBAAuB;AACzC,SAAQC,aAAa,QAAO,+BAA8B;AAC1D,SACEC,gBAAgB,EAChBC,eAAe,EACfC,WAAW,EACXC,kBAAkB,EAClBC,kBAAkB,EAClBC,mBAAmB,EACnBC,oBAAoB,EACpBC,mBAAmB,EACnBC,qBAAqB,QAGhB,4BAA2B;AAElC,mBAAmB;AACnB,SACEC,iBAAiB,EACjBC,cAAc,EACdC,0BAA0B,EAC1BC,YAAY,EACZC,aAAa,EACbC,UAAU,EACVC,YAAY,QAQP,+BAA8B;AAErC,mBAAmB;AACnB,SACEC,UAAU,EACVC,UAAU,EACVC,SAAS,EACTC,WAAW,EACXC,iBAAiB,EACjBC,cAAc,EACdC,eAAe,EACfC,mBAAmB,EACnBC,qBAAqB,EACrBC,eAAe,EACfC,gBAAgB,EAChBC,IAAI,EACJC,UAAU,EACVC,cAAc,EACdC,aAAa,EACbC,QAAQ,EACRC,OAAO,QACF,gCAA+B;AAEtC,QAAQ;AACR,SACEC,eAAe,EACfC,gBAAgB,EAChBC,aAAa,EACbC,YAAY,EACZC,kBAAkB,QAEb,kCAAiC;AAExC,QAAQ;AACR,SACEC,QAAQ,EACRC,eAAe,EACfC,mBAAmB,EACnBC,cAAc,EACdC,aAAa,EACbC,aAAa,EACbC,wBAAwB,EACxBC,cAAc,EACdC,mBAAmB,EACnBC,uBAAuB,EACvBC,aAAa,EACbC,gBAAgB,EAChBC,UAAU,EACVC,kBAAkB,EAClBC,UAAU,QACL,2BAA0B;AAEjC,aAAa;AACb,SACEC,eAAe,QACV,uCAAsC;AAC7C,SAASC,QAAQ,QAA+B,4CAA4C;AAE5F,aAAa;AACb,SAASC,cAAc,QAA0B,sCAAsC;AAGvF,SAAQC,WAAW,QAAO,yBAAwB;AAClD,SAAQC,cAAc,QAA4B,4BAA2B"}
@@ -0,0 +1,429 @@
1
+ /**
2
+ * Test Fixtures and Utilities
3
+ *
4
+ * Centralized test data generators and helpers for consistent, type-safe testing
5
+ * across all 90dc projects.
6
+ *
7
+ * @module testFixtures
8
+ *
9
+ * Key Principles:
10
+ * - Industry-standard UUID v4 format (RFC 4122)
11
+ * - Complete, realistic mock data with proper TypeScript types
12
+ * - Reusable and composable fixtures
13
+ * - Deterministic test data for reproducible tests
14
+ * - No magic strings or fake IDs
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { TEST_UUIDS, createTestUser, freezeTime } from '90dc-core';
19
+ *
20
+ * const user = createTestUser({
21
+ * userUuid: TEST_UUIDS.USER_1,
22
+ * role: 'coach'
23
+ * });
24
+ * ```
25
+ */
26
+ import type { UserTypes } from '../models/UserInterfaces.js';
27
+ /**
28
+ * Pre-generated valid UUID v4 identifiers for deterministic testing.
29
+ *
30
+ * These UUIDs follow RFC 4122 format and are safe to use across all tests.
31
+ * Using predefined UUIDs ensures test reproducibility and makes debugging easier.
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * const coachUuid = TEST_UUIDS.COACH_1;
36
+ * const clientUuid = TEST_UUIDS.CLIENT_1;
37
+ * ```
38
+ */
39
+ export declare const TEST_UUIDS: {
40
+ /** Generic user UUID #1 */
41
+ readonly USER_1: "11111111-1111-4111-8111-111111111111";
42
+ /** Generic user UUID #2 */
43
+ readonly USER_2: "22222222-2222-4222-8222-222222222222";
44
+ /** Generic user UUID #3 */
45
+ readonly USER_3: "33333333-3333-4333-8333-333333333333";
46
+ /** Generic user UUID #4 */
47
+ readonly USER_4: "44444444-4444-4444-8444-444444444444";
48
+ /** Generic user UUID #5 */
49
+ readonly USER_5: "55555555-5555-4555-8555-555555555555";
50
+ /** Generic user UUID #6 */
51
+ readonly USER_6: "66666666-6666-4666-8666-666666666666";
52
+ /** Generic user UUID #7 */
53
+ readonly USER_7: "77777777-7777-4777-8777-777777777777";
54
+ /** Generic user UUID #8 */
55
+ readonly USER_8: "88888888-8888-4888-8888-888888888888";
56
+ /** Generic user UUID #9 */
57
+ readonly USER_9: "99999999-9999-4999-8999-999999999999";
58
+ /** Generic user UUID #10 */
59
+ readonly USER_10: "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa";
60
+ /** Coach user UUID #1 */
61
+ readonly COACH_1: "c1111111-c111-4c11-8c11-c11111111111";
62
+ /** Coach user UUID #2 */
63
+ readonly COACH_2: "c2222222-c222-4c22-8c22-c22222222222";
64
+ /** Coach user UUID #3 */
65
+ readonly COACH_3: "c3333333-c333-4c33-8c33-c33333333333";
66
+ /** Head coach UUID */
67
+ readonly HEAD_COACH: "hc111111-1111-4111-8111-111111111111";
68
+ /** Client user UUID #1 */
69
+ readonly CLIENT_1: "cccccccc-cccc-4ccc-8ccc-cccccccccccc";
70
+ /** Client user UUID #2 */
71
+ readonly CLIENT_2: "dddddddd-dddd-4ddd-8ddd-dddddddddddd";
72
+ /** Client user UUID #3 */
73
+ readonly CLIENT_3: "eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee";
74
+ /** Finance role user UUID */
75
+ readonly FINANCE: "ffffffff-ffff-4fff-8fff-ffffffffffff";
76
+ /** Admin user UUID */
77
+ readonly ADMIN: "adadadad-adad-4dad-8dad-adadadadadad";
78
+ /** Super admin user UUID */
79
+ readonly SUPER_ADMIN: "aaaaaaaa-0000-4000-8000-000000000000";
80
+ };
81
+ /**
82
+ * Validates if a string is a valid UUID v4
83
+ *
84
+ * @param value - String to validate
85
+ * @returns True if valid UUID v4, false otherwise
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * isValidUUID('11111111-1111-4111-8111-111111111111'); // true
90
+ * isValidUUID('invalid-uuid'); // false
91
+ * ```
92
+ */
93
+ export declare function isValidUUID(value: string): boolean;
94
+ /**
95
+ * Generates a unique email address for testing to avoid collisions.
96
+ *
97
+ * Format: `{prefix}-{timestamp}-{random}@{domain}`
98
+ *
99
+ * @param prefix - Email prefix (default: 'test')
100
+ * @param domain - Email domain (default: 'test.com')
101
+ * @returns Unique email address
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * generateTestEmail('coach'); // 'coach-1234567890-abc12@test.com'
106
+ * generateTestEmail('user', 'example.com'); // 'user-1234567890-xyz98@example.com'
107
+ * ```
108
+ */
109
+ export declare function generateTestEmail(prefix?: string, domain?: string): string;
110
+ /**
111
+ * Creates a complete mock user with sensible defaults and type safety.
112
+ *
113
+ * All fields are properly typed and provide realistic test data.
114
+ *
115
+ * @param overrides - Partial user properties to override defaults
116
+ * @returns Complete UserTypes object
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * const user = createTestUser({
121
+ * userUuid: TEST_UUIDS.USER_1,
122
+ * role: 'coach',
123
+ * email: 'coach@test.com'
124
+ * });
125
+ * ```
126
+ */
127
+ export declare function createTestUser(overrides?: Partial<UserTypes>): UserTypes;
128
+ /**
129
+ * Creates a mock coach user with coach-specific defaults.
130
+ *
131
+ * @param overrides - Partial user properties to override defaults
132
+ * @returns Complete coach UserTypes object
133
+ *
134
+ * @example
135
+ * ```typescript
136
+ * const coach = createTestCoach({
137
+ * userUuid: TEST_UUIDS.COACH_1,
138
+ * firstName: 'John',
139
+ * lastName: 'Coach'
140
+ * });
141
+ * ```
142
+ */
143
+ export declare function createTestCoach(overrides?: Partial<UserTypes>): UserTypes;
144
+ /**
145
+ * Creates a mock head coach user.
146
+ *
147
+ * @param overrides - Partial user properties to override defaults
148
+ * @returns Complete head coach UserTypes object
149
+ */
150
+ export declare function createTestHeadCoach(overrides?: Partial<UserTypes>): UserTypes;
151
+ /**
152
+ * Creates a mock finance user.
153
+ *
154
+ * Typically used for Richard (finance role) in financial tracking tests.
155
+ *
156
+ * @param overrides - Partial user properties to override defaults
157
+ * @returns Complete finance UserTypes object
158
+ */
159
+ export declare function createTestFinanceUser(overrides?: Partial<UserTypes>): UserTypes;
160
+ /**
161
+ * Creates a mock admin user.
162
+ *
163
+ * @param overrides - Partial user properties to override defaults
164
+ * @returns Complete admin UserTypes object
165
+ */
166
+ export declare function createTestAdmin(overrides?: Partial<UserTypes>): UserTypes;
167
+ /**
168
+ * Creates a mock client user (regular user role).
169
+ *
170
+ * @param overrides - Partial user properties to override defaults
171
+ * @returns Complete client UserTypes object
172
+ */
173
+ export declare function createTestClient(overrides?: Partial<UserTypes>): UserTypes;
174
+ /**
175
+ * Fixed date constants for deterministic testing.
176
+ *
177
+ * Using consistent dates across tests ensures reproducible behavior
178
+ * and easier debugging of time-dependent logic.
179
+ */
180
+ export declare const TEST_DATES: {
181
+ /** Fixed date for deterministic tests: 2026-03-01 10:00:00 UTC */
182
+ readonly FIXED_DATE: Date;
183
+ /** Start of month: 2026-03-01 00:00:00 UTC */
184
+ readonly MONTH_START: Date;
185
+ /** End of month: 2026-03-31 23:59:59 UTC */
186
+ readonly MONTH_END: Date;
187
+ /** Yesterday relative to FIXED_DATE */
188
+ readonly YESTERDAY: Date;
189
+ /** Tomorrow relative to FIXED_DATE */
190
+ readonly TOMORROW: Date;
191
+ /** One week ago relative to FIXED_DATE */
192
+ readonly WEEK_AGO: Date;
193
+ /** One week from now relative to FIXED_DATE */
194
+ readonly WEEK_AHEAD: Date;
195
+ };
196
+ /**
197
+ * Common test data patterns and constants.
198
+ */
199
+ export declare const TEST_DATA: {
200
+ /**
201
+ * Valid month format strings (YYYY-MM) for financial tracking
202
+ */
203
+ readonly MONTHS: {
204
+ readonly CURRENT: "2026-03";
205
+ readonly PREVIOUS: "2026-02";
206
+ readonly NEXT: "2026-04";
207
+ readonly JANUARY: "2026-01";
208
+ readonly DECEMBER: "2025-12";
209
+ };
210
+ /**
211
+ * Common test email domains
212
+ */
213
+ readonly EMAIL_DOMAINS: readonly ["test.com", "example.com", "test.org", "example.org"];
214
+ /**
215
+ * Sample notes for testing note-taking features
216
+ */
217
+ readonly SAMPLE_NOTES: readonly ["Client is making great progress with consistency", "Needs additional support with nutrition planning", "Struggling with morning routine, discussed strategies", "Excellent workout form, ready to increase weight", "Discussed goal adjustments for next quarter"];
218
+ /**
219
+ * Common HTTP status codes for testing
220
+ */
221
+ readonly HTTP_STATUS: {
222
+ readonly OK: 200;
223
+ readonly CREATED: 201;
224
+ readonly NO_CONTENT: 204;
225
+ readonly BAD_REQUEST: 400;
226
+ readonly UNAUTHORIZED: 401;
227
+ readonly FORBIDDEN: 403;
228
+ readonly NOT_FOUND: 404;
229
+ readonly CONFLICT: 409;
230
+ readonly INTERNAL_SERVER_ERROR: 500;
231
+ };
232
+ };
233
+ /**
234
+ * Waits for all pending promises to resolve.
235
+ *
236
+ * Useful for testing async operations that may have multiple
237
+ * promise chains.
238
+ *
239
+ * @returns Promise that resolves when all pending promises complete
240
+ *
241
+ * @example
242
+ * ```typescript
243
+ * await flushPromises();
244
+ * expect(mockCallback).toHaveBeenCalled();
245
+ * ```
246
+ */
247
+ export declare function flushPromises(): Promise<void>;
248
+ /**
249
+ * Waits for a specific amount of time.
250
+ *
251
+ * @param ms - Milliseconds to wait
252
+ * @returns Promise that resolves after the specified time
253
+ *
254
+ * @example
255
+ * ```typescript
256
+ * await wait(1000); // Wait 1 second
257
+ * ```
258
+ */
259
+ export declare function wait(ms: number): Promise<void>;
260
+ /**
261
+ * Freezes time to a specific date for deterministic testing.
262
+ *
263
+ * This function mocks the global Date object to always return
264
+ * the specified date. Useful for testing time-dependent logic.
265
+ *
266
+ * **Important:** Call the returned cleanup function to restore
267
+ * normal Date behavior after your test.
268
+ *
269
+ * @param date - Date to freeze time to (default: TEST_DATES.FIXED_DATE)
270
+ * @returns Cleanup function to restore original Date behavior
271
+ *
272
+ * @example
273
+ * ```typescript
274
+ * const cleanup = freezeTime(new Date('2026-03-01'));
275
+ * const now = new Date(); // Always returns 2026-03-01
276
+ * cleanup(); // Restore normal behavior
277
+ * ```
278
+ */
279
+ export declare function freezeTime(date?: Date): () => void;
280
+ /**
281
+ * Custom assertion helpers for common test scenarios.
282
+ *
283
+ * These assertions provide better error messages and type safety
284
+ * compared to basic Jest assertions.
285
+ */
286
+ export declare const testAssertions: {
287
+ /**
288
+ * Asserts that a value is a valid UUID v4 (RFC 4122).
289
+ *
290
+ * @param value - String to validate
291
+ * @param message - Optional custom error message
292
+ * @throws Error if value is not a valid UUID v4
293
+ *
294
+ * @example
295
+ * ```typescript
296
+ * testAssertions.assertValidUUID('11111111-1111-4111-8111-111111111111');
297
+ * ```
298
+ */
299
+ assertValidUUID(value: string, message?: string): void;
300
+ /**
301
+ * Asserts that a date is within a specified range (inclusive).
302
+ *
303
+ * @param date - Date to check
304
+ * @param start - Start of valid range
305
+ * @param end - End of valid range
306
+ * @param message - Optional custom error message
307
+ * @throws Error if date is outside range
308
+ */
309
+ assertDateInRange(date: Date, start: Date, end: Date, message?: string): void;
310
+ /**
311
+ * Asserts that an array has a specific length.
312
+ *
313
+ * @param array - Array to check
314
+ * @param expectedLength - Expected length
315
+ * @param message - Optional custom error message
316
+ * @throws Error if array length doesn't match
317
+ */
318
+ assertLength<T>(array: readonly T[], expectedLength: number, message?: string): void;
319
+ /**
320
+ * Asserts that a value is truthy.
321
+ *
322
+ * @param value - Value to check
323
+ * @param message - Optional custom error message
324
+ * @throws Error if value is falsy
325
+ */
326
+ assertTruthy(value: unknown, message?: string): asserts value;
327
+ /**
328
+ * Asserts that a value is falsy.
329
+ *
330
+ * @param value - Value to check
331
+ * @param message - Optional custom error message
332
+ * @throws Error if value is truthy
333
+ */
334
+ assertFalsy(value: unknown, message?: string): void;
335
+ /**
336
+ * Asserts that two dates are equal (within 1 second tolerance).
337
+ *
338
+ * @param actual - Actual date
339
+ * @param expected - Expected date
340
+ * @param message - Optional custom error message
341
+ * @throws Error if dates are not equal within tolerance
342
+ */
343
+ assertDateEquals(actual: Date, expected: Date, message?: string): void;
344
+ };
345
+ /**
346
+ * Standard response builders for common API response patterns.
347
+ *
348
+ * These helpers ensure consistent response shapes across tests.
349
+ */
350
+ export declare const mockResponses: {
351
+ /**
352
+ * Creates a success response object.
353
+ *
354
+ * @param data - Response data
355
+ * @returns Success response object
356
+ *
357
+ * @example
358
+ * ```typescript
359
+ * const response = mockResponses.success({ id: 1, name: 'Test' });
360
+ * // { success: true, data: { id: 1, name: 'Test' } }
361
+ * ```
362
+ */
363
+ success<T>(data: T): {
364
+ success: true;
365
+ data: T;
366
+ };
367
+ /**
368
+ * Creates an error response object.
369
+ *
370
+ * @param message - Error message
371
+ * @param code - Optional error code
372
+ * @returns Error response object
373
+ *
374
+ * @example
375
+ * ```typescript
376
+ * const response = mockResponses.error('Not found', 'NOT_FOUND');
377
+ * // { success: false, error: 'Not found', code: 'NOT_FOUND' }
378
+ * ```
379
+ */
380
+ error(message: string, code?: string): {
381
+ success: false;
382
+ error: string;
383
+ code?: string;
384
+ };
385
+ /**
386
+ * Creates a paginated response object.
387
+ *
388
+ * @param items - Array of items for current page
389
+ * @param total - Total number of items across all pages
390
+ * @param page - Current page number (1-indexed)
391
+ * @param limit - Items per page
392
+ * @returns Paginated response object
393
+ *
394
+ * @example
395
+ * ```typescript
396
+ * const response = mockResponses.paginated([item1, item2], 100, 1, 10);
397
+ * // {
398
+ * // items: [item1, item2],
399
+ * // total: 100,
400
+ * // page: 1,
401
+ * // limit: 10,
402
+ * // hasMore: true
403
+ * // }
404
+ * ```
405
+ */
406
+ paginated<T>(items: T[], total: number, page?: number, limit?: number): {
407
+ items: T[];
408
+ total: number;
409
+ page: number;
410
+ limit: number;
411
+ hasMore: boolean;
412
+ totalPages: number;
413
+ };
414
+ };
415
+ /**
416
+ * Type guard to check if a value is a non-null object.
417
+ *
418
+ * @param value - Value to check
419
+ * @returns True if value is a non-null object
420
+ */
421
+ export declare function isObject(value: unknown): value is Record<string, unknown>;
422
+ /**
423
+ * Type guard to check if a value is an array.
424
+ *
425
+ * @param value - Value to check
426
+ * @returns True if value is an array
427
+ */
428
+ export declare function isArray(value: unknown): value is unknown[];
429
+ //# sourceMappingURL=testFixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testFixtures.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/testFixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,520 @@
1
+ /**
2
+ * Test Fixtures and Utilities
3
+ *
4
+ * Centralized test data generators and helpers for consistent, type-safe testing
5
+ * across all 90dc projects.
6
+ *
7
+ * @module testFixtures
8
+ *
9
+ * Key Principles:
10
+ * - Industry-standard UUID v4 format (RFC 4122)
11
+ * - Complete, realistic mock data with proper TypeScript types
12
+ * - Reusable and composable fixtures
13
+ * - Deterministic test data for reproducible tests
14
+ * - No magic strings or fake IDs
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { TEST_UUIDS, createTestUser, freezeTime } from '90dc-core';
19
+ *
20
+ * const user = createTestUser({
21
+ * userUuid: TEST_UUIDS.USER_1,
22
+ * role: 'coach'
23
+ * });
24
+ * ```
25
+ */ /**
26
+ * Pre-generated valid UUID v4 identifiers for deterministic testing.
27
+ *
28
+ * These UUIDs follow RFC 4122 format and are safe to use across all tests.
29
+ * Using predefined UUIDs ensures test reproducibility and makes debugging easier.
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * const coachUuid = TEST_UUIDS.COACH_1;
34
+ * const clientUuid = TEST_UUIDS.CLIENT_1;
35
+ * ```
36
+ */ export const TEST_UUIDS = {
37
+ /** Generic user UUID #1 */ USER_1: '11111111-1111-4111-8111-111111111111',
38
+ /** Generic user UUID #2 */ USER_2: '22222222-2222-4222-8222-222222222222',
39
+ /** Generic user UUID #3 */ USER_3: '33333333-3333-4333-8333-333333333333',
40
+ /** Generic user UUID #4 */ USER_4: '44444444-4444-4444-8444-444444444444',
41
+ /** Generic user UUID #5 */ USER_5: '55555555-5555-4555-8555-555555555555',
42
+ /** Generic user UUID #6 */ USER_6: '66666666-6666-4666-8666-666666666666',
43
+ /** Generic user UUID #7 */ USER_7: '77777777-7777-4777-8777-777777777777',
44
+ /** Generic user UUID #8 */ USER_8: '88888888-8888-4888-8888-888888888888',
45
+ /** Generic user UUID #9 */ USER_9: '99999999-9999-4999-8999-999999999999',
46
+ /** Generic user UUID #10 */ USER_10: 'aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa',
47
+ /** Coach user UUID #1 */ COACH_1: 'c1111111-c111-4c11-8c11-c11111111111',
48
+ /** Coach user UUID #2 */ COACH_2: 'c2222222-c222-4c22-8c22-c22222222222',
49
+ /** Coach user UUID #3 */ COACH_3: 'c3333333-c333-4c33-8c33-c33333333333',
50
+ /** Head coach UUID */ HEAD_COACH: 'hc111111-1111-4111-8111-111111111111',
51
+ /** Client user UUID #1 */ CLIENT_1: 'cccccccc-cccc-4ccc-8ccc-cccccccccccc',
52
+ /** Client user UUID #2 */ CLIENT_2: 'dddddddd-dddd-4ddd-8ddd-dddddddddddd',
53
+ /** Client user UUID #3 */ CLIENT_3: 'eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee',
54
+ /** Finance role user UUID */ FINANCE: 'ffffffff-ffff-4fff-8fff-ffffffffffff',
55
+ /** Admin user UUID */ ADMIN: 'adadadad-adad-4dad-8dad-adadadadadad',
56
+ /** Super admin user UUID */ SUPER_ADMIN: 'aaaaaaaa-0000-4000-8000-000000000000'
57
+ };
58
+ /**
59
+ * UUID validation regex (RFC 4122 v4)
60
+ * @internal
61
+ */ const UUID_V4_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
62
+ /**
63
+ * Validates if a string is a valid UUID v4
64
+ *
65
+ * @param value - String to validate
66
+ * @returns True if valid UUID v4, false otherwise
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * isValidUUID('11111111-1111-4111-8111-111111111111'); // true
71
+ * isValidUUID('invalid-uuid'); // false
72
+ * ```
73
+ */ export function isValidUUID(value) {
74
+ return UUID_V4_REGEX.test(value);
75
+ }
76
+ /**
77
+ * Generates a unique email address for testing to avoid collisions.
78
+ *
79
+ * Format: `{prefix}-{timestamp}-{random}@{domain}`
80
+ *
81
+ * @param prefix - Email prefix (default: 'test')
82
+ * @param domain - Email domain (default: 'test.com')
83
+ * @returns Unique email address
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * generateTestEmail('coach'); // 'coach-1234567890-abc12@test.com'
88
+ * generateTestEmail('user', 'example.com'); // 'user-1234567890-xyz98@example.com'
89
+ * ```
90
+ */ export function generateTestEmail(prefix = 'test', domain = 'test.com') {
91
+ const timestamp = Date.now();
92
+ const random = Math.random().toString(36).slice(2, 7);
93
+ return `${prefix}-${timestamp}-${random}@${domain}`;
94
+ }
95
+ /**
96
+ * Creates a complete mock user with sensible defaults and type safety.
97
+ *
98
+ * All fields are properly typed and provide realistic test data.
99
+ *
100
+ * @param overrides - Partial user properties to override defaults
101
+ * @returns Complete UserTypes object
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * const user = createTestUser({
106
+ * userUuid: TEST_UUIDS.USER_1,
107
+ * role: 'coach',
108
+ * email: 'coach@test.com'
109
+ * });
110
+ * ```
111
+ */ export function createTestUser(overrides) {
112
+ return {
113
+ userUuid: TEST_UUIDS.USER_1,
114
+ email: generateTestEmail('user'),
115
+ firstName: 'Test',
116
+ lastName: 'User',
117
+ role: 'user',
118
+ avatar: '1',
119
+ isSubscriptionActive: true,
120
+ ...overrides
121
+ };
122
+ }
123
+ /**
124
+ * Creates a mock coach user with coach-specific defaults.
125
+ *
126
+ * @param overrides - Partial user properties to override defaults
127
+ * @returns Complete coach UserTypes object
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * const coach = createTestCoach({
132
+ * userUuid: TEST_UUIDS.COACH_1,
133
+ * firstName: 'John',
134
+ * lastName: 'Coach'
135
+ * });
136
+ * ```
137
+ */ export function createTestCoach(overrides) {
138
+ return createTestUser({
139
+ userUuid: TEST_UUIDS.COACH_1,
140
+ role: 'coach',
141
+ email: generateTestEmail('coach'),
142
+ firstName: 'Coach',
143
+ lastName: 'Test',
144
+ ...overrides
145
+ });
146
+ }
147
+ /**
148
+ * Creates a mock head coach user.
149
+ *
150
+ * @param overrides - Partial user properties to override defaults
151
+ * @returns Complete head coach UserTypes object
152
+ */ export function createTestHeadCoach(overrides) {
153
+ return createTestUser({
154
+ userUuid: TEST_UUIDS.HEAD_COACH,
155
+ role: 'head-coach',
156
+ email: generateTestEmail('head-coach'),
157
+ firstName: 'Head',
158
+ lastName: 'Coach',
159
+ ...overrides
160
+ });
161
+ }
162
+ /**
163
+ * Creates a mock finance user.
164
+ *
165
+ * Typically used for Richard (finance role) in financial tracking tests.
166
+ *
167
+ * @param overrides - Partial user properties to override defaults
168
+ * @returns Complete finance UserTypes object
169
+ */ export function createTestFinanceUser(overrides) {
170
+ return createTestUser({
171
+ userUuid: TEST_UUIDS.FINANCE,
172
+ role: 'finance',
173
+ email: generateTestEmail('finance'),
174
+ firstName: 'Richard',
175
+ lastName: 'Finance',
176
+ ...overrides
177
+ });
178
+ }
179
+ /**
180
+ * Creates a mock admin user.
181
+ *
182
+ * @param overrides - Partial user properties to override defaults
183
+ * @returns Complete admin UserTypes object
184
+ */ export function createTestAdmin(overrides) {
185
+ return createTestUser({
186
+ userUuid: TEST_UUIDS.ADMIN,
187
+ role: 'admin',
188
+ email: generateTestEmail('admin'),
189
+ firstName: 'Admin',
190
+ lastName: 'User',
191
+ ...overrides
192
+ });
193
+ }
194
+ /**
195
+ * Creates a mock client user (regular user role).
196
+ *
197
+ * @param overrides - Partial user properties to override defaults
198
+ * @returns Complete client UserTypes object
199
+ */ export function createTestClient(overrides) {
200
+ return createTestUser({
201
+ userUuid: TEST_UUIDS.CLIENT_1,
202
+ role: 'user',
203
+ email: generateTestEmail('client'),
204
+ firstName: 'Client',
205
+ lastName: 'User',
206
+ ...overrides
207
+ });
208
+ }
209
+ /**
210
+ * Fixed date constants for deterministic testing.
211
+ *
212
+ * Using consistent dates across tests ensures reproducible behavior
213
+ * and easier debugging of time-dependent logic.
214
+ */ export const TEST_DATES = {
215
+ /** Fixed date for deterministic tests: 2026-03-01 10:00:00 UTC */ FIXED_DATE: new Date('2026-03-01T10:00:00.000Z'),
216
+ /** Start of month: 2026-03-01 00:00:00 UTC */ MONTH_START: new Date('2026-03-01T00:00:00.000Z'),
217
+ /** End of month: 2026-03-31 23:59:59 UTC */ MONTH_END: new Date('2026-03-31T23:59:59.999Z'),
218
+ /** Yesterday relative to FIXED_DATE */ YESTERDAY: new Date('2026-02-28T10:00:00.000Z'),
219
+ /** Tomorrow relative to FIXED_DATE */ TOMORROW: new Date('2026-03-02T10:00:00.000Z'),
220
+ /** One week ago relative to FIXED_DATE */ WEEK_AGO: new Date('2026-02-22T10:00:00.000Z'),
221
+ /** One week from now relative to FIXED_DATE */ WEEK_AHEAD: new Date('2026-03-08T10:00:00.000Z')
222
+ };
223
+ /**
224
+ * Common test data patterns and constants.
225
+ */ export const TEST_DATA = {
226
+ /**
227
+ * Valid month format strings (YYYY-MM) for financial tracking
228
+ */ MONTHS: {
229
+ CURRENT: '2026-03',
230
+ PREVIOUS: '2026-02',
231
+ NEXT: '2026-04',
232
+ JANUARY: '2026-01',
233
+ DECEMBER: '2025-12'
234
+ },
235
+ /**
236
+ * Common test email domains
237
+ */ EMAIL_DOMAINS: [
238
+ 'test.com',
239
+ 'example.com',
240
+ 'test.org',
241
+ 'example.org'
242
+ ],
243
+ /**
244
+ * Sample notes for testing note-taking features
245
+ */ SAMPLE_NOTES: [
246
+ 'Client is making great progress with consistency',
247
+ 'Needs additional support with nutrition planning',
248
+ 'Struggling with morning routine, discussed strategies',
249
+ 'Excellent workout form, ready to increase weight',
250
+ 'Discussed goal adjustments for next quarter'
251
+ ],
252
+ /**
253
+ * Common HTTP status codes for testing
254
+ */ HTTP_STATUS: {
255
+ OK: 200,
256
+ CREATED: 201,
257
+ NO_CONTENT: 204,
258
+ BAD_REQUEST: 400,
259
+ UNAUTHORIZED: 401,
260
+ FORBIDDEN: 403,
261
+ NOT_FOUND: 404,
262
+ CONFLICT: 409,
263
+ INTERNAL_SERVER_ERROR: 500
264
+ }
265
+ };
266
+ /**
267
+ * Waits for all pending promises to resolve.
268
+ *
269
+ * Useful for testing async operations that may have multiple
270
+ * promise chains.
271
+ *
272
+ * @returns Promise that resolves when all pending promises complete
273
+ *
274
+ * @example
275
+ * ```typescript
276
+ * await flushPromises();
277
+ * expect(mockCallback).toHaveBeenCalled();
278
+ * ```
279
+ */ export async function flushPromises() {
280
+ return new Promise((resolve)=>setImmediate(resolve));
281
+ }
282
+ /**
283
+ * Waits for a specific amount of time.
284
+ *
285
+ * @param ms - Milliseconds to wait
286
+ * @returns Promise that resolves after the specified time
287
+ *
288
+ * @example
289
+ * ```typescript
290
+ * await wait(1000); // Wait 1 second
291
+ * ```
292
+ */ export async function wait(ms) {
293
+ return new Promise((resolve)=>setTimeout(resolve, ms));
294
+ }
295
+ /**
296
+ * Original Date class reference for restoring after time mocking
297
+ * @internal
298
+ */ let originalDate;
299
+ /**
300
+ * Freezes time to a specific date for deterministic testing.
301
+ *
302
+ * This function mocks the global Date object to always return
303
+ * the specified date. Useful for testing time-dependent logic.
304
+ *
305
+ * **Important:** Call the returned cleanup function to restore
306
+ * normal Date behavior after your test.
307
+ *
308
+ * @param date - Date to freeze time to (default: TEST_DATES.FIXED_DATE)
309
+ * @returns Cleanup function to restore original Date behavior
310
+ *
311
+ * @example
312
+ * ```typescript
313
+ * const cleanup = freezeTime(new Date('2026-03-01'));
314
+ * const now = new Date(); // Always returns 2026-03-01
315
+ * cleanup(); // Restore normal behavior
316
+ * ```
317
+ */ export function freezeTime(date = TEST_DATES.FIXED_DATE) {
318
+ originalDate = Date;
319
+ const frozenTime = new Date(date).getTime();
320
+ // Intentionally mocking global Date for testing purposes
321
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
322
+ global.Date = class MockDate extends originalDate {
323
+ constructor(...args){
324
+ if (args.length === 0) {
325
+ super(frozenTime);
326
+ } else {
327
+ super(...args);
328
+ }
329
+ }
330
+ static now() {
331
+ return frozenTime;
332
+ }
333
+ };
334
+ // Preserve static methods
335
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
336
+ global.Date.UTC = originalDate.UTC;
337
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
338
+ global.Date.parse = originalDate.parse;
339
+ return ()=>{
340
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
341
+ global.Date = originalDate;
342
+ };
343
+ }
344
+ /**
345
+ * Custom assertion helpers for common test scenarios.
346
+ *
347
+ * These assertions provide better error messages and type safety
348
+ * compared to basic Jest assertions.
349
+ */ export const testAssertions = {
350
+ /**
351
+ * Asserts that a value is a valid UUID v4 (RFC 4122).
352
+ *
353
+ * @param value - String to validate
354
+ * @param message - Optional custom error message
355
+ * @throws Error if value is not a valid UUID v4
356
+ *
357
+ * @example
358
+ * ```typescript
359
+ * testAssertions.assertValidUUID('11111111-1111-4111-8111-111111111111');
360
+ * ```
361
+ */ assertValidUUID (value, message) {
362
+ if (!isValidUUID(value)) {
363
+ throw new Error(message || `Expected valid UUID v4, got: ${value}`);
364
+ }
365
+ },
366
+ /**
367
+ * Asserts that a date is within a specified range (inclusive).
368
+ *
369
+ * @param date - Date to check
370
+ * @param start - Start of valid range
371
+ * @param end - End of valid range
372
+ * @param message - Optional custom error message
373
+ * @throws Error if date is outside range
374
+ */ assertDateInRange (date, start, end, message) {
375
+ if (date < start || date > end) {
376
+ throw new Error(message || `Date ${date.toISOString()} not in range ${start.toISOString()} to ${end.toISOString()}`);
377
+ }
378
+ },
379
+ /**
380
+ * Asserts that an array has a specific length.
381
+ *
382
+ * @param array - Array to check
383
+ * @param expectedLength - Expected length
384
+ * @param message - Optional custom error message
385
+ * @throws Error if array length doesn't match
386
+ */ assertLength (array, expectedLength, message) {
387
+ if (array.length !== expectedLength) {
388
+ throw new Error(message || `Expected array length ${expectedLength}, got ${array.length}`);
389
+ }
390
+ },
391
+ /**
392
+ * Asserts that a value is truthy.
393
+ *
394
+ * @param value - Value to check
395
+ * @param message - Optional custom error message
396
+ * @throws Error if value is falsy
397
+ */ assertTruthy (value, message) {
398
+ if (!value) {
399
+ throw new Error(message || `Expected truthy value, got: ${value}`);
400
+ }
401
+ },
402
+ /**
403
+ * Asserts that a value is falsy.
404
+ *
405
+ * @param value - Value to check
406
+ * @param message - Optional custom error message
407
+ * @throws Error if value is truthy
408
+ */ assertFalsy (value, message) {
409
+ if (value) {
410
+ throw new Error(message || `Expected falsy value, got: ${value}`);
411
+ }
412
+ },
413
+ /**
414
+ * Asserts that two dates are equal (within 1 second tolerance).
415
+ *
416
+ * @param actual - Actual date
417
+ * @param expected - Expected date
418
+ * @param message - Optional custom error message
419
+ * @throws Error if dates are not equal within tolerance
420
+ */ assertDateEquals (actual, expected, message) {
421
+ const tolerance = 1000; // 1 second
422
+ const diff = Math.abs(actual.getTime() - expected.getTime());
423
+ if (diff > tolerance) {
424
+ throw new Error(message || `Dates are not equal. Expected: ${expected.toISOString()}, Got: ${actual.toISOString()}`);
425
+ }
426
+ }
427
+ };
428
+ /**
429
+ * Standard response builders for common API response patterns.
430
+ *
431
+ * These helpers ensure consistent response shapes across tests.
432
+ */ export const mockResponses = {
433
+ /**
434
+ * Creates a success response object.
435
+ *
436
+ * @param data - Response data
437
+ * @returns Success response object
438
+ *
439
+ * @example
440
+ * ```typescript
441
+ * const response = mockResponses.success({ id: 1, name: 'Test' });
442
+ * // { success: true, data: { id: 1, name: 'Test' } }
443
+ * ```
444
+ */ success (data) {
445
+ return {
446
+ success: true,
447
+ data
448
+ };
449
+ },
450
+ /**
451
+ * Creates an error response object.
452
+ *
453
+ * @param message - Error message
454
+ * @param code - Optional error code
455
+ * @returns Error response object
456
+ *
457
+ * @example
458
+ * ```typescript
459
+ * const response = mockResponses.error('Not found', 'NOT_FOUND');
460
+ * // { success: false, error: 'Not found', code: 'NOT_FOUND' }
461
+ * ```
462
+ */ error (message, code) {
463
+ return code ? {
464
+ success: false,
465
+ error: message,
466
+ code
467
+ } : {
468
+ success: false,
469
+ error: message
470
+ };
471
+ },
472
+ /**
473
+ * Creates a paginated response object.
474
+ *
475
+ * @param items - Array of items for current page
476
+ * @param total - Total number of items across all pages
477
+ * @param page - Current page number (1-indexed)
478
+ * @param limit - Items per page
479
+ * @returns Paginated response object
480
+ *
481
+ * @example
482
+ * ```typescript
483
+ * const response = mockResponses.paginated([item1, item2], 100, 1, 10);
484
+ * // {
485
+ * // items: [item1, item2],
486
+ * // total: 100,
487
+ * // page: 1,
488
+ * // limit: 10,
489
+ * // hasMore: true
490
+ * // }
491
+ * ```
492
+ */ paginated (items, total, page = 1, limit = 10) {
493
+ return {
494
+ items,
495
+ total,
496
+ page,
497
+ limit,
498
+ hasMore: page * limit < total,
499
+ totalPages: Math.ceil(total / limit)
500
+ };
501
+ }
502
+ };
503
+ /**
504
+ * Type guard to check if a value is a non-null object.
505
+ *
506
+ * @param value - Value to check
507
+ * @returns True if value is a non-null object
508
+ */ export function isObject(value) {
509
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
510
+ }
511
+ /**
512
+ * Type guard to check if a value is an array.
513
+ *
514
+ * @param value - Value to check
515
+ * @returns True if value is an array
516
+ */ export function isArray(value) {
517
+ return Array.isArray(value);
518
+ }
519
+
520
+ //# sourceMappingURL=testFixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/testing/testFixtures.ts"],"sourcesContent":["/**\n * Test Fixtures and Utilities\n *\n * Centralized test data generators and helpers for consistent, type-safe testing\n * across all 90dc projects.\n *\n * @module testFixtures\n *\n * Key Principles:\n * - Industry-standard UUID v4 format (RFC 4122)\n * - Complete, realistic mock data with proper TypeScript types\n * - Reusable and composable fixtures\n * - Deterministic test data for reproducible tests\n * - No magic strings or fake IDs\n *\n * @example\n * ```typescript\n * import { TEST_UUIDS, createTestUser, freezeTime } from '90dc-core';\n *\n * const user = createTestUser({\n * userUuid: TEST_UUIDS.USER_1,\n * role: 'coach'\n * });\n * ```\n */\n\nimport type { UserTypes } from '../models/UserInterfaces.js';\n\n/**\n * Pre-generated valid UUID v4 identifiers for deterministic testing.\n *\n * These UUIDs follow RFC 4122 format and are safe to use across all tests.\n * Using predefined UUIDs ensures test reproducibility and makes debugging easier.\n *\n * @example\n * ```typescript\n * const coachUuid = TEST_UUIDS.COACH_1;\n * const clientUuid = TEST_UUIDS.CLIENT_1;\n * ```\n */\nexport const TEST_UUIDS = {\n /** Generic user UUID #1 */\n USER_1: '11111111-1111-4111-8111-111111111111',\n /** Generic user UUID #2 */\n USER_2: '22222222-2222-4222-8222-222222222222',\n /** Generic user UUID #3 */\n USER_3: '33333333-3333-4333-8333-333333333333',\n /** Generic user UUID #4 */\n USER_4: '44444444-4444-4444-8444-444444444444',\n /** Generic user UUID #5 */\n USER_5: '55555555-5555-4555-8555-555555555555',\n /** Generic user UUID #6 */\n USER_6: '66666666-6666-4666-8666-666666666666',\n /** Generic user UUID #7 */\n USER_7: '77777777-7777-4777-8777-777777777777',\n /** Generic user UUID #8 */\n USER_8: '88888888-8888-4888-8888-888888888888',\n /** Generic user UUID #9 */\n USER_9: '99999999-9999-4999-8999-999999999999',\n /** Generic user UUID #10 */\n USER_10: 'aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa',\n\n /** Coach user UUID #1 */\n COACH_1: 'c1111111-c111-4c11-8c11-c11111111111',\n /** Coach user UUID #2 */\n COACH_2: 'c2222222-c222-4c22-8c22-c22222222222',\n /** Coach user UUID #3 */\n COACH_3: 'c3333333-c333-4c33-8c33-c33333333333',\n\n /** Head coach UUID */\n HEAD_COACH: 'hc111111-1111-4111-8111-111111111111',\n\n /** Client user UUID #1 */\n CLIENT_1: 'cccccccc-cccc-4ccc-8ccc-cccccccccccc',\n /** Client user UUID #2 */\n CLIENT_2: 'dddddddd-dddd-4ddd-8ddd-dddddddddddd',\n /** Client user UUID #3 */\n CLIENT_3: 'eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee',\n\n /** Finance role user UUID */\n FINANCE: 'ffffffff-ffff-4fff-8fff-ffffffffffff',\n\n /** Admin user UUID */\n ADMIN: 'adadadad-adad-4dad-8dad-adadadadadad',\n\n /** Super admin user UUID */\n SUPER_ADMIN: 'aaaaaaaa-0000-4000-8000-000000000000',\n} as const;\n\n/**\n * UUID validation regex (RFC 4122 v4)\n * @internal\n */\nconst UUID_V4_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Validates if a string is a valid UUID v4\n *\n * @param value - String to validate\n * @returns True if valid UUID v4, false otherwise\n *\n * @example\n * ```typescript\n * isValidUUID('11111111-1111-4111-8111-111111111111'); // true\n * isValidUUID('invalid-uuid'); // false\n * ```\n */\nexport function isValidUUID(value: string): boolean {\n return UUID_V4_REGEX.test(value);\n}\n\n/**\n * Generates a unique email address for testing to avoid collisions.\n *\n * Format: `{prefix}-{timestamp}-{random}@{domain}`\n *\n * @param prefix - Email prefix (default: 'test')\n * @param domain - Email domain (default: 'test.com')\n * @returns Unique email address\n *\n * @example\n * ```typescript\n * generateTestEmail('coach'); // 'coach-1234567890-abc12@test.com'\n * generateTestEmail('user', 'example.com'); // 'user-1234567890-xyz98@example.com'\n * ```\n */\nexport function generateTestEmail(\n prefix: string = 'test',\n domain: string = 'test.com',\n): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).slice(2, 7);\n return `${prefix}-${timestamp}-${random}@${domain}`;\n}\n\n/**\n * Creates a complete mock user with sensible defaults and type safety.\n *\n * All fields are properly typed and provide realistic test data.\n *\n * @param overrides - Partial user properties to override defaults\n * @returns Complete UserTypes object\n *\n * @example\n * ```typescript\n * const user = createTestUser({\n * userUuid: TEST_UUIDS.USER_1,\n * role: 'coach',\n * email: 'coach@test.com'\n * });\n * ```\n */\nexport function createTestUser(overrides?: Partial<UserTypes>): UserTypes {\n return {\n userUuid: TEST_UUIDS.USER_1,\n email: generateTestEmail('user'),\n firstName: 'Test',\n lastName: 'User',\n role: 'user',\n avatar: '1',\n isSubscriptionActive: true,\n ...overrides,\n };\n}\n\n/**\n * Creates a mock coach user with coach-specific defaults.\n *\n * @param overrides - Partial user properties to override defaults\n * @returns Complete coach UserTypes object\n *\n * @example\n * ```typescript\n * const coach = createTestCoach({\n * userUuid: TEST_UUIDS.COACH_1,\n * firstName: 'John',\n * lastName: 'Coach'\n * });\n * ```\n */\nexport function createTestCoach(overrides?: Partial<UserTypes>): UserTypes {\n return createTestUser({\n userUuid: TEST_UUIDS.COACH_1,\n role: 'coach',\n email: generateTestEmail('coach'),\n firstName: 'Coach',\n lastName: 'Test',\n ...overrides,\n });\n}\n\n/**\n * Creates a mock head coach user.\n *\n * @param overrides - Partial user properties to override defaults\n * @returns Complete head coach UserTypes object\n */\nexport function createTestHeadCoach(overrides?: Partial<UserTypes>): UserTypes {\n return createTestUser({\n userUuid: TEST_UUIDS.HEAD_COACH,\n role: 'head-coach',\n email: generateTestEmail('head-coach'),\n firstName: 'Head',\n lastName: 'Coach',\n ...overrides,\n });\n}\n\n/**\n * Creates a mock finance user.\n *\n * Typically used for Richard (finance role) in financial tracking tests.\n *\n * @param overrides - Partial user properties to override defaults\n * @returns Complete finance UserTypes object\n */\nexport function createTestFinanceUser(overrides?: Partial<UserTypes>): UserTypes {\n return createTestUser({\n userUuid: TEST_UUIDS.FINANCE,\n role: 'finance',\n email: generateTestEmail('finance'),\n firstName: 'Richard',\n lastName: 'Finance',\n ...overrides,\n });\n}\n\n/**\n * Creates a mock admin user.\n *\n * @param overrides - Partial user properties to override defaults\n * @returns Complete admin UserTypes object\n */\nexport function createTestAdmin(overrides?: Partial<UserTypes>): UserTypes {\n return createTestUser({\n userUuid: TEST_UUIDS.ADMIN,\n role: 'admin',\n email: generateTestEmail('admin'),\n firstName: 'Admin',\n lastName: 'User',\n ...overrides,\n });\n}\n\n/**\n * Creates a mock client user (regular user role).\n *\n * @param overrides - Partial user properties to override defaults\n * @returns Complete client UserTypes object\n */\nexport function createTestClient(overrides?: Partial<UserTypes>): UserTypes {\n return createTestUser({\n userUuid: TEST_UUIDS.CLIENT_1,\n role: 'user',\n email: generateTestEmail('client'),\n firstName: 'Client',\n lastName: 'User',\n ...overrides,\n });\n}\n\n/**\n * Fixed date constants for deterministic testing.\n *\n * Using consistent dates across tests ensures reproducible behavior\n * and easier debugging of time-dependent logic.\n */\nexport const TEST_DATES = {\n /** Fixed date for deterministic tests: 2026-03-01 10:00:00 UTC */\n FIXED_DATE: new Date('2026-03-01T10:00:00.000Z'),\n\n /** Start of month: 2026-03-01 00:00:00 UTC */\n MONTH_START: new Date('2026-03-01T00:00:00.000Z'),\n\n /** End of month: 2026-03-31 23:59:59 UTC */\n MONTH_END: new Date('2026-03-31T23:59:59.999Z'),\n\n /** Yesterday relative to FIXED_DATE */\n YESTERDAY: new Date('2026-02-28T10:00:00.000Z'),\n\n /** Tomorrow relative to FIXED_DATE */\n TOMORROW: new Date('2026-03-02T10:00:00.000Z'),\n\n /** One week ago relative to FIXED_DATE */\n WEEK_AGO: new Date('2026-02-22T10:00:00.000Z'),\n\n /** One week from now relative to FIXED_DATE */\n WEEK_AHEAD: new Date('2026-03-08T10:00:00.000Z'),\n} as const;\n\n/**\n * Common test data patterns and constants.\n */\nexport const TEST_DATA = {\n /**\n * Valid month format strings (YYYY-MM) for financial tracking\n */\n MONTHS: {\n CURRENT: '2026-03',\n PREVIOUS: '2026-02',\n NEXT: '2026-04',\n JANUARY: '2026-01',\n DECEMBER: '2025-12',\n },\n\n /**\n * Common test email domains\n */\n EMAIL_DOMAINS: ['test.com', 'example.com', 'test.org', 'example.org'] as const,\n\n /**\n * Sample notes for testing note-taking features\n */\n SAMPLE_NOTES: [\n 'Client is making great progress with consistency',\n 'Needs additional support with nutrition planning',\n 'Struggling with morning routine, discussed strategies',\n 'Excellent workout form, ready to increase weight',\n 'Discussed goal adjustments for next quarter',\n ] as const,\n\n /**\n * Common HTTP status codes for testing\n */\n HTTP_STATUS: {\n OK: 200,\n CREATED: 201,\n NO_CONTENT: 204,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n CONFLICT: 409,\n INTERNAL_SERVER_ERROR: 500,\n } as const,\n} as const;\n\n/**\n * Waits for all pending promises to resolve.\n *\n * Useful for testing async operations that may have multiple\n * promise chains.\n *\n * @returns Promise that resolves when all pending promises complete\n *\n * @example\n * ```typescript\n * await flushPromises();\n * expect(mockCallback).toHaveBeenCalled();\n * ```\n */\nexport async function flushPromises(): Promise<void> {\n return new Promise((resolve) => setImmediate(resolve));\n}\n\n/**\n * Waits for a specific amount of time.\n *\n * @param ms - Milliseconds to wait\n * @returns Promise that resolves after the specified time\n *\n * @example\n * ```typescript\n * await wait(1000); // Wait 1 second\n * ```\n */\nexport async function wait(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Original Date class reference for restoring after time mocking\n * @internal\n */\nlet originalDate: typeof Date;\n\n/**\n * Freezes time to a specific date for deterministic testing.\n *\n * This function mocks the global Date object to always return\n * the specified date. Useful for testing time-dependent logic.\n *\n * **Important:** Call the returned cleanup function to restore\n * normal Date behavior after your test.\n *\n * @param date - Date to freeze time to (default: TEST_DATES.FIXED_DATE)\n * @returns Cleanup function to restore original Date behavior\n *\n * @example\n * ```typescript\n * const cleanup = freezeTime(new Date('2026-03-01'));\n * const now = new Date(); // Always returns 2026-03-01\n * cleanup(); // Restore normal behavior\n * ```\n */\nexport function freezeTime(date: Date = TEST_DATES.FIXED_DATE): () => void {\n originalDate = Date;\n const frozenTime = new Date(date).getTime();\n\n // Intentionally mocking global Date for testing purposes\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (global as any).Date = class MockDate extends originalDate {\n constructor(...args: unknown[]) {\n if (args.length === 0) {\n super(frozenTime);\n } else {\n super(...(args as [number | string]));\n }\n }\n\n static override now(): number {\n return frozenTime;\n }\n };\n\n // Preserve static methods\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (global as any).Date.UTC = originalDate.UTC;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (global as any).Date.parse = originalDate.parse;\n\n return () => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (global as any).Date = originalDate;\n };\n}\n\n/**\n * Custom assertion helpers for common test scenarios.\n *\n * These assertions provide better error messages and type safety\n * compared to basic Jest assertions.\n */\nexport const testAssertions = {\n /**\n * Asserts that a value is a valid UUID v4 (RFC 4122).\n *\n * @param value - String to validate\n * @param message - Optional custom error message\n * @throws Error if value is not a valid UUID v4\n *\n * @example\n * ```typescript\n * testAssertions.assertValidUUID('11111111-1111-4111-8111-111111111111');\n * ```\n */\n assertValidUUID(value: string, message?: string): void {\n if (!isValidUUID(value)) {\n throw new Error(\n message || `Expected valid UUID v4, got: ${value}`,\n );\n }\n },\n\n /**\n * Asserts that a date is within a specified range (inclusive).\n *\n * @param date - Date to check\n * @param start - Start of valid range\n * @param end - End of valid range\n * @param message - Optional custom error message\n * @throws Error if date is outside range\n */\n assertDateInRange(\n date: Date,\n start: Date,\n end: Date,\n message?: string,\n ): void {\n if (date < start || date > end) {\n throw new Error(\n message ||\n `Date ${date.toISOString()} not in range ${start.toISOString()} to ${end.toISOString()}`,\n );\n }\n },\n\n /**\n * Asserts that an array has a specific length.\n *\n * @param array - Array to check\n * @param expectedLength - Expected length\n * @param message - Optional custom error message\n * @throws Error if array length doesn't match\n */\n assertLength<T>(\n array: readonly T[],\n expectedLength: number,\n message?: string,\n ): void {\n if (array.length !== expectedLength) {\n throw new Error(\n message ||\n `Expected array length ${expectedLength}, got ${array.length}`,\n );\n }\n },\n\n /**\n * Asserts that a value is truthy.\n *\n * @param value - Value to check\n * @param message - Optional custom error message\n * @throws Error if value is falsy\n */\n assertTruthy(value: unknown, message?: string): asserts value {\n if (!value) {\n throw new Error(message || `Expected truthy value, got: ${value}`);\n }\n },\n\n /**\n * Asserts that a value is falsy.\n *\n * @param value - Value to check\n * @param message - Optional custom error message\n * @throws Error if value is truthy\n */\n assertFalsy(value: unknown, message?: string): void {\n if (value) {\n throw new Error(message || `Expected falsy value, got: ${value}`);\n }\n },\n\n /**\n * Asserts that two dates are equal (within 1 second tolerance).\n *\n * @param actual - Actual date\n * @param expected - Expected date\n * @param message - Optional custom error message\n * @throws Error if dates are not equal within tolerance\n */\n assertDateEquals(\n actual: Date,\n expected: Date,\n message?: string,\n ): void {\n const tolerance = 1000; // 1 second\n const diff = Math.abs(actual.getTime() - expected.getTime());\n if (diff > tolerance) {\n throw new Error(\n message ||\n `Dates are not equal. Expected: ${expected.toISOString()}, Got: ${actual.toISOString()}`,\n );\n }\n },\n};\n\n/**\n * Standard response builders for common API response patterns.\n *\n * These helpers ensure consistent response shapes across tests.\n */\nexport const mockResponses = {\n /**\n * Creates a success response object.\n *\n * @param data - Response data\n * @returns Success response object\n *\n * @example\n * ```typescript\n * const response = mockResponses.success({ id: 1, name: 'Test' });\n * // { success: true, data: { id: 1, name: 'Test' } }\n * ```\n */\n success<T>(data: T): { success: true; data: T } {\n return { success: true, data };\n },\n\n /**\n * Creates an error response object.\n *\n * @param message - Error message\n * @param code - Optional error code\n * @returns Error response object\n *\n * @example\n * ```typescript\n * const response = mockResponses.error('Not found', 'NOT_FOUND');\n * // { success: false, error: 'Not found', code: 'NOT_FOUND' }\n * ```\n */\n error(\n message: string,\n code?: string,\n ): { success: false; error: string; code?: string } {\n return code\n ? { success: false, error: message, code }\n : { success: false, error: message };\n },\n\n /**\n * Creates a paginated response object.\n *\n * @param items - Array of items for current page\n * @param total - Total number of items across all pages\n * @param page - Current page number (1-indexed)\n * @param limit - Items per page\n * @returns Paginated response object\n *\n * @example\n * ```typescript\n * const response = mockResponses.paginated([item1, item2], 100, 1, 10);\n * // {\n * // items: [item1, item2],\n * // total: 100,\n * // page: 1,\n * // limit: 10,\n * // hasMore: true\n * // }\n * ```\n */\n paginated<T>(\n items: T[],\n total: number,\n page: number = 1,\n limit: number = 10,\n ): {\n items: T[];\n total: number;\n page: number;\n limit: number;\n hasMore: boolean;\n totalPages: number;\n } {\n return {\n items,\n total,\n page,\n limit,\n hasMore: page * limit < total,\n totalPages: Math.ceil(total / limit),\n };\n },\n};\n\n/**\n * Type guard to check if a value is a non-null object.\n *\n * @param value - Value to check\n * @returns True if value is a non-null object\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Type guard to check if a value is an array.\n *\n * @param value - Value to check\n * @returns True if value is an array\n */\nexport function isArray(value: unknown): value is unknown[] {\n return Array.isArray(value);\n}\n"],"names":["TEST_UUIDS","USER_1","USER_2","USER_3","USER_4","USER_5","USER_6","USER_7","USER_8","USER_9","USER_10","COACH_1","COACH_2","COACH_3","HEAD_COACH","CLIENT_1","CLIENT_2","CLIENT_3","FINANCE","ADMIN","SUPER_ADMIN","UUID_V4_REGEX","isValidUUID","value","test","generateTestEmail","prefix","domain","timestamp","Date","now","random","Math","toString","slice","createTestUser","overrides","userUuid","email","firstName","lastName","role","avatar","isSubscriptionActive","createTestCoach","createTestHeadCoach","createTestFinanceUser","createTestAdmin","createTestClient","TEST_DATES","FIXED_DATE","MONTH_START","MONTH_END","YESTERDAY","TOMORROW","WEEK_AGO","WEEK_AHEAD","TEST_DATA","MONTHS","CURRENT","PREVIOUS","NEXT","JANUARY","DECEMBER","EMAIL_DOMAINS","SAMPLE_NOTES","HTTP_STATUS","OK","CREATED","NO_CONTENT","BAD_REQUEST","UNAUTHORIZED","FORBIDDEN","NOT_FOUND","CONFLICT","INTERNAL_SERVER_ERROR","flushPromises","Promise","resolve","setImmediate","wait","ms","setTimeout","originalDate","freezeTime","date","frozenTime","getTime","global","MockDate","args","length","UTC","parse","testAssertions","assertValidUUID","message","Error","assertDateInRange","start","end","toISOString","assertLength","array","expectedLength","assertTruthy","assertFalsy","assertDateEquals","actual","expected","tolerance","diff","abs","mockResponses","success","data","error","code","paginated","items","total","page","limit","hasMore","totalPages","ceil","isObject","Array","isArray"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"testHelpers.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/testHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG7D,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE;QACP,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;QACxD,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IACtD,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAGD,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,EACnE,SAAS,GAAE,OAAO,CAAC,CAAC,CAAM,GACzB,CAAC,CA6BH;AAGD,wBAAgB,cAAc,CAAC,SAAS,GAAE,OAAO,CAAC,SAAS,CAAM,GAAG,SAAS,CAW5E;AAGD,MAAM,WAAW,oBAAqB,SAAQ,WAAW;IACvD,KAAK,EAAE;QACL,IAAI,EAAE,SAAS,CAAC;QAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAGD,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,WAAW,GAAG,oBAAoB,EACrF,aAAa,GAAE,OAAO,CAAC,SAAS,CAAM,EACtC,gBAAgB,GAAE,OAAO,CAAC,CAAC,CAAM,GAChC,CAAC,CAcH;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,OAAO;IAChD,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IAChE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;IAC3D,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IACtF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC5E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACxF,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9D,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;CAC7D;AAGD,eAAO,MAAM,YAAY;cAEb,CAAC,sBACA,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,GACzC,qBAAqB,CAAC,CAAC,CAAC;CAY5B,CAAC;AAGF,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnD;AAGD,eAAO,MAAM,UAAU;kBAEP,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,SAAS,YAAY,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC;0BAO7D,WAAW,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,YAAY,MAAM,GAAG,IAAI;8BASvF,OAAO,gBACC,MAAM,EAAE,GACrB,QAAQ,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;iBAc7B,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,SAAS,YAAY,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC;eAMvE,CAAC,SAAS,OAAO,QAAQ,MAAM,YAAY,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC;6BAMxD,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,OACnD,OAAO,iBACG,CAAC,MAAM,CAAC,CAAC,EAAE,GACzB,GAAG,IAAI,CAAC;CAMZ,CAAC;AAEF,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAGD,MAAM,MAAM,gBAAgB,CAAC,QAAQ,GAAG,WAAW,IAAI,CACrD,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KACtB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAG1B,MAAM,WAAW,WAAW,CAAC,QAAQ,GAAG,WAAW;IACjD,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAGD,MAAM,WAAW,UAAU,CAAC,QAAQ,GAAG,WAAW;IAChD,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;CAChC;AAED,wBAAsB,YAAY,CAAC,QAAQ,SAAS,WAAW,GAAG,WAAW,EAC3E,MAAM,EAAE;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,OAAO,EAAE,CAAA;KAAE,EAAE,CAAA;CAAE,EACnF,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,QAAQ,GACZ,OAAO,CAAC,IAAI,CAAC,CAyCf"}
1
+ {"version":3,"file":"testHelpers.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/testHelpers.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { TEST_UUIDS, generateTestEmail } from "./testFixtures.js";
1
2
  export function createMockContext(overrides = {}) {
2
3
  const ctx = {
3
4
  request: {
@@ -32,8 +33,8 @@ export function createMockContext(overrides = {}) {
32
33
  }
33
34
  export function createMockUser(overrides = {}) {
34
35
  return {
35
- userUuid: overrides.userUuid || 'test-user-uuid',
36
- email: overrides.email || 'test@example.com',
36
+ userUuid: overrides.userUuid || TEST_UUIDS.USER_1,
37
+ email: overrides.email || generateTestEmail('user'),
37
38
  firstName: overrides.firstName || 'Test',
38
39
  lastName: overrides.lastName || 'User',
39
40
  avatar: overrides.avatar || '1',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/testing/testHelpers.ts"],"sourcesContent":["import type { UserTypes } from '../models/UserInterfaces.js';\n\n\nexport interface BaseContext {\n request: {\n body?: unknown;\n headers?: Record<string, string | string[] | undefined>;\n files?: unknown;\n };\n response: {\n status: number;\n body?: unknown;\n };\n params?: Record<string, string>;\n query?: Record<string, string | string[] | undefined>;\n state: Record<string, unknown>;\n status: number;\n body?: unknown;\n headers: Record<string, string | string[] | undefined>;\n method?: string;\n path?: string;\n get: (field: string) => string | string[] | undefined;\n set: (field: string, value: string) => void;\n}\n\n\nexport function createMockContext<T extends BaseContext = BaseContext>(\n overrides: Partial<T> = {},\n): T {\n const ctx: BaseContext = {\n request: {\n body: {},\n headers: {},\n ...overrides.request,\n },\n response: {\n status: 200,\n body: undefined,\n ...overrides.response,\n },\n params: overrides.params || {},\n query: overrides.query || {},\n state: overrides.state || {},\n status: overrides.status || 200,\n body: overrides.body,\n headers: overrides.headers || {},\n method: overrides.method || 'GET',\n path: overrides.path || '/',\n get: (field: string) => {\n return ctx.headers[field.toLowerCase()];\n },\n set: (field: string, value: string) => {\n ctx.headers[field.toLowerCase()] = value;\n },\n };\n\n return { ...ctx, ...overrides } as T;\n}\n\n\nexport function createMockUser(overrides: Partial<UserTypes> = {}): UserTypes {\n return {\n userUuid: overrides.userUuid || 'test-user-uuid',\n email: overrides.email || 'test@example.com',\n firstName: overrides.firstName || 'Test',\n lastName: overrides.lastName || 'User',\n avatar: overrides.avatar || '1',\n role: overrides.role || 'user',\n isSubscriptionActive: overrides.isSubscriptionActive ?? true,\n ...overrides,\n };\n}\n\n\nexport interface AuthenticatedContext extends BaseContext {\n state: {\n user: UserTypes;\n [key: string]: unknown;\n };\n}\n\n\nexport function createAuthenticatedContext<T extends BaseContext = AuthenticatedContext>(\n userOverrides: Partial<UserTypes> = {},\n contextOverrides: Partial<T> = {},\n): T {\n const user = createMockUser(userOverrides);\n\n return createMockContext<T>({\n ...contextOverrides,\n state: {\n user,\n ...(contextOverrides.state || {}),\n },\n headers: {\n authorization: 'Bearer mock-token',\n ...(contextOverrides.headers || {}),\n },\n } as Partial<T>);\n}\n\nexport interface SequelizeModelMethods<T = unknown> {\n findOne: ((options?: unknown) => Promise<T | null>) | undefined;\n findAll: ((options?: unknown) => Promise<T[]>) | undefined;\n findByPk: ((id: string | number, options?: unknown) => Promise<T | null>) | undefined;\n create: ((values: Partial<T>, options?: unknown) => Promise<T>) | undefined;\n update: ((values: Partial<T>, options?: unknown) => Promise<[number, T[]]>) | undefined;\n destroy: ((options?: unknown) => Promise<number>) | undefined;\n count: ((options?: unknown) => Promise<number>) | undefined;\n}\n\n\nexport const mockDatabase = {\n\n mockModel<T = unknown>(\n methods: Partial<SequelizeModelMethods<T>> = {},\n ): SequelizeModelMethods<T> {\n return {\n findOne: undefined,\n findAll: undefined,\n findByPk: undefined,\n create: undefined,\n update: undefined,\n destroy: undefined,\n count: undefined,\n ...methods,\n };\n },\n};\n\n\nexport async function flushPromises(): Promise<void> {\n return new Promise((resolve) => setImmediate(resolve));\n}\n\n\nexport const assertions = {\n\n assertDefined<T>(value: T | null | undefined, message?: string): asserts value is T {\n if (value === null || value === undefined) {\n throw new Error(message || 'Expected value to be defined');\n }\n },\n\n\n assertStatusCode(ctx: BaseContext | { status: number; body?: unknown }, expected: number): void {\n if (ctx.status !== expected) {\n throw new Error(\n `Expected status ${expected} but got ${ctx.status}. Body: ${JSON.stringify(ctx.body)}`,\n );\n }\n },\n\n assertResponseShape(\n body: unknown,\n expectedKeys: string[],\n ): asserts body is Record<string, unknown> {\n if (typeof body !== 'object' || body === null) {\n throw new Error('Expected body to be an object');\n }\n const actualKeys = Object.keys(body);\n const missingKeys = expectedKeys.filter((key) => !actualKeys.includes(key));\n if (missingKeys.length > 0) {\n throw new Error(\n `Missing expected keys in response: ${missingKeys.join(', ')}. Got: ${actualKeys.join(', ')}`,\n );\n }\n },\n\n\n assertExists<T>(value: T | null | undefined, message?: string): asserts value is T {\n if (value === null || value === undefined) {\n throw new Error(message || 'Expected value to exist');\n }\n },\n\n assertType<T>(value: unknown, type: string, message?: string): asserts value is T {\n if (typeof value !== type) {\n throw new Error(message || `Expected value to be of type ${type}, got ${typeof value}`);\n }\n },\n\n validateObjectProperties<T extends Record<string, unknown>>(\n obj: unknown,\n expectedProps: (keyof T)[],\n ): obj is T {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n return expectedProps.every((prop) => prop in obj);\n },\n};\n\nexport interface RouterContext extends BaseContext {\n params: Record<string, string>;\n router?: unknown;\n _matchedRoute?: string;\n _matchedRouteName?: string;\n}\n\n\nexport type RouterMiddleware<TContext = BaseContext> = (\n ctx: TContext,\n next: () => Promise<void>\n) => Promise<void> | void;\n\n\nexport interface RouterLayer<TContext = BaseContext> {\n path: string | RegExp;\n methods: string[];\n stack: RouterMiddleware<TContext>[];\n name?: string | null;\n}\n\n\nexport interface RouterLike<TContext = BaseContext> {\n stack: RouterLayer<TContext>[];\n}\n\nexport async function executeRoute<TContext extends BaseContext = BaseContext>(\n router: { stack: { path: string | RegExp; methods: string[]; stack: unknown[] }[] },\n path: string,\n method: string,\n ctx: TContext,\n): Promise<void> {\n const route = router.stack.find(\n (layer) => layer.path === path && layer.methods.includes(method)\n );\n\n if (!route) {\n throw new Error(`Route not found: ${method} ${path}`);\n }\n\n // Cast context to include router properties\n // We add these properties dynamically, so TypeScript needs to trust us here\n const routerCtx = ctx as TContext & RouterContext;\n if (!routerCtx.params) {\n routerCtx.params = {};\n }\n if (!routerCtx.router) {\n routerCtx.router = router;\n }\n if (!routerCtx._matchedRoute) {\n routerCtx._matchedRoute = path;\n }\n\n // Execute all middlewares in the stack (validation, then handler)\n // Build the middleware chain from right to left\n let index = -1;\n\n const dispatch = async (i: number): Promise<void> => {\n if (i <= index) {\n throw new Error('next() called multiple times');\n }\n index = i;\n\n if (i >= route.stack.length) {\n return;\n }\n\n const middleware = route.stack[i] as (ctx: unknown, next: () => Promise<void>) => Promise<void>;\n return await middleware(routerCtx, () => dispatch(i + 1));\n };\n\n await dispatch(0);\n}\n"],"names":["createMockContext","overrides","ctx","request","body","headers","response","status","undefined","params","query","state","method","path","get","field","toLowerCase","set","value","createMockUser","userUuid","email","firstName","lastName","avatar","role","isSubscriptionActive","createAuthenticatedContext","userOverrides","contextOverrides","user","authorization","mockDatabase","mockModel","methods","findOne","findAll","findByPk","create","update","destroy","count","flushPromises","Promise","resolve","setImmediate","assertions","assertDefined","message","Error","assertStatusCode","expected","JSON","stringify","assertResponseShape","expectedKeys","actualKeys","Object","keys","missingKeys","filter","key","includes","length","join","assertExists","assertType","type","validateObjectProperties","obj","expectedProps","every","prop","executeRoute","router","route","stack","find","layer","routerCtx","_matchedRoute","index","dispatch","i","middleware"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/testing/testHelpers.ts"],"sourcesContent":["import type { UserTypes } from '../models/UserInterfaces.js';\nimport { TEST_UUIDS, generateTestEmail } from './testFixtures.js';\n\n\nexport interface BaseContext {\n request: {\n body?: unknown;\n headers?: Record<string, string | string[] | undefined>;\n files?: unknown;\n };\n response: {\n status: number;\n body?: unknown;\n };\n params?: Record<string, string>;\n query?: Record<string, string | string[] | undefined>;\n state: Record<string, unknown>;\n status: number;\n body?: unknown;\n headers: Record<string, string | string[] | undefined>;\n method?: string;\n path?: string;\n get: (field: string) => string | string[] | undefined;\n set: (field: string, value: string) => void;\n}\n\n\nexport function createMockContext<T extends BaseContext = BaseContext>(\n overrides: Partial<T> = {},\n): T {\n const ctx: BaseContext = {\n request: {\n body: {},\n headers: {},\n ...overrides.request,\n },\n response: {\n status: 200,\n body: undefined,\n ...overrides.response,\n },\n params: overrides.params || {},\n query: overrides.query || {},\n state: overrides.state || {},\n status: overrides.status || 200,\n body: overrides.body,\n headers: overrides.headers || {},\n method: overrides.method || 'GET',\n path: overrides.path || '/',\n get: (field: string) => {\n return ctx.headers[field.toLowerCase()];\n },\n set: (field: string, value: string) => {\n ctx.headers[field.toLowerCase()] = value;\n },\n };\n\n return { ...ctx, ...overrides } as T;\n}\n\n\nexport function createMockUser(overrides: Partial<UserTypes> = {}): UserTypes {\n return {\n userUuid: overrides.userUuid || TEST_UUIDS.USER_1,\n email: overrides.email || generateTestEmail('user'),\n firstName: overrides.firstName || 'Test',\n lastName: overrides.lastName || 'User',\n avatar: overrides.avatar || '1',\n role: overrides.role || 'user',\n isSubscriptionActive: overrides.isSubscriptionActive ?? true,\n ...overrides,\n };\n}\n\n\nexport interface AuthenticatedContext extends BaseContext {\n state: {\n user: UserTypes;\n [key: string]: unknown;\n };\n}\n\n\nexport function createAuthenticatedContext<T extends BaseContext = AuthenticatedContext>(\n userOverrides: Partial<UserTypes> = {},\n contextOverrides: Partial<T> = {},\n): T {\n const user = createMockUser(userOverrides);\n\n return createMockContext<T>({\n ...contextOverrides,\n state: {\n user,\n ...(contextOverrides.state || {}),\n },\n headers: {\n authorization: 'Bearer mock-token',\n ...(contextOverrides.headers || {}),\n },\n } as Partial<T>);\n}\n\nexport interface SequelizeModelMethods<T = unknown> {\n findOne: ((options?: unknown) => Promise<T | null>) | undefined;\n findAll: ((options?: unknown) => Promise<T[]>) | undefined;\n findByPk: ((id: string | number, options?: unknown) => Promise<T | null>) | undefined;\n create: ((values: Partial<T>, options?: unknown) => Promise<T>) | undefined;\n update: ((values: Partial<T>, options?: unknown) => Promise<[number, T[]]>) | undefined;\n destroy: ((options?: unknown) => Promise<number>) | undefined;\n count: ((options?: unknown) => Promise<number>) | undefined;\n}\n\n\nexport const mockDatabase = {\n\n mockModel<T = unknown>(\n methods: Partial<SequelizeModelMethods<T>> = {},\n ): SequelizeModelMethods<T> {\n return {\n findOne: undefined,\n findAll: undefined,\n findByPk: undefined,\n create: undefined,\n update: undefined,\n destroy: undefined,\n count: undefined,\n ...methods,\n };\n },\n};\n\n\nexport async function flushPromises(): Promise<void> {\n return new Promise((resolve) => setImmediate(resolve));\n}\n\n\nexport const assertions = {\n\n assertDefined<T>(value: T | null | undefined, message?: string): asserts value is T {\n if (value === null || value === undefined) {\n throw new Error(message || 'Expected value to be defined');\n }\n },\n\n\n assertStatusCode(ctx: BaseContext | { status: number; body?: unknown }, expected: number): void {\n if (ctx.status !== expected) {\n throw new Error(\n `Expected status ${expected} but got ${ctx.status}. Body: ${JSON.stringify(ctx.body)}`,\n );\n }\n },\n\n assertResponseShape(\n body: unknown,\n expectedKeys: string[],\n ): asserts body is Record<string, unknown> {\n if (typeof body !== 'object' || body === null) {\n throw new Error('Expected body to be an object');\n }\n const actualKeys = Object.keys(body);\n const missingKeys = expectedKeys.filter((key) => !actualKeys.includes(key));\n if (missingKeys.length > 0) {\n throw new Error(\n `Missing expected keys in response: ${missingKeys.join(', ')}. Got: ${actualKeys.join(', ')}`,\n );\n }\n },\n\n\n assertExists<T>(value: T | null | undefined, message?: string): asserts value is T {\n if (value === null || value === undefined) {\n throw new Error(message || 'Expected value to exist');\n }\n },\n\n assertType<T>(value: unknown, type: string, message?: string): asserts value is T {\n if (typeof value !== type) {\n throw new Error(message || `Expected value to be of type ${type}, got ${typeof value}`);\n }\n },\n\n validateObjectProperties<T extends Record<string, unknown>>(\n obj: unknown,\n expectedProps: (keyof T)[],\n ): obj is T {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n return expectedProps.every((prop) => prop in obj);\n },\n};\n\nexport interface RouterContext extends BaseContext {\n params: Record<string, string>;\n router?: unknown;\n _matchedRoute?: string;\n _matchedRouteName?: string;\n}\n\n\nexport type RouterMiddleware<TContext = BaseContext> = (\n ctx: TContext,\n next: () => Promise<void>\n) => Promise<void> | void;\n\n\nexport interface RouterLayer<TContext = BaseContext> {\n path: string | RegExp;\n methods: string[];\n stack: RouterMiddleware<TContext>[];\n name?: string | null;\n}\n\n\nexport interface RouterLike<TContext = BaseContext> {\n stack: RouterLayer<TContext>[];\n}\n\nexport async function executeRoute<TContext extends BaseContext = BaseContext>(\n router: { stack: { path: string | RegExp; methods: string[]; stack: unknown[] }[] },\n path: string,\n method: string,\n ctx: TContext,\n): Promise<void> {\n const route = router.stack.find(\n (layer) => layer.path === path && layer.methods.includes(method)\n );\n\n if (!route) {\n throw new Error(`Route not found: ${method} ${path}`);\n }\n\n // Cast context to include router properties\n // We add these properties dynamically, so TypeScript needs to trust us here\n const routerCtx = ctx as TContext & RouterContext;\n if (!routerCtx.params) {\n routerCtx.params = {};\n }\n if (!routerCtx.router) {\n routerCtx.router = router;\n }\n if (!routerCtx._matchedRoute) {\n routerCtx._matchedRoute = path;\n }\n\n // Execute all middlewares in the stack (validation, then handler)\n // Build the middleware chain from right to left\n let index = -1;\n\n const dispatch = async (i: number): Promise<void> => {\n if (i <= index) {\n throw new Error('next() called multiple times');\n }\n index = i;\n\n if (i >= route.stack.length) {\n return;\n }\n\n const middleware = route.stack[i] as (ctx: unknown, next: () => Promise<void>) => Promise<void>;\n return await middleware(routerCtx, () => dispatch(i + 1));\n };\n\n await dispatch(0);\n}\n"],"names":["TEST_UUIDS","generateTestEmail","createMockContext","overrides","ctx","request","body","headers","response","status","undefined","params","query","state","method","path","get","field","toLowerCase","set","value","createMockUser","userUuid","USER_1","email","firstName","lastName","avatar","role","isSubscriptionActive","createAuthenticatedContext","userOverrides","contextOverrides","user","authorization","mockDatabase","mockModel","methods","findOne","findAll","findByPk","create","update","destroy","count","flushPromises","Promise","resolve","setImmediate","assertions","assertDefined","message","Error","assertStatusCode","expected","JSON","stringify","assertResponseShape","expectedKeys","actualKeys","Object","keys","missingKeys","filter","key","includes","length","join","assertExists","assertType","type","validateObjectProperties","obj","expectedProps","every","prop","executeRoute","router","route","stack","find","layer","routerCtx","_matchedRoute","index","dispatch","i","middleware"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "90dc-core",
3
- "version": "1.16.17",
3
+ "version": "1.16.19",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",