Skip to content

Commit c8b2b55

Browse files
committed
fix: type errors in tests
1 parent 0c8e47f commit c8b2b55

12 files changed

Lines changed: 100 additions & 95 deletions

File tree

src/interfaces/job.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export type JobStatus = 'waiting' | 'delayed' | 'reserved' | 'done';
1+
export type JobStatus = 'waiting' | 'delayed' | 'reserved' | 'done' | 'failed';
22

33
export interface JobMeta {
44
ttr?: number;

tests/core/queue.test.ts

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import { describe, it, expect, beforeEach, vi } from 'vitest';
22
import { Queue } from '../../src/core/queue.ts';
3-
import { JobMeta, QueueMessage } from '../../src/interfaces/job.ts';
3+
import type { JobMeta, QueueMessage, DbJobRequest } from '../../src/interfaces/job.ts';
44

55
interface TestJobs {
66
'test-job': { data: string };
77
'math-job': { a: number; b: number };
88
}
99

10-
class TestQueue extends Queue<TestJobs> {
11-
public messages: Array<{ payload: Buffer; meta: JobMeta; id: string }> = [];
10+
class TestQueue extends Queue<TestJobs, DbJobRequest<any>> {
11+
public messages: Array<{ payload: string; meta: JobMeta; id: string }> = [];
1212
private nextId = 1;
1313

14-
protected async pushMessage(payload: Buffer, meta: JobMeta): Promise<string> {
14+
protected async pushMessage(payload: string, meta: JobMeta): Promise<string> {
1515
const id = this.nextId.toString();
1616
this.nextId++;
1717
this.messages.push({ payload, meta, id });
@@ -53,9 +53,9 @@ describe('Queue', () => {
5353

5454
expect(id).toBe('1');
5555
expect(queue.messages).toHaveLength(1);
56-
expect(queue.messages[0].meta.ttr).toBe(300);
57-
expect(queue.messages[0].meta.delay).toBe(0);
58-
expect(queue.messages[0].meta.priority).toBe(0);
56+
expect(queue.messages[0]?.meta.ttr).toBe(300);
57+
expect(queue.messages[0]?.meta.delay).toBe(0);
58+
expect(queue.messages[0]?.meta.priority).toBe(0);
5959
});
6060

6161
it('should add a job with custom settings using new API', async () => {
@@ -68,9 +68,9 @@ describe('Queue', () => {
6868

6969
expect(id).toBe('1');
7070
expect(queue.messages).toHaveLength(1);
71-
expect(queue.messages[0].meta.ttr).toBe(600);
72-
expect(queue.messages[0].meta.delay).toBe(30);
73-
expect(queue.messages[0].meta.priority).toBe(5);
71+
expect(queue.messages[0]?.meta.ttr).toBe(600);
72+
expect(queue.messages[0]?.meta.delay).toBe(30);
73+
expect(queue.messages[0]?.meta.priority).toBe(5);
7474
});
7575

7676
it('should emit beforePush and afterPush events', async () => {
@@ -98,8 +98,8 @@ describe('Queue', () => {
9898
await queue.addJob('test-job', { payload: { data: 'job1' }, ttr: 600 });
9999
await queue.addJob('test-job', { payload: { data: 'job2' } });
100100

101-
expect(queue.messages[0].meta.ttr).toBe(600);
102-
expect(queue.messages[1].meta.ttr).toBe(300); // back to default
101+
expect(queue.messages[0]?.meta.ttr).toBe(600);
102+
expect(queue.messages[1]?.meta.ttr).toBe(300); // back to default
103103
});
104104
});
105105

@@ -108,14 +108,14 @@ describe('Queue', () => {
108108
const handlerSpy = vi.fn().mockResolvedValue(undefined);
109109
queue.onJob('test-job', handlerSpy);
110110

111-
const payload = Buffer.from(JSON.stringify({
111+
const payloadString = JSON.stringify({
112112
name: 'test-job',
113113
payload: { data: 'test data' }
114-
}));
114+
});
115115

116116
const message: QueueMessage = {
117117
id: '1',
118-
payload,
118+
payload: payloadString,
119119
meta: { ttr: 300 }
120120
};
121121

@@ -134,14 +134,14 @@ describe('Queue', () => {
134134
queue.on('afterExec', afterExecSpy);
135135
queue.onJob('test-job', handlerSpy);
136136

137-
const payload = Buffer.from(JSON.stringify({
137+
const payloadString = JSON.stringify({
138138
name: 'test-job',
139139
payload: { data: 'test data' }
140-
}));
140+
});
141141

142142
const message: QueueMessage = {
143143
id: '1',
144-
payload,
144+
payload: payloadString,
145145
meta: { ttr: 300 }
146146
};
147147

@@ -168,14 +168,14 @@ describe('Queue', () => {
168168
queue.onJob('test-job', handlerSpy);
169169
queue.on('afterError', errorSpy);
170170

171-
const payload = Buffer.from(JSON.stringify({
171+
const payloadString = JSON.stringify({
172172
name: 'test-job',
173173
payload: { data: 'test data' }
174-
}));
174+
});
175175

176176
const message: QueueMessage = {
177177
id: '1',
178-
payload,
178+
payload: payloadString,
179179
meta: { ttr: 300 }
180180
};
181181

@@ -197,14 +197,14 @@ describe('Queue', () => {
197197
const errorSpy = vi.fn();
198198
queue.on('afterError', errorSpy);
199199

200-
const payload = Buffer.from(JSON.stringify({
200+
const payloadString = JSON.stringify({
201201
name: 'unregistered-job',
202202
payload: { data: 'test data' }
203-
}));
203+
});
204204

205205
const message: QueueMessage = {
206206
id: '1',
207-
payload,
207+
payload: payloadString,
208208
meta: { ttr: 300 }
209209
};
210210

tests/drivers/db-real.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,11 @@ describe('DbQueue with Real SQLite Adapter', () => {
9090
const jobs = db.prepare('SELECT * FROM jobs').all();
9191
expect(jobs).toHaveLength(1);
9292

93-
const job = jobs[0];
94-
expect(job.status).toBe('waiting');
93+
const job = jobs[0] as any;
94+
expect(job?.status).toBe('waiting');
9595

9696
// Verify the payload contains our data (it's a serialized job request)
97-
const payloadStr = job.payload.toString();
97+
const payloadStr = job?.payload?.toString();
9898
expect(payloadStr).toContain('persistent');
9999
});
100100

@@ -110,8 +110,8 @@ describe('DbQueue with Real SQLite Adapter', () => {
110110
expect(new Set(jobs).size).toBe(3); // All IDs should be unique
111111

112112
// Verify all jobs are in database
113-
const jobCount = db.prepare('SELECT COUNT(*) as count FROM jobs').get();
114-
expect(jobCount.count).toBe(3);
113+
const jobCount = db.prepare('SELECT COUNT(*) as count FROM jobs').get() as any;
114+
expect(jobCount?.count).toBe(3);
115115
});
116116

117117
it('should properly handle database transactions', async () => {
@@ -180,8 +180,8 @@ describe('DbQueue with Real SQLite Adapter', () => {
180180
const insertTime = Date.now() - startTime;
181181

182182
// Verify all jobs were inserted
183-
const count = db.prepare('SELECT COUNT(*) as count FROM jobs').get();
184-
expect(count.count).toBe(jobCount);
183+
const count = db.prepare('SELECT COUNT(*) as count FROM jobs').get() as any;
184+
expect(count?.count).toBe(jobCount);
185185

186186
// Should be reasonably fast (less than 1 second for 100 jobs)
187187
expect(insertTime).toBeLessThan(1000);

tests/drivers/db.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ describe('DbQueue', () => {
3636
expect(immediateReserve).toBeNull();
3737

3838
// In a real test, we'd wait or mock time
39-
expect(dbAdapter.jobsArray[0].meta.delay).toBe(5);
39+
expect(dbAdapter.jobsArray[0]?.meta.delay).toBe(5);
4040
});
4141

4242
it('should handle job execution lifecycle', async () => {
@@ -90,7 +90,7 @@ describe('DbQueue', () => {
9090
expect(await queue.status(id)).toBe('reserved');
9191

9292
// After completing
93-
await queue['release']({ id, payload: Buffer.from(''), meta: {} });
93+
await queue['release']({ id, payload: '', meta: {} });
9494
expect(await queue.status(id)).toBe('done');
9595
});
9696
});

tests/drivers/sqs.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ describe('SqsQueue', () => {
3535

3636
expect(sqsClient.sentMessages).toHaveLength(1);
3737
const sentMessage = sqsClient.sentMessages[0];
38-
expect(sentMessage.MessageAttributes?.ttr?.StringValue).toBe('600');
39-
expect(sentMessage.DelaySeconds).toBe(30);
38+
expect(sentMessage?.MessageAttributes?.ttr?.StringValue).toBe('600');
39+
expect(sentMessage?.DelaySeconds).toBe(30);
4040
});
4141

4242
it('should respect delay seconds', async () => {
@@ -47,7 +47,7 @@ describe('SqsQueue', () => {
4747

4848
expect(sqsClient.sentMessages).toHaveLength(1);
4949
const message = sqsClient.sentMessages[0];
50-
expect(message.DelaySeconds).toBe(30);
50+
expect(message?.DelaySeconds).toBe(30);
5151
});
5252

5353
it('should handle job processing', async () => {

tests/integration/mongodb-debug.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, it, expect, beforeEach, afterEach, beforeAll, afterAll } from 'vitest';
22
import { MongoClient, ObjectId } from 'mongodb';
3-
import { GenericContainer, StartedTestContainer } from 'testcontainers';
3+
import { GenericContainer, type StartedTestContainer } from 'testcontainers';
44
import { MongoQueue, createMongoQueue, MongoDatabaseAdapter } from '../../src/adapters/mongodb.ts';
55

66
interface TestJobs {
@@ -62,8 +62,8 @@ describe.only('MongoDB Debug Tests', () => {
6262
expect(jobs).toHaveLength(1);
6363

6464
const job = jobs[0];
65-
expect(job.status).toBe('waiting');
66-
expect(job.payload).toBeTruthy();
65+
expect(job?.status).toBe('waiting');
66+
expect(job?.payload).toBeTruthy();
6767

6868
console.log('=== STEP 3: Checking job status ===');
6969
const status = await queue.status(jobId);

tests/integration/mongodb.test.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, it, expect, beforeEach, afterEach, beforeAll, afterAll } from 'vitest';
22
import { MongoClient, ObjectId } from 'mongodb';
3-
import { GenericContainer, StartedTestContainer } from 'testcontainers';
3+
import { GenericContainer, type StartedTestContainer } from 'testcontainers';
44
import { MongoQueue, createMongoQueue, createMongoQueueFromUrl, MongoDatabaseAdapter } from '../../src/adapters/mongodb.ts';
55

66
interface TestJobs {
@@ -67,12 +67,16 @@ describe('MongoDB Integration Tests (with TestContainers)', () => {
6767
// Add a job to trigger index creation
6868
await queue.addJob('simple-job', { payload: { data: 'test' } });
6969

70+
// Wait a bit for async index creation to complete
71+
await new Promise(resolve => setTimeout(resolve, 100));
72+
7073
// Check that indexes exist
7174
const db = client.db(testDatabase);
7275
const collection = db.collection(testCollection);
7376
const indexes = await collection.listIndexes().toArray();
7477

75-
expect(indexes.length).toBeGreaterThan(1); // Should have more than just the default _id index
78+
// Should have the default _id index plus our custom indexes (at least 2 total)
79+
expect(indexes.length).toBeGreaterThanOrEqual(2);
7680
});
7781
});
7882

tests/integration/redis.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, it, expect, beforeEach, afterEach, beforeAll, afterAll } from 'vitest';
22
import { createClient } from 'redis';
3-
import { GenericContainer, StartedTestContainer } from 'testcontainers';
3+
import { GenericContainer, type StartedTestContainer } from 'testcontainers';
44
import { RedisQueue, createRedisQueue, RedisDatabaseAdapter } from '../../src/adapters/redis.ts';
55

66
interface TestJobs {

tests/integration/sqlite.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,9 @@ describe('SQLite Integration Tests', () => {
8686
expect(await queue.status(id)).toBe('waiting');
8787

8888
// Verify job is stored in database
89-
const job = db.prepare('SELECT * FROM jobs WHERE id = ?').get(parseInt(id));
89+
const job = db.prepare('SELECT * FROM jobs WHERE id = ?').get(parseInt(id)) as any;
9090
expect(job).toBeTruthy();
91-
expect(job.status).toBe('waiting');
91+
expect(job?.status).toBe('waiting');
9292
});
9393

9494
it('should handle job delays correctly', async () => {
@@ -170,8 +170,8 @@ describe('SQLite Integration Tests', () => {
170170
});
171171

172172
// Verify TTR is stored correctly
173-
const job = db.prepare('SELECT * FROM jobs WHERE id = ?').get(parseInt(id));
174-
expect(job.ttr).toBe(10);
173+
const job = db.prepare('SELECT * FROM jobs WHERE id = ?').get(parseInt(id)) as any;
174+
expect(job?.ttr).toBe(10);
175175
});
176176
});
177177

tests/jobs/test-job.ts

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,19 @@
1-
import { Job, Queue } from '../../src/index.ts';
1+
import type { Queue } from '../../src/index.ts';
22

3-
export class SimpleJob implements Job<string> {
4-
constructor(public data: string) {}
3+
// Simple test job handler functions (not classes)
4+
export const simpleJobHandler = async (payload: { data: string }): Promise<string> => {
5+
return `Processed: ${payload.data}`;
6+
};
57

6-
async execute(queue: Queue): Promise<string> {
7-
return `Processed: ${this.data}`;
8+
export const failingJobHandler = async (payload: { shouldFail?: boolean }): Promise<void> => {
9+
if (payload.shouldFail !== false) {
10+
throw new Error('Job intentionally failed');
811
}
12+
};
913

10-
serialize() {
11-
return {
12-
constructor: 'SimpleJob',
13-
data: this.data
14-
};
15-
}
16-
17-
static deserialize(data: any): SimpleJob {
18-
return new SimpleJob(data.data);
19-
}
20-
}
21-
22-
export class FailingJob implements Job<void> {
23-
constructor(public shouldFail: boolean = true) {}
24-
25-
async execute(queue: Queue): Promise<void> {
26-
if (this.shouldFail) {
27-
throw new Error('Job intentionally failed');
28-
}
29-
}
30-
31-
serialize() {
32-
return {
33-
constructor: 'FailingJob',
34-
shouldFail: this.shouldFail
35-
};
36-
}
37-
38-
static deserialize(data: any): FailingJob {
39-
return new FailingJob(data.shouldFail);
40-
}
14+
// Test job types for type safety
15+
export interface TestJobs {
16+
'simple-job': { data: string };
17+
'failing-job': { shouldFail?: boolean };
4118
}
4219

0 commit comments

Comments
 (0)