From 9c151900bb9e87b198bebd075e773f1967a3c85c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefano=20Borz=C3=AC?= Date: Tue, 12 May 2020 11:30:54 +0200 Subject: [PATCH] chore(quest-preview-required): add required NpC, Gameobject, Item and Faction (#672) * chore(quest-preview-required): add required NpC, Gameobject, Item and Faction * chore(quest-preview): add unit-tests for quest-preview service * chore(quest-preview): add component unit-tests --- .../quest-preview.component.html | 31 ++++++ .../quest-preview.component.spec.ts | 82 +++++++++++++- .../quest-preview.service.spec.ts | 100 +++++++++++++++++- .../quest-preview/quest-preview.service.ts | 51 +++++++++ 4 files changed, 259 insertions(+), 5 deletions(-) diff --git a/src/app/features/quest/quest-preview/quest-preview.component.html b/src/app/features/quest/quest-preview/quest-preview.component.html index ed92d1c610..eca95f4f96 100644 --- a/src/app/features/quest/quest-preview/quest-preview.component.html +++ b/src/app/features/quest/quest-preview/quest-preview.component.html @@ -99,6 +99,37 @@
{{ service.title }}
+
+

Objectives

+ {{ service.objectiveText }} +

{{ service.questTemplate.AreaDescription }}

+ +
+ +

+ • {{ !!service.getObjText(i) ? service.getObjText(i) : (service.getObjective$(i) | async) }} {{ service.getObjectiveCount(i) }} +

+
+
+ +
+ +

+ •  {{ service.mysqlQueryService.getItemNameById(reqItem) | async }} {{ service.getObjItemCount(i) }} +

+
+
+ +
+ +

+ • {{ service.sqliteQueryService.getFactionNameById(reqFaction) | async }} {{ service.getFactionByValue(i) }} +

+
+
+ +
+

Gains

• {{ xp }} experience

diff --git a/src/app/features/quest/quest-preview/quest-preview.component.spec.ts b/src/app/features/quest/quest-preview/quest-preview.component.spec.ts index 59e9e7e7e4..a74c57592d 100644 --- a/src/app/features/quest/quest-preview/quest-preview.component.spec.ts +++ b/src/app/features/quest/quest-preview/quest-preview.component.spec.ts @@ -9,6 +9,8 @@ import { PageObject } from '@keira-shared/testing/page-object'; import { QuestTemplate } from '@keira-shared/types/quest-template.type'; import { QuestTemplateAddon } from '@keira-shared/types/quest-template-addon.type'; import { createMockObject } from '@keira-shared/utils/helpers'; +import { MysqlQueryService } from '@keira-shared/services/mysql-query.service'; +import { SqliteQueryService } from '@keira-shared/services/sqlite-query.service'; class QuestPreviewComponentPage extends PageObject { get title() { return this.query('#title'); } @@ -23,6 +25,10 @@ class QuestPreviewComponentPage extends PageObject { get rewardTalents() { return this.query('#rewardTalents'); } get rewardReputations() { return this.query('#rewardReputations'); } get providedItem() { return this.query('#provided-item'); } + get areaDescription() { return this.query('#areaDescription'); } + get npcOrGoObjectives() { return this.query('#npcOrGoObjectives'); } + get itemObjectives() { return this.query('#itemObjectives'); } + get RequiredFaction() { return this.query('#RequiredFaction'); } getRaces(assert = true) { return this.query('#races', assert); } } @@ -44,8 +50,10 @@ describe('QuestPreviewComponent', () => { const fixture: ComponentFixture = TestBed.createComponent(QuestPreviewComponent); const component: QuestPreviewComponent = fixture.componentInstance; const page = new QuestPreviewComponentPage(fixture); + const mysqlQueryService = TestBed.inject(MysqlQueryService); + const sqliteQueryService = TestBed.inject(SqliteQueryService); - return { fixture, component, service, page }; + return { fixture, component, service, page, mysqlQueryService, sqliteQueryService }; } it('ngOnInit should initialise services', () => { @@ -209,4 +217,76 @@ describe('QuestPreviewComponent', () => { fixture.debugElement.nativeElement.remove(); }); + it('should show areaDescription', () => { + const { fixture, page, service } = setup(); + const questTemplate = createMockObject({ AreaDescription: 'Area Desc', }, QuestTemplate); + spyOnProperty(service, 'questTemplate', 'get').and.returnValue(questTemplate); + + fixture.detectChanges(); + + expect(page.areaDescription.innerText).toContain('Area Desc'); + fixture.debugElement.nativeElement.remove(); + }); + + it('should show npcOrGoObjectives', async() => { + const { fixture, page, service } = setup(); + const getObjectiveCountSpy: Spy = spyOn(service, 'getObjectiveCount').and.returnValue('(1)'); + const getObjTextSpy: Spy = spyOn(service, 'getObjText').and.returnValue('Mock Objective'); + spyOn(service, 'getObjective$').and.returnValue(Promise.resolve('Riverpaw Gnoll')); + spyOn(service, 'isNpcOrGoObj').and.returnValue(true); + + fixture.detectChanges(); + expect(page.npcOrGoObjectives.innerText).toContain('Mock Objective (1)'); + + getObjectiveCountSpy.and.returnValue(''); + + fixture.detectChanges(); + expect(page.npcOrGoObjectives.innerText).toContain('Mock Objective'); + + getObjTextSpy.and.returnValue(''); + + fixture.detectChanges(); + await fixture.whenStable(); + fixture.detectChanges(); + expect(page.npcOrGoObjectives.innerText).toContain('Riverpaw Gnoll'); + + fixture.debugElement.nativeElement.remove(); + }); + + + it('should show itemObjectives', async() => { + const { fixture, page, service, mysqlQueryService } = setup(); + const getObjItemCountSpy: Spy = spyOn(service, 'getObjItemCount').and.returnValue('(2)'); + const questTemplate = createMockObject({ RequiredItemId1: 1 }, QuestTemplate); + spyOnProperty(service, 'questTemplate', 'get').and.returnValue(questTemplate); + spyOn(mysqlQueryService, 'getItemNameById').and.returnValue(Promise.resolve('Mock Item')); + + fixture.detectChanges(); + await fixture.whenStable(); + fixture.detectChanges(); + expect(page.itemObjectives.innerText).toContain('Mock Item (2)'); + + getObjItemCountSpy.and.returnValue(''); + + fixture.detectChanges(); + expect(page.itemObjectives.innerText).toContain('Mock Item'); + + fixture.debugElement.nativeElement.remove(); + }); + + it('should show RequiredFaction', async() => { + const { fixture, page, service, sqliteQueryService } = setup(); + const questTemplate = createMockObject({ RequiredFactionId1: 1, RequiredFactionValue1: 900 }, QuestTemplate); + spyOn(service, 'getFactionByValue').and.returnValue('(Neutral)'); + spyOnProperty(service, 'questTemplate', 'get').and.returnValue(questTemplate); + spyOn(sqliteQueryService, 'getFactionNameById').and.returnValue(Promise.resolve('Mock Faction')); + + fixture.detectChanges(); + await fixture.whenStable(); + fixture.detectChanges(); + expect(page.RequiredFaction.innerText).toContain('Mock Faction (Neutral)'); + + fixture.debugElement.nativeElement.remove(); + }); + }); diff --git a/src/app/features/quest/quest-preview/quest-preview.service.spec.ts b/src/app/features/quest/quest-preview/quest-preview.service.spec.ts index f11aa48366..1fd8f46dc2 100644 --- a/src/app/features/quest/quest-preview/quest-preview.service.spec.ts +++ b/src/app/features/quest/quest-preview/quest-preview.service.spec.ts @@ -12,7 +12,6 @@ import { CreatureQueststarterService } from '../creature-queststarter/creature-q import { CreatureQuestenderService } from '../creature-questender/creature-questender.service'; import { QuestHandlerService } from '../quest-handler.service'; import { MysqlQueryService } from '@keira-shared/services/mysql-query.service'; -import { of } from 'rxjs'; import { DifficultyLevel } from './quest-preview.model'; import { QUEST_FLAG_DAILY, QUEST_FLAG_WEEKLY, QUEST_FLAG_SPECIAL_MONTHLY, QUEST_FLAG_SPECIAL_REPEATABLE, QUEST_FLAG_REPEATABLE, QUEST_PERIOD @@ -46,13 +45,15 @@ describe('QuestPreviewService', () => { const creatureQuestenderService = TestBed.inject(CreatureQuestenderService); const MAX_NEXT_QUEST_ID = 7; - spyOn(mysqlQueryService, 'getQuestTitleById').and.callFake(i => of('Title' + i).toPromise()); + spyOn(mysqlQueryService, 'getQuestTitleById').and.callFake(i => Promise.resolve('Title' + i)); spyOn(mysqlQueryService, 'getPrevQuestById').and.callFake( - (id: number) => of(String(id > 0 ? (id - 1) : 0)).toPromise() + (id: number) => Promise.resolve(String(id > 0 ? (id - 1) : 0)) ); spyOn(mysqlQueryService, 'getNextQuestById').and.callFake( - (id: number) => of(String(id < MAX_NEXT_QUEST_ID ? (id + 1) : 0)).toPromise() + (id: number) => Promise.resolve(String(id < MAX_NEXT_QUEST_ID ? (id + 1) : 0)) ); + spyOn(mysqlQueryService, 'getGameObjectNameById').and.callFake(() => Promise.resolve('Helias Gameobject')); + spyOn(mysqlQueryService, 'getCreatureNameById').and.callFake(() => Promise.resolve('Helias Creature')); return { service, @@ -486,6 +487,97 @@ describe('QuestPreviewService', () => { expect(service.getRewardReputation(1, [mockQuestReputationReward2])).toBe(mockRepValue * (repeatableRate - 1)); }); + it('getObjective$', async() => { + const { service, questTemplateService, mysqlQueryService } = setup(); + + questTemplateService.form.controls.RequiredNpcOrGo1.setValue(0); + expect(await service.getObjective$(1)).toBeUndefined(); + + questTemplateService.form.controls.RequiredNpcOrGo1.setValue(-1); + expect(await service.getObjective$(1)).toBe('Helias Gameobject'); + expect(mysqlQueryService.getGameObjectNameById).toHaveBeenCalledTimes(1); + expect(mysqlQueryService.getGameObjectNameById).toHaveBeenCalledWith(1); + + + questTemplateService.form.controls.RequiredNpcOrGo1.setValue(1); + expect(await service.getObjective$(1)).toBe('Helias Creature'); + expect(mysqlQueryService.getCreatureNameById).toHaveBeenCalledTimes(1); + expect(mysqlQueryService.getCreatureNameById).toHaveBeenCalledWith(1); + }); + + + it('getObjectiveCount', () => { + const { service, questTemplateService } = setup(); + + questTemplateService.form.controls.RequiredNpcOrGoCount1.setValue(0); + expect(service.getObjectiveCount(1)).toBe(''); + + questTemplateService.form.controls.RequiredNpcOrGoCount1.setValue(2); + expect(service.getObjectiveCount(1)).toBe('(2)'); + }); + + it('isNpcOrGo', () => { + const { service, questTemplateService } = setup(); + + questTemplateService.form.controls.RequiredNpcOrGoCount1.setValue(0); + expect(service.isNpcOrGoObj(1)).toBeFalse(); + + questTemplateService.form.controls.RequiredNpcOrGoCount1.setValue(1); + expect(service.isNpcOrGoObj(1)).toBeTrue(); + }); + + + it('getObjItemCount', () => { + const { service, questTemplateService } = setup(); + + questTemplateService.form.controls.RequiredItemCount1.setValue(0); + expect(service.getObjItemCount(1)).toBe(''); + + questTemplateService.form.controls.RequiredItemCount1.setValue(2); + expect(service.getObjItemCount(1)).toBe('(2)'); + }); + + + it('getFactionByValue', () => { + const { service, questTemplateService } = setup(); + + questTemplateService.form.controls.RequiredFactionValue1.setValue(0); + expect(service.getFactionByValue(1)).toBe(''); + + questTemplateService.form.controls.RequiredFactionValue1.setValue(900); + expect(service.getFactionByValue(1)).toBe('(Neutral)'); + + questTemplateService.form.controls.RequiredFactionValue1.setValue(2100); + expect(service.getFactionByValue(1)).toBe('(Neutral)'); + + questTemplateService.form.controls.RequiredFactionValue1.setValue(3000); + expect(service.getFactionByValue(1)).toBe('(Friendly)'); + + questTemplateService.form.controls.RequiredFactionValue1.setValue(9000); + expect(service.getFactionByValue(1)).toBe('(Honored)'); + + questTemplateService.form.controls.RequiredFactionValue1.setValue(21000); + expect(service.getFactionByValue(1)).toBe('(Revered)'); + + questTemplateService.form.controls.RequiredFactionValue1.setValue(42000); + expect(service.getFactionByValue(1)).toBe('(Exalted)'); + }); + + it('getObjText', () => { + const { service, questTemplateService } = setup(); + + questTemplateService.form.controls.ObjectiveText1.setValue('mock objective'); + expect(service.getObjText(1)).toBe('mock objective'); + }); + + it('get objectiveText', () => { + const { service, questTemplateService } = setup(); + + questTemplateService.form.controls.LogDescription.setValue('mock objective text'); + expect(service.objectiveText).toBe('mock objective text'); + }); + + }); }); diff --git a/src/app/features/quest/quest-preview/quest-preview.service.ts b/src/app/features/quest/quest-preview/quest-preview.service.ts index 75295c6a6d..f57326ef79 100644 --- a/src/app/features/quest/quest-preview/quest-preview.service.ts +++ b/src/app/features/quest/quest-preview/quest-preview.service.ts @@ -73,6 +73,7 @@ export class QuestPreviewService { get sharable(): string { return this.questTemplate.Flags & QUEST_FLAG_SHARABLE ? 'Sharable' : 'Not sharable'; } get startItem(): number { return this.questTemplate.StartItem; } get startItemName$(): Promise { return this.mysqlQueryService.getItemNameById(this.startItem); } + get objectiveText(): string { return this.questTemplate.LogDescription; } // get QuestTemplateAddon values get maxLevel(): string { return String(this.questTemplateAddon.MaxLevel); } @@ -304,4 +305,54 @@ export class QuestPreviewService { return Number(value); } + getObjText(field: string | number) { + return this.questTemplate[`ObjectiveText${field}`]; + } + + getObjective$(field: string | number): Promise { + + const RequiredNpcOrGo = Number(this.questTemplate[`RequiredNpcOrGo${field}`]); + if (!!RequiredNpcOrGo) { + if (RequiredNpcOrGo > 0) { + return this.mysqlQueryService.getCreatureNameById(RequiredNpcOrGo); + } + + return this.mysqlQueryService.getGameObjectNameById(Math.abs(RequiredNpcOrGo)); + } + + } + + getObjectiveCount(field: string | number): string { + const reqNpcOrGo = this.questTemplate[`RequiredNpcOrGoCount${field}`]; + return !!reqNpcOrGo && reqNpcOrGo > 1 ? `(${reqNpcOrGo})` : ''; + } + + isNpcOrGoObj(field: string | number): boolean { + return !!this.questTemplate[`RequiredNpcOrGoCount${field}`]; + // return !!this.questTemplate[`ObjectiveText${field}`] || !!this.questTemplate[`RequiredNpcOrGo${field}`]; + } + + getObjItemCount(field: string | number) { + const reqItemCount = this.questTemplate[`RequiredItemCount${field}`]; + return !!reqItemCount && reqItemCount > 1 ? `(${reqItemCount})` : ''; + } + + getFactionByValue(field: string | number) { + switch (Number(this.questTemplate[`RequiredFactionValue${field}`])) { + case 900: + case 2100: + return '(Neutral)'; + case 3000: + return '(Friendly)'; + case 9000: + return '(Honored)'; + case 21000: + return '(Revered)'; + case 42000: + return '(Exalted)'; + default: + return ''; + } + } + }