Skip to content

Commit 9b93557

Browse files
author
georgiy.rusanov
committed
added tests for queues
1 parent 2a0c3ef commit 9b93557

File tree

3 files changed

+1015
-0
lines changed

3 files changed

+1015
-0
lines changed
Lines changed: 358 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,358 @@
1+
import { getConfig } from '../config'
2+
3+
// Mock dependencies
4+
jest.mock('../config')
5+
6+
const mockGetConfig = getConfig as jest.MockedFunction<typeof getConfig>
7+
8+
describe('Queue Configuration Tests', () => {
9+
beforeEach(() => {
10+
jest.clearAllMocks()
11+
})
12+
13+
describe('Queue Configuration Values', () => {
14+
it('should have correct default configuration values', () => {
15+
mockGetConfig.mockReturnValue({
16+
isMultitenant: false,
17+
databaseURL: 'postgres://test:test@localhost:5432/test',
18+
multitenantDatabaseUrl: 'postgres://test:test@localhost:5433/test',
19+
pgQueueConnectionURL: undefined,
20+
pgQueueArchiveCompletedAfterSeconds: 3600,
21+
pgQueueDeleteAfterDays: 7,
22+
pgQueueDeleteAfterHours: undefined,
23+
pgQueueRetentionDays: 7,
24+
pgQueueEnableWorkers: true,
25+
pgQueueReadWriteTimeout: 30000,
26+
pgQueueConcurrentTasksPerQueue: 5,
27+
pgQueueMaxConnections: 10,
28+
logLevel: 'info',
29+
logflareApiKey: undefined,
30+
logflareSourceToken: undefined,
31+
logflareEnabled: false,
32+
} as any)
33+
34+
const config = mockGetConfig()
35+
36+
expect(config.isMultitenant).toBe(false)
37+
expect(config.databaseURL).toBe('postgres://test:test@localhost:5432/test')
38+
expect(config.pgQueueEnableWorkers).toBe(true)
39+
expect(config.pgQueueMaxConnections).toBe(10)
40+
expect(config.pgQueueConcurrentTasksPerQueue).toBe(5)
41+
expect(config.pgQueueReadWriteTimeout).toBe(30000)
42+
expect(config.pgQueueArchiveCompletedAfterSeconds).toBe(3600)
43+
expect(config.pgQueueDeleteAfterDays).toBe(7)
44+
expect(config.pgQueueRetentionDays).toBe(7)
45+
})
46+
47+
it('should handle multitenant configuration', () => {
48+
mockGetConfig.mockReturnValue({
49+
isMultitenant: true,
50+
databaseURL: 'postgres://test:test@localhost:5432/test',
51+
multitenantDatabaseUrl: 'postgres://test:test@localhost:5433/test',
52+
pgQueueConnectionURL: 'postgres://queue:queue@localhost:5434/queue',
53+
pgQueueArchiveCompletedAfterSeconds: 3600,
54+
pgQueueDeleteAfterDays: 7,
55+
pgQueueDeleteAfterHours: undefined,
56+
pgQueueRetentionDays: 7,
57+
pgQueueEnableWorkers: true,
58+
pgQueueReadWriteTimeout: 30000,
59+
pgQueueConcurrentTasksPerQueue: 5,
60+
pgQueueMaxConnections: 10,
61+
logLevel: 'info',
62+
logflareApiKey: undefined,
63+
logflareSourceToken: undefined,
64+
logflareEnabled: false,
65+
} as any)
66+
67+
const config = mockGetConfig()
68+
69+
expect(config.isMultitenant).toBe(true)
70+
expect(config.multitenantDatabaseUrl).toBe('postgres://test:test@localhost:5433/test')
71+
expect(config.pgQueueConnectionURL).toBe('postgres://queue:queue@localhost:5434/queue')
72+
})
73+
74+
it('should handle custom queue connection URL', () => {
75+
mockGetConfig.mockReturnValue({
76+
isMultitenant: false,
77+
databaseURL: 'postgres://test:test@localhost:5432/test',
78+
multitenantDatabaseUrl: 'postgres://test:test@localhost:5433/test',
79+
pgQueueConnectionURL: 'postgres://queue:queue@localhost:5434/queue',
80+
pgQueueArchiveCompletedAfterSeconds: 3600,
81+
pgQueueDeleteAfterDays: 7,
82+
pgQueueDeleteAfterHours: undefined,
83+
pgQueueRetentionDays: 7,
84+
pgQueueEnableWorkers: true,
85+
pgQueueReadWriteTimeout: 30000,
86+
pgQueueConcurrentTasksPerQueue: 5,
87+
pgQueueMaxConnections: 10,
88+
logLevel: 'info',
89+
logflareApiKey: undefined,
90+
logflareSourceToken: undefined,
91+
logflareEnabled: false,
92+
} as any)
93+
94+
const config = mockGetConfig()
95+
96+
expect(config.pgQueueConnectionURL).toBe('postgres://queue:queue@localhost:5434/queue')
97+
})
98+
99+
it('should handle delete after hours configuration', () => {
100+
mockGetConfig.mockReturnValue({
101+
isMultitenant: false,
102+
databaseURL: 'postgres://test:test@localhost:5432/test',
103+
multitenantDatabaseUrl: 'postgres://test:test@localhost:5433/test',
104+
pgQueueConnectionURL: undefined,
105+
pgQueueArchiveCompletedAfterSeconds: 3600,
106+
pgQueueDeleteAfterDays: undefined,
107+
pgQueueDeleteAfterHours: 24,
108+
pgQueueRetentionDays: 7,
109+
pgQueueEnableWorkers: true,
110+
pgQueueReadWriteTimeout: 30000,
111+
pgQueueConcurrentTasksPerQueue: 5,
112+
pgQueueMaxConnections: 10,
113+
logLevel: 'info',
114+
logflareApiKey: undefined,
115+
logflareSourceToken: undefined,
116+
logflareEnabled: false,
117+
} as any)
118+
119+
const config = mockGetConfig()
120+
121+
expect(config.pgQueueDeleteAfterDays).toBeUndefined()
122+
expect(config.pgQueueDeleteAfterHours).toBe(24)
123+
})
124+
125+
it('should handle disabled workers configuration', () => {
126+
mockGetConfig.mockReturnValue({
127+
isMultitenant: false,
128+
databaseURL: 'postgres://test:test@localhost:5432/test',
129+
multitenantDatabaseUrl: 'postgres://test:test@localhost:5433/test',
130+
pgQueueConnectionURL: undefined,
131+
pgQueueArchiveCompletedAfterSeconds: 3600,
132+
pgQueueDeleteAfterDays: 7,
133+
pgQueueDeleteAfterHours: undefined,
134+
pgQueueRetentionDays: 7,
135+
pgQueueEnableWorkers: false,
136+
pgQueueReadWriteTimeout: 30000,
137+
pgQueueConcurrentTasksPerQueue: 5,
138+
pgQueueMaxConnections: 10,
139+
logLevel: 'info',
140+
logflareApiKey: undefined,
141+
logflareSourceToken: undefined,
142+
logflareEnabled: false,
143+
} as any)
144+
145+
const config = mockGetConfig()
146+
147+
expect(config.pgQueueEnableWorkers).toBe(false)
148+
})
149+
})
150+
151+
describe('Queue Configuration Validation', () => {
152+
it('should validate required configuration fields', () => {
153+
mockGetConfig.mockReturnValue({
154+
isMultitenant: false,
155+
databaseURL: 'postgres://test:test@localhost:5432/test',
156+
multitenantDatabaseUrl: 'postgres://test:test@localhost:5433/test',
157+
pgQueueConnectionURL: undefined,
158+
pgQueueArchiveCompletedAfterSeconds: 3600,
159+
pgQueueDeleteAfterDays: 7,
160+
pgQueueDeleteAfterHours: undefined,
161+
pgQueueRetentionDays: 7,
162+
pgQueueEnableWorkers: true,
163+
pgQueueReadWriteTimeout: 30000,
164+
pgQueueConcurrentTasksPerQueue: 5,
165+
pgQueueMaxConnections: 10,
166+
logLevel: 'info',
167+
logflareApiKey: undefined,
168+
logflareSourceToken: undefined,
169+
logflareEnabled: false,
170+
} as any)
171+
172+
const config = mockGetConfig()
173+
174+
// Required fields
175+
expect(config.databaseURL).toBeDefined()
176+
expect(config.pgQueueEnableWorkers).toBeDefined()
177+
expect(config.pgQueueMaxConnections).toBeDefined()
178+
expect(config.pgQueueConcurrentTasksPerQueue).toBeDefined()
179+
expect(config.pgQueueReadWriteTimeout).toBeDefined()
180+
expect(config.pgQueueArchiveCompletedAfterSeconds).toBeDefined()
181+
expect(config.pgQueueRetentionDays).toBeDefined()
182+
})
183+
184+
it('should validate optional configuration fields', () => {
185+
mockGetConfig.mockReturnValue({
186+
isMultitenant: false,
187+
databaseURL: 'postgres://test:test@localhost:5432/test',
188+
multitenantDatabaseUrl: 'postgres://test:test@localhost:5433/test',
189+
pgQueueConnectionURL: undefined,
190+
pgQueueArchiveCompletedAfterSeconds: 3600,
191+
pgQueueDeleteAfterDays: 7,
192+
pgQueueDeleteAfterHours: undefined,
193+
pgQueueRetentionDays: 7,
194+
pgQueueEnableWorkers: true,
195+
pgQueueReadWriteTimeout: 30000,
196+
pgQueueConcurrentTasksPerQueue: 5,
197+
pgQueueMaxConnections: 10,
198+
logLevel: 'info',
199+
logflareApiKey: undefined,
200+
logflareSourceToken: undefined,
201+
logflareEnabled: false,
202+
} as any)
203+
204+
const config = mockGetConfig()
205+
206+
// Optional fields
207+
expect(config.pgQueueConnectionURL).toBeUndefined()
208+
expect(config.pgQueueDeleteAfterHours).toBeUndefined()
209+
expect(config.multitenantDatabaseUrl).toBeDefined()
210+
})
211+
212+
it('should validate multitenant configuration requirements', () => {
213+
mockGetConfig.mockReturnValue({
214+
isMultitenant: true,
215+
databaseURL: 'postgres://test:test@localhost:5432/test',
216+
multitenantDatabaseUrl: 'postgres://test:test@localhost:5433/test',
217+
pgQueueConnectionURL: undefined,
218+
pgQueueArchiveCompletedAfterSeconds: 3600,
219+
pgQueueDeleteAfterDays: 7,
220+
pgQueueDeleteAfterHours: undefined,
221+
pgQueueRetentionDays: 7,
222+
pgQueueEnableWorkers: true,
223+
pgQueueReadWriteTimeout: 30000,
224+
pgQueueConcurrentTasksPerQueue: 5,
225+
pgQueueMaxConnections: 10,
226+
logLevel: 'info',
227+
logflareApiKey: undefined,
228+
logflareSourceToken: undefined,
229+
logflareEnabled: false,
230+
} as any)
231+
232+
const config = mockGetConfig()
233+
234+
expect(config.isMultitenant).toBe(true)
235+
expect(config.multitenantDatabaseUrl).toBeDefined()
236+
expect(config.multitenantDatabaseUrl).toBe('postgres://test:test@localhost:5433/test')
237+
})
238+
})
239+
240+
describe('Queue Configuration Types', () => {
241+
it('should validate configuration value types', () => {
242+
mockGetConfig.mockReturnValue({
243+
isMultitenant: false,
244+
databaseURL: 'postgres://test:test@localhost:5432/test',
245+
multitenantDatabaseUrl: 'postgres://test:test@localhost:5433/test',
246+
pgQueueConnectionURL: undefined,
247+
pgQueueArchiveCompletedAfterSeconds: 3600,
248+
pgQueueDeleteAfterDays: 7,
249+
pgQueueDeleteAfterHours: undefined,
250+
pgQueueRetentionDays: 7,
251+
pgQueueEnableWorkers: true,
252+
pgQueueReadWriteTimeout: 30000,
253+
pgQueueConcurrentTasksPerQueue: 5,
254+
pgQueueMaxConnections: 10,
255+
logLevel: 'info',
256+
logflareApiKey: undefined,
257+
logflareSourceToken: undefined,
258+
logflareEnabled: false,
259+
} as any)
260+
261+
const config = mockGetConfig()
262+
263+
// Boolean types
264+
expect(typeof config.isMultitenant).toBe('boolean')
265+
expect(typeof config.pgQueueEnableWorkers).toBe('boolean')
266+
expect(typeof config.logflareEnabled).toBe('boolean')
267+
268+
// String types
269+
expect(typeof config.databaseURL).toBe('string')
270+
expect(typeof config.multitenantDatabaseUrl).toBe('string')
271+
expect(typeof config.logLevel).toBe('string')
272+
273+
// Number types
274+
expect(typeof config.pgQueueMaxConnections).toBe('number')
275+
expect(typeof config.pgQueueConcurrentTasksPerQueue).toBe('number')
276+
expect(typeof config.pgQueueReadWriteTimeout).toBe('number')
277+
expect(typeof config.pgQueueArchiveCompletedAfterSeconds).toBe('number')
278+
expect(typeof config.pgQueueDeleteAfterDays).toBe('number')
279+
expect(typeof config.pgQueueRetentionDays).toBe('number')
280+
281+
// Undefined types
282+
expect(config.pgQueueConnectionURL).toBeUndefined()
283+
expect(config.pgQueueDeleteAfterHours).toBeUndefined()
284+
expect(config.logflareApiKey).toBeUndefined()
285+
expect(config.logflareSourceToken).toBeUndefined()
286+
})
287+
})
288+
289+
describe('Queue Configuration Ranges', () => {
290+
it('should validate configuration value ranges', () => {
291+
mockGetConfig.mockReturnValue({
292+
isMultitenant: false,
293+
databaseURL: 'postgres://test:test@localhost:5432/test',
294+
multitenantDatabaseUrl: 'postgres://test:test@localhost:5433/test',
295+
pgQueueConnectionURL: undefined,
296+
pgQueueArchiveCompletedAfterSeconds: 3600,
297+
pgQueueDeleteAfterDays: 7,
298+
pgQueueDeleteAfterHours: undefined,
299+
pgQueueRetentionDays: 7,
300+
pgQueueEnableWorkers: true,
301+
pgQueueReadWriteTimeout: 30000,
302+
pgQueueConcurrentTasksPerQueue: 5,
303+
pgQueueMaxConnections: 10,
304+
logLevel: 'info',
305+
logflareApiKey: undefined,
306+
logflareSourceToken: undefined,
307+
logflareEnabled: false,
308+
} as any)
309+
310+
const config = mockGetConfig()
311+
312+
// Positive numbers
313+
expect(config.pgQueueMaxConnections).toBeGreaterThan(0)
314+
expect(config.pgQueueConcurrentTasksPerQueue).toBeGreaterThan(0)
315+
expect(config.pgQueueReadWriteTimeout).toBeGreaterThan(0)
316+
expect(config.pgQueueArchiveCompletedAfterSeconds).toBeGreaterThan(0)
317+
expect(config.pgQueueDeleteAfterDays).toBeGreaterThan(0)
318+
expect(config.pgQueueRetentionDays).toBeGreaterThan(0)
319+
320+
// Reasonable ranges
321+
expect(config.pgQueueMaxConnections).toBeLessThanOrEqual(100)
322+
expect(config.pgQueueConcurrentTasksPerQueue).toBeLessThanOrEqual(50)
323+
expect(config.pgQueueReadWriteTimeout).toBeLessThanOrEqual(300000)
324+
expect(config.pgQueueArchiveCompletedAfterSeconds).toBeLessThanOrEqual(86400)
325+
expect(config.pgQueueDeleteAfterDays).toBeLessThanOrEqual(365)
326+
expect(config.pgQueueRetentionDays).toBeLessThanOrEqual(365)
327+
})
328+
})
329+
330+
describe('Queue Configuration Environment Variables', () => {
331+
it('should validate environment variable names', () => {
332+
const envVarNames = [
333+
'DATABASE_URL',
334+
'MULTITENANT_DATABASE_URL',
335+
'PG_QUEUE_CONNECTION_URL',
336+
'PG_QUEUE_ARCHIVE_COMPLETED_AFTER_SECONDS',
337+
'PG_QUEUE_DELETE_AFTER_DAYS',
338+
'PG_QUEUE_DELETE_AFTER_HOURS',
339+
'PG_QUEUE_RETENTION_DAYS',
340+
'PG_QUEUE_ENABLE_WORKERS',
341+
'PG_QUEUE_READ_WRITE_TIMEOUT',
342+
'PG_QUEUE_CONCURRENT_TASKS_PER_QUEUE',
343+
'PG_QUEUE_MAX_CONNECTIONS',
344+
'LOG_LEVEL',
345+
'LOGFLARE_API_KEY',
346+
'LOGFLARE_SOURCE_TOKEN',
347+
'LOGFLARE_ENABLED',
348+
]
349+
350+
envVarNames.forEach(envVar => {
351+
expect(envVar).toBeDefined()
352+
expect(typeof envVar).toBe('string')
353+
expect(envVar.length).toBeGreaterThan(0)
354+
expect(envVar).toMatch(/^[A-Z_]+$/)
355+
})
356+
})
357+
})
358+
})

0 commit comments

Comments
 (0)