diff --git a/src/app/features/item/item-template/item-template.component.html b/src/app/features/item/item-template/item-template.component.html index 09ac09fc8a..90a38916ee 100644 --- a/src/app/features/item/item-template/item-template.component.html +++ b/src/app/features/item/item-template/item-template.component.html @@ -218,6 +218,11 @@
+ + + { ); }); + it('changing a value via QuestSelector should correctly work', async () => { + const field = 'NextQuestID'; + const mysqlQueryService = TestBed.inject(MysqlQueryService); + (mysqlQueryService.query as Spy).and.returnValue(of( + [{ ID: 123, LogTitle: 'Mock Quest' }] + )); + + page.clickElement(page.getSelectorBtn(field)); + await page.whenReady(); + page.expectModalDisplayed(); + + page.clickSearchBtn(); + + await fixture.whenStable(); + page.clickRowOfDatatableInModal(0); + await page.whenReady(); + page.clickModalSelect(); + await page.whenReady(); + + page.expectDiffQueryToContain( + 'UPDATE `quest_template_addon` SET `NextQuestID` = 123 WHERE (`ID` = 1234);' + ); + page.expectFullQueryToContain( + 'DELETE FROM `quest_template_addon` WHERE (`ID` = 1234);\n' + + 'INSERT INTO `quest_template_addon` (`ID`, `MaxLevel`, `AllowableClasses`, `SourceSpellID`, `PrevQuestID`, `NextQuestID`, ' + + '`ExclusiveGroup`, `RewardMailTemplateID`, `RewardMailDelay`, `RequiredSkillID`, `RequiredSkillPoints`, `RequiredMinRepFaction`, ' + + '`RequiredMaxRepFaction`, `RequiredMinRepValue`, `RequiredMaxRepValue`, `ProvidedItemCount`, `SpecialFlags`) VALUES\n' + + '(1234, 1, 2, 3, 4, 123, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0);' + ); + }); + }); }); diff --git a/src/app/features/quest/quest-template-addon/quest-template-addon.module.ts b/src/app/features/quest/quest-template-addon/quest-template-addon.module.ts index 35e9cf6686..cfc98a2342 100644 --- a/src/app/features/quest/quest-template-addon/quest-template-addon.module.ts +++ b/src/app/features/quest/quest-template-addon/quest-template-addon.module.ts @@ -14,6 +14,7 @@ import { QuestTemplateAddonService } from './quest-template-addon.service'; import { SpellSelectorModule } from '@keira-shared/modules/selectors/spell-selector/spell-selector.module'; import { FactionSelectorModule } from '@keira-shared/modules/selectors/faction-selector/faction-selector.module'; import { SkillSelectorModule } from '@keira-shared/modules/selectors/skill-selector/skill-selector.module'; +import { QuestSelectorModule } from '@keira-shared/modules/selectors/quest-selector/quest-selector.module'; @NgModule({ declarations: [ @@ -31,6 +32,7 @@ import { SkillSelectorModule } from '@keira-shared/modules/selectors/skill-selec SpellSelectorModule, FactionSelectorModule, SkillSelectorModule, + QuestSelectorModule, ], exports: [ QuestTemplateAddonComponent, diff --git a/src/app/shared/modules/search/quest-search.service.spec.ts b/src/app/shared/modules/search/quest-search.service.spec.ts new file mode 100644 index 0000000000..faf3ff3375 --- /dev/null +++ b/src/app/shared/modules/search/quest-search.service.spec.ts @@ -0,0 +1,19 @@ +import { TestBed } from '@angular/core/testing'; +import { instance } from 'ts-mockito'; + +import { QuestSearchService } from './quest-search.service'; +import { MockedSqliteQueryService } from '../../testing/mocks'; +import { SqliteQueryService } from '@keira-shared/services/sqlite-query.service'; + +describe('QuestSearchService', () => { + beforeEach(() => TestBed.configureTestingModule({ + providers: [ + { provide: SqliteQueryService, useValue: instance(MockedSqliteQueryService) }, + ] + })); + + it('should be created', () => { + const service: QuestSearchService = TestBed.inject(QuestSearchService); + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/modules/search/quest-search.service.ts b/src/app/shared/modules/search/quest-search.service.ts new file mode 100644 index 0000000000..54703059fd --- /dev/null +++ b/src/app/shared/modules/search/quest-search.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; + +import { SearchService } from './search.service'; +import { MysqlQueryService } from '@keira-shared/services/mysql-query.service'; +import { + QUEST_TEMPLATE_SEARCH_FIELDS, + QUEST_TEMPLATE_TABLE, + QuestTemplate, +} from '../../types/quest-template.type'; + +@Injectable({ + providedIn: 'root' +}) +export class QuestSearchService extends SearchService { + + /* istanbul ignore next */ // because of: https://github.com/gotwarlost/istanbul/issues/690 + constructor( + protected queryService: MysqlQueryService, + ) { + super(queryService, QUEST_TEMPLATE_TABLE, QUEST_TEMPLATE_SEARCH_FIELDS); + } +} diff --git a/src/app/shared/modules/selectors/quest-selector/quest-selector-btn.component.spec.ts b/src/app/shared/modules/selectors/quest-selector/quest-selector-btn.component.spec.ts new file mode 100644 index 0000000000..0d046d56b7 --- /dev/null +++ b/src/app/shared/modules/selectors/quest-selector/quest-selector-btn.component.spec.ts @@ -0,0 +1,26 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { QuestSelectorBtnComponent } from './quest-selector-btn.component'; +import { QuestSelectorModule } from './quest-selector.module'; + +describe('QuestSelectorBtnComponent', () => { + let component: QuestSelectorBtnComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ QuestSelectorModule ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QuestSelectorBtnComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/modules/selectors/quest-selector/quest-selector-btn.component.ts b/src/app/shared/modules/selectors/quest-selector/quest-selector-btn.component.ts new file mode 100644 index 0000000000..f58940fc97 --- /dev/null +++ b/src/app/shared/modules/selectors/quest-selector/quest-selector-btn.component.ts @@ -0,0 +1,23 @@ +import { Component } from '@angular/core'; +import { BsModalService } from 'ngx-bootstrap'; + +import { QuestSelectorModalComponent } from './quest-selector-modal.component'; +import { BaseSelectorBtnComponent } from '../base-selector/base-selector-btn.component'; + +@Component({ + selector: 'keira-quest-selector-btn', + templateUrl: '../base-selector/base-selector-btn.component.html', + styleUrls: ['../base-selector/base-selector-btn.component.scss'] +}) +export class QuestSelectorBtnComponent extends BaseSelectorBtnComponent { + + /* istanbul ignore next */ // because of: https://github.com/gotwarlost/istanbul/issues/690 + constructor( + modalService: BsModalService, + ) { + super( + QuestSelectorModalComponent, + modalService, + ); + } +} diff --git a/src/app/shared/modules/selectors/quest-selector/quest-selector-modal.component.html b/src/app/shared/modules/selectors/quest-selector/quest-selector-modal.component.html new file mode 100644 index 0000000000..1434496fc8 --- /dev/null +++ b/src/app/shared/modules/selectors/quest-selector/quest-selector-modal.component.html @@ -0,0 +1,57 @@ + + + diff --git a/src/app/shared/modules/selectors/quest-selector/quest-selector-modal.component.scss b/src/app/shared/modules/selectors/quest-selector/quest-selector-modal.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/modules/selectors/quest-selector/quest-selector-modal.component.spec.ts b/src/app/shared/modules/selectors/quest-selector/quest-selector-modal.component.spec.ts new file mode 100644 index 0000000000..969bff585e --- /dev/null +++ b/src/app/shared/modules/selectors/quest-selector/quest-selector-modal.component.spec.ts @@ -0,0 +1,39 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { BsModalRef } from 'ngx-bootstrap'; +import { instance } from 'ts-mockito'; + +import { QuestSelectorModalComponent } from './quest-selector-modal.component'; +import { MysqlQueryService } from '../../../services/mysql-query.service'; +import { MockedMysqlQueryService } from '@keira-testing/mocks'; +import { QuestSearchService } from '../../search/quest-search.service'; +import { QuestSelectorModule } from './quest-selector.module'; + +describe('QuestSelectorModalComponent', () => { + let component: QuestSelectorModalComponent; + let fixture: ComponentFixture; + let searchService: QuestSearchService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ QuestSelectorModule ], + providers: [ + BsModalRef, + { provide: MysqlQueryService, useValue: instance(MockedMysqlQueryService) }, + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + searchService = TestBed.inject(QuestSearchService); + searchService.query = '--mock query'; + + fixture = TestBed.createComponent(QuestSelectorModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/modules/selectors/quest-selector/quest-selector-modal.component.ts b/src/app/shared/modules/selectors/quest-selector/quest-selector-modal.component.ts new file mode 100644 index 0000000000..2700631d51 --- /dev/null +++ b/src/app/shared/modules/selectors/quest-selector/quest-selector-modal.component.ts @@ -0,0 +1,22 @@ +import { Component, } from '@angular/core'; +import { BsModalRef } from 'ngx-bootstrap'; + +import { QuestSearchService } from '../../search/quest-search.service'; +import { QUEST_TEMPLATE_ID } from '@keira-types/quest-template.type'; +import { SearchSelectorModalComponent } from '../base-selector/search-selector-modal.component'; + +@Component({ + selector: 'keira-quest-selector-modal', + templateUrl: './quest-selector-modal.component.html', + styleUrls: ['./quest-selector-modal.component.scss'] +}) +export class QuestSelectorModalComponent extends SearchSelectorModalComponent { + + /* istanbul ignore next */ // because of: https://github.com/gotwarlost/istanbul/issues/690 + constructor( + protected bsModalRef: BsModalRef, + public searchService: QuestSearchService, + ) { + super(QUEST_TEMPLATE_ID, bsModalRef); + } +} diff --git a/src/app/shared/modules/selectors/quest-selector/quest-selector.module.ts b/src/app/shared/modules/selectors/quest-selector/quest-selector.module.ts new file mode 100644 index 0000000000..5fbbcda72d --- /dev/null +++ b/src/app/shared/modules/selectors/quest-selector/quest-selector.module.ts @@ -0,0 +1,31 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { ReactiveFormsModule } from '@angular/forms'; + +import { QuestSelectorModalComponent } from './quest-selector-modal.component'; +import { QuestSelectorBtnComponent } from './quest-selector-btn.component'; +import { highlightOptions } from '@keira-config/highlight.config'; +import { HighlightModule } from 'ngx-highlightjs'; +import { NgxDatatableModule } from '@swimlane/ngx-datatable'; +import { ModalModule } from 'ngx-bootstrap'; + +@NgModule({ + entryComponents: [ + QuestSelectorModalComponent, + ], + declarations: [ + QuestSelectorBtnComponent, + QuestSelectorModalComponent, + ], + imports: [ + BrowserModule, + ReactiveFormsModule, + NgxDatatableModule, + ModalModule.forRoot(), + HighlightModule.forRoot(highlightOptions), + ], + exports: [ + QuestSelectorBtnComponent, + ], +}) +export class QuestSelectorModule {}