Skip to content

Commit ef0f195

Browse files
committed
add test coverage for update worker
1 parent 4b6d602 commit ef0f195

File tree

4 files changed

+90
-5
lines changed

4 files changed

+90
-5
lines changed

src/patcher/backoff.service.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@ import { Redis } from 'ioredis'
33
import { IConnOptionsService } from '../common/conn-options.service'
44
import { ImageDescriptor } from '../kubernetes/k8s.service'
55

6+
export interface IBackoffService {
7+
canIUpdate(descriptor: ImageDescriptor): Promise<boolean>
8+
}
9+
610
@Injectable()
7-
export class BackoffService implements OnModuleDestroy {
11+
export class BackoffService implements OnModuleDestroy, IBackoffService {
812
private readonly redis: Redis
913

1014
constructor(

src/patcher/patcher.module.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ import { BackoffService } from './backoff.service'
1313
CommonModule,
1414
KubernetesModule,
1515
],
16-
providers: [UpdateWorker, BackoffService],
16+
providers: [
17+
UpdateWorker,
18+
{
19+
provide: 'BACKOFF_SERVICE',
20+
useClass: BackoffService,
21+
},
22+
],
1723
})
1824
export class PatcherModule {}

src/patcher/update.consumer.spec.ts

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import { Test, TestingModule } from '@nestjs/testing'
2+
import {
3+
ImageDescriptor,
4+
Resource,
5+
ResourceType,
6+
} from '../kubernetes/k8s.service'
7+
import { UpdateWorker } from './update.consumer'
8+
9+
describe('UpdateWorker', () => {
10+
let service: UpdateWorker
11+
let module: TestingModule
12+
let fakeK8s
13+
14+
beforeEach(async () => {
15+
fakeK8s = {
16+
triggerRollingUpdate: jest.fn(),
17+
}
18+
module = await Test.createTestingModule({
19+
providers: [
20+
{
21+
provide: 'K8S_SERVICE',
22+
useValue: fakeK8s,
23+
},
24+
{
25+
provide: 'BACKOFF_SERVICE',
26+
useValue: {
27+
canIUpdate: (descriptor: ImageDescriptor): Promise<boolean> => {
28+
if (descriptor.owner.name === 'TEST_1')
29+
return Promise.resolve(false)
30+
return Promise.resolve(true)
31+
},
32+
},
33+
},
34+
UpdateWorker,
35+
],
36+
}).compile()
37+
38+
service = module.get<UpdateWorker>(UpdateWorker)
39+
})
40+
afterEach(async () => {
41+
await module.close()
42+
})
43+
44+
it('should be defined', () => {
45+
expect(service).toBeDefined()
46+
})
47+
48+
it('should not update when inside graceperiod', async () => {
49+
const result = await service.rollout({
50+
data: {
51+
owner: {
52+
name: 'TEST_1',
53+
namespace: 'TEST_NAMESPACE_1',
54+
type: ResourceType.DAEMONSET,
55+
} as Resource,
56+
},
57+
} as unknown as any)
58+
expect(result.updateScheduled).toBeFalsy()
59+
expect(fakeK8s.triggerRollingUpdate.mock.calls.length).toBe(0)
60+
})
61+
62+
it('should update when outside the graceperiod', async () => {
63+
const result = await service.rollout({
64+
data: {
65+
owner: {
66+
name: 'TEST_2',
67+
namespace: 'TEST_NAMESPACE_2',
68+
type: ResourceType.DAEMONSET,
69+
} as Resource,
70+
},
71+
} as unknown as any)
72+
expect(result.updateScheduled).toBeTruthy()
73+
expect(fakeK8s.triggerRollingUpdate.mock.calls.length).toBe(1)
74+
})
75+
})

src/patcher/update.consumer.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Processor, Process } from '@nestjs/bull'
22
import { Inject, Logger } from '@nestjs/common'
33
import { Job } from 'bull'
44
import { IK8sService, ImageDescriptor } from '../kubernetes/k8s.service'
5-
import { BackoffService } from './backoff.service'
5+
import { IBackoffService } from './backoff.service'
66

77
export interface ImageDescriptorUpdate extends ImageDescriptor {
88
currentSha: string
@@ -13,11 +13,11 @@ export interface ImageDescriptorUpdate extends ImageDescriptor {
1313
export class UpdateWorker {
1414
private readonly logger = new Logger(UpdateWorker.name)
1515
private readonly k8sService: IK8sService
16-
private readonly backoffService: BackoffService
16+
private readonly backoffService: IBackoffService
1717

1818
constructor(
1919
@Inject('K8S_SERVICE') k8s: IK8sService,
20-
backoff: BackoffService
20+
@Inject('BACKOFF_SERVICE') backoff: IBackoffService
2121
) {
2222
this.k8sService = k8s
2323
this.backoffService = backoff

0 commit comments

Comments
 (0)