You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					138 lines
				
				4.4 KiB
			
		
		
			
		
	
	
					138 lines
				
				4.4 KiB
			| 
								 
											2 years ago
										 
									 | 
							
								const { assert } = require('chai');
							 | 
						||
| 
								 | 
							
								const sinon = require('sinon');
							 | 
						||
| 
								 | 
							
								const cron = require('../src/node-cron');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								describe('node-cron', () => {
							 | 
						||
| 
								 | 
							
								    beforeEach(() => {
							 | 
						||
| 
								 | 
							
								        this.clock = sinon.useFakeTimers(new Date(2018, 0, 1, 0, 0, 0, 0));
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    afterEach(() => {
							 | 
						||
| 
								 | 
							
								        this.clock.restore();
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    describe('schedule', () => {
							 | 
						||
| 
								 | 
							
								        it('should schedule a task', () => {
							 | 
						||
| 
								 | 
							
								            let executed = 0;
							 | 
						||
| 
								 | 
							
								            cron.schedule('* * * * * *', () => {
							 | 
						||
| 
								 | 
							
								                executed += 1;
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            this.clock.tick(2000);
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            assert.equal(2, executed);
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        it('should schedule a task with America/Sao_Paulo timezone', (done) => {
							 | 
						||
| 
								 | 
							
								            let startDate = new Date('Thu, 20 Sep 2018 00:00:00.000Z');
							 | 
						||
| 
								 | 
							
								            this.clock.restore();
							 | 
						||
| 
								 | 
							
								            this.clock = sinon.useFakeTimers(startDate);
							 | 
						||
| 
								 | 
							
								            cron.schedule('* * * * * *', (date) => {
							 | 
						||
| 
								 | 
							
								                assert.equal(19, date.getDate());
							 | 
						||
| 
								 | 
							
								                assert.equal(8, date.getMonth());
							 | 
						||
| 
								 | 
							
								                assert.equal(2018, date.getFullYear());
							 | 
						||
| 
								 | 
							
								                assert.equal(21, date.getHours());
							 | 
						||
| 
								 | 
							
								                assert.equal(0, date.getMinutes());
							 | 
						||
| 
								 | 
							
								                assert.equal(1, date.getSeconds());
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								            }, {
							 | 
						||
| 
								 | 
							
								                timezone: 'America/Sao_Paulo'
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								            this.clock.tick(1000);
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        it('should schedule a task with Europe/Rome timezone', (done) => {
							 | 
						||
| 
								 | 
							
								            let startDate = new Date('Thu, 20 Sep 2018 00:00:00.000Z');
							 | 
						||
| 
								 | 
							
								            this.clock.restore();
							 | 
						||
| 
								 | 
							
								            this.clock = sinon.useFakeTimers(startDate);
							 | 
						||
| 
								 | 
							
								            cron.schedule('* * * * * *', (date) => {
							 | 
						||
| 
								 | 
							
								                assert.equal(20, date.getDate());
							 | 
						||
| 
								 | 
							
								                assert.equal(8, date.getMonth());
							 | 
						||
| 
								 | 
							
								                assert.equal(2018, date.getFullYear());
							 | 
						||
| 
								 | 
							
								                assert.equal(2, date.getHours());
							 | 
						||
| 
								 | 
							
								                assert.equal(0, date.getMinutes());
							 | 
						||
| 
								 | 
							
								                assert.equal(1, date.getSeconds());
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								            }, {
							 | 
						||
| 
								 | 
							
								                timezone: 'Europe/Rome'
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								            this.clock.tick(1000);
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        it('should schedule a task stoped', () => {
							 | 
						||
| 
								 | 
							
								            let executed = 0;
							 | 
						||
| 
								 | 
							
								            cron.schedule('* * * * * *', () => {
							 | 
						||
| 
								 | 
							
								                executed += 1;
							 | 
						||
| 
								 | 
							
								            }, { scheduled: false });
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            this.clock.tick(2000);
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            assert.equal(0, executed);
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        it('should start a stoped task', () => {
							 | 
						||
| 
								 | 
							
								            let executed = 0;
							 | 
						||
| 
								 | 
							
								            let scheduledTask = cron.schedule('* * * * * *', () => {
							 | 
						||
| 
								 | 
							
								                executed += 1;
							 | 
						||
| 
								 | 
							
								            }, { scheduled: false });
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            this.clock.tick(2000);
							 | 
						||
| 
								 | 
							
								            assert.equal(0, executed);
							 | 
						||
| 
								 | 
							
								            scheduledTask.start();
							 | 
						||
| 
								 | 
							
								            this.clock.tick(2000);
							 | 
						||
| 
								 | 
							
								            assert.equal(2, executed);
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        it('should recover missed executions', (done) => {
							 | 
						||
| 
								 | 
							
								            let executed = 0;
							 | 
						||
| 
								 | 
							
								            this.clock.restore();
							 | 
						||
| 
								 | 
							
								            let scheduledTask = cron.schedule('* * * * * *', () => {
							 | 
						||
| 
								 | 
							
								                executed += 1;
							 | 
						||
| 
								 | 
							
								            }, { recoverMissedExecutions: true });
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            let wait = true;
							 | 
						||
| 
								 | 
							
								            let startedAt = new Date();
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            while(wait){
							 | 
						||
| 
								 | 
							
								                if((new Date().getTime() - startedAt.getTime()) > 1000){
							 | 
						||
| 
								 | 
							
								                    wait = false;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            setTimeout(() => {
							 | 
						||
| 
								 | 
							
								                scheduledTask.stop();
							 | 
						||
| 
								 | 
							
								                assert.equal(2, executed);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								            }, 1000);
							 | 
						||
| 
								 | 
							
								        }).timeout(4000);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        it('should schedule a background task', () => {
							 | 
						||
| 
								 | 
							
								            let task = cron.schedule('* * * * * *', './test/assets/dummy-task.js');
							 | 
						||
| 
								 | 
							
								            assert.isNotNull(task);
							 | 
						||
| 
								 | 
							
								            assert.isDefined(task);
							 | 
						||
| 
								 | 
							
								            assert.isTrue(task.isRunning());
							 | 
						||
| 
								 | 
							
								            task.stop();
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    describe('validate', () => {
							 | 
						||
| 
								 | 
							
								        it('should validate a pattern', () => {
							 | 
						||
| 
								 | 
							
								            assert.isTrue(cron.validate('* * * * * *')); 
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        it('should fail with a invalid pattern', () => {
							 | 
						||
| 
								 | 
							
								            assert.isFalse(cron.validate('62 * * * * *')); 
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    describe('getTasks', () => {
							 | 
						||
| 
								 | 
							
								        beforeEach(() => {
							 | 
						||
| 
								 | 
							
								            global.scheduledTasks = new Map();
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        it('should store a task', () => {
							 | 
						||
| 
								 | 
							
								            cron.schedule('* * * * *', () => {});
							 | 
						||
| 
								 | 
							
								            assert.lengthOf(cron.getTasks(), 1);
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								});
							 |