From 70e0aea0566b90f0326ccd249c064a3a3fcf2413 Mon Sep 17 00:00:00 2001 From: Rudy Marchandise Date: Sat, 3 Apr 2021 20:28:13 +0200 Subject: [PATCH 1/4] fix(tests): unit tests --- src/services/TwitchService.ts | 2 +- tests/LarbinBot.spec.ts | 126 +++++++++++++++++++++++++++ tests/services/CryptoService.spec.ts | 20 +++++ 3 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 tests/LarbinBot.spec.ts create mode 100644 tests/services/CryptoService.spec.ts diff --git a/src/services/TwitchService.ts b/src/services/TwitchService.ts index 9330754..ca76675 100644 --- a/src/services/TwitchService.ts +++ b/src/services/TwitchService.ts @@ -73,7 +73,7 @@ export class TwitchService implements ITwitchService { } public AddScheduler(scheduler: IScheduler): ITwitchService { - setInterval((s) => { + setInterval((s: any) => { s.Action(this); }, scheduler.Minutes * 60000, scheduler); return this; diff --git a/tests/LarbinBot.spec.ts b/tests/LarbinBot.spec.ts new file mode 100644 index 0000000..b93f6e1 --- /dev/null +++ b/tests/LarbinBot.spec.ts @@ -0,0 +1,126 @@ +import 'reflect-metadata' +import { LarbinBot } from '../src/LarbinBot'; +import { Configuration } from '../src/Configuration'; +import { Mock, Times } from 'moq.ts'; +import { LoggerService, TwitchService, YamlService } from '../src/services'; +import { ICommand } from '../src/lib/Commands'; +import { EventType, IEvent, IEventParams } from '../src/lib/Events'; +import { IScheduler } from '../src/lib/Schedulers'; + +describe('LarbinBot', function () { + let larbinBot : LarbinBot; + let mockConfiguration : Mock; + let mockYamlService : Mock; + let mockLoggerService : Mock; + let mockTwitchService : Mock; + + beforeEach(() => { + // Mock + mockConfiguration = new Mock(); + mockYamlService = new Mock(); + mockLoggerService = new Mock(); + mockTwitchService = new Mock(); + + const logFunction = (write: string) => {} + mockLoggerService.setup(x => x.Ascii).returns(logFunction); + mockLoggerService.setup(x => x.Debug).returns(logFunction); + mockLoggerService.setup(x => x.Error).returns(logFunction); + mockLoggerService.setup(x => x.Information).returns(logFunction); + mockLoggerService.setup(x => x.Warning).returns(logFunction); + + larbinBot = new LarbinBot( + mockConfiguration.object(), + mockYamlService.object(), + mockLoggerService.object(), + mockTwitchService.object()); + }); + + it('Commands', async function () { + // Arrange + const numberOfResult = 10; + const returns = new Array(); + for (let i = 0; i < numberOfResult; i++) { + const mockCommand = new Mock(); + mockCommand.setup(x => x.Trigger).returns(`!${i}`); + mockCommand.setup(x => x.OnlyMods).returns(false); + mockCommand.setup(x => x.Action).returns(() => {}); + returns.push(mockCommand.object()); + } + mockYamlService.setup(x => x.getCommands()).returns(returns); + mockYamlService.setup(x => x.getEvents()).returns(new Array()); + mockYamlService.setup(x => x.getSchedulers()).returns(new Array()); + mockTwitchService.setup(x => x.AddCommand).returns(() => { return mockTwitchService.object() }); + mockTwitchService.setup(x => x.Listen).returns(() => {}); + + // Act + larbinBot.Run(); + + // Assert + mockYamlService.verify(x => x.getCommands, Times.Once()); + mockYamlService.verify(x => x.getCommands, Times.Once()); + mockYamlService.verify(x => x.getEvents, Times.Once()); + + mockTwitchService.verify(x => x.AddCommand, Times.Exactly(numberOfResult)); + mockTwitchService.verify(x => x.AddEvent, Times.Never()); + mockTwitchService.verify(x => x.AddScheduler, Times.Never()); + }); + + it('Events', async function () { + // Arrange + const numberOfResult = 10; + const returns = new Array>(); + for (let i = 0; i < numberOfResult; i++) { + const mockCommand = new Mock>(); + mockCommand.setup(x => x.Type).returns(EventType.JOIN); + mockCommand.setup(x => x.Action).returns(() => {}); + returns.push(mockCommand.object()); + } + mockYamlService.setup(x => x.getCommands()).returns(new Array()); + mockYamlService.setup(x => x.getEvents()).returns(returns); + mockYamlService.setup(x => x.getSchedulers()).returns(new Array()); + mockTwitchService.setup(x => x.AddEvent).returns(() => { return mockTwitchService.object() }); + mockTwitchService.setup(x => x.Listen).returns(() => {}); + + // Act + larbinBot.Run(); + + // Assert + mockYamlService.verify(x => x.getCommands, Times.Once()); + mockYamlService.verify(x => x.getCommands, Times.Once()); + mockYamlService.verify(x => x.getEvents, Times.Once()); + + mockTwitchService.verify(x => x.AddCommand, Times.Never()); + mockTwitchService.verify(x => x.AddEvent, Times.Exactly(numberOfResult)); + mockTwitchService.verify(x => x.AddScheduler, Times.Never()); + }); + + it('Schedulers', async function () { + // Arrange + const numberOfResult = 10; + const returns = new Array(); + for (let i = 0; i < numberOfResult; i++) { + const mockCommand = new Mock(); + mockCommand.setup(x => x.Id).returns(i.toString()); + mockCommand.setup(x => x.Minutes).returns(i); + mockCommand.setup(x => x.Action).returns(() => {}); + returns.push(mockCommand.object()); + } + mockYamlService.setup(x => x.getCommands()).returns(new Array()); + mockYamlService.setup(x => x.getEvents()).returns(new Array()); + mockYamlService.setup(x => x.getSchedulers()).returns(returns); + mockTwitchService.setup(x => x.AddScheduler).returns(() => { return mockTwitchService.object() }); + mockTwitchService.setup(x => x.Listen).returns(() => {}); + + // Act + larbinBot.Run(); + + // Assert + mockYamlService.verify(x => x.getCommands, Times.Once()); + mockYamlService.verify(x => x.getCommands, Times.Once()); + mockYamlService.verify(x => x.getEvents, Times.Once()); + + mockTwitchService.verify(x => x.AddCommand, Times.Never()); + mockTwitchService.verify(x => x.AddEvent, Times.Never()); + mockTwitchService.verify(x => x.AddScheduler, Times.Exactly(numberOfResult)); + }); +}); diff --git a/tests/services/CryptoService.spec.ts b/tests/services/CryptoService.spec.ts new file mode 100644 index 0000000..7c8a281 --- /dev/null +++ b/tests/services/CryptoService.spec.ts @@ -0,0 +1,20 @@ +import 'reflect-metadata' +import { CryptoService } from '../../src/services'; + +describe('Service - CryptoService', function () { + let cryptoService : CryptoService; + + beforeEach(() => { + cryptoService = new CryptoService(); + }); + + it('UniqueString', async function () { + const MaximumLength = 100; + const StepLength = 5; + + for (let i = 0; i < MaximumLength; i += StepLength) { + const result = cryptoService.UniqueString(i); + expect(result.length).toBe(i); + } + }); +}); From c29268017ce8c8726ed3f81cf7619dd1e0cca196 Mon Sep 17 00:00:00 2001 From: Rudy Marchandise Date: Sat, 3 Apr 2021 20:32:21 +0200 Subject: [PATCH 2/4] configure codecov --- codecov.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 codecov.yml diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..2cc8b16 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,7 @@ +codecov: + require_ci_to_pass: yes + +coverage: + precision: 2 + round: down + range: "70...100" From 73920c717145d1fcc2ee92e52ae34f3e51d8d569 Mon Sep 17 00:00:00 2001 From: Rudy Marchandise Date: Sat, 3 Apr 2021 20:34:59 +0200 Subject: [PATCH 3/4] code cove --- codecov.yml => .codecov.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename codecov.yml => .codecov.yml (100%) diff --git a/codecov.yml b/.codecov.yml similarity index 100% rename from codecov.yml rename to .codecov.yml From 56993e8b59b53c5eb179489ad7134eb667319049 Mon Sep 17 00:00:00 2001 From: Rudy Marchandise Date: Sat, 3 Apr 2021 20:36:01 +0200 Subject: [PATCH 4/4] fix --- .codecov.yml => codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .codecov.yml => codecov.yml (72%) diff --git a/.codecov.yml b/codecov.yml similarity index 72% rename from .codecov.yml rename to codecov.yml index 2cc8b16..73a7646 100644 --- a/.codecov.yml +++ b/codecov.yml @@ -1,5 +1,5 @@ codecov: - require_ci_to_pass: yes + require_ci_to_pass: no coverage: precision: 2