123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- import mockMilvusClient from '../__mocks__/milvus/milvusClient';
- import { schedule } from 'node-cron';
- import { CollectionsService } from '../../collections/collections.service';
- import { CronsService, SchedulerRegistry } from '../../crons/crons.service';
- import { MilvusService } from '../../milvus/milvus.service';
- import { WS_EVENTS, WS_EVENTS_TYPE } from '../../utils/Const';
- import { insightCacheForTest, mockAddress } from '../__mocks__/consts';
- import { MilvusClient } from '@zilliz/milvus2-sdk-node/dist/milvus';
- // mock Milvus client
- jest.mock('@zilliz/milvus2-sdk-node', () => {
- return {
- MilvusClient: mockMilvusClient,
- };
- });
- // mock node-cron
- jest.mock('node-cron', () => {
- return {
- schedule: jest.fn(),
- };
- });
- // mock variable
- const mockCronFrequency = '30 00 * * *';
- const mockCronEverySec = '* * * * * *';
- const mockCb = jest.fn();
- const mockErrCb = jest.fn(() => {
- throw new Error('error');
- });
- const mockName = 'j1';
- const mockSecName = 'everySec';
- describe('test crons service', () => {
- let milvusService: any;
- let collectionService: any;
- let cronsService: any;
- let schedulerRegistry: any;
- const handleStartTask = jest.fn();
- const handleEndTask = jest.fn();
- const setup = async () => {
- milvusService = new MilvusService();
- MilvusService.activeAddress = mockAddress;
- MilvusService.activeMilvusClient = new MilvusClient(mockAddress);
- await milvusService.connectMilvus(
- { address: mockAddress },
- insightCacheForTest
- );
- collectionService = new CollectionsService(milvusService);
- schedulerRegistry = new SchedulerRegistry([]);
- cronsService = new CronsService(collectionService, schedulerRegistry);
- };
- beforeAll(async () => {
- // setup Milvus service and connect to mock Milvus client
- await setup();
- });
- beforeEach(() => {
- // mock schedule
- (schedule as jest.Mock).mockImplementationOnce((frequency, callback) => {
- callback();
- return {
- start: handleStartTask,
- stop: handleEndTask,
- };
- });
- });
- afterAll(() => {
- milvusService = null;
- collectionService = null;
- schedulerRegistry = null;
- cronsService = null;
- });
- test('test SchedulerRegistry related methods', async () => {
- schedulerRegistry.setCronJob(mockName, mockCronFrequency, () => mockCb());
- expect(mockCb).toBeCalledTimes(1);
- expect(schedule).toBeCalledWith(mockCronFrequency, expect.any(Function));
- const job = schedulerRegistry.getCronJob(mockName);
- expect(job).toEqual({
- start: handleStartTask,
- stop: handleEndTask,
- });
- schedulerRegistry.setCronJob(mockName, mockCronFrequency, () => mockCb());
- expect(handleEndTask).toBeCalled();
- schedulerRegistry.setCronJobEverySecond(mockSecName, () => mockCb());
- expect(schedule).toBeCalledWith(mockCronEverySec, expect.any(Function));
- schedulerRegistry.setCronJob(mockName, mockCronFrequency, () => mockCb());
- expect(handleEndTask).toBeCalled();
- schedulerRegistry.setCronJob(mockName, mockCronFrequency, () =>
- mockErrCb()
- );
- expect(() => {
- mockErrCb();
- }).toThrow();
- });
- test('test CronService related methods', async () => {
- try {
- await cronsService.toggleCronJobByName({
- name: WS_EVENTS.COLLECTION,
- type: WS_EVENTS_TYPE.STOP,
- });
- } catch (err) {
- expect(err.message).toBe('No existed job entity');
- }
- await cronsService.toggleCronJobByName({
- name: WS_EVENTS.COLLECTION,
- type: WS_EVENTS_TYPE.START,
- });
- expect(schedule).toBeCalledWith(mockCronEverySec, expect.any(Function));
- schedulerRegistry.setCronJob(WS_EVENTS.COLLECTION, mockCronFrequency, () =>
- mockCb()
- );
- await cronsService.toggleCronJobByName({
- name: WS_EVENTS.COLLECTION,
- type: WS_EVENTS_TYPE.START,
- });
- expect(handleStartTask).toBeCalled();
- await cronsService.toggleCronJobByName({
- name: WS_EVENTS.COLLECTION,
- type: WS_EVENTS_TYPE.STOP,
- });
- expect(handleStartTask).toBeCalled();
- try {
- await cronsService.toggleCronJobByName({
- name: mockName,
- type: WS_EVENTS_TYPE.STOP,
- });
- } catch (err) {
- expect(err.message).toBe('Unsupported event type');
- }
- });
- test('test getCollections error', async () => {
- // reset setup to trigger error
- const newCollectionService = new CollectionsService(milvusService);
- const newSchedulerRegistry = new SchedulerRegistry([]);
- newCollectionService.getAllCollections = () => {
- throw new Error('error');
- };
- const newCronsService = new CronsService(
- newCollectionService,
- newSchedulerRegistry
- );
- await newCronsService.getCollections(
- WS_EVENTS.COLLECTION,
- '127.0.0.1:19530'
- );
- expect(schedule).toBeCalledWith(mockCronEverySec, expect.any(Function));
- expect(handleEndTask).toBeCalled();
- });
- });
|