Skip to content

Commit

Permalink
chore(quest-preview-required): add required NpC, Gameobject, Item and…
Browse files Browse the repository at this point in the history
… 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
  • Loading branch information
Helias committed May 12, 2020
1 parent b510b57 commit 9c15190
Show file tree
Hide file tree
Showing 4 changed files with 259 additions and 5 deletions.
31 changes: 31 additions & 0 deletions src/app/features/quest/quest-preview/quest-preview.component.html
Expand Up @@ -99,6 +99,37 @@ <h5 id="title" *ngIf="!!service.title">{{ service.title }}</h5>
</ul>
</ng-container>

<div id="objectives">
<p class="title">Objectives</p>
{{ service.objectiveText }}
<p class="mt-3" id="areaDescription" *ngIf="!!service.questTemplate.AreaDescription">{{ service.questTemplate.AreaDescription }}</p>

<div class="mt-2" id="npcOrGoObjectives">
<ng-container *ngFor="let i of [1,2,3,4]">
<p *ngIf="!!service.isNpcOrGoObj(i)">
<span class="colored">{{ !!service.getObjText(i) ? service.getObjText(i) : (service.getObjective$(i) | async) }}</span> {{ service.getObjectiveCount(i) }}
</p>
</ng-container>
</div>

<div class="mt-2" id="itemObjectives">
<ng-container *ngFor="let i of [1,2,3,4,5,6]">
<p *ngIf="service.questTemplate['RequiredItemId'+i]; let reqItem">
<keira-icon [size]="'small'" [itemId]="reqItem"></keira-icon> &nbsp;<span class="colored">{{ service.mysqlQueryService.getItemNameById(reqItem) | async }}</span> {{ service.getObjItemCount(i) }}
</p>
</ng-container>
</div>

<div class="mt-2" id="RequiredFaction">
<ng-container *ngFor="let i of [1,2]">
<p *ngIf="service.questTemplate['RequiredFactionId'+i]; let reqFaction">
<span class="colored">{{ service.sqliteQueryService.getFactionNameById(reqFaction) | async }}</span> {{ service.getFactionByValue(i) }}
</p>
</ng-container>
</div>

</div>

<div id="gains">
<p class="title">Gains</p>
<p id="rewardXP" *ngIf="service.rewardXP$ | async as xp">• {{ xp }} experience</p>
Expand Down
Expand Up @@ -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<QuestPreviewComponent> {
get title() { return this.query<HTMLHeadElement>('#title'); }
Expand All @@ -23,6 +25,10 @@ class QuestPreviewComponentPage extends PageObject<QuestPreviewComponent> {
get rewardTalents() { return this.query<HTMLParagraphElement>('#rewardTalents'); }
get rewardReputations() { return this.query<HTMLParagraphElement>('#rewardReputations'); }
get providedItem() { return this.query<HTMLParagraphElement>('#provided-item'); }
get areaDescription() { return this.query<HTMLParagraphElement>('#areaDescription'); }
get npcOrGoObjectives() { return this.query<HTMLParagraphElement>('#npcOrGoObjectives'); }
get itemObjectives() { return this.query<HTMLParagraphElement>('#itemObjectives'); }
get RequiredFaction() { return this.query<HTMLParagraphElement>('#RequiredFaction'); }

getRaces(assert = true) { return this.query<HTMLParagraphElement>('#races', assert); }
}
Expand All @@ -44,8 +50,10 @@ describe('QuestPreviewComponent', () => {
const fixture: ComponentFixture<QuestPreviewComponent> = 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', () => {
Expand Down Expand Up @@ -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();
});

});
100 changes: 96 additions & 4 deletions src/app/features/quest/quest-preview/quest-preview.service.spec.ts
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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');
});


});

});
51 changes: 51 additions & 0 deletions src/app/features/quest/quest-preview/quest-preview.service.ts
Expand Up @@ -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<string> { return this.mysqlQueryService.getItemNameById(this.startItem); }
get objectiveText(): string { return this.questTemplate.LogDescription; }

// get QuestTemplateAddon values
get maxLevel(): string { return String(this.questTemplateAddon.MaxLevel); }
Expand Down Expand Up @@ -304,4 +305,54 @@ export class QuestPreviewService {
return Number(value);
}

getObjText(field: string | number) {
return this.questTemplate[`ObjectiveText${field}`];
}

getObjective$(field: string | number): Promise<string> {

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 '';
}
}

}

0 comments on commit 9c15190

Please sign in to comment.