level-resolver.spec.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { describe, expect, it } from 'vitest';
  2. import { resolveLevel } from './level-resolver';
  3. import type { LoggerConfig } from './types';
  4. describe('resolveLevel', () => {
  5. const baseConfig: LoggerConfig = {
  6. default: 'info',
  7. 'growi:service:page': 'debug',
  8. 'growi:routes:*': 'debug',
  9. 'growi:crowi': 'debug',
  10. };
  11. describe('config pattern matching', () => {
  12. it('returns default level when no pattern matches', () => {
  13. const result = resolveLevel('growi:unknown', baseConfig, {});
  14. expect(result).toBe('info');
  15. });
  16. it('returns level for exact namespace match', () => {
  17. const result = resolveLevel('growi:crowi', baseConfig, {});
  18. expect(result).toBe('debug');
  19. });
  20. it('matches glob wildcard pattern', () => {
  21. const result = resolveLevel('growi:routes:login', baseConfig, {});
  22. expect(result).toBe('debug');
  23. });
  24. it('does not match partial namespace without wildcard', () => {
  25. const config: LoggerConfig = {
  26. default: 'warn',
  27. 'growi:service': 'debug',
  28. };
  29. // 'growi:service:page' should NOT match 'growi:service' (no wildcard)
  30. const result = resolveLevel('growi:service:page', config, {});
  31. expect(result).toBe('warn');
  32. });
  33. it('uses config default when provided', () => {
  34. const config: LoggerConfig = { default: 'error' };
  35. const result = resolveLevel('growi:anything', config, {});
  36. expect(result).toBe('error');
  37. });
  38. });
  39. describe('env override precedence', () => {
  40. it('env override takes precedence over config pattern', () => {
  41. const envOverrides = { 'growi:service:page': 'trace' };
  42. const result = resolveLevel(
  43. 'growi:service:page',
  44. baseConfig,
  45. envOverrides,
  46. );
  47. expect(result).toBe('trace');
  48. });
  49. it('env override glob takes precedence over config exact match', () => {
  50. const envOverrides = { 'growi:*': 'fatal' };
  51. const result = resolveLevel('growi:crowi', baseConfig, envOverrides);
  52. expect(result).toBe('fatal');
  53. });
  54. it('falls back to config when no env override matches', () => {
  55. const envOverrides = { 'other:ns': 'trace' };
  56. const result = resolveLevel('growi:crowi', baseConfig, envOverrides);
  57. expect(result).toBe('debug');
  58. });
  59. it('falls back to config default when neither env nor config pattern matches', () => {
  60. const envOverrides = { 'other:ns': 'trace' };
  61. const result = resolveLevel('growi:unknown:ns', baseConfig, envOverrides);
  62. expect(result).toBe('info');
  63. });
  64. });
  65. describe('glob pattern matching', () => {
  66. it('matches deep wildcard patterns', () => {
  67. const config: LoggerConfig = {
  68. default: 'info',
  69. 'growi:service:*': 'debug',
  70. };
  71. const result = resolveLevel('growi:service:auth', config, {});
  72. expect(result).toBe('debug');
  73. });
  74. it('env override wildcard applies to multiple namespaces', () => {
  75. const envOverrides = { 'growi:service:*': 'trace' };
  76. const result1 = resolveLevel(
  77. 'growi:service:page',
  78. baseConfig,
  79. envOverrides,
  80. );
  81. const result2 = resolveLevel(
  82. 'growi:service:user',
  83. baseConfig,
  84. envOverrides,
  85. );
  86. expect(result1).toBe('trace');
  87. expect(result2).toBe('trace');
  88. });
  89. });
  90. });