Skip to content

Commit 0a01ace

Browse files
committed
fix: update stop method to handle release option and delete leader document
1 parent 0cc8a02 commit 0a01ace

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

index.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,18 @@ class Leader extends EventEmitter {
206206
}
207207
}
208208

209-
stop() {
209+
async stop(options = {}) {
210+
const { release = false } = options
210211
this.pause()
212+
213+
if (release && this.collection) {
214+
try {
215+
await this.collection.deleteOne({ 'leader-id': this.id })
216+
} catch (error) {
217+
this.emit('error', error)
218+
}
219+
}
220+
211221
this.removeAllListeners()
212222
this.initiated = false
213223
this.starting = false

tests/index.test.js

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -564,19 +564,48 @@ describe('Leader', () => {
564564
await leader.start()
565565
const spy = jest.spyOn(leader, 'removeAllListeners')
566566
// Act
567-
leader.stop()
567+
await leader.stop()
568568
// Assert
569569
expect(leader.paused).toBe(true)
570570
expect(leader.initiated).toBe(false)
571571
expect(leader.starting).toBe(false)
572572
expect(leader.startPromise).toBe(null)
573573
expect(spy).toHaveBeenCalled()
574574
})
575+
it('should delete leader doc on release stop', async () => {
576+
// Arrange
577+
const leader = new Leader(mockDb)
578+
await leader.start()
579+
jest.clearAllMocks()
580+
581+
// Act
582+
await leader.stop({ release: true })
583+
584+
// Assert
585+
expect(mockCollection.deleteOne).toHaveBeenCalledWith({ 'leader-id': leader.id })
586+
})
587+
it('should emit error if release delete fails', async () => {
588+
// Arrange
589+
const leader = new Leader(mockDb)
590+
const errorSpy = jest.spyOn(leader, 'emit')
591+
const dbError = new Error('Delete failed')
592+
leader.on('error', () => {}) // Consume error events
593+
594+
await leader.start()
595+
jest.clearAllMocks()
596+
mockCollection.deleteOne.mockRejectedValueOnce(dbError)
597+
598+
// Act
599+
await leader.stop({ release: true })
600+
601+
// Assert
602+
expect(errorSpy).toHaveBeenCalledWith('error', dbError)
603+
})
575604
it('should allow restart after stop', async () => {
576605
// Arrange
577606
const leader = new Leader(mockDb)
578607
await leader.start()
579-
leader.stop()
608+
await leader.stop()
580609

581610
// Reset the mock to simulate a fresh start
582611
mockDb.listCollections.mockResolvedValue({
@@ -592,7 +621,7 @@ describe('Leader', () => {
592621
expect(mockDb.createCollection).toHaveBeenCalled()
593622

594623
// Cleanup
595-
leader.stop()
624+
await leader.stop()
596625
})
597626
})
598627
})

tests/mocks/db.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const mockCollection = {
77
createIndex: jest.fn(() => Promise.resolve()),
88
findOne: jest.fn(() => Promise.resolve()),
99
findOneAndUpdate: jest.fn(() => Promise.resolve()),
10+
deleteOne: jest.fn(() => Promise.resolve()),
1011
listIndexes: jest.fn(() => ({
1112
toArray: jest.fn(() => Promise.resolve([])),
1213
})),

0 commit comments

Comments
 (0)