From cf7d978d484364da5aa169492b880b7184504e2c Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Tue, 14 May 2024 11:39:53 +0200 Subject: [PATCH 01/26] N21-1885 WIP --- .../media-board/media-element.service.ts | 32 ++++----- .../board/uc/media-board/media-element.uc.ts | 12 ++-- .../api-test/tool-context.api.spec.ts | 53 +------------- .../dto/context-external-tool-post.params.ts | 8 +-- .../dto/context-external-tool.response.ts | 6 +- .../domain/context-external-tool.do.ts | 55 ++++++++------- .../entity/context-external-tool.entity.ts | 12 ++-- .../context-external-tool-request.mapper.ts | 3 +- .../context-external-tool-response.mapper.ts | 1 - .../context-external-tool.service.spec.ts | 66 +++++++++-------- .../service/context-external-tool.service.ts | 30 ++++---- .../context-external-tool-entity.factory.ts | 1 - .../testing}/context-external-tool.factory.ts | 10 +-- .../context-external-tool/testing/index.ts | 1 + .../uc/dto/context-external-tool.types.ts | 4 +- ...al-tool-configuration-template.response.ts | 4 -- .../dto/response/external-tool.response.ts | 8 +-- ...al-tool-configuration-template.response.ts | 4 -- .../external-tool/domain/external-tool.do.ts | 16 +---- .../entity/external-tool.entity.ts | 39 ++++++++--- .../mapper/external-tool-response.mapper.ts | 1 - .../mapper/tool-configuration.mapper.ts | 4 +- ...external-tool-version-increment.service.ts | 4 +- .../testing/external-tool-entity.factory.ts | 23 +++--- .../tool/external-tool/uc/external-tool.uc.ts | 1 - .../api-test/tool-school.api.spec.ts | 30 +++----- .../dto/school-external-tool-post.params.ts | 6 +- .../dto/school-external-tool.response.ts | 4 -- .../tool/school-external-tool/domain/index.ts | 2 +- .../domain/school-external-tool.do.ts | 60 +++++++++------- ...-ref.do.ts => school-external-tool.ref.ts} | 4 +- .../entity/school-external-tool.entity.ts | 20 +++--- .../school-external-tool-request.mapper.ts | 3 +- .../school-external-tool-response.mapper.ts | 1 - .../school-external-tool.service.spec.ts | 29 ++++---- .../service/school-external-tool.service.ts | 24 ++++--- .../school-external-tool/testing/index.ts | 2 + ...ernal-tool-configuration-status.factory.ts | 11 +++ .../school-external-tool-entity.factory.ts | 5 +- .../testing}/school-external-tool.factory.ts | 13 ++-- .../context-external-tool.repo.ts | 6 +- .../externaltool/external-tool.repo.mapper.ts | 4 +- ...c.ts => school-external-tool.repo.spec.ts} | 9 ++- .../school-external-tool.repo.ts | 70 +++++++++++++------ .../factory/domainobject/tool/index.ts | 3 - ...ernal-tool-configuration-status.factory.ts | 9 --- 46 files changed, 338 insertions(+), 375 deletions(-) rename apps/server/src/{shared/testing/factory/domainobject/tool => modules/tool/context-external-tool/testing}/context-external-tool.factory.ts (77%) rename apps/server/src/modules/tool/school-external-tool/domain/{school-external-tool-ref.do.ts => school-external-tool.ref.ts} (59%) create mode 100644 apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-configuration-status.factory.ts rename apps/server/src/{shared/testing/factory/domainobject/tool => modules/tool/school-external-tool/testing}/school-external-tool.factory.ts (55%) rename apps/server/src/shared/repo/schoolexternaltool/{school-external-tool.repo.integration.spec.ts => school-external-tool.repo.spec.ts} (96%) delete mode 100644 apps/server/src/shared/testing/factory/domainobject/tool/school-external-tool-configuration-status.factory.ts diff --git a/apps/server/src/modules/board/service/media-board/media-element.service.ts b/apps/server/src/modules/board/service/media-board/media-element.service.ts index a14c3b2c381..f164a86a226 100644 --- a/apps/server/src/modules/board/service/media-board/media-element.service.ts +++ b/apps/server/src/modules/board/service/media-board/media-element.service.ts @@ -1,8 +1,8 @@ import { ObjectId } from '@mikro-orm/mongodb'; import { ToolContextType } from '@modules/tool/common/enum'; import { ContextExternalToolService } from '@modules/tool/context-external-tool'; -import { ContextExternalTool, ContextExternalToolWithId, ContextRef } from '@modules/tool/context-external-tool/domain'; -import { SchoolExternalToolRefDO, SchoolExternalToolWithId } from '@modules/tool/school-external-tool/domain'; +import { ContextExternalTool, ContextRef } from '@modules/tool/context-external-tool/domain'; +import { SchoolExternalTool, SchoolExternalToolRef } from '@modules/tool/school-external-tool/domain'; import { Injectable, NotFoundException } from '@nestjs/common'; import { AnyBoardDo, @@ -35,10 +35,7 @@ export class MediaElementService { return element; } - public async checkElementExists( - mediaBoard: MediaBoard, - schoolExternalTool: SchoolExternalToolWithId - ): Promise { + public async checkElementExists(mediaBoard: MediaBoard, schoolExternalTool: SchoolExternalTool): Promise { const contextExternalTools: ContextExternalTool[] = await this.contextExternalToolService.findContextExternalTools({ schoolToolRef: { schoolToolId: schoolExternalTool.id }, }); @@ -52,18 +49,17 @@ export class MediaElementService { public async createContextExternalToolForMediaBoard( user: User, - schoolExternalTool: SchoolExternalToolWithId, + schoolExternalTool: SchoolExternalTool, mediaBoard: MediaBoard - ): Promise { - const contextExternalTool: ContextExternalToolWithId = - await this.contextExternalToolService.saveContextExternalTool( - new ContextExternalTool({ - schoolToolRef: new SchoolExternalToolRefDO({ schoolId: user.school.id, schoolToolId: schoolExternalTool.id }), - contextRef: new ContextRef({ id: mediaBoard.id, type: ToolContextType.MEDIA_BOARD }), - toolVersion: 0, - parameters: [], - }) - ); + ): Promise { + const contextExternalTool: ContextExternalTool = await this.contextExternalToolService.saveContextExternalTool( + new ContextExternalTool({ + id: new ObjectId().toHexString(), + schoolToolRef: new SchoolExternalToolRef({ schoolId: user.school.id, schoolToolId: schoolExternalTool.id }), + contextRef: new ContextRef({ id: mediaBoard.id, type: ToolContextType.MEDIA_BOARD }), + parameters: [], + }) + ); return contextExternalTool; } @@ -71,7 +67,7 @@ export class MediaElementService { public async createExternalToolElement( parent: MediaLine, position: number, - contextExternalTool: ContextExternalToolWithId + contextExternalTool: ContextExternalTool ): Promise { const element: MediaExternalToolElement = new MediaExternalToolElement({ id: new ObjectId().toHexString(), diff --git a/apps/server/src/modules/board/uc/media-board/media-element.uc.ts b/apps/server/src/modules/board/uc/media-board/media-element.uc.ts index 77df303bc1c..c936f4d540b 100644 --- a/apps/server/src/modules/board/uc/media-board/media-element.uc.ts +++ b/apps/server/src/modules/board/uc/media-board/media-element.uc.ts @@ -1,7 +1,5 @@ import { AuthorizationContextBuilder, AuthorizationService } from '@modules/authorization'; -import { ContextExternalToolWithId } from '@modules/tool/context-external-tool/domain'; import { SchoolExternalToolService } from '@modules/tool/school-external-tool'; -import { SchoolExternalToolWithId } from '@modules/tool/school-external-tool/domain'; import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { FeatureDisabledLoggableException } from '@shared/common/loggable-exception'; @@ -14,6 +12,8 @@ import { } from '@shared/domain/domainobject'; import { User as UserEntity } from '@shared/domain/entity'; import type { EntityId } from '@shared/domain/types'; +import { ContextExternalTool } from '../../../tool/context-external-tool/domain'; +import { SchoolExternalTool } from '../../../tool/school-external-tool/domain'; import { MediaBoardElementAlreadyExistsLoggableException } from '../../loggable'; import type { MediaBoardConfig } from '../../media-board.config'; import { BoardDoAuthorizableService, MediaBoardService, MediaElementService, MediaLineService } from '../../service'; @@ -73,13 +73,11 @@ export class MediaElementUc { const mediaBoard: MediaBoard = await this.mediaBoardService.findByDescendant(line); - const schoolExternalTool: SchoolExternalToolWithId = await this.schoolExternalToolService.findById( - schoolExternalToolId - ); + const schoolExternalTool: SchoolExternalTool = await this.schoolExternalToolService.findById(schoolExternalToolId); await this.checkElementExistsAlreadyOnBoardAndThrow(mediaBoard, schoolExternalTool); - const createdContexExternalTool: ContextExternalToolWithId = + const createdContexExternalTool: ContextExternalTool = await this.mediaElementService.createContextExternalToolForMediaBoard(user, schoolExternalTool, mediaBoard); const createdElement: AnyMediaContentElementDo = await this.mediaElementService.createExternalToolElement( @@ -93,7 +91,7 @@ export class MediaElementUc { private async checkElementExistsAlreadyOnBoardAndThrow( mediaBoard: MediaBoard, - schoolExternalTool: SchoolExternalToolWithId + schoolExternalTool: SchoolExternalTool ): Promise { const exists = await this.mediaElementService.checkElementExists(mediaBoard, schoolExternalTool); diff --git a/apps/server/src/modules/tool/context-external-tool/controller/api-test/tool-context.api.spec.ts b/apps/server/src/modules/tool/context-external-tool/controller/api-test/tool-context.api.spec.ts index 27e68052b7c..03423dd2bca 100644 --- a/apps/server/src/modules/tool/context-external-tool/controller/api-test/tool-context.api.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/controller/api-test/tool-context.api.spec.ts @@ -1,4 +1,6 @@ import { EntityManager, MikroORM } from '@mikro-orm/core'; +import { ObjectId } from '@mikro-orm/mongodb'; +import { AccountEntity } from '@modules/account/entity/account.entity'; import { ServerTestModule } from '@modules/server'; import { HttpStatus, INestApplication } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; @@ -13,8 +15,6 @@ import { UserAndAccountTestFactory, userFactory, } from '@shared/testing'; -import { AccountEntity } from '@modules/account/entity/account.entity'; -import { ObjectId } from '@mikro-orm/mongodb'; import { CustomParameterScope, CustomParameterType, ToolContextType } from '../../../common/enum'; import { ExternalToolEntity } from '../../../external-tool/entity'; import { customParameterEntityFactory, externalToolEntityFactory } from '../../../external-tool/testing'; @@ -82,13 +82,11 @@ describe('ToolContextController (API)', () => { }), ], restrictToContexts: [ToolContextType.COURSE], - version: 1, }); const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ tool: externalToolEntity, school, schoolParameters: [], - toolVersion: 1, }); const postParams: ContextExternalToolPostParams = { @@ -100,7 +98,6 @@ describe('ToolContextController (API)', () => { { name: 'param1', value: 'value' }, { name: 'param2', value: 'true' }, ], - toolVersion: 1, }; await em.persistAndFlush([teacherUser, teacherAccount, course, school, schoolExternalToolEntity]); @@ -130,7 +127,6 @@ describe('ToolContextController (API)', () => { { name: 'param1', value: 'value' }, { name: 'param2', value: 'true' }, ], - toolVersion: postParams.toolVersion, }); }); }); @@ -143,7 +139,6 @@ describe('ToolContextController (API)', () => { const otherCourse = courseFactory.build(); const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.build({ schoolParameters: [], - toolVersion: 1, school, }); @@ -155,7 +150,6 @@ describe('ToolContextController (API)', () => { contextId: otherCourse.id, contextType: ToolContextType.COURSE, parameters: [], - toolVersion: 1, }; const loggedInClient: TestApiClient = await testApiClient.login(teacherAccount); @@ -188,13 +182,11 @@ describe('ToolContextController (API)', () => { const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ parameters: [], restrictToContexts: [], - version: 1, }); const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ tool: externalToolEntity, school, schoolParameters: [], - toolVersion: 1, }); const postParams: ContextExternalToolPostParams = { @@ -203,7 +195,6 @@ describe('ToolContextController (API)', () => { displayName: course.name, contextType: ToolContextType.COURSE, parameters: [], - toolVersion: 1, }; await em.persistAndFlush([teacherUser, teacherAccount, course, school, schoolExternalToolEntity]); @@ -230,7 +221,6 @@ describe('ToolContextController (API)', () => { displayName: postParams.displayName, contextType: postParams.contextType, parameters: [], - toolVersion: postParams.toolVersion, }); }); }); @@ -247,13 +237,11 @@ describe('ToolContextController (API)', () => { const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ parameters: [], restrictToContexts: [ToolContextType.BOARD_ELEMENT], - version: 1, }); const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ tool: externalToolEntity, school, schoolParameters: [], - toolVersion: 1, }); const postParams: ContextExternalToolPostParams = { @@ -262,7 +250,6 @@ describe('ToolContextController (API)', () => { displayName: course.name, contextType: ToolContextType.COURSE, parameters: [], - toolVersion: 1, }; await em.persistAndFlush([teacherUser, teacherAccount, course, school, schoolExternalToolEntity]); @@ -296,13 +283,11 @@ describe('ToolContextController (API)', () => { const course: Course = courseFactory.buildWithId({ teachers: [teacherUser] }); const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ - toolVersion: 1, school, }); const contextExternalToolEntity: ContextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ contextId: course.id, schoolTool: schoolExternalToolEntity, - toolVersion: 1, }); em.persist([course, teacherUser, teacherAccount, schoolExternalToolEntity, contextExternalToolEntity]); @@ -336,13 +321,10 @@ describe('ToolContextController (API)', () => { const setup = async () => { const { teacherAccount, teacherUser } = UserAndAccountTestFactory.buildTeacher(); const course = courseFactory.buildWithId({ teachers: [teacherUser] }); - const schoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ - toolVersion: 1, - }); + const schoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({}); const contextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ schoolTool: schoolExternalToolEntity, contextId: course.id, - toolVersion: 1, }); await em.persistAndFlush([ @@ -392,33 +374,27 @@ describe('ToolContextController (API)', () => { const schoolExternalTool1: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ school, - toolVersion: 1, }); const contextExternalTool1: ContextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ contextId: course.id, schoolTool: schoolExternalTool1, - toolVersion: 1, }); const schoolExternalTool2: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ - toolVersion: 1, school, }); const contextExternalTool2: ContextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ contextId: course.id, schoolTool: schoolExternalTool2, - toolVersion: 1, }); const schoolExternalToolFromOtherSchool: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ school: otherSchool, - toolVersion: 1, }); const contextExternalToolFromOtherSchool: ContextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ contextId: course.id, schoolTool: schoolExternalToolFromOtherSchool, - toolVersion: 1, }); em.persist([ @@ -475,7 +451,6 @@ describe('ToolContextController (API)', () => { contextId: contextExternalTool1.contextId, contextType: ToolContextType.COURSE, displayName: contextExternalTool1.displayName, - toolVersion: contextExternalTool1.toolVersion, }, { parameters: [ @@ -489,7 +464,6 @@ describe('ToolContextController (API)', () => { contextId: contextExternalTool2.contextId, contextType: ToolContextType.COURSE, displayName: contextExternalTool2.displayName, - toolVersion: contextExternalTool2.toolVersion, }, ], }); @@ -507,7 +481,6 @@ describe('ToolContextController (API)', () => { contextId: contextExternalToolFromOtherSchool.contextId, contextType: ToolContextType.COURSE, displayName: contextExternalToolFromOtherSchool.displayName, - toolVersion: contextExternalToolFromOtherSchool.toolVersion, }, ], }); @@ -560,12 +533,10 @@ describe('ToolContextController (API)', () => { const schoolExternalTool: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ school, tool: externalTool, - toolVersion: 1, }); const contextExternalTool: ContextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ contextId: course.id, schoolTool: schoolExternalTool, - toolVersion: 1, contextType: ContextExternalToolType.COURSE, }); @@ -602,7 +573,6 @@ describe('ToolContextController (API)', () => { id: contextExternalTool.id, displayName: contextExternalTool.displayName, parameters: contextExternalTool.parameters, - toolVersion: contextExternalTool.toolVersion, }); }); }); @@ -649,12 +619,10 @@ describe('ToolContextController (API)', () => { const schoolExternalTool: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ school, tool: externalTool, - toolVersion: 1, }); const contextExternalTool: ContextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ contextId: course.id, schoolTool: schoolExternalTool, - toolVersion: 1, contextType: ContextExternalToolType.COURSE, }); @@ -688,7 +656,6 @@ describe('ToolContextController (API)', () => { const schoolExternalTool: SchoolExternalToolEntity = schoolExternalToolEntityFactory.build({ school, tool: externalTool, - toolVersion: 1, }); await em.persistAndFlush([school, course, externalTool, schoolExternalTool, studentAccount, studentUser]); @@ -696,7 +663,6 @@ describe('ToolContextController (API)', () => { const contextExternalTool: ContextExternalToolEntity = contextExternalToolEntityFactory.build({ contextId: course.id, schoolTool: schoolExternalTool, - toolVersion: 1, contextType: ContextExternalToolType.COURSE, }); @@ -741,14 +707,12 @@ describe('ToolContextController (API)', () => { const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ parameters: [contextParameter], - version: 2, }); const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ tool: externalToolEntity, school, schoolParameters: [], - toolVersion: 2, }); const contextExternalToolEntity: ContextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ @@ -757,7 +721,6 @@ describe('ToolContextController (API)', () => { contextType: ContextExternalToolType.COURSE, displayName: 'CoolTool123', parameters: [], - toolVersion: 1, }); const postParams: ContextExternalToolPostParams = { @@ -771,7 +734,6 @@ describe('ToolContextController (API)', () => { value: 'testValue123', }, ], - toolVersion: 2, }; await em.persistAndFlush([ @@ -809,7 +771,6 @@ describe('ToolContextController (API)', () => { displayName: postParams.displayName, contextType: postParams.contextType, parameters: postParams.parameters, - toolVersion: postParams.toolVersion, }); }); }); @@ -828,13 +789,11 @@ describe('ToolContextController (API)', () => { }); const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.build({ parameters: [contextParameter], - version: 2, }); const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.build({ tool: externalToolEntity, school, schoolParameters: [], - toolVersion: 2, }); await em.persistAndFlush([ @@ -852,7 +811,6 @@ describe('ToolContextController (API)', () => { contextType: ContextExternalToolType.COURSE, displayName: 'CoolTool123', parameters: [], - toolVersion: 1, }); await em.persistAndFlush([contextExternalToolEntity]); @@ -870,7 +828,6 @@ describe('ToolContextController (API)', () => { value: 'testValue123', }, ], - toolVersion: 2, }; const loggedInClient: TestApiClient = await testApiClient.login(teacherAccount); @@ -901,14 +858,12 @@ describe('ToolContextController (API)', () => { const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ parameters: [contextParameter], - version: 2, }); const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ tool: externalToolEntity, school, schoolParameters: [], - toolVersion: 2, }); const contextExternalToolEntity: ContextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ @@ -917,7 +872,6 @@ describe('ToolContextController (API)', () => { contextType: ContextExternalToolType.COURSE, displayName: 'CoolTool123', parameters: [], - toolVersion: 1, }); const postParams: ContextExternalToolPostParams = { @@ -931,7 +885,6 @@ describe('ToolContextController (API)', () => { value: 'testValue123', }, ], - toolVersion: 2, }; await em.persistAndFlush([ diff --git a/apps/server/src/modules/tool/context-external-tool/controller/dto/context-external-tool-post.params.ts b/apps/server/src/modules/tool/context-external-tool/controller/dto/context-external-tool-post.params.ts index b5323717db1..71ac544753a 100644 --- a/apps/server/src/modules/tool/context-external-tool/controller/dto/context-external-tool-post.params.ts +++ b/apps/server/src/modules/tool/context-external-tool/controller/dto/context-external-tool-post.params.ts @@ -1,8 +1,8 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Type } from 'class-transformer'; -import { IsArray, IsEnum, IsMongoId, IsNumber, IsOptional, IsString, ValidateNested } from 'class-validator'; -import { CustomParameterEntryParam } from '../../../school-external-tool/controller/dto'; +import { IsArray, IsEnum, IsMongoId, IsOptional, IsString, ValidateNested } from 'class-validator'; import { ToolContextType } from '../../../common/enum'; +import { CustomParameterEntryParam } from '../../../school-external-tool/controller/dto'; export class ContextExternalToolPostParams { @ApiProperty() @@ -28,8 +28,4 @@ export class ContextExternalToolPostParams { @ApiPropertyOptional({ type: [CustomParameterEntryParam] }) @Type(() => CustomParameterEntryParam) parameters?: CustomParameterEntryParam[]; - - @ApiProperty() - @IsNumber() - toolVersion!: number; } diff --git a/apps/server/src/modules/tool/context-external-tool/controller/dto/context-external-tool.response.ts b/apps/server/src/modules/tool/context-external-tool/controller/dto/context-external-tool.response.ts index 62f68fb7b4c..60145a6d140 100644 --- a/apps/server/src/modules/tool/context-external-tool/controller/dto/context-external-tool.response.ts +++ b/apps/server/src/modules/tool/context-external-tool/controller/dto/context-external-tool.response.ts @@ -1,6 +1,6 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import { CustomParameterEntryResponse } from '../../../school-external-tool/controller/dto'; import { ToolContextType } from '../../../common/enum'; +import { CustomParameterEntryResponse } from '../../../school-external-tool/controller/dto'; export class ContextExternalToolResponse { @ApiProperty() @@ -21,9 +21,6 @@ export class ContextExternalToolResponse { @ApiProperty({ type: [CustomParameterEntryResponse] }) parameters: CustomParameterEntryResponse[] = []; - @ApiProperty() - toolVersion: number; - @ApiPropertyOptional() logoUrl?: string; @@ -34,7 +31,6 @@ export class ContextExternalToolResponse { this.contextType = response.contextType; this.displayName = response.displayName; this.parameters = response.parameters; - this.toolVersion = response.toolVersion; this.logoUrl = response.logoUrl; } } diff --git a/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts b/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts index 1ce23a5a4ed..3b9c0b762df 100644 --- a/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts +++ b/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts @@ -1,47 +1,50 @@ -import { BaseDO } from '@shared/domain/domainobject/base.do'; +import { AuthorizableObject, DomainObject } from '@shared/domain/domain-object'; import { CustomParameterEntry } from '../../common/domain'; -import { ToolVersion } from '../../common/interface'; -import { SchoolExternalToolRefDO } from '../../school-external-tool/domain'; +import { SchoolExternalToolRef } from '../../school-external-tool/domain'; import { ContextRef } from './context-ref'; -export interface ContextExternalToolProps { - id?: string; +export interface ContextExternalToolProps extends AuthorizableObject { + id: string; - schoolToolRef: SchoolExternalToolRefDO; + schoolToolRef: SchoolExternalToolRef; contextRef: ContextRef; displayName?: string; parameters: CustomParameterEntry[]; - - toolVersion: number; } -export class ContextExternalTool extends BaseDO implements ToolVersion { - schoolToolRef: SchoolExternalToolRefDO; +export class ContextExternalTool extends DomainObject { + get schoolToolRef(): SchoolExternalToolRef { + return this.props.schoolToolRef; + } - contextRef: ContextRef; + set schoolToolRef(value: SchoolExternalToolRef) { + this.props.schoolToolRef = value; + } - displayName?: string; + get contextRef(): ContextRef { + return this.props.contextRef; + } - parameters: CustomParameterEntry[]; + set contextRef(value: ContextRef) { + this.props.contextRef = value; + } + + get displayName(): string | undefined { + return this.props.displayName; + } - toolVersion: number; + set displayName(value: string | undefined) { + this.props.displayName = value; + } - constructor(props: ContextExternalToolProps) { - super(props.id); - this.schoolToolRef = props.schoolToolRef; - this.contextRef = props.contextRef; - this.displayName = props.displayName; - this.parameters = props.parameters; - this.toolVersion = props.toolVersion; + get parameters(): CustomParameterEntry[] { + return this.props.parameters; } - getVersion(): number { - return this.toolVersion; + set parameters(value: CustomParameterEntry[]) { + this.props.parameters = value; } } - -// TODO: N21-1885: Remove this type and alls its usages -export type ContextExternalToolWithId = ContextExternalTool & { id: string }; diff --git a/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.ts b/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.ts index b82475a64ca..822edd68c89 100644 --- a/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.ts +++ b/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.ts @@ -1,10 +1,13 @@ import { Embedded, Entity, ManyToOne, Property } from '@mikro-orm/core'; import { BaseEntityWithTimestamps } from '@shared/domain/entity/base.entity'; +import { EntityId } from '@shared/domain/types'; import { CustomParameterEntryEntity } from '../../common/entity'; import { SchoolExternalToolEntity } from '../../school-external-tool/entity'; import { ContextExternalToolType } from './context-external-tool-type.enum'; export interface ContextExternalToolProperties { + id?: EntityId; + schoolTool: SchoolExternalToolEntity; contextId: string; @@ -14,8 +17,6 @@ export interface ContextExternalToolProperties { displayName?: string; parameters?: CustomParameterEntryEntity[]; - - toolVersion: number; } @Entity({ tableName: 'context-external-tools' }) @@ -35,16 +36,15 @@ export class ContextExternalToolEntity extends BaseEntityWithTimestamps { @Embedded(() => CustomParameterEntryEntity, { array: true }) parameters: CustomParameterEntryEntity[]; - @Property() - toolVersion: number; - constructor(props: ContextExternalToolProperties) { super(); + if (props.id) { + this.id = props.id; + } this.schoolTool = props.schoolTool; this.contextId = props.contextId; this.contextType = props.contextType; this.displayName = props.displayName; this.parameters = props.parameters ?? []; - this.toolVersion = props.toolVersion; } } diff --git a/apps/server/src/modules/tool/context-external-tool/mapper/context-external-tool-request.mapper.ts b/apps/server/src/modules/tool/context-external-tool/mapper/context-external-tool-request.mapper.ts index 8e72f5f540b..59a581ec4f1 100644 --- a/apps/server/src/modules/tool/context-external-tool/mapper/context-external-tool-request.mapper.ts +++ b/apps/server/src/modules/tool/context-external-tool/mapper/context-external-tool-request.mapper.ts @@ -1,3 +1,4 @@ +import { ObjectId } from '@mikro-orm/mongodb'; import { CustomParameterEntry } from '../../common/domain'; import { CustomParameterEntryParam } from '../../school-external-tool/controller/dto'; import { ContextExternalToolPostParams } from '../controller/dto'; @@ -6,6 +7,7 @@ import { ContextExternalToolDto } from '../uc/dto/context-external-tool.types'; export class ContextExternalToolRequestMapper { static mapContextExternalToolRequest(request: ContextExternalToolPostParams): ContextExternalToolDto { return { + id: new ObjectId().toHexString(), schoolToolRef: { schoolToolId: request.schoolToolId, }, @@ -14,7 +16,6 @@ export class ContextExternalToolRequestMapper { type: request.contextType, }, displayName: request.displayName, - toolVersion: request.toolVersion, parameters: this.mapRequestToCustomParameterEntryDO(request.parameters ?? []), }; } diff --git a/apps/server/src/modules/tool/context-external-tool/mapper/context-external-tool-response.mapper.ts b/apps/server/src/modules/tool/context-external-tool/mapper/context-external-tool-response.mapper.ts index 80e12ea94ee..61de3ac0e0e 100644 --- a/apps/server/src/modules/tool/context-external-tool/mapper/context-external-tool-response.mapper.ts +++ b/apps/server/src/modules/tool/context-external-tool/mapper/context-external-tool-response.mapper.ts @@ -11,7 +11,6 @@ export class ContextExternalToolResponseMapper { contextType: contextExternalTool.contextRef.type, schoolToolId: contextExternalTool.schoolToolRef.schoolToolId, displayName: contextExternalTool.displayName, - toolVersion: contextExternalTool.toolVersion, parameters: this.mapRequestToCustomParameterEntryDO(contextExternalTool.parameters), }); diff --git a/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.spec.ts b/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.spec.ts index 0f50917ec54..0f6f01699e6 100644 --- a/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.spec.ts @@ -6,11 +6,9 @@ import { Test, TestingModule } from '@nestjs/testing'; import { Permission } from '@shared/domain/interface'; import { ContextExternalToolRepo } from '@shared/repo'; import { - contextExternalToolFactory, customParameterFactory, externalToolFactory, legacySchoolDoFactory, - schoolExternalToolFactory, } from '@shared/testing/factory/domainobject'; import { CustomParameter } from '../../common/domain'; import { ToolContextType } from '../../common/enum'; @@ -18,8 +16,15 @@ import { CommonToolService } from '../../common/service'; import { ExternalToolService } from '../../external-tool'; import { ExternalTool } from '../../external-tool/domain'; import { SchoolExternalToolService } from '../../school-external-tool'; -import { SchoolExternalTool, SchoolExternalToolWithId } from '../../school-external-tool/domain'; -import { ContextExternalTool, ContextRef, RestrictedContextMismatchLoggableException } from '../domain'; +import { SchoolExternalTool } from '../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../school-external-tool/testing'; +import { + ContextExternalTool, + ContextExternalToolProps, + ContextRef, + RestrictedContextMismatchLoggableException, +} from '../domain'; +import { contextExternalToolFactory } from '../testing'; import { ContextExternalToolService } from './context-external-tool.service'; describe('ContextExternalToolService', () => { @@ -99,7 +104,7 @@ describe('ContextExternalToolService', () => { describe('when schoolExternalToolId is given', () => { const setup = () => { const schoolExternalTool: SchoolExternalTool = schoolExternalToolFactory.buildWithId(); - const schoolExternalToolId = schoolExternalTool.id as string; + const schoolExternalToolId = schoolExternalTool.id; const contextExternalTool1: ContextExternalTool = contextExternalToolFactory .withSchoolExternalToolRef(schoolExternalToolId) .buildWithId(); @@ -165,7 +170,7 @@ describe('ContextExternalToolService', () => { schoolId, }); const contextExternalTool: ContextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string, schoolExternalTool.schoolId) + .withSchoolExternalToolRef(schoolExternalTool.id, schoolExternalTool.schoolId) .build(); contextExternalToolRepo.findById.mockResolvedValue(contextExternalTool); @@ -178,7 +183,7 @@ describe('ContextExternalToolService', () => { it('should return a contextExternalTool', async () => { const { contextExternalTool } = setup(); - const result: ContextExternalTool = await service.findByIdOrFail(contextExternalTool.id as string); + const result: ContextExternalTool = await service.findByIdOrFail(contextExternalTool.id); expect(result).toEqual(contextExternalTool); }); @@ -207,7 +212,7 @@ describe('ContextExternalToolService', () => { schoolId, }); const contextExternalTool: ContextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string, schoolExternalTool.schoolId) + .withSchoolExternalToolRef(schoolExternalTool.id, schoolExternalTool.schoolId) .build(); contextExternalToolRepo.findByIdOrNull.mockResolvedValue(contextExternalTool); @@ -220,7 +225,7 @@ describe('ContextExternalToolService', () => { it('should return a contextExternalTool', async () => { const { contextExternalTool } = setup(); - const result: ContextExternalTool | null = await service.findById(contextExternalTool.id as string); + const result: ContextExternalTool | null = await service.findById(contextExternalTool.id); expect(result).toEqual(contextExternalTool); }); @@ -290,7 +295,7 @@ describe('ContextExternalToolService', () => { describe('when contexts are not restricted', () => { const setup = () => { const externalTool: ExternalTool = externalToolFactory.build({ restrictToContexts: [] }); - const schoolExternalTool = schoolExternalToolFactory.build() as SchoolExternalToolWithId; + const schoolExternalTool = schoolExternalToolFactory.build(); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.build(); schoolExternalToolService.findById.mockResolvedValueOnce(schoolExternalTool); @@ -344,7 +349,7 @@ describe('ContextExternalToolService', () => { const context: AuthorizationContext = AuthorizationContextBuilder.write([Permission.CONTEXT_TOOL_ADMIN]); const externalTool: ExternalTool = externalToolFactory.build({ restrictToContexts: [ToolContextType.COURSE] }); - const schoolExternalTool = schoolExternalToolFactory.build() as SchoolExternalToolWithId; + const schoolExternalTool = schoolExternalToolFactory.build(); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.build({ contextRef: { type: ToolContextType.COURSE }, }); @@ -375,7 +380,7 @@ describe('ContextExternalToolService', () => { const externalTool: ExternalTool = externalToolFactory.build({ restrictToContexts: [ToolContextType.BOARD_ELEMENT], }); - const schoolExternalTool = schoolExternalToolFactory.build() as SchoolExternalToolWithId; + const schoolExternalTool = schoolExternalToolFactory.build(); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.build({ contextRef: { type: ToolContextType.COURSE }, }); @@ -415,7 +420,7 @@ describe('ContextExternalToolService', () => { const schoolExternalTool = schoolExternalToolFactory.buildWithId({ toolId: externalTool.id, - }) as SchoolExternalToolWithId; + }); const unusedParam: CustomParameter = customParameterFactory.build(); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId({ @@ -463,23 +468,24 @@ describe('ContextExternalToolService', () => { const copiedTool: ContextExternalTool = await service.copyContextExternalTool(contextExternalTool, contextCopyId); - expect(copiedTool).toEqual>({ - id: undefined, - contextRef: { id: contextCopyId, type: ToolContextType.COURSE }, - displayName: contextExternalTool.displayName, - schoolToolRef: contextExternalTool.schoolToolRef, - toolVersion: contextExternalTool.toolVersion, - parameters: [ - { - name: contextExternalTool.parameters[0].name, - value: undefined, - }, - { - name: contextExternalTool.parameters[1].name, - value: contextExternalTool.parameters[1].value, - }, - ], - }); + expect(copiedTool).toEqual( + expect.objectContaining({ + id: expect.any(String), + contextRef: { id: contextCopyId, type: ToolContextType.COURSE }, + displayName: contextExternalTool.displayName, + schoolToolRef: contextExternalTool.schoolToolRef, + parameters: [ + { + name: contextExternalTool.parameters[0].name, + value: undefined, + }, + { + name: contextExternalTool.parameters[1].name, + value: contextExternalTool.parameters[1].value, + }, + ], + }) + ); }); it('should not copy unused parameter', async () => { diff --git a/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.ts b/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.ts index 127958c631e..b853e2bf4fd 100644 --- a/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.ts +++ b/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.ts @@ -1,3 +1,4 @@ +import { ObjectId } from '@mikro-orm/mongodb'; import { Injectable } from '@nestjs/common'; import { EntityId } from '@shared/domain/types'; import { ContextExternalToolRepo } from '@shared/repo'; @@ -7,12 +8,7 @@ import { ExternalTool } from '../../external-tool/domain'; import { ExternalToolService } from '../../external-tool/service'; import { SchoolExternalTool } from '../../school-external-tool/domain'; import { SchoolExternalToolService } from '../../school-external-tool/service'; -import { - ContextExternalTool, - ContextExternalToolWithId, - ContextRef, - RestrictedContextMismatchLoggableException, -} from '../domain'; +import { ContextExternalTool, ContextRef, RestrictedContextMismatchLoggableException } from '../domain'; import { ContextExternalToolQuery } from '../uc/dto/context-external-tool.types'; @Injectable() @@ -42,11 +38,10 @@ export class ContextExternalToolService { return tool; } - // TODO: N21-1885 - Refactor to return ContextExternalToolWithId without cast - public async saveContextExternalTool(contextExternalTool: ContextExternalTool): Promise { + public async saveContextExternalTool(contextExternalTool: ContextExternalTool): Promise { const savedContextExternalTool: ContextExternalTool = await this.contextExternalToolRepo.save(contextExternalTool); - return savedContextExternalTool as ContextExternalToolWithId; + return savedContextExternalTool; } public async deleteBySchoolExternalToolId(schoolExternalToolId: EntityId) { @@ -87,20 +82,27 @@ export class ContextExternalToolService { contextExternalTool: ContextExternalTool, contextCopyId: EntityId ): Promise { - contextExternalTool.id = undefined; - contextExternalTool.contextRef.id = contextCopyId; + const copy = new ContextExternalTool({ + id: new ObjectId().toHexString(), + schoolToolRef: contextExternalTool.schoolToolRef, + contextRef: contextExternalTool.contextRef, + displayName: contextExternalTool.displayName, + parameters: contextExternalTool.parameters, + }); + + copy.contextRef.id = contextCopyId; const schoolExternalTool: SchoolExternalTool = await this.schoolExternalToolService.findById( - contextExternalTool.schoolToolRef.schoolToolId + copy.schoolToolRef.schoolToolId ); const externalTool: ExternalTool = await this.externalToolService.findById(schoolExternalTool.toolId); - contextExternalTool.parameters.forEach((parameter: CustomParameterEntry): void => { + copy.parameters.forEach((parameter: CustomParameterEntry): void => { const isUnusedParameter = !externalTool.parameters?.find( (param: CustomParameter): boolean => param.name === parameter.name ); if (isUnusedParameter) { - this.deleteUnusedParameter(contextExternalTool, parameter.name); + this.deleteUnusedParameter(copy, parameter.name); } }); diff --git a/apps/server/src/modules/tool/context-external-tool/testing/context-external-tool-entity.factory.ts b/apps/server/src/modules/tool/context-external-tool/testing/context-external-tool-entity.factory.ts index 5addd661578..ac39b2b401f 100644 --- a/apps/server/src/modules/tool/context-external-tool/testing/context-external-tool-entity.factory.ts +++ b/apps/server/src/modules/tool/context-external-tool/testing/context-external-tool-entity.factory.ts @@ -18,6 +18,5 @@ export const contextExternalToolEntityFactory = BaseFactory.define< displayName: 'My Course Tool 1', schoolTool: schoolExternalToolEntityFactory.buildWithId(), parameters: [new CustomParameterEntryEntity({ name: 'contextMockParameter', value: 'mockValue' })], - toolVersion: 1, }; }); diff --git a/apps/server/src/shared/testing/factory/domainobject/tool/context-external-tool.factory.ts b/apps/server/src/modules/tool/context-external-tool/testing/context-external-tool.factory.ts similarity index 77% rename from apps/server/src/shared/testing/factory/domainobject/tool/context-external-tool.factory.ts rename to apps/server/src/modules/tool/context-external-tool/testing/context-external-tool.factory.ts index 4b5a8f32dae..88827f685c9 100644 --- a/apps/server/src/shared/testing/factory/domainobject/tool/context-external-tool.factory.ts +++ b/apps/server/src/modules/tool/context-external-tool/testing/context-external-tool.factory.ts @@ -1,9 +1,9 @@ import { ObjectId } from '@mikro-orm/mongodb'; -import { CustomParameterEntry } from '@modules/tool/common/domain'; -import { ToolContextType } from '@modules/tool/common/enum'; -import { ContextExternalTool, ContextExternalToolProps } from '@modules/tool/context-external-tool/domain'; +import { DoBaseFactory } from '@shared/testing/factory/domainobject/do-base.factory'; import { DeepPartial } from 'fishery'; -import { DoBaseFactory } from '../do-base.factory'; +import { CustomParameterEntry } from '../../common/domain'; +import { ToolContextType } from '../../common/enum'; +import { ContextExternalTool, ContextExternalToolProps } from '../domain'; class ContextExternalToolFactory extends DoBaseFactory { withSchoolExternalToolRef(schoolToolId: string, schoolId?: string | undefined): this { @@ -23,10 +23,10 @@ class ContextExternalToolFactory extends DoBaseFactory { return { + id: new ObjectId().toHexString(), schoolToolRef: { schoolToolId: `schoolToolId-${sequence}`, schoolId: 'schoolId' }, contextRef: { id: new ObjectId().toHexString(), type: ToolContextType.COURSE }, displayName: 'My Course Tool 1', parameters: [new CustomParameterEntry({ name: 'param', value: 'value' })], - toolVersion: 1, }; }); diff --git a/apps/server/src/modules/tool/context-external-tool/testing/index.ts b/apps/server/src/modules/tool/context-external-tool/testing/index.ts index 4c763729962..372d84debe4 100644 --- a/apps/server/src/modules/tool/context-external-tool/testing/index.ts +++ b/apps/server/src/modules/tool/context-external-tool/testing/index.ts @@ -1 +1,2 @@ export { contextExternalToolEntityFactory } from './context-external-tool-entity.factory'; +export { contextExternalToolFactory } from './context-external-tool.factory'; diff --git a/apps/server/src/modules/tool/context-external-tool/uc/dto/context-external-tool.types.ts b/apps/server/src/modules/tool/context-external-tool/uc/dto/context-external-tool.types.ts index af595e96779..a9e44c209e3 100644 --- a/apps/server/src/modules/tool/context-external-tool/uc/dto/context-external-tool.types.ts +++ b/apps/server/src/modules/tool/context-external-tool/uc/dto/context-external-tool.types.ts @@ -1,10 +1,10 @@ +import { SchoolExternalToolRef } from '../../../school-external-tool/domain'; import { ContextExternalToolProps, ContextRef } from '../../domain'; -import { SchoolExternalToolRefDO } from '../../../school-external-tool/domain'; export type ContextExternalToolDto = ContextExternalToolProps; export type ContextExternalToolQuery = { id?: string; - schoolToolRef?: Partial; + schoolToolRef?: Partial; context?: Partial; }; diff --git a/apps/server/src/modules/tool/external-tool/controller/dto/response/context-external-tool-configuration-template.response.ts b/apps/server/src/modules/tool/external-tool/controller/dto/response/context-external-tool-configuration-template.response.ts index 09ebf443efc..e16495bbacc 100644 --- a/apps/server/src/modules/tool/external-tool/controller/dto/response/context-external-tool-configuration-template.response.ts +++ b/apps/server/src/modules/tool/external-tool/controller/dto/response/context-external-tool-configuration-template.response.ts @@ -18,15 +18,11 @@ export class ContextExternalToolConfigurationTemplateResponse { @ApiProperty({ type: [CustomParameterResponse] }) parameters: CustomParameterResponse[]; - @ApiProperty() - version: number; - constructor(configuration: ContextExternalToolConfigurationTemplateResponse) { this.externalToolId = configuration.externalToolId; this.schoolExternalToolId = configuration.schoolExternalToolId; this.name = configuration.name; this.logoUrl = configuration.logoUrl; this.parameters = configuration.parameters; - this.version = configuration.version; } } diff --git a/apps/server/src/modules/tool/external-tool/controller/dto/response/external-tool.response.ts b/apps/server/src/modules/tool/external-tool/controller/dto/response/external-tool.response.ts index 554bccc984e..7931250d430 100644 --- a/apps/server/src/modules/tool/external-tool/controller/dto/response/external-tool.response.ts +++ b/apps/server/src/modules/tool/external-tool/controller/dto/response/external-tool.response.ts @@ -1,8 +1,8 @@ import { ApiProperty, ApiPropertyOptional, getSchemaPath } from '@nestjs/swagger'; +import { ToolContextType } from '../../../../common/enum'; import { BasicToolConfigParams, Lti11ToolConfigCreateParams, Oauth2ToolConfigCreateParams } from '../request'; -import { BasicToolConfigResponse, Oauth2ToolConfigResponse, Lti11ToolConfigResponse } from './config'; +import { BasicToolConfigResponse, Lti11ToolConfigResponse, Oauth2ToolConfigResponse } from './config'; import { CustomParameterResponse } from './custom-parameter.response'; -import { ToolContextType } from '../../../../common/enum'; import { ExternalToolMediumResponse } from './external-tool-medium.response'; export class ExternalToolResponse { @@ -43,9 +43,6 @@ export class ExternalToolResponse { @ApiProperty({ type: Boolean, description: 'Should the external tool be opened in a new tab' }) openNewTab: boolean; - @ApiProperty({ type: Number, description: 'Version of the external tool' }) - version: number; - @ApiPropertyOptional({ enum: ToolContextType, enumName: 'ToolContextType', @@ -68,7 +65,6 @@ export class ExternalToolResponse { this.isHidden = response.isHidden; this.isDeactivated = response.isDeactivated; this.openNewTab = response.openNewTab; - this.version = response.version; this.restrictToContexts = response.restrictToContexts; this.medium = response.medium; } diff --git a/apps/server/src/modules/tool/external-tool/controller/dto/response/school-external-tool-configuration-template.response.ts b/apps/server/src/modules/tool/external-tool/controller/dto/response/school-external-tool-configuration-template.response.ts index 6ce5712c7d7..85d4d428e94 100644 --- a/apps/server/src/modules/tool/external-tool/controller/dto/response/school-external-tool-configuration-template.response.ts +++ b/apps/server/src/modules/tool/external-tool/controller/dto/response/school-external-tool-configuration-template.response.ts @@ -15,14 +15,10 @@ export class SchoolExternalToolConfigurationTemplateResponse { @ApiProperty({ type: [CustomParameterResponse] }) parameters: CustomParameterResponse[]; - @ApiProperty() - version: number; - constructor(configuration: SchoolExternalToolConfigurationTemplateResponse) { this.externalToolId = configuration.externalToolId; this.name = configuration.name; this.logoUrl = configuration.logoUrl; this.parameters = configuration.parameters; - this.version = configuration.version; } } diff --git a/apps/server/src/modules/tool/external-tool/domain/external-tool.do.ts b/apps/server/src/modules/tool/external-tool/domain/external-tool.do.ts index a44dc1c5d19..0441028c1a1 100644 --- a/apps/server/src/modules/tool/external-tool/domain/external-tool.do.ts +++ b/apps/server/src/modules/tool/external-tool/domain/external-tool.do.ts @@ -1,9 +1,8 @@ -import { BaseDO } from '@shared/domain/domainobject/base.do'; import { InternalServerErrorException } from '@nestjs/common'; -import { ToolVersion } from '../../common/interface'; -import { Oauth2ToolConfig, BasicToolConfig, Lti11ToolConfig, ExternalToolConfig } from './config'; +import { BaseDO } from '@shared/domain/domainobject/base.do'; import { CustomParameter } from '../../common/domain'; import { ToolConfigType, ToolContextType } from '../../common/enum'; +import { BasicToolConfig, ExternalToolConfig, Lti11ToolConfig, Oauth2ToolConfig } from './config'; import { ExternalToolMedium } from './external-tool-medium.do'; export interface ExternalToolProps { @@ -29,8 +28,6 @@ export interface ExternalToolProps { openNewTab: boolean; - version: number; - restrictToContexts?: ToolContextType[]; medium?: ExternalToolMedium; @@ -38,7 +35,7 @@ export interface ExternalToolProps { createdAt?: Date; } -export class ExternalTool extends BaseDO implements ToolVersion { +export class ExternalTool extends BaseDO { name: string; description?: string; @@ -59,8 +56,6 @@ export class ExternalTool extends BaseDO implements ToolVersion { openNewTab: boolean; - version: number; - restrictToContexts?: ToolContextType[]; medium?: ExternalToolMedium; @@ -88,16 +83,11 @@ export class ExternalTool extends BaseDO implements ToolVersion { this.isHidden = props.isHidden; this.isDeactivated = props.isDeactivated; this.openNewTab = props.openNewTab; - this.version = props.version; this.restrictToContexts = props.restrictToContexts; this.medium = props.medium; this.createdAt = props.createdAt; } - getVersion(): number { - return this.version; - } - static isBasicConfig(config: ExternalToolConfig): config is BasicToolConfig { return ToolConfigType.BASIC === config.type; } diff --git a/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts b/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts index d5d9eefe3ef..0496d0cadf9 100644 --- a/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts +++ b/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts @@ -1,12 +1,39 @@ import { Embedded, Entity, Property, Unique } from '@mikro-orm/core'; import { BaseEntityWithTimestamps } from '@shared/domain/entity/base.entity'; -import { CustomParameterEntity } from './custom-parameter'; -import { BasicToolConfigEntity, Lti11ToolConfigEntity, Oauth2ToolConfigEntity } from './config'; +import { EntityId } from '@shared/domain/types'; import { ToolContextType } from '../../common/enum'; +import { BasicToolConfigEntity, Lti11ToolConfigEntity, Oauth2ToolConfigEntity } from './config'; +import { CustomParameterEntity } from './custom-parameter'; import { ExternalToolMediumEntity } from './external-tool-medium.entity'; -export type IExternalToolProperties = Readonly>; +export interface ExternalToolProps { + id?: EntityId; + + name: string; + + description?: string; + + url?: string; + + logoUrl?: string; + + logoBase64?: string; + + config: BasicToolConfigEntity | Oauth2ToolConfigEntity | Lti11ToolConfigEntity; + + parameters?: CustomParameterEntity[]; + + isHidden: boolean; + + isDeactivated: boolean; + + openNewTab: boolean; + + restrictToContexts?: ToolContextType[]; + + medium?: ExternalToolMediumEntity; +} @Entity({ tableName: 'external-tools' }) export class ExternalToolEntity extends BaseEntityWithTimestamps { @@ -41,16 +68,13 @@ export class ExternalToolEntity extends BaseEntityWithTimestamps { @Property() openNewTab: boolean; - @Property() - version: number; - @Property({ nullable: true }) restrictToContexts?: ToolContextType[]; @Embedded(() => ExternalToolMediumEntity, { nullable: true, object: true }) medium?: ExternalToolMediumEntity; - constructor(props: IExternalToolProperties) { + constructor(props: ExternalToolProps) { super(); this.name = props.name; this.description = props.description; @@ -62,7 +86,6 @@ export class ExternalToolEntity extends BaseEntityWithTimestamps { this.isHidden = props.isHidden; this.isDeactivated = props.isDeactivated; this.openNewTab = props.openNewTab; - this.version = props.version; this.restrictToContexts = props.restrictToContexts; this.medium = props.medium; } diff --git a/apps/server/src/modules/tool/external-tool/mapper/external-tool-response.mapper.ts b/apps/server/src/modules/tool/external-tool/mapper/external-tool-response.mapper.ts index 790c8b7944c..41e239c434d 100644 --- a/apps/server/src/modules/tool/external-tool/mapper/external-tool-response.mapper.ts +++ b/apps/server/src/modules/tool/external-tool/mapper/external-tool-response.mapper.ts @@ -68,7 +68,6 @@ export class ExternalToolResponseMapper { isHidden: externalTool.isHidden, isDeactivated: externalTool.isDeactivated, openNewTab: externalTool.openNewTab, - version: externalTool.version, restrictToContexts: externalTool.restrictToContexts, medium: this.mapMediumToResponse(externalTool.medium), }); diff --git a/apps/server/src/modules/tool/external-tool/mapper/tool-configuration.mapper.ts b/apps/server/src/modules/tool/external-tool/mapper/tool-configuration.mapper.ts index b1846d60ea0..4821569e872 100644 --- a/apps/server/src/modules/tool/external-tool/mapper/tool-configuration.mapper.ts +++ b/apps/server/src/modules/tool/external-tool/mapper/tool-configuration.mapper.ts @@ -1,3 +1,4 @@ +import { ToolContextType } from '../../common/enum'; import { ContextExternalToolConfigurationTemplateListResponse, ContextExternalToolConfigurationTemplateResponse, @@ -8,7 +9,6 @@ import { import { ExternalTool } from '../domain'; import { ContextExternalToolTemplateInfo } from '../uc'; import { ExternalToolResponseMapper } from './external-tool-response.mapper'; -import { ToolContextType } from '../../common/enum'; export class ToolConfigurationMapper { static mapToSchoolExternalToolConfigurationTemplateResponse( @@ -21,7 +21,6 @@ export class ToolConfigurationMapper { parameters: externalTool.parameters ? ExternalToolResponseMapper.mapCustomParameterToResponse(externalTool.parameters) : [], - version: externalTool.version, }); return mapped; @@ -53,7 +52,6 @@ export class ToolConfigurationMapper { parameters: externalTool.parameters ? ExternalToolResponseMapper.mapCustomParameterToResponse(externalTool.parameters) : [], - version: externalTool.version, }); return mapped; diff --git a/apps/server/src/modules/tool/external-tool/service/external-tool-version-increment.service.ts b/apps/server/src/modules/tool/external-tool/service/external-tool-version-increment.service.ts index 9e645b97ad2..ca112f7a086 100644 --- a/apps/server/src/modules/tool/external-tool/service/external-tool-version-increment.service.ts +++ b/apps/server/src/modules/tool/external-tool/service/external-tool-version-increment.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import { ExternalTool } from '../domain'; import { CustomParameter } from '../../common/domain'; +import { ExternalTool } from '../domain'; @Injectable() export class ExternalToolVersionIncrementService { @@ -9,7 +9,7 @@ export class ExternalToolVersionIncrementService { return; } if (this.compareParameters(oldTool.parameters, newTool.parameters)) { - newTool.version += 1; + // newTool.version += 1; } } diff --git a/apps/server/src/modules/tool/external-tool/testing/external-tool-entity.factory.ts b/apps/server/src/modules/tool/external-tool/testing/external-tool-entity.factory.ts index 9aefd55bf49..b13f7a40bcb 100644 --- a/apps/server/src/modules/tool/external-tool/testing/external-tool-entity.factory.ts +++ b/apps/server/src/modules/tool/external-tool/testing/external-tool-entity.factory.ts @@ -1,3 +1,4 @@ +import { ObjectId } from '@mikro-orm/mongodb'; import { CustomParameterLocation, CustomParameterScope, @@ -10,24 +11,24 @@ import { BasicToolConfigEntity, CustomParameterEntity, ExternalToolEntity, - IExternalToolProperties, + ExternalToolMediumEntity, + ExternalToolProps, Lti11ToolConfigEntity, Oauth2ToolConfigEntity, - ExternalToolMediumEntity, } from '@modules/tool/external-tool/entity'; import { BaseFactory } from '@shared/testing/factory/base.factory'; import { DeepPartial } from 'fishery'; -export class ExternalToolEntityFactory extends BaseFactory { +export class ExternalToolEntityFactory extends BaseFactory { withName(name: string): this { - const params: DeepPartial = { + const params: DeepPartial = { name, }; return this.params(params); } withBasicConfig(): this { - const params: DeepPartial = { + const params: DeepPartial = { config: new BasicToolConfigEntity({ type: ToolConfigType.BASIC, baseUrl: 'mockBaseUrl', @@ -37,7 +38,7 @@ export class ExternalToolEntityFactory extends BaseFactory = { + const params: DeepPartial = { config: new Oauth2ToolConfigEntity({ type: ToolConfigType.OAUTH2, baseUrl: 'mockBaseUrl', @@ -49,7 +50,7 @@ export class ExternalToolEntityFactory extends BaseFactory = { + const params: DeepPartial = { config: new Lti11ToolConfigEntity({ type: ToolConfigType.BASIC, baseUrl: 'mockBaseUrl', @@ -64,7 +65,7 @@ export class ExternalToolEntityFactory extends BaseFactory = { + const params: DeepPartial = { logoBase64: 'iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAYAAAAeGRPoAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ2MUQ2Q0Y5RTQxMTExRTdBMTg3QkQ2MDVGMUFEMUIwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQ2MUQ2Q0ZBRTQxMTExRTdBMTg3QkQ2MDVGMUFEMUIwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDYxRDZDRjdFNDExMTFFN0ExODdCRDYwNUYxQUQxQjAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDYxRDZDRjhFNDExMTFFN0ExODdCRDYwNUYxQUQxQjAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz45EjsrAAALfUlEQVR42uzdgXWjOAIGYHLvGsiV4CnBU4JTgqeEpIS4hKSEpIS4BLsEu4RJCeMScmhGzPplkyCMAGO+7z3ezs3tYsuS+BEIcfX29lYAAOP2Hz8BAAh0AECgAwACHQAQ6AAg0AEAgQ4ACHQAQKADgEAHAAQ6ACDQAQCBDgACHQAQ6ACAQAcABDoACHQAQKADAAIdABDoACDQAQCBDgAIdABAoAOAQAcABDoAINABAIEOAAIdABDoAIBABwAEOgAIdABAoAMAAh0AEOgAINABAIEOAAh0AECgA4BABwAEOgAg0AEAgQ4ACHQAEOgAgEAHAAQ6ACDQAUCgAwACHQAQ6ACAQAcAgQ4ACHQAQKADAAIdAAQ6ACDQAQCBDgAIdAAQ6ACAQAcABDoAINABQKADAAIdABDoAIBABwCBDgAIdABAoAMAAh0ABDoAINABgN79109AbldXV9flPxblNov/DOblFv7+UG77+HfVn39vb29vB78emdpg1fauP2iDwWvcgm3883aMbbAs6/yorPP414ujf+W4z+2r/12WdasOL6zdl4Ufa4fdvGu0gyp/x6sTyjD0jx8a/03GOgn1cVtuyxN3EQ4267CV3+t16u2jhz701lfb6DEAlnGbt2yDz+ccDDHEq7LOTtzNIZY11PVaHV6AEOhj3ErhgP12LtuJZRj6e28y1cW8g/p4CgeqKbePHvpQ522jp3LMYnvJWWe/2rbBjsq66Kht/wwn4+pw3Jt76LQ9o76NB5jco+Gw35/l/p/iJXx43/auy+2+CqPMu7+O+9zFzziHsj511Nf+Bmr5GT/jlTZ1OEICnbZh/lT8c0+rC1WwL/3ivLvkvCu3h44/KrTth/LzdvFy8BBlXXQUeJ8F+6b8zIeuT6SnVIcCnXM/oC5jmPchdMiXqZxlk3QiuStOv3d8inkc6c0HKOum45Pmj9zHYJ+pQ4HOZR9Qr08I8zBRZRu3U4RJcs9+fWHe44nkRyeWu/gd+ijr04BlrRzU4Xh4bI1T3CaMGMKB4LH4M4N2/0Gnrh5JqWbr1u3vzmNtwrxhEFSzuEP7ez1+TCu2v9lR+2syagv3mvcfteuMZb0vml1ifz0q6/74KZF3Za3Km/Lb/cjd56ZUh4OYyuy/1NnPZhknfe9fNd/9JQR0g/1Vk1d+frK/hym2D+3vX7O7G83YbtgGm86yDn1g1lFZlw3Lumy4/9Df7mv68VwdjrBPC3SBnrlT7lru//2BZtekUwv0y2t/MYB+JR6kH9q0lzjK2yV+1q6jx7dSy3qf4Xe9/2C/t+rQY2tMQ91lrceWV4zCf/8tXmZzqZ2iSH+SIrSVVZv2Ei/BhgV1UuZrzDuYqJlS1upyeNu+doj7+F78s+LaY/l3z+pwnAQ6WQM9x4pT8UDzI3TKi7vHRdN7rovEe753uYIotr+7xEC4zzUTPD45kvIM+E3Old1iH/sew3ylDgU609Hb4zPnvtY0vUgZPd11MaqMgbBP6A+5RngPiWXdd1DWQxdhPsE6FOhc1IjKqm7kHNnVjVjXHV0iroQrRXWXf2/btvtY1tnAZVWHAp2JqesYVnQjl5S2tOryC8THv1LuVbd9rvk2od+t1OFZ16FAZ3TqLl89XPJKTPQ2srtOCIPHtm/lSwyEEAZ1n7PsuKzPfZRVHQp0pqWuU4ROvLnUlZjoTfUe7C9DrsfvU/dZ8xYTq5YZPl8dDluHAp1RSpmo9ntp2Pjmpnv31TlB3VWefc8j1nWG7/yZ2ZmVVR0KdKYgPh+aelYdDlRh5u6vMtQ3MdxdjidHGKx7bvchePYJ7X30ZVWHAp38FmX4vXWwbTJ8t3A/qunCD4sY7uHFCCHgX2LAz1Q1n7SXL0d3A3ynbcvvPKayqsMR8nIWTjrTLYM4zEw99Y1J1WSZsIVJdNWLJdYWkiHREJegD2Mqa3ineZHpEnLZL2/UoUDnckP9uTxgFEWe1yCGUXpY2CGM2EOgP4/teVvySbktM9A95bqTzcUJZV10WNb5UCPOKdXhOXHJnVahXqQt2tD0IFRNqPNM+zSZRKkOEegMEOrhUnl4mcoqc7CHUXu4z/5kljyAQKefUD8cvSUtBHvOS2nhefaNUGcEvBVQHQp0LivYyy0E+++3NxV5ZrKGy/AvfuHJtKPatQ4Gevyx9nnxCyqrOhToZLQtO8VVB9tNTx16H99rHIL9f8Wfe+1tAn5xSe8tpvMDcxeuJ1RWdSjQ4dOR+/oo4MMIPrzWsOnCEladm9AJbc3/P8TobtHyO5/6381O7Hc3qSf6RTcvSJlSHQp0Jhvwr2GGfLn9iKP31Al1KS974DKc1Ys04onkouV3HkVZ1aFAhzaj92pCXcqz55aOnYbaJTp7vgebEj7bjso61peGTKkOBTq8C/a7hFC3VOw0pNyO6fONfnWftY3vOTjF9szKqg4FOmRRdy9v4SeaxgleQiDc9jFyja8C7uxFI4kvDbkd2yh9SnUo0OHzg8DWL0HiAfapyy8Q77vWPV1xKNqHQd2VqfA9HtThWdehQGecQieJZ73Q1cldOMDWTVLq+nHGEKJ1I8jHtpdq4zLKdftYjq3PTakOBTpjFl7D+hTf6JTbV4+meRvbtKQ8TvXQRdCFZYeL+vuuhyJtMmeKx8SyztXh2dahQGd0o/PQSaqDSng2fJPrPljcz1cHrFc1MLlResotmKeco7zEIMg6sotPe9S173Cyu+ngxUVzdSjQmV6Y337QScJEtV2mzlh3P80IfXruirR1CsIo76XN4kPhhDKcoCYGwTaGcO6y1gnle8nR38JoP5Z3qQ4FOtMK88UXgXsdO2N47elt0w4Z78m/FPWz2NdqYnKj9DBqTV3JLARTaIONVhWMIRACclekPUkRwulHB2UNI9nUgPnb307py3EEm1pedTiGY3T5Q08tlDZfVXZcBrGv7zL4j59a3njfblM0Wwv5OY6ow7ru+y/2u4xn03X73na9Fv05tY9Lbn+n/I7xYN10zsa6aoOxHR6qE8jiz2XmamsyQg37uPmsTWeqm5cTvlNV1tfjl6MclbW6nbUoGq7nkKvdT6kOBbpAP+dAv46B3uZe26H455L5rGi+SMz3rjugQD/fQI/fOfW+aFd6CYJM/S2XcI95lbFsk6jDIbjkTuoB+BBfrNLmflO1lnLjEUJpdYkdkMbtMNyLXQ308b0FQRyFhqtRQ86+/n1JOmeYT6kOBTpjOKCu4oGmz9nmz5c0cYXWbfAxtsE+ZyaHS9jf+gyCo+WQhwi/dSzvWh0KdC77gBo6xvci/S1pbaziQQ3et8HUF/q0HdHdxVeRHgYqaxV+fQTRaxzB/ui6vFOqQ4HOuR9Qj9+StupgxL6PBxYjc+pGsDdF/uWCD7Fdf4uruA1+AhNved0V3VwdC79fCPFvxxPq1OG4mBT37wZmUtzp5VnG3zb889TnSMMlvnVXl/rG1D4uuf118TvGRYluY/ubtWh/29gGD2dcdzn62j6W9Tk+VnYO5ZpMHQp0xhQW1aMk1+8Csvrz69FIYxv/vJ1aB6TTYKgmX87ftb3j9lc9eTHa9hf7WlXW2Qdl3cdyjqqsU6pDgQ4A/OUeOgAIdABAoAMAAh0AEOgAINABAIEOAAh0AECgA4BABwAEOgAg0AEAgQ4AAh0AEOgAgEAHAAQ6AAh0AECgAwACHQAQ6AAg0AEAgQ4ACHQAQKADgEAHAAQ6ACDQAQCBDgACHQAQ6ACAQAcABDoACHQAQKADAAIdABDoACDQAQCBDgAIdABAoAOAQAcABDoAINABAIEOAAh0ABDoAIBABwAEOgAg0AFAoAMAAh0AEOgAgEAHAIEOAAh0AECgAwACHQAEOgAg0AEAgQ4ACHQAEOgAgEAHAAQ6ACDQAUCgAwACHQAQ6ACAQAcAgQ4ACHQAQKADAAIdAAQ6ACDQAYD+/V+AAQADXuXS75wQpQAAAABJRU5ErkJggg==', }; @@ -73,7 +74,7 @@ export class ExternalToolEntityFactory extends BaseFactory = { + const params: DeepPartial = { medium: new ExternalToolMediumEntity({ ...medium, mediumId: 'mediumId', @@ -104,8 +105,9 @@ export const customParameterEntityFactory = BaseFactory.define { + ({ sequence }): ExternalToolProps => { return { + id: new ObjectId().toHexString(), name: `external-tool-${sequence}`, description: 'This is a tool description', url: '', @@ -118,7 +120,6 @@ export const externalToolEntityFactory = ExternalToolEntityFactory.define( isHidden: false, isDeactivated: false, openNewTab: true, - version: 1, }; } ); diff --git a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts index 1fd6ca576bf..982a1dede42 100644 --- a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts +++ b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts @@ -57,7 +57,6 @@ export class ExternalToolUc { ...loaded, ...externalTool, config: configToUpdate, - version: loaded.version, }); await this.toolValidationService.validateUpdate(toolId, toUpdate); diff --git a/apps/server/src/modules/tool/school-external-tool/controller/api-test/tool-school.api.spec.ts b/apps/server/src/modules/tool/school-external-tool/controller/api-test/tool-school.api.spec.ts index 96b205e7c73..d51b5e1c073 100644 --- a/apps/server/src/modules/tool/school-external-tool/controller/api-test/tool-school.api.spec.ts +++ b/apps/server/src/modules/tool/school-external-tool/controller/api-test/tool-school.api.spec.ts @@ -1,26 +1,26 @@ import { EntityManager, MikroORM } from '@mikro-orm/core'; import { ObjectId } from '@mikro-orm/mongodb'; +import { AccountEntity } from '@modules/account/entity/account.entity'; import { ServerTestModule } from '@modules/server'; import { HttpStatus, INestApplication } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { ColumnBoardNode, ExternalToolElementNodeEntity, SchoolEntity, User } from '@shared/domain/entity'; import { Permission } from '@shared/domain/interface'; import { - TestApiClient, - UserAndAccountTestFactory, accountFactory, columnBoardNodeFactory, externalToolElementNodeFactory, schoolEntityFactory, + TestApiClient, + UserAndAccountTestFactory, userFactory, } from '@shared/testing'; -import { schoolToolConfigurationStatusFactory } from '@shared/testing/factory'; -import { AccountEntity } from '@modules/account/entity/account.entity'; import { ContextExternalToolEntity, ContextExternalToolType } from '../../../context-external-tool/entity'; import { contextExternalToolEntityFactory } from '../../../context-external-tool/testing'; import { CustomParameterScope, CustomParameterType, ExternalToolEntity } from '../../../external-tool/entity'; import { customParameterEntityFactory, externalToolEntityFactory } from '../../../external-tool/testing'; import { SchoolExternalToolEntity } from '../../entity'; +import { schoolExternalToolConfigurationStatusFactory, schoolExternalToolEntityFactory } from '../../testing'; import { CustomParameterEntryParam, SchoolExternalToolMetadataResponse, @@ -29,7 +29,6 @@ import { SchoolExternalToolSearchListResponse, SchoolExternalToolSearchParams, } from '../dto'; -import { schoolExternalToolEntityFactory } from '../../testing/school-external-tool-entity.factory'; describe('ToolSchoolController (API)', () => { let app: INestApplication; @@ -73,7 +72,6 @@ describe('ToolSchoolController (API)', () => { }); const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ - version: 1, parameters: [ customParameterEntityFactory.build({ name: 'param1', @@ -93,7 +91,6 @@ describe('ToolSchoolController (API)', () => { const postParams: SchoolExternalToolPostParams = { toolId: externalToolEntity.id, schoolId: school.id, - version: 1, parameters: [ { name: 'param1', value: 'value' }, { name: 'param2', value: 'false' }, @@ -144,10 +141,9 @@ describe('ToolSchoolController (API)', () => { name: externalToolEntity.name, schoolId: postParams.schoolId, toolId: postParams.toolId, - status: schoolToolConfigurationStatusFactory.build({ + status: schoolExternalToolConfigurationStatusFactory.build({ isOutdatedOnScopeSchool: false, }), - toolVersion: postParams.version, parameters: [ { name: 'param1', value: 'value' }, { name: 'param2', value: 'false' }, @@ -176,7 +172,6 @@ describe('ToolSchoolController (API)', () => { }); const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ - version: 1, parameters: [], }); @@ -241,7 +236,6 @@ describe('ToolSchoolController (API)', () => { }); const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ - version: 1, parameters: [], }); @@ -303,10 +297,9 @@ describe('ToolSchoolController (API)', () => { name: externalToolEntity.name, schoolId: school.id, toolId: externalToolEntity.id, - status: schoolToolConfigurationStatusFactory.build({ + status: schoolExternalToolConfigurationStatusFactory.build({ isOutdatedOnScopeSchool: true, }), - toolVersion: schoolExternalToolEntity.toolVersion, parameters: [ { name: schoolExternalToolEntity.schoolParameters[0].name, @@ -334,7 +327,6 @@ describe('ToolSchoolController (API)', () => { }); const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ - version: 1, parameters: [], }); @@ -348,10 +340,9 @@ describe('ToolSchoolController (API)', () => { name: '', schoolId: school.id, toolId: externalToolEntity.id, - status: schoolToolConfigurationStatusFactory.build({ + status: schoolExternalToolConfigurationStatusFactory.build({ isOutdatedOnScopeSchool: false, }), - toolVersion: schoolExternalToolEntity.toolVersion, parameters: [ { name: schoolExternalToolEntity.schoolParameters[0].name, @@ -416,7 +407,6 @@ describe('ToolSchoolController (API)', () => { }); const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ - version: 1, parameters: [ customParameterEntityFactory.build({ name: 'param1', @@ -427,7 +417,6 @@ describe('ToolSchoolController (API)', () => { ], }); const externalToolEntity2: ExternalToolEntity = externalToolEntityFactory.buildWithId({ - version: 1, parameters: [], }); @@ -459,7 +448,6 @@ describe('ToolSchoolController (API)', () => { const postParams: SchoolExternalToolPostParams = { toolId: externalToolEntity.id, schoolId: school.id, - version: 1, parameters: [paramEntry], isDeactivated: false, }; @@ -468,7 +456,6 @@ describe('ToolSchoolController (API)', () => { const postParamsUpdate: SchoolExternalToolPostParams = { toolId: externalToolEntity.id, schoolId: school.id, - version: 1, parameters: [updatedParamEntry], isDeactivated: false, }; @@ -478,10 +465,9 @@ describe('ToolSchoolController (API)', () => { name: externalToolEntity.name, schoolId: postParamsUpdate.schoolId, toolId: postParamsUpdate.toolId, - status: schoolToolConfigurationStatusFactory.build({ + status: schoolExternalToolConfigurationStatusFactory.build({ isOutdatedOnScopeSchool: false, }), - toolVersion: postParamsUpdate.version, parameters: [ { name: updatedParamEntry.name, diff --git a/apps/server/src/modules/tool/school-external-tool/controller/dto/school-external-tool-post.params.ts b/apps/server/src/modules/tool/school-external-tool/controller/dto/school-external-tool-post.params.ts index e21be39714b..5195c0453f0 100644 --- a/apps/server/src/modules/tool/school-external-tool/controller/dto/school-external-tool-post.params.ts +++ b/apps/server/src/modules/tool/school-external-tool/controller/dto/school-external-tool-post.params.ts @@ -1,6 +1,6 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Type } from 'class-transformer'; -import { IsArray, IsBoolean, IsMongoId, IsNumber, IsOptional, IsString, ValidateNested } from 'class-validator'; +import { IsArray, IsBoolean, IsMongoId, IsOptional, IsString, ValidateNested } from 'class-validator'; import { CustomParameterEntryParam } from './custom-parameter-entry.params'; export class SchoolExternalToolPostParams { @@ -28,8 +28,4 @@ export class SchoolExternalToolPostParams { }) @IsBoolean() isDeactivated!: boolean; - - @ApiProperty() - @IsNumber() - version!: number; } diff --git a/apps/server/src/modules/tool/school-external-tool/controller/dto/school-external-tool.response.ts b/apps/server/src/modules/tool/school-external-tool/controller/dto/school-external-tool.response.ts index 5d86bdcd186..2ca015c5538 100644 --- a/apps/server/src/modules/tool/school-external-tool/controller/dto/school-external-tool.response.ts +++ b/apps/server/src/modules/tool/school-external-tool/controller/dto/school-external-tool.response.ts @@ -18,9 +18,6 @@ export class SchoolExternalToolResponse { @ApiProperty({ type: [CustomParameterEntryResponse] }) parameters: CustomParameterEntryResponse[]; - @ApiProperty() - toolVersion: number; - @ApiProperty({ type: SchoolExternalToolConfigurationStatusResponse }) status: SchoolExternalToolConfigurationStatusResponse; @@ -33,7 +30,6 @@ export class SchoolExternalToolResponse { this.toolId = response.toolId; this.schoolId = response.schoolId; this.parameters = response.parameters; - this.toolVersion = response.toolVersion; this.status = response.status; this.logoUrl = response.logoUrl; } diff --git a/apps/server/src/modules/tool/school-external-tool/domain/index.ts b/apps/server/src/modules/tool/school-external-tool/domain/index.ts index d089fb2e908..c0716afd84b 100644 --- a/apps/server/src/modules/tool/school-external-tool/domain/index.ts +++ b/apps/server/src/modules/tool/school-external-tool/domain/index.ts @@ -1,3 +1,3 @@ export * from './school-external-tool.do'; -export * from './school-external-tool-ref.do'; +export * from './school-external-tool.ref'; export * from './school-external-tool-metadata'; diff --git a/apps/server/src/modules/tool/school-external-tool/domain/school-external-tool.do.ts b/apps/server/src/modules/tool/school-external-tool/domain/school-external-tool.do.ts index 06e49f75d1c..eb75c54cd9f 100644 --- a/apps/server/src/modules/tool/school-external-tool/domain/school-external-tool.do.ts +++ b/apps/server/src/modules/tool/school-external-tool/domain/school-external-tool.do.ts @@ -1,10 +1,9 @@ -import { BaseDO } from '@shared/domain/domainobject/base.do'; +import { AuthorizableObject, DomainObject } from '@shared/domain/domain-object'; import { CustomParameterEntry } from '../../common/domain'; -import { ToolVersion } from '../../common/interface'; import { SchoolExternalToolConfigurationStatus } from '../controller/dto'; -export interface SchoolExternalToolProps { - id?: string; +export interface SchoolExternalToolProps extends AuthorizableObject { + id: string; name?: string; @@ -14,38 +13,47 @@ export interface SchoolExternalToolProps { parameters: CustomParameterEntry[]; - toolVersion: number; - status?: SchoolExternalToolConfigurationStatus; } -export class SchoolExternalTool extends BaseDO implements ToolVersion { - name?: string; +export class SchoolExternalTool extends DomainObject { + get name(): string | undefined { + return this.props.name; + } - toolId: string; + set name(value: string | undefined) { + this.props.name = value; + } - schoolId: string; + get toolId(): string { + return this.props.toolId; + } - parameters: CustomParameterEntry[]; + set toolId(value: string) { + this.props.toolId = value; + } - toolVersion: number; + get schoolId(): string { + return this.props.schoolId; + } - status?: SchoolExternalToolConfigurationStatus; + set schoolId(value: string) { + this.props.schoolId = value; + } - constructor(props: SchoolExternalToolProps) { - super(props.id); - this.name = props.name; - this.toolId = props.toolId; - this.schoolId = props.schoolId; - this.parameters = props.parameters; - this.toolVersion = props.toolVersion; - this.status = props.status; + get parameters(): CustomParameterEntry[] { + return this.props.parameters; } - getVersion(): number { - return this.toolVersion; + set parameters(value: CustomParameterEntry[]) { + this.props.parameters = value; } -} -// TODO: N21-1885: Remove this type and alls its usages -export type SchoolExternalToolWithId = SchoolExternalTool & { id: string }; + get status(): SchoolExternalToolConfigurationStatus | undefined { + return this.props.status; + } + + set status(value: SchoolExternalToolConfigurationStatus | undefined) { + this.props.status = value; + } +} diff --git a/apps/server/src/modules/tool/school-external-tool/domain/school-external-tool-ref.do.ts b/apps/server/src/modules/tool/school-external-tool/domain/school-external-tool.ref.ts similarity index 59% rename from apps/server/src/modules/tool/school-external-tool/domain/school-external-tool-ref.do.ts rename to apps/server/src/modules/tool/school-external-tool/domain/school-external-tool.ref.ts index 421d512f838..47777df75e9 100644 --- a/apps/server/src/modules/tool/school-external-tool/domain/school-external-tool-ref.do.ts +++ b/apps/server/src/modules/tool/school-external-tool/domain/school-external-tool.ref.ts @@ -1,9 +1,9 @@ -export class SchoolExternalToolRefDO { +export class SchoolExternalToolRef { schoolToolId: string; schoolId?: string; - constructor(props: SchoolExternalToolRefDO) { + constructor(props: SchoolExternalToolRef) { this.schoolToolId = props.schoolToolId; this.schoolId = props.schoolId; } diff --git a/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool.entity.ts b/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool.entity.ts index 2662a5d3986..cd798abfccd 100644 --- a/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool.entity.ts +++ b/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool.entity.ts @@ -1,15 +1,20 @@ -import { Embedded, Entity, ManyToOne, Property } from '@mikro-orm/core'; +import { Embedded, Entity, ManyToOne } from '@mikro-orm/core'; import { BaseEntityWithTimestamps } from '@shared/domain/entity/base.entity'; import { SchoolEntity } from '@shared/domain/entity/school.entity'; +import { EntityId } from '@shared/domain/types'; import { CustomParameterEntryEntity } from '../../common/entity'; import { ExternalToolEntity } from '../../external-tool/entity'; import { SchoolExternalToolConfigurationStatusEntity } from './school-external-tool-configuration-status.entity'; -export interface SchoolExternalToolProperties { +export interface SchoolExternalToolEntityProps { + id?: EntityId; + tool: ExternalToolEntity; + school: SchoolEntity; + schoolParameters?: CustomParameterEntryEntity[]; - toolVersion: number; + status?: SchoolExternalToolConfigurationStatusEntity; } @@ -24,18 +29,17 @@ export class SchoolExternalToolEntity extends BaseEntityWithTimestamps { @Embedded(() => CustomParameterEntryEntity, { array: true }) schoolParameters: CustomParameterEntryEntity[]; - @Property() - toolVersion: number; - @Embedded(() => SchoolExternalToolConfigurationStatusEntity, { object: true, nullable: true }) status?: SchoolExternalToolConfigurationStatusEntity; - constructor(props: SchoolExternalToolProperties) { + constructor(props: SchoolExternalToolEntityProps) { super(); + if (props.id) { + this.id = props.id; + } this.tool = props.tool; this.school = props.school; this.schoolParameters = props.schoolParameters ?? []; - this.toolVersion = props.toolVersion; this.status = props.status; } } diff --git a/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-request.mapper.ts b/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-request.mapper.ts index 3fb0da2ee5b..6e05bc21ed2 100644 --- a/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-request.mapper.ts +++ b/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-request.mapper.ts @@ -1,3 +1,4 @@ +import { ObjectId } from '@mikro-orm/mongodb'; import { Injectable } from '@nestjs/common'; import { CustomParameterEntry } from '../../common/domain'; import { @@ -11,9 +12,9 @@ import { SchoolExternalToolDto } from '../uc/dto/school-external-tool.types'; export class SchoolExternalToolRequestMapper { mapSchoolExternalToolRequest(request: SchoolExternalToolPostParams): SchoolExternalToolDto { return { + id: new ObjectId().toHexString(), toolId: request.toolId, schoolId: request.schoolId, - toolVersion: request.version, parameters: this.mapRequestToCustomParameterEntryDO(request.parameters ?? []), status: new SchoolExternalToolConfigurationStatus({ isOutdatedOnScopeSchool: false, diff --git a/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-response.mapper.ts b/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-response.mapper.ts index d0b984a77b8..71de9168de5 100644 --- a/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-response.mapper.ts +++ b/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-response.mapper.ts @@ -24,7 +24,6 @@ export class SchoolExternalToolResponseMapper { toolId: schoolExternalTool.toolId, schoolId: schoolExternalTool.schoolId, parameters: this.mapToCustomParameterEntryResponse(schoolExternalTool.parameters), - toolVersion: schoolExternalTool.toolVersion, status: SchoolToolConfigurationStatusResponseMapper.mapToResponse( schoolExternalTool.status ?? { isOutdatedOnScopeSchool: false, isDeactivated: false } ), diff --git a/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.spec.ts b/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.spec.ts index cbcb9a84b41..61df16455ac 100644 --- a/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.spec.ts +++ b/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.spec.ts @@ -2,14 +2,11 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { Test, TestingModule } from '@nestjs/testing'; import { ApiValidationError } from '@shared/common'; import { SchoolExternalToolRepo } from '@shared/repo'; -import { - externalToolFactory, - schoolExternalToolFactory, - schoolToolConfigurationStatusFactory, -} from '@shared/testing/factory'; +import { externalToolFactory } from '@shared/testing/factory'; import { ExternalToolService } from '../../external-tool'; import { ExternalTool } from '../../external-tool/domain'; import { SchoolExternalTool } from '../domain'; +import { schoolExternalToolConfigurationStatusFactory, schoolExternalToolFactory } from '../testing'; import { SchoolExternalToolQuery } from '../uc/dto/school-external-tool.types'; import { SchoolExternalToolValidationService } from './school-external-tool-validation.service'; import { SchoolExternalToolService } from './school-external-tool.service'; @@ -59,11 +56,11 @@ describe(SchoolExternalToolService.name, () => { isDeactivated: !!schoolExternalTool.status?.isDeactivated, }; - schoolExternalToolRepo.find.mockResolvedValue([schoolExternalTool]); + schoolExternalToolRepo.find.mockResolvedValueOnce([schoolExternalTool]); return { schoolExternalTool, - schoolExternalToolId: schoolExternalTool.id as string, + schoolExternalToolId: schoolExternalTool.id, schoolExternalToolQuery, }; }; @@ -137,7 +134,7 @@ describe(SchoolExternalToolService.name, () => { expect(schoolExternalToolValidationService.validate).toHaveBeenCalledWith(schoolExternalTool); expect(schoolExternalToolDOs[0].status).toEqual( - schoolToolConfigurationStatusFactory.build({ + schoolExternalToolConfigurationStatusFactory.build({ isOutdatedOnScopeSchool: false, }) ); @@ -152,7 +149,7 @@ describe(SchoolExternalToolService.name, () => { expect(schoolExternalToolValidationService.validate).toHaveBeenCalledWith(schoolExternalTool); expect(schoolExternalToolDOs[0].status).toEqual( - schoolToolConfigurationStatusFactory.build({ + schoolExternalToolConfigurationStatusFactory.build({ isDeactivated: false, }) ); @@ -182,7 +179,7 @@ describe(SchoolExternalToolService.name, () => { expect(schoolExternalToolValidationService.validate).toHaveBeenCalledWith(schoolExternalTool); expect(schoolExternalToolDOs[0].status).toEqual( - schoolToolConfigurationStatusFactory.build({ + schoolExternalToolConfigurationStatusFactory.build({ isOutdatedOnScopeSchool: true, }) ); @@ -192,7 +189,7 @@ describe(SchoolExternalToolService.name, () => { describe('when schoolExternalTool is deactivated', () => { const setup = () => { const schoolExternalTool: SchoolExternalTool = schoolExternalToolFactory.build({ - status: schoolToolConfigurationStatusFactory.build({ isDeactivated: true }), + status: schoolExternalToolConfigurationStatusFactory.build({ isDeactivated: true }), }); const externalTool: ExternalTool = externalToolFactory.buildWithId(); @@ -213,7 +210,7 @@ describe(SchoolExternalToolService.name, () => { ); expect(schoolExternalToolDOs[0].status).toEqual( - schoolToolConfigurationStatusFactory.build({ + schoolExternalToolConfigurationStatusFactory.build({ isDeactivated: true, isOutdatedOnScopeSchool: true, }) @@ -243,7 +240,7 @@ describe(SchoolExternalToolService.name, () => { ); expect(schoolExternalToolDOs[0].status).toEqual( - schoolToolConfigurationStatusFactory.build({ + schoolExternalToolConfigurationStatusFactory.build({ isDeactivated: true, isOutdatedOnScopeSchool: true, }) @@ -263,7 +260,7 @@ describe(SchoolExternalToolService.name, () => { externalToolService.findById.mockResolvedValue(externalTool); return { - schoolExternalToolId: schoolExternalTool.id as string, + schoolExternalToolId: schoolExternalTool.id, }; }; @@ -287,7 +284,7 @@ describe(SchoolExternalToolService.name, () => { externalToolService.findById.mockResolvedValue(externalTool); return { - schoolExternalToolId: schoolExternalTool.id as string, + schoolExternalToolId: schoolExternalTool.id, }; }; @@ -320,7 +317,7 @@ describe(SchoolExternalToolService.name, () => { await service.saveSchoolExternalTool(schoolExternalTool); - expect(schoolExternalToolRepo.save).toHaveBeenCalledWith(schoolExternalTool); + expect(schoolExternalToolRepo.createOrUpdate).toHaveBeenCalledWith(schoolExternalTool); }); it('should enrich data from externalTool', async () => { diff --git a/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.ts b/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.ts index 1ba92a7f244..8c46de1a63c 100644 --- a/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.ts +++ b/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.ts @@ -4,7 +4,7 @@ import { SchoolExternalToolRepo } from '@shared/repo'; import { ExternalTool } from '../../external-tool/domain'; import { ExternalToolService } from '../../external-tool/service'; import { SchoolExternalToolConfigurationStatus } from '../controller/dto'; -import { SchoolExternalTool, SchoolExternalToolWithId } from '../domain'; +import { SchoolExternalTool } from '../domain'; import { SchoolExternalToolQuery } from '../uc/dto/school-external-tool.types'; import { SchoolExternalToolValidationService } from './school-external-tool-validation.service'; @@ -16,14 +16,13 @@ export class SchoolExternalToolService { private readonly schoolExternalToolValidationService: SchoolExternalToolValidationService ) {} - // TODO: N21-1885 - Refactor to return SchoolExternalToolWithId without cast - async findById(schoolExternalToolId: EntityId): Promise { + public async findById(schoolExternalToolId: EntityId): Promise { const schoolExternalTool: SchoolExternalTool = await this.schoolExternalToolRepo.findById(schoolExternalToolId); - return schoolExternalTool as SchoolExternalToolWithId; + return schoolExternalTool; } - async findSchoolExternalTools(query: SchoolExternalToolQuery): Promise { + public async findSchoolExternalTools(query: SchoolExternalToolQuery): Promise { let schoolExternalTools: SchoolExternalTool[] = await this.schoolExternalToolRepo.find({ schoolId: query.schoolId, toolId: query.toolId, @@ -47,7 +46,10 @@ export class SchoolExternalToolService { const externalTool: ExternalTool = await this.externalToolService.findById(tool.toolId); const status: SchoolExternalToolConfigurationStatus = await this.determineSchoolToolStatus(tool, externalTool); const schoolExternalTool: SchoolExternalTool = new SchoolExternalTool({ - ...tool, + id: tool.id, + toolId: tool.toolId, + schoolId: tool.schoolId, + parameters: tool.parameters, status, name: externalTool.name, }); @@ -75,12 +77,14 @@ export class SchoolExternalToolService { } } - async deleteSchoolExternalToolById(schoolExternalToolId: EntityId): Promise { - await this.schoolExternalToolRepo.deleteById(schoolExternalToolId); + public deleteSchoolExternalToolById(schoolExternalToolId: EntityId): void { + this.schoolExternalToolRepo.deleteById(schoolExternalToolId); } - async saveSchoolExternalTool(schoolExternalTool: SchoolExternalTool): Promise { - let createdSchoolExternalTool: SchoolExternalTool = await this.schoolExternalToolRepo.save(schoolExternalTool); + public async saveSchoolExternalTool(schoolExternalTool: SchoolExternalTool): Promise { + let createdSchoolExternalTool: SchoolExternalTool = await this.schoolExternalToolRepo.createOrUpdate( + schoolExternalTool + ); createdSchoolExternalTool = await this.enrichDataFromExternalTool(createdSchoolExternalTool); return createdSchoolExternalTool; diff --git a/apps/server/src/modules/tool/school-external-tool/testing/index.ts b/apps/server/src/modules/tool/school-external-tool/testing/index.ts index cc2eb35d068..8760012efb6 100644 --- a/apps/server/src/modules/tool/school-external-tool/testing/index.ts +++ b/apps/server/src/modules/tool/school-external-tool/testing/index.ts @@ -1 +1,3 @@ export { schoolExternalToolEntityFactory } from './school-external-tool-entity.factory'; +export { schoolExternalToolFactory } from './school-external-tool.factory'; +export { schoolExternalToolConfigurationStatusFactory } from './school-external-tool-configuration-status.factory'; diff --git a/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-configuration-status.factory.ts b/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-configuration-status.factory.ts new file mode 100644 index 00000000000..11b38da4bbd --- /dev/null +++ b/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-configuration-status.factory.ts @@ -0,0 +1,11 @@ +import { Factory } from 'fishery'; +import { SchoolExternalToolConfigurationStatus } from '../controller/dto'; + +export const schoolExternalToolConfigurationStatusFactory = Factory.define( + () => { + return { + isOutdatedOnScopeSchool: false, + isDeactivated: false, + }; + } +); diff --git a/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-entity.factory.ts b/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-entity.factory.ts index 081199aca04..003c2372730 100644 --- a/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-entity.factory.ts +++ b/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-entity.factory.ts @@ -1,18 +1,17 @@ import { externalToolEntityFactory } from '@modules/tool/external-tool/testing'; -import { SchoolExternalToolEntity, SchoolExternalToolProperties } from '@modules/tool/school-external-tool/entity'; +import { SchoolExternalToolEntity, SchoolExternalToolEntityProps } from '@modules/tool/school-external-tool/entity'; import { BaseFactory } from '@shared/testing/factory/base.factory'; import { schoolEntityFactory } from '@shared/testing/factory/school-entity.factory'; import { schoolExternalToolConfigurationStatusEntityFactory } from '@shared/testing/factory/school-external-tool-configuration-status-entity.factory'; export const schoolExternalToolEntityFactory = BaseFactory.define< SchoolExternalToolEntity, - SchoolExternalToolProperties + SchoolExternalToolEntityProps >(SchoolExternalToolEntity, () => { return { tool: externalToolEntityFactory.buildWithId(), school: schoolEntityFactory.buildWithId(), schoolParameters: [{ name: 'schoolMockParameter', value: 'mockValue' }], - toolVersion: 0, status: schoolExternalToolConfigurationStatusEntityFactory.build(), }; }); diff --git a/apps/server/src/shared/testing/factory/domainobject/tool/school-external-tool.factory.ts b/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool.factory.ts similarity index 55% rename from apps/server/src/shared/testing/factory/domainobject/tool/school-external-tool.factory.ts rename to apps/server/src/modules/tool/school-external-tool/testing/school-external-tool.factory.ts index 94ea7e8b392..a7af0be4b53 100644 --- a/apps/server/src/shared/testing/factory/domainobject/tool/school-external-tool.factory.ts +++ b/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool.factory.ts @@ -1,8 +1,9 @@ -import { CustomParameterEntry } from '@modules/tool/common/domain'; -import { SchoolExternalTool, SchoolExternalToolProps } from '@modules/tool/school-external-tool/domain'; +import { ObjectId } from '@mikro-orm/mongodb'; +import { DoBaseFactory } from '@shared/testing/factory/domainobject/do-base.factory'; import { DeepPartial } from 'fishery'; -import { DoBaseFactory } from '../do-base.factory'; -import { schoolToolConfigurationStatusFactory } from './school-external-tool-configuration-status.factory'; +import { CustomParameterEntry } from '../../common/domain'; +import { SchoolExternalTool, SchoolExternalToolProps } from '../domain'; +import { schoolExternalToolConfigurationStatusFactory } from './school-external-tool-configuration-status.factory'; class SchoolExternalToolFactory extends DoBaseFactory { withSchoolId(schoolId: string): this { @@ -15,9 +16,9 @@ class SchoolExternalToolFactory extends DoBaseFactory { return { + id: new ObjectId().toHexString(), name: `schoolExternal-${sequence}`, schoolId: `schoolId-${sequence}`, - toolVersion: 1, parameters: [ new CustomParameterEntry({ name: 'name', @@ -25,6 +26,6 @@ export const schoolExternalToolFactory = SchoolExternalToolFactory.define(School }), ], toolId: 'toolId', - status: schoolToolConfigurationStatusFactory.build(), + status: schoolExternalToolConfigurationStatusFactory.build(), }; }); diff --git a/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts b/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts index ec469d23549..fa87448dc2c 100644 --- a/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts +++ b/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts @@ -4,7 +4,7 @@ import { ToolContextType } from '@modules/tool/common/enum/tool-context-type.enu import { ContextExternalTool, ContextRef } from '@modules/tool/context-external-tool/domain'; import { ContextExternalToolEntity, ContextExternalToolType } from '@modules/tool/context-external-tool/entity'; import { ContextExternalToolQuery } from '@modules/tool/context-external-tool/uc/dto/context-external-tool.types'; -import { SchoolExternalToolRefDO } from '@modules/tool/school-external-tool/domain'; +import { SchoolExternalToolRef } from '@modules/tool/school-external-tool/domain'; import { SchoolExternalToolEntity } from '@modules/tool/school-external-tool/entity'; import { Injectable } from '@nestjs/common'; import { EntityId } from '@shared/domain/types'; @@ -97,7 +97,7 @@ export class ContextExternalToolRepo extends BaseDORepo { +describe(SchoolExternalToolRepo.name, () => { let module: TestingModule; let repo: SchoolExternalToolRepo; let em: EntityManager; @@ -146,11 +146,10 @@ describe('SchoolExternalToolRepo', () => { describe('save', () => { function setup() { - const domainObject: SchoolExternalTool = new SchoolExternalTool({ + const domainObject: SchoolExternalTool = schoolExternalToolFactory.build({ toolId: new ObjectId().toHexString(), parameters: [new CustomParameterEntry({ name: 'param', value: 'value' })], schoolId: new ObjectId().toHexString(), - toolVersion: 1, }); return { @@ -162,7 +161,7 @@ describe('SchoolExternalToolRepo', () => { const { domainObject } = setup(); const { id, ...expected } = domainObject; - const result: SchoolExternalTool = await repo.save(domainObject); + const result: SchoolExternalTool = await repo.createOrUpdate(domainObject); expect(result).toMatchObject(expected); expect(result.id).toBeDefined(); diff --git a/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.ts b/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.ts index 86c6fb70b9f..03c22d1c4a7 100644 --- a/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.ts +++ b/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.ts @@ -1,39 +1,67 @@ -import { EntityData, EntityName } from '@mikro-orm/core'; +import { EntityName } from '@mikro-orm/core'; import { EntityManager } from '@mikro-orm/mongodb'; import { ExternalToolEntity } from '@modules/tool/external-tool/entity'; import { SchoolExternalTool } from '@modules/tool/school-external-tool/domain'; -import { SchoolExternalToolEntity } from '@modules/tool/school-external-tool/entity'; +import { SchoolExternalToolEntity, SchoolExternalToolEntityProps } from '@modules/tool/school-external-tool/entity'; import { SchoolExternalToolQuery } from '@modules/tool/school-external-tool/uc/dto/school-external-tool.types'; import { Injectable } from '@nestjs/common/decorators/core/injectable.decorator'; import { SchoolEntity } from '@shared/domain/entity'; -import { BaseDORepo } from '@shared/repo/base.do.repo'; -import { LegacyLogger } from '@src/core/logger'; +import { EntityId } from '../../domain/types'; import { ExternalToolRepoMapper } from '../externaltool'; import { SchoolExternalToolScope } from './school-external-tool.scope'; @Injectable() -export class SchoolExternalToolRepo extends BaseDORepo { - constructor(protected readonly _em: EntityManager, protected readonly logger: LegacyLogger) { - super(_em, logger); - } +export class SchoolExternalToolRepo { + constructor(private readonly em: EntityManager) {} get entityName(): EntityName { return SchoolExternalToolEntity; } + public async createOrUpdate(domainObject: SchoolExternalTool): Promise { + const existing: SchoolExternalToolEntity | undefined = this.em + .getUnitOfWork() + .getById(SchoolExternalToolEntity.name, domainObject.id); + + const entityProps: SchoolExternalToolEntityProps = this.mapDomainObjectToEntityProps(domainObject); + let entity: SchoolExternalToolEntity = new SchoolExternalToolEntity(entityProps); + + if (existing) { + entity = this.em.assign(existing, entity); + } else { + this.em.persist(entity); + } + await this.em.flush(); + + const savedDomainObject: SchoolExternalTool = this.mapEntityToDomainObject(entity); + + return savedDomainObject; + } + + public async findById(id: EntityId): Promise { + const entity: SchoolExternalToolEntity = await this.em.findOneOrFail(this.entityName, { id }); + const domainObject: SchoolExternalTool = this.mapEntityToDomainObject(entity); + + return domainObject; + } + + public deleteById(id: EntityId): void { + this.em.remove(this.em.getReference(this.entityName, id)); + } + async findByExternalToolId(toolId: string): Promise { - const entities: SchoolExternalToolEntity[] = await this._em.find(this.entityName, { tool: toolId }); + const entities: SchoolExternalToolEntity[] = await this.em.find(this.entityName, { tool: toolId }); const domainObjects: SchoolExternalTool[] = entities.map((entity: SchoolExternalToolEntity): SchoolExternalTool => { - const domainObject: SchoolExternalTool = this.mapEntityToDO(entity); + const domainObject: SchoolExternalTool = this.mapEntityToDomainObject(entity); return domainObject; }); return domainObjects; } async findBySchoolId(schoolId: string): Promise { - const entities: SchoolExternalToolEntity[] = await this._em.find(this.entityName, { school: schoolId }); + const entities: SchoolExternalToolEntity[] = await this.em.find(this.entityName, { school: schoolId }); const domainObjects: SchoolExternalTool[] = entities.map((entity: SchoolExternalToolEntity): SchoolExternalTool => { - const domainObject: SchoolExternalTool = this.mapEntityToDO(entity); + const domainObject: SchoolExternalTool = this.mapEntityToDomainObject(entity); return domainObject; }); @@ -41,16 +69,18 @@ export class SchoolExternalToolRepo extends BaseDORepo { - const count: Promise = this._em.nativeDelete(this.entityName, { tool: toolId }); + const count: Promise = this.em.nativeDelete(this.entityName, { tool: toolId }); return count; } async find(query: SchoolExternalToolQuery): Promise { const scope: SchoolExternalToolScope = this.buildScope(query); - const entities: SchoolExternalToolEntity[] = await this._em.find(this.entityName, scope.query); + const entities: SchoolExternalToolEntity[] = await this.em.find(this.entityName, scope.query); - const dos: SchoolExternalTool[] = entities.map((entity: SchoolExternalToolEntity) => this.mapEntityToDO(entity)); + const dos: SchoolExternalTool[] = entities.map((entity: SchoolExternalToolEntity) => + this.mapEntityToDomainObject(entity) + ); return dos; } @@ -65,22 +95,20 @@ export class SchoolExternalToolRepo extends BaseDORepo { + private mapDomainObjectToEntityProps(entityDO: SchoolExternalTool): SchoolExternalToolEntityProps { return { - school: this._em.getReference(SchoolEntity, entityDO.schoolId), - tool: this._em.getReference(ExternalToolEntity, entityDO.toolId), - toolVersion: entityDO.toolVersion, + school: this.em.getReference(SchoolEntity, entityDO.schoolId), + tool: this.em.getReference(ExternalToolEntity, entityDO.toolId), schoolParameters: ExternalToolRepoMapper.mapCustomParameterEntryDOsToEntities(entityDO.parameters), status: entityDO.status, }; diff --git a/apps/server/src/shared/testing/factory/domainobject/tool/index.ts b/apps/server/src/shared/testing/factory/domainobject/tool/index.ts index f9b501d0ace..9dd50c3b0eb 100644 --- a/apps/server/src/shared/testing/factory/domainobject/tool/index.ts +++ b/apps/server/src/shared/testing/factory/domainobject/tool/index.ts @@ -1,8 +1,5 @@ -export * from './context-external-tool.factory'; export * from './external-tool.factory'; -export * from './school-external-tool.factory'; export * from './tool-configuration-status.factory'; -export * from './school-external-tool-configuration-status.factory'; export { externalToolDatasheetTemplateDataFactory, ExternalToolDatasheetTemplateDataFactory, diff --git a/apps/server/src/shared/testing/factory/domainobject/tool/school-external-tool-configuration-status.factory.ts b/apps/server/src/shared/testing/factory/domainobject/tool/school-external-tool-configuration-status.factory.ts deleted file mode 100644 index fc2fcbc9348..00000000000 --- a/apps/server/src/shared/testing/factory/domainobject/tool/school-external-tool-configuration-status.factory.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SchoolExternalToolConfigurationStatus } from '@modules/tool/school-external-tool/controller/dto'; -import { Factory } from 'fishery'; - -export const schoolToolConfigurationStatusFactory = Factory.define(() => { - return { - isOutdatedOnScopeSchool: false, - isDeactivated: false, - }; -}); From db74662782ad831976de467d76450cee6128e8ed Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Tue, 14 May 2024 12:31:13 +0200 Subject: [PATCH 02/26] N21-1885 WIP --- .../board/uc/media-board/media-element.uc.ts | 4 +- .../external-tool/domain/external-tool.do.ts | 114 +++++++++-- .../external-tool/external-tool.module.ts | 3 - .../external-tool-request.mapper.spec.ts | 12 +- .../mapper/external-tool-request.mapper.ts | 8 +- ...external-tool-version-increment.service.ts | 83 -------- .../external-tool-version.service.spec.ts | 182 ------------------ .../service/external-tool.service.spec.ts | 86 +++------ .../service/external-tool.service.ts | 9 +- .../tool/external-tool/service/index.ts | 1 - ...al-tool-datasheet-template-data.factory.ts | 67 +++++++ .../testing/external-tool.factory.ts | 144 ++++++++++++++ .../tool/external-tool/testing/index.ts | 3 + .../tool-configuration-status.factory.ts | 12 ++ .../uc/dto/external-tool.types.ts | 4 +- .../external-tool/uc/external-tool.uc.spec.ts | 20 +- .../tool/external-tool/uc/external-tool.uc.ts | 5 +- .../tool/external-tool.factory.ts | 31 +-- 18 files changed, 388 insertions(+), 400 deletions(-) delete mode 100644 apps/server/src/modules/tool/external-tool/service/external-tool-version-increment.service.ts delete mode 100644 apps/server/src/modules/tool/external-tool/service/external-tool-version.service.spec.ts create mode 100644 apps/server/src/modules/tool/external-tool/testing/external-tool-datasheet-template-data.factory.ts create mode 100644 apps/server/src/modules/tool/external-tool/testing/external-tool.factory.ts create mode 100644 apps/server/src/modules/tool/external-tool/testing/tool-configuration-status.factory.ts diff --git a/apps/server/src/modules/board/uc/media-board/media-element.uc.ts b/apps/server/src/modules/board/uc/media-board/media-element.uc.ts index c936f4d540b..960f3b9f400 100644 --- a/apps/server/src/modules/board/uc/media-board/media-element.uc.ts +++ b/apps/server/src/modules/board/uc/media-board/media-element.uc.ts @@ -1,5 +1,7 @@ import { AuthorizationContextBuilder, AuthorizationService } from '@modules/authorization'; +import { ContextExternalTool } from '@modules/tool/context-external-tool/domain'; import { SchoolExternalToolService } from '@modules/tool/school-external-tool'; +import { SchoolExternalTool } from '@modules/tool/school-external-tool/domain'; import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { FeatureDisabledLoggableException } from '@shared/common/loggable-exception'; @@ -12,8 +14,6 @@ import { } from '@shared/domain/domainobject'; import { User as UserEntity } from '@shared/domain/entity'; import type { EntityId } from '@shared/domain/types'; -import { ContextExternalTool } from '../../../tool/context-external-tool/domain'; -import { SchoolExternalTool } from '../../../tool/school-external-tool/domain'; import { MediaBoardElementAlreadyExistsLoggableException } from '../../loggable'; import type { MediaBoardConfig } from '../../media-board.config'; import { BoardDoAuthorizableService, MediaBoardService, MediaElementService, MediaLineService } from '../../service'; diff --git a/apps/server/src/modules/tool/external-tool/domain/external-tool.do.ts b/apps/server/src/modules/tool/external-tool/domain/external-tool.do.ts index 0441028c1a1..0695eafd9d8 100644 --- a/apps/server/src/modules/tool/external-tool/domain/external-tool.do.ts +++ b/apps/server/src/modules/tool/external-tool/domain/external-tool.do.ts @@ -1,12 +1,12 @@ import { InternalServerErrorException } from '@nestjs/common'; -import { BaseDO } from '@shared/domain/domainobject/base.do'; +import { AuthorizableObject, DomainObject } from '@shared/domain/domain-object'; import { CustomParameter } from '../../common/domain'; import { ToolConfigType, ToolContextType } from '../../common/enum'; import { BasicToolConfig, ExternalToolConfig, Lti11ToolConfig, Oauth2ToolConfig } from './config'; import { ExternalToolMedium } from './external-tool-medium.do'; -export interface ExternalToolProps { - id?: string; +export interface ExternalToolProps extends AuthorizableObject { + id: string; name: string; @@ -35,35 +35,113 @@ export interface ExternalToolProps { createdAt?: Date; } -export class ExternalTool extends BaseDO { - name: string; +export class ExternalTool extends DomainObject { + get name(): string { + return this.props.name; + } - description?: string; + set name(value: string) { + this.props.name = value; + } - url?: string; + get description(): string | undefined { + return this.props.description; + } - logoUrl?: string; + set description(value: string | undefined) { + this.props.description = value; + } - logo?: string; + get url(): string | undefined { + return this.props.url; + } - config: BasicToolConfig | Lti11ToolConfig | Oauth2ToolConfig; + set url(value: string | undefined) { + this.props.url = value; + } - parameters?: CustomParameter[]; + get logoUrl(): string | undefined { + return this.props.logoUrl; + } - isHidden: boolean; + set logoUrl(value: string | undefined) { + this.props.logoUrl = value; + } - isDeactivated: boolean; + get logo(): string | undefined { + return this.props.logo; + } - openNewTab: boolean; + set logo(value: string | undefined) { + this.props.logo = value; + } - restrictToContexts?: ToolContextType[]; + get config(): BasicToolConfig | Lti11ToolConfig | Oauth2ToolConfig { + return this.props.config; + } - medium?: ExternalToolMedium; + set config(value: BasicToolConfig | Lti11ToolConfig | Oauth2ToolConfig) { + this.props.config = value; + } - createdAt?: Date; + get parameters(): CustomParameter[] | undefined { + return this.props.parameters; + } + + set parameters(value: CustomParameter[] | undefined) { + this.props.parameters = value; + } + + get isHidden(): boolean { + return this.props.isHidden; + } + + set isHidden(value: boolean) { + this.props.isHidden = value; + } + + get isDeactivated(): boolean { + return this.props.isDeactivated; + } + + set isDeactivated(value: boolean) { + this.props.isDeactivated = value; + } + + get openNewTab(): boolean { + return this.props.openNewTab; + } + + set openNewTab(value: boolean) { + this.props.openNewTab = value; + } + + get restrictToContexts(): ToolContextType[] | undefined { + return this.props.restrictToContexts; + } + + set restrictToContexts(value: ToolContextType[] | undefined) { + this.props.restrictToContexts = value; + } + + get medium(): ExternalToolMedium | undefined { + return this.props.medium; + } + + set medium(value: ExternalToolMedium | undefined) { + this.props.medium = value; + } + + get createdAt(): Date | undefined { + return this.props.createdAt; + } + + set createdAt(value: Date | undefined) { + this.props.createdAt = value; + } constructor(props: ExternalToolProps) { - super(props.id); + super(props); this.name = props.name; this.description = props.description; diff --git a/apps/server/src/modules/tool/external-tool/external-tool.module.ts b/apps/server/src/modules/tool/external-tool/external-tool.module.ts index 407326bb5a9..b329dbc2af4 100644 --- a/apps/server/src/modules/tool/external-tool/external-tool.module.ts +++ b/apps/server/src/modules/tool/external-tool/external-tool.module.ts @@ -16,7 +16,6 @@ import { ExternalToolService, ExternalToolServiceMapper, ExternalToolValidationService, - ExternalToolVersionIncrementService, } from './service'; @Module({ @@ -26,7 +25,6 @@ import { ExternalToolServiceMapper, ExternalToolParameterValidationService, ExternalToolValidationService, - ExternalToolVersionIncrementService, ExternalToolConfigurationService, ExternalToolLogoService, ExternalToolRepo, @@ -37,7 +35,6 @@ import { exports: [ ExternalToolService, ExternalToolValidationService, - ExternalToolVersionIncrementService, ExternalToolConfigurationService, ExternalToolLogoService, DatasheetPdfService, diff --git a/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts b/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts index 38d41af33d9..77653bfe691 100644 --- a/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts +++ b/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts @@ -124,7 +124,7 @@ describe('ExternalToolRequestMapper', () => { it('should map the request to external tool DO with basicConfig', () => { const { externalToolCreateParams, externalToolDOCreate } = setup(); - const result = mapper.mapCreateRequest(externalToolCreateParams, 1); + const result = mapper.mapCreateRequest(externalToolCreateParams); expect(result).toEqual(externalToolDOCreate); }); @@ -210,7 +210,7 @@ describe('ExternalToolRequestMapper', () => { it('should map the request to external tool DO with lti11 config', () => { const { externalToolCreateParams, externalToolDOCreate } = setup(); - const result = mapper.mapCreateRequest(externalToolCreateParams, 1); + const result = mapper.mapCreateRequest(externalToolCreateParams); expect(result).toEqual(externalToolDOCreate); }); @@ -300,7 +300,7 @@ describe('ExternalToolRequestMapper', () => { it('should map the request to external tool DO with oauth2', () => { const { externalToolCreateParams, externalToolDOCreate } = setup(); - const result = mapper.mapCreateRequest(externalToolCreateParams, 1); + const result = mapper.mapCreateRequest(externalToolCreateParams); expect(result).toEqual(externalToolDOCreate); }); @@ -382,7 +382,7 @@ describe('ExternalToolRequestMapper', () => { it('should map the request to external tool DO with basicConfig', () => { const { externalToolUpdateParams, externalToolDOUpdate } = setup(); - const result = mapper.mapUpdateRequest(externalToolUpdateParams, 1); + const result = mapper.mapUpdateRequest(externalToolUpdateParams); expect(result).toEqual(externalToolDOUpdate); }); @@ -472,7 +472,7 @@ describe('ExternalToolRequestMapper', () => { it('should map the request to external tool DO with lti11 config', () => { const { externalToolUpdateParams, externalToolDOUpdate } = setup(); - const result = mapper.mapUpdateRequest(externalToolUpdateParams, 1); + const result = mapper.mapUpdateRequest(externalToolUpdateParams); expect(result).toEqual(externalToolDOUpdate); }); @@ -566,7 +566,7 @@ describe('ExternalToolRequestMapper', () => { it('should map the request to external tool DO with oauth2', () => { const { externalToolUpdateParams, externalToolDOUpdate } = setup(); - const result = mapper.mapUpdateRequest(externalToolUpdateParams, 1); + const result = mapper.mapUpdateRequest(externalToolUpdateParams); expect(result).toEqual(externalToolDOUpdate); }); diff --git a/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.ts b/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.ts index 14094d7cbe2..8d3cfe15f9a 100644 --- a/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.ts +++ b/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.ts @@ -13,6 +13,7 @@ import { BasicToolConfigParams, CustomParameterPostParams, ExternalToolCreateParams, + ExternalToolMediumParams, ExternalToolSearchParams, ExternalToolUpdateParams, Lti11ToolConfigCreateParams, @@ -20,7 +21,6 @@ import { Oauth2ToolConfigCreateParams, Oauth2ToolConfigUpdateParams, SortExternalToolParams, - ExternalToolMediumParams, } from '../controller/dto'; import { ExternalTool } from '../domain'; import { @@ -60,7 +60,7 @@ const typeMapping: Record = { @Injectable() export class ExternalToolRequestMapper { - public mapUpdateRequest(externalToolUpdateParams: ExternalToolUpdateParams, version = 1): ExternalToolUpdate { + public mapUpdateRequest(externalToolUpdateParams: ExternalToolUpdateParams): ExternalToolUpdate { let mappedConfig: BasicToolConfigDto | Lti11ToolConfigUpdate | Oauth2ToolConfigUpdate; if (externalToolUpdateParams.config instanceof BasicToolConfigParams) { mappedConfig = this.mapRequestToBasicToolConfig(externalToolUpdateParams.config); @@ -85,13 +85,12 @@ export class ExternalToolRequestMapper { isHidden: externalToolUpdateParams.isHidden, isDeactivated: externalToolUpdateParams.isDeactivated, openNewTab: externalToolUpdateParams.openNewTab, - version, restrictToContexts: externalToolUpdateParams.restrictToContexts, medium: this.mapRequestToExternalToolMedium(externalToolUpdateParams.medium), }; } - public mapCreateRequest(externalToolCreateParams: ExternalToolCreateParams, version = 1): ExternalToolCreate { + public mapCreateRequest(externalToolCreateParams: ExternalToolCreateParams): ExternalToolCreate { let mappedConfig: BasicToolConfigDto | Lti11ToolConfigCreate | Oauth2ToolConfigCreate; if (externalToolCreateParams.config instanceof BasicToolConfigParams) { mappedConfig = this.mapRequestToBasicToolConfig(externalToolCreateParams.config); @@ -114,7 +113,6 @@ export class ExternalToolRequestMapper { isHidden: externalToolCreateParams.isHidden, isDeactivated: externalToolCreateParams.isDeactivated, openNewTab: externalToolCreateParams.openNewTab, - version, restrictToContexts: externalToolCreateParams.restrictToContexts, medium: this.mapRequestToExternalToolMedium(externalToolCreateParams.medium), description: externalToolCreateParams.description, diff --git a/apps/server/src/modules/tool/external-tool/service/external-tool-version-increment.service.ts b/apps/server/src/modules/tool/external-tool/service/external-tool-version-increment.service.ts deleted file mode 100644 index ca112f7a086..00000000000 --- a/apps/server/src/modules/tool/external-tool/service/external-tool-version-increment.service.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { CustomParameter } from '../../common/domain'; -import { ExternalTool } from '../domain'; - -@Injectable() -export class ExternalToolVersionIncrementService { - increaseVersionOfNewToolIfNecessary(oldTool: ExternalTool, newTool: ExternalTool): void { - if (!oldTool.parameters || !newTool.parameters) { - return; - } - if (this.compareParameters(oldTool.parameters, newTool.parameters)) { - // newTool.version += 1; - } - } - - private compareParameters(oldParams: CustomParameter[], newParams: CustomParameter[]): boolean { - const matchingParams: CustomParameter[] = oldParams.filter((oldParam) => - newParams.some((newParam) => oldParam.name === newParam.name) - ); - - const shouldIncrementVersion = - this.hasNewRequiredParameter(oldParams, newParams) || - this.hasChangedRequiredParameters(oldParams, newParams) || - this.hasChangedParameterNames(oldParams, newParams) || - this.hasChangedParameterRegex(newParams, matchingParams) || - this.hasChangedParameterTypes(newParams, matchingParams) || - this.hasChangedParameterScope(newParams, matchingParams); - - return shouldIncrementVersion; - } - - private hasNewRequiredParameter(oldParams: CustomParameter[], newParams: CustomParameter[]): boolean { - const increase = newParams.some( - (newParam) => !newParam.isOptional && oldParams.every((oldParam) => oldParam.name !== newParam.name) - ); - return increase; - } - - private hasChangedParameterNames(oldParams: CustomParameter[], newParams: CustomParameter[]): boolean { - const nonOptionalParams = oldParams.filter((parameter) => !parameter.isOptional); - const nonOptionalParamNames = nonOptionalParams.map((parameter) => parameter.name); - - const newNonOptionalParams = newParams.filter((parameter) => !parameter.isOptional); - const newNonOptionalParamNames = newNonOptionalParams.map((parameter) => parameter.name); - - const increase = - nonOptionalParamNames.some((name) => !newNonOptionalParamNames.includes(name)) || - newNonOptionalParamNames.some((name) => !nonOptionalParamNames.includes(name)); - return increase; - } - - private hasChangedRequiredParameters(newParams: CustomParameter[], matchingParams: CustomParameter[]): boolean { - const increase = matchingParams.some((param) => { - const newParam = newParams.find((p) => p.name === param.name); - return newParam && param.isOptional !== newParam.isOptional; - }); - return increase; - } - - private hasChangedParameterRegex(newParams: CustomParameter[], matchingParams: CustomParameter[]): boolean { - const increase = matchingParams.some((param) => { - const newParam = newParams.find((p) => p.name === param.name); - return newParam && param.regex !== newParam.regex; - }); - return increase; - } - - private hasChangedParameterTypes(newParams: CustomParameter[], matchingParams: CustomParameter[]): boolean { - const increase = matchingParams.some((param) => { - const newParam = newParams.find((p) => p.name === param.name); - return newParam && param.type !== newParam.type; - }); - return increase; - } - - private hasChangedParameterScope(newParams: CustomParameter[], matchingParams: CustomParameter[]): boolean { - const increase = matchingParams.some((param) => { - const newParam = newParams.find((p) => p.name === param.name); - return newParam && param.scope !== newParam.scope; - }); - return increase; - } -} diff --git a/apps/server/src/modules/tool/external-tool/service/external-tool-version.service.spec.ts b/apps/server/src/modules/tool/external-tool/service/external-tool-version.service.spec.ts deleted file mode 100644 index f19eaeabe04..00000000000 --- a/apps/server/src/modules/tool/external-tool/service/external-tool-version.service.spec.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { customParameterFactory, externalToolFactory } from '@shared/testing/factory/domainobject/tool'; -import { ExternalToolVersionIncrementService } from './external-tool-version-increment.service'; -import { CustomParameterLocation, CustomParameterScope, CustomParameterType } from '../../common/enum'; -import { CustomParameter } from '../../common/domain'; -import { ExternalTool } from '../domain'; - -describe('ExternalToolVersionService', () => { - let service: ExternalToolVersionIncrementService; - - beforeEach(() => { - service = new ExternalToolVersionIncrementService(); - }); - - const setup = () => { - const param1: CustomParameter = new CustomParameter({ - name: 'param1', - displayName: 'displayName', - default: 'defaulValueParam1', - isOptional: false, - isProtected: false, - location: CustomParameterLocation.PATH, - regex: '*', - regexComment: '', - scope: CustomParameterScope.GLOBAL, - type: CustomParameterType.STRING, - }); - const oldTool: ExternalTool = externalToolFactory - .params({ - parameters: [param1], - version: 1, - }) - .build(); - const newTool: ExternalTool = externalToolFactory.build({ ...oldTool, parameters: [{ ...param1 }] }); - - return { - oldTool, - newTool, - param1, - newToolParams: newTool.parameters as CustomParameter[], - }; - }; - - const expectIncreasement = (newTool: ExternalTool) => expect(newTool.version).toEqual(2); - const expectNoIncreasement = (newTool: ExternalTool) => expect(newTool.version).toEqual(1); - - describe('increaseVersionOfNewToolIfNecessary', () => { - describe('when customParameters on old tool is not defined', () => { - it('should not increase version', () => { - const { oldTool, newTool } = setup(); - oldTool.parameters = undefined; - - service.increaseVersionOfNewToolIfNecessary(oldTool, newTool); - - expectNoIncreasement(newTool); - }); - - describe('when customParameters on new tool is not defined', () => { - it('should not increase version', () => { - const { oldTool, newTool } = setup(); - newTool.parameters = undefined; - - service.increaseVersionOfNewToolIfNecessary(oldTool, newTool); - - expectNoIncreasement(newTool); - }); - }); - }); - - describe('compareParameters', () => { - describe('when customParameters are the same', () => { - it('should not increase version', () => { - const { oldTool, newTool } = setup(); - - service.increaseVersionOfNewToolIfNecessary(oldTool, newTool); - - expectNoIncreasement(newTool); - }); - }); - - describe('when length of customParameters is different', () => { - it('should increase version', () => { - const { oldTool, newTool } = setup(); - newTool.parameters?.push(customParameterFactory.build()); - - service.increaseVersionOfNewToolIfNecessary(oldTool, newTool); - - expectIncreasement(newTool); - }); - }); - }); - - describe('hasNewRequiredParameter', () => { - describe('when new required parameter exists', () => { - it('should increase version', () => { - const { oldTool, newTool } = setup(); - newTool.parameters?.push(customParameterFactory.build({ isOptional: false })); - - service.increaseVersionOfNewToolIfNecessary(oldTool, newTool); - - expectIncreasement(newTool); - }); - }); - }); - - describe('hasChangedParameterNames', () => { - describe('when the name of some customParameter has changed', () => { - it('should increase version', () => { - const { oldTool, newTool, param1 } = setup(); - param1.name = 'newName'; - - service.increaseVersionOfNewToolIfNecessary(oldTool, newTool); - - expectIncreasement(newTool); - }); - }); - - describe('when a new optional custom parameter added', () => { - it('should not increase version', () => { - const { oldTool, newTool, newToolParams } = setup(); - const newOptionalParam: CustomParameter = customParameterFactory.build({ isOptional: true }); - newToolParams.push(newOptionalParam); - - service.increaseVersionOfNewToolIfNecessary(oldTool, newTool); - - expectNoIncreasement(newTool); - }); - }); - }); - - describe('hasChangedRequiredParameters', () => { - describe('when one customParameter change from optional to required', () => { - it('should increase version', () => { - const { oldTool, newTool, param1 } = setup(); - param1.isOptional = true; - - service.increaseVersionOfNewToolIfNecessary(oldTool, newTool); - - expectIncreasement(newTool); - }); - }); - }); - - describe('hasChangedParameterRegex', () => { - describe('when one customParameter has a changed regex', () => { - it('should increase version', () => { - const { oldTool, newTool, param1 } = setup(); - param1.regex = '.+'; - - service.increaseVersionOfNewToolIfNecessary(oldTool, newTool); - - expectIncreasement(newTool); - }); - }); - }); - - describe('hasChangedParameterTypes', () => { - describe('when one customParameter has a changed type', () => { - it('should increase version', () => { - const { oldTool, newTool, param1 } = setup(); - param1.type = CustomParameterType.BOOLEAN; - - service.increaseVersionOfNewToolIfNecessary(oldTool, newTool); - - expectIncreasement(newTool); - }); - }); - }); - - describe('hasChangedParameterScope', () => { - describe('when one customParameter has a changed scope', () => { - it('should increase version', () => { - const { oldTool, newTool, param1 } = setup(); - param1.scope = CustomParameterScope.SCHOOL; - - service.increaseVersionOfNewToolIfNecessary(oldTool, newTool); - - expectIncreasement(newTool); - }); - }); - }); - }); -}); diff --git a/apps/server/src/modules/tool/external-tool/service/external-tool.service.spec.ts b/apps/server/src/modules/tool/external-tool/service/external-tool.service.spec.ts index 16568324e53..ecc0e62f2dc 100644 --- a/apps/server/src/modules/tool/external-tool/service/external-tool.service.spec.ts +++ b/apps/server/src/modules/tool/external-tool/service/external-tool.service.spec.ts @@ -4,20 +4,18 @@ import { OauthProviderService } from '@infra/oauth-provider'; import { ProviderOauthClient } from '@infra/oauth-provider/dto'; import { UnprocessableEntityException } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; - import { Page } from '@shared/domain/domainobject'; import { IFindOptions, SortOrder } from '@shared/domain/interface'; import { ContextExternalToolRepo, ExternalToolRepo, SchoolExternalToolRepo } from '@shared/repo'; -import { LegacyLogger } from '@src/core/logger'; import { externalToolFactory, lti11ToolConfigFactory, oauth2ToolConfigFactory } from '@shared/testing'; +import { LegacyLogger } from '@src/core/logger'; import { ExternalToolSearchQuery } from '../../common/interface'; import { SchoolExternalTool } from '../../school-external-tool/domain'; import { ExternalTool, Lti11ToolConfig, Oauth2ToolConfig } from '../domain'; import { ExternalToolServiceMapper } from './external-tool-service.mapper'; -import { ExternalToolVersionIncrementService } from './external-tool-version-increment.service'; import { ExternalToolService } from './external-tool.service'; -describe('ExternalToolService', () => { +describe(ExternalToolService.name, () => { let module: TestingModule; let service: ExternalToolService; @@ -27,7 +25,6 @@ describe('ExternalToolService', () => { let oauthProviderService: DeepMocked; let mapper: DeepMocked; let encryptionService: DeepMocked; - let versionService: DeepMocked; beforeAll(async () => { module = await Test.createTestingModule({ @@ -61,10 +58,6 @@ describe('ExternalToolService', () => { provide: LegacyLogger, useValue: createMock(), }, - { - provide: ExternalToolVersionIncrementService, - useValue: createMock(), - }, ], }).compile(); @@ -75,7 +68,6 @@ describe('ExternalToolService', () => { oauthProviderService = module.get(OauthProviderService); mapper = module.get(ExternalToolServiceMapper); encryptionService = module.get(DefaultEncryptionService); - versionService = module.get(ExternalToolVersionIncrementService); }); afterAll(async () => { @@ -273,7 +265,10 @@ describe('ExternalToolService', () => { const result: Page = await service.findExternalTools(query, options); - expect(result).toEqual({ data: [{ ...externalTool, config: oauth2ToolConfig }], total: 1 }); + expect(result).toEqual({ + data: [expect.objectContaining>({ ...externalTool, config: oauth2ToolConfig })], + total: 1, + }); }); }); @@ -301,7 +296,10 @@ describe('ExternalToolService', () => { const result: Page = await service.findExternalTools(query, options); - expect(result).toEqual({ data: [{ ...externalTool, config: oauth2ToolConfig }], total: 1 }); + expect(result).toEqual({ + data: [expect.objectContaining>({ ...externalTool, config: oauth2ToolConfig })], + total: 1, + }); }); }); }); @@ -340,7 +338,13 @@ describe('ExternalToolService', () => { const result: ExternalTool = await service.findById('toolId'); - expect(result).toEqual({ ...externalTool, config: oauth2ToolConfig }); + expect(result).toEqual( + expect.objectContaining>({ + ...externalTool, + config: oauth2ToolConfig, + id: expect.any(String), + }) + ); }); }); @@ -376,7 +380,6 @@ describe('ExternalToolService', () => { toolId: 'tool1', schoolId: 'school1', parameters: [], - toolVersion: 1, }); schoolToolRepo.findByExternalToolId.mockResolvedValue([schoolExternalTool]); @@ -515,7 +518,7 @@ describe('ExternalToolService', () => { it('should call externalToolServiceMapper', async () => { const { changedTool, existingTool } = setup(); - await service.updateExternalTool(changedTool, existingTool); + await service.updateExternalTool(changedTool); expect(mapper.mapDoToProviderOauthClient).toHaveBeenCalledWith(changedTool.name, changedTool.config); }); @@ -548,7 +551,7 @@ describe('ExternalToolService', () => { it('should call oauthProviderService', async () => { const { changedTool, oauthClientId, existingTool } = setup(); - await service.updateExternalTool(changedTool, existingTool); + await service.updateExternalTool(changedTool); expect(oauthProviderService.getOAuth2Client).toHaveBeenCalledWith(oauthClientId); }); @@ -581,7 +584,7 @@ describe('ExternalToolService', () => { it('should update the oauth2Client', async () => { const { changedTool, oauthClientId, providerOauthClient, existingTool } = setup(); - await service.updateExternalTool(changedTool, existingTool); + await service.updateExternalTool(changedTool); expect(oauthProviderService.updateOAuth2Client).toHaveBeenCalledWith(oauthClientId, providerOauthClient); }); @@ -610,7 +613,7 @@ describe('ExternalToolService', () => { it('should throw an error ', async () => { const { changedTool, existingTool } = setup(); - const func = () => service.updateExternalTool(changedTool, existingTool); + const func = () => service.updateExternalTool(changedTool); await expect(func).rejects.toThrow(UnprocessableEntityException); }); @@ -628,55 +631,10 @@ describe('ExternalToolService', () => { it('should save the externalTool', async () => { const { externalTool } = setup(); - await service.updateExternalTool(externalTool, externalTool); + await service.updateExternalTool(externalTool); expect(externalToolRepo.save).toHaveBeenCalled(); }); }); - - describe('externalToolVersionService', () => { - describe('when service', () => { - const setup = () => { - const tool1: ExternalTool = externalToolFactory.buildWithId(); - const tool2: ExternalTool = externalToolFactory.buildWithId(); - - return { - tool1, - tool2, - }; - }; - - it('should call increaseVersionOfNewToolIfNecessary', async () => { - const { tool1, tool2 } = setup(); - - await service.updateExternalTool(tool1, tool2); - - expect(versionService.increaseVersionOfNewToolIfNecessary).toHaveBeenCalledWith(tool2, tool1); - }); - }); - - describe('when increaseVersionOfNewToolIfNecessary returns a tool with higher version', () => { - const setup = () => { - const externalTool: ExternalTool = externalToolFactory.buildWithId(); - externalTool.version = 1; - versionService.increaseVersionOfNewToolIfNecessary.mockImplementation((toolDO: ExternalTool) => { - toolDO.version = 2; - return toolDO; - }); - - return { - externalTool, - }; - }; - - it('should increase the version of the externalTool', async () => { - const { externalTool } = setup(); - - await service.updateExternalTool(externalTool, externalTool); - - expect(externalToolRepo.save).toHaveBeenCalledWith({ ...externalTool, version: 2 }); - }); - }); - }); }); }); diff --git a/apps/server/src/modules/tool/external-tool/service/external-tool.service.ts b/apps/server/src/modules/tool/external-tool/service/external-tool.service.ts index 4fb9bca23fd..65b9700f79a 100644 --- a/apps/server/src/modules/tool/external-tool/service/external-tool.service.ts +++ b/apps/server/src/modules/tool/external-tool/service/external-tool.service.ts @@ -12,7 +12,6 @@ import { ExternalToolSearchQuery } from '../../common/interface'; import { SchoolExternalTool } from '../../school-external-tool/domain'; import { ExternalTool, Oauth2ToolConfig } from '../domain'; import { ExternalToolServiceMapper } from './external-tool-service.mapper'; -import { ExternalToolVersionIncrementService } from './external-tool-version-increment.service'; @Injectable() export class ExternalToolService { @@ -23,8 +22,7 @@ export class ExternalToolService { private readonly schoolExternalToolRepo: SchoolExternalToolRepo, private readonly contextExternalToolRepo: ContextExternalToolRepo, @Inject(DefaultEncryptionService) private readonly encryptionService: EncryptionService, - private readonly legacyLogger: LegacyLogger, - private readonly externalToolVersionService: ExternalToolVersionIncrementService + private readonly legacyLogger: LegacyLogger ) {} public async createExternalTool(externalTool: ExternalTool): Promise { @@ -43,9 +41,8 @@ export class ExternalToolService { return created; } - public async updateExternalTool(toUpdate: ExternalTool, loadedTool: ExternalTool): Promise { + public async updateExternalTool(toUpdate: ExternalTool): Promise { await this.updateOauth2ToolConfig(toUpdate); - this.externalToolVersionService.increaseVersionOfNewToolIfNecessary(loadedTool, toUpdate); const externalTool: ExternalTool = await this.externalToolRepo.save(toUpdate); return externalTool; @@ -108,7 +105,7 @@ export class ExternalToolService { const schoolExternalToolIds: string[] = schoolExternalTools.map( (schoolExternalTool: SchoolExternalTool): string => // We can be sure that the repo returns the id - schoolExternalTool.id as string + schoolExternalTool.id ); await Promise.all([ diff --git a/apps/server/src/modules/tool/external-tool/service/index.ts b/apps/server/src/modules/tool/external-tool/service/index.ts index a0bb13c7690..42d2c89786c 100644 --- a/apps/server/src/modules/tool/external-tool/service/index.ts +++ b/apps/server/src/modules/tool/external-tool/service/index.ts @@ -1,6 +1,5 @@ export * from './external-tool.service'; export * from './external-tool-service.mapper'; -export * from './external-tool-version-increment.service'; export * from './external-tool-validation.service'; export * from './external-tool-parameter-validation.service'; export * from './external-tool-configuration.service'; diff --git a/apps/server/src/modules/tool/external-tool/testing/external-tool-datasheet-template-data.factory.ts b/apps/server/src/modules/tool/external-tool/testing/external-tool-datasheet-template-data.factory.ts new file mode 100644 index 00000000000..96f18c0751d --- /dev/null +++ b/apps/server/src/modules/tool/external-tool/testing/external-tool-datasheet-template-data.factory.ts @@ -0,0 +1,67 @@ +import { CustomParameterLocation, LtiMessageType, LtiPrivacyPermission } from '@modules/tool/common/enum'; +import { + ExternalToolDatasheetTemplateData, + ExternalToolParameterDatasheetTemplateData, +} from '@modules/tool/external-tool/domain'; +import { DeepPartial, Factory } from 'fishery'; + +export const externalToolParameterDatasheetTemplateDataFactory = Factory.define< + ExternalToolParameterDatasheetTemplateData, + ExternalToolParameterDatasheetTemplateData +>(({ sequence }) => { + return { + name: `custom-parameter-${sequence}`, + properties: '', + type: 'Zeichenkette', + scope: 'Schule', + location: CustomParameterLocation.BODY, + }; +}); + +export class ExternalToolDatasheetTemplateDataFactory extends Factory { + asOauth2Tool(): this { + const params: DeepPartial = { + toolType: 'OAuth 2.0', + skipConsent: 'Zustimmung überspringen: ja', + toolUrl: 'https://www.oauth2-baseUrl.com/', + }; + return this.params(params); + } + + asLti11Tool(): this { + const params: DeepPartial = { + toolType: 'LTI 1.1', + messageType: LtiMessageType.BASIC_LTI_LAUNCH_REQUEST, + privacy: LtiPrivacyPermission.PSEUDONYMOUS, + toolUrl: 'https://www.lti11-baseUrl.com/', + }; + return this.params(params); + } + + withParameters(number: number, customParam?: DeepPartial): this { + const params: DeepPartial = { + parameters: externalToolParameterDatasheetTemplateDataFactory.buildList(number, customParam), + }; + return this.params(params); + } + + withOptionalProperties(): this { + const params: DeepPartial = { + isDeactivated: 'Das Tool ist instanzweit deaktiviert', + restrictToContexts: 'Kurs, Kurs-Board', + }; + return this.params(params); + } +} +export const externalToolDatasheetTemplateDataFactory = ExternalToolDatasheetTemplateDataFactory.define( + ({ sequence }) => { + return { + createdAt: new Date().toLocaleDateString('de-DE'), + creatorName: `John Doe ${sequence}`, + instance: 'dBildungscloud', + toolName: `external-tool-${sequence}`, + toolUrl: 'https://www.basic-baseUrl.com/', + toolType: 'Basic', + }; + } +); diff --git a/apps/server/src/modules/tool/external-tool/testing/external-tool.factory.ts b/apps/server/src/modules/tool/external-tool/testing/external-tool.factory.ts new file mode 100644 index 00000000000..b3867020a92 --- /dev/null +++ b/apps/server/src/modules/tool/external-tool/testing/external-tool.factory.ts @@ -0,0 +1,144 @@ +import { ObjectId } from '@mikro-orm/mongodb'; +import { CustomParameter } from '@modules/tool/common/domain'; +import { + CustomParameterLocation, + CustomParameterScope, + CustomParameterType, + LtiMessageType, + LtiPrivacyPermission, + TokenEndpointAuthMethod, + ToolConfigType, +} from '@modules/tool/common/enum'; +import { + BasicToolConfig, + ExternalTool, + ExternalToolMedium, + ExternalToolProps, + Lti11ToolConfig, + Oauth2ToolConfig, +} from '@modules/tool/external-tool/domain'; +import { DoBaseFactory } from '@shared/testing/factory/domainobject/do-base.factory'; +import { DeepPartial } from 'fishery'; + +export const basicToolConfigFactory = DoBaseFactory.define(BasicToolConfig, () => { + return { + type: ToolConfigType.BASIC, + baseUrl: 'https://www.basic-baseUrl.com/', + }; +}); + +class Oauth2ToolConfigFactory extends DoBaseFactory { + withExternalData(oauth2Params?: DeepPartial): this { + const params: DeepPartial = { + clientSecret: 'clientSecret', + scope: 'offline openid', + frontchannelLogoutUri: 'https://www.frontchannel.com/', + redirectUris: ['https://www.redirect.com/'], + tokenEndpointAuthMethod: TokenEndpointAuthMethod.CLIENT_SECRET_POST, + }; + + return this.params({ ...params, ...oauth2Params }); + } +} + +export const oauth2ToolConfigFactory = Oauth2ToolConfigFactory.define(Oauth2ToolConfig, () => { + return { + type: ToolConfigType.OAUTH2, + baseUrl: 'https://www.oauth2-baseUrl.com/', + clientId: 'clientId', + skipConsent: false, + }; +}); + +export const lti11ToolConfigFactory = DoBaseFactory.define(Lti11ToolConfig, () => { + return { + type: ToolConfigType.LTI11, + baseUrl: 'https://www.lti11-baseUrl.com/', + key: 'key', + secret: 'secret', + privacy_permission: LtiPrivacyPermission.PSEUDONYMOUS, + lti_message_type: LtiMessageType.BASIC_LTI_LAUNCH_REQUEST, + launch_presentation_locale: 'de-DE', + }; +}); + +class CustomParameterFactory extends DoBaseFactory { + buildListWithEachType(params?: DeepPartial): CustomParameter[] { + const globalParameter = this.build({ ...params, scope: CustomParameterScope.GLOBAL }); + const schoolParameter = this.build({ ...params, scope: CustomParameterScope.SCHOOL }); + const contextParameter = this.build({ ...params, scope: CustomParameterScope.CONTEXT }); + + return [globalParameter, schoolParameter, contextParameter]; + } +} + +export const customParameterFactory = CustomParameterFactory.define(CustomParameter, ({ sequence }) => { + return { + name: `custom-parameter-${sequence}`, + displayName: 'User Friendly Name', + type: CustomParameterType.STRING, + scope: CustomParameterScope.SCHOOL, + location: CustomParameterLocation.BODY, + isOptional: false, + isProtected: false, + }; +}); + +class ExternalToolFactory extends DoBaseFactory { + withOauth2Config(customParam?: DeepPartial): this { + const params: DeepPartial = { + config: oauth2ToolConfigFactory.build(customParam), + }; + return this.params(params); + } + + withLti11Config(customParam?: DeepPartial): this { + const params: DeepPartial = { + config: lti11ToolConfigFactory.build(customParam), + }; + return this.params(params); + } + + withCustomParameters(number: number, customParam?: DeepPartial): this { + const params: DeepPartial = { + parameters: customParameterFactory.buildList(number, customParam), + }; + return this.params(params); + } + + withBase64Logo(): this { + const params: DeepPartial = { + logo: 'iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAYAAAAeGRPoAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ2MUQ2Q0Y5RTQxMTExRTdBMTg3QkQ2MDVGMUFEMUIwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQ2MUQ2Q0ZBRTQxMTExRTdBMTg3QkQ2MDVGMUFEMUIwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDYxRDZDRjdFNDExMTFFN0ExODdCRDYwNUYxQUQxQjAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDYxRDZDRjhFNDExMTFFN0ExODdCRDYwNUYxQUQxQjAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz45EjsrAAALfUlEQVR42uzdgXWjOAIGYHLvGsiV4CnBU4JTgqeEpIS4hKSEpIS4BLsEu4RJCeMScmhGzPplkyCMAGO+7z3ezs3tYsuS+BEIcfX29lYAAOP2Hz8BAAh0AECgAwACHQAQ6AAg0AEAgQ4ACHQAQKADgEAHAAQ6ACDQAQCBDgACHQAQ6ACAQAcABDoACHQAQKADAAIdABDoACDQAQCBDgAIdABAoAOAQAcABDoAINABAIEOAAIdABDoAIBABwAEOgAIdABAoAMAAh0AEOgAINABAIEOAAh0AECgA4BABwAEOgAg0AEAgQ4ACHQAEOgAgEAHAAQ6ACDQAUCgAwACHQAQ6ACAQAcAgQ4ACHQAQKADAAIdAAQ6ACDQAQCBDgAIdAAQ6ACAQAcABDoAINABQKADAAIdABDoAIBABwCBDgAIdABAoAMAAh0ABDoAINABgN79109AbldXV9flPxblNov/DOblFv7+UG77+HfVn39vb29vB78emdpg1fauP2iDwWvcgm3883aMbbAs6/yorPP414ujf+W4z+2r/12WdasOL6zdl4Ufa4fdvGu0gyp/x6sTyjD0jx8a/03GOgn1cVtuyxN3EQ4267CV3+t16u2jhz701lfb6DEAlnGbt2yDz+ccDDHEq7LOTtzNIZY11PVaHV6AEOhj3ErhgP12LtuJZRj6e28y1cW8g/p4CgeqKbePHvpQ522jp3LMYnvJWWe/2rbBjsq66Kht/wwn4+pw3Jt76LQ9o76NB5jco+Gw35/l/p/iJXx43/auy+2+CqPMu7+O+9zFzziHsj511Nf+Bmr5GT/jlTZ1OEICnbZh/lT8c0+rC1WwL/3ivLvkvCu3h44/KrTth/LzdvFy8BBlXXQUeJ8F+6b8zIeuT6SnVIcCnXM/oC5jmPchdMiXqZxlk3QiuStOv3d8inkc6c0HKOum45Pmj9zHYJ+pQ4HOZR9Qr08I8zBRZRu3U4RJcs9+fWHe44nkRyeWu/gd+ijr04BlrRzU4Xh4bI1T3CaMGMKB4LH4M4N2/0Gnrh5JqWbr1u3vzmNtwrxhEFSzuEP7ez1+TCu2v9lR+2syagv3mvcfteuMZb0vml1ifz0q6/74KZF3Za3Km/Lb/cjd56ZUh4OYyuy/1NnPZhknfe9fNd/9JQR0g/1Vk1d+frK/hym2D+3vX7O7G83YbtgGm86yDn1g1lFZlw3Lumy4/9Df7mv68VwdjrBPC3SBnrlT7lru//2BZtekUwv0y2t/MYB+JR6kH9q0lzjK2yV+1q6jx7dSy3qf4Xe9/2C/t+rQY2tMQ91lrceWV4zCf/8tXmZzqZ2iSH+SIrSVVZv2Ei/BhgV1UuZrzDuYqJlS1upyeNu+doj7+F78s+LaY/l3z+pwnAQ6WQM9x4pT8UDzI3TKi7vHRdN7rovEe753uYIotr+7xEC4zzUTPD45kvIM+E3Old1iH/sew3ylDgU609Hb4zPnvtY0vUgZPd11MaqMgbBP6A+5RngPiWXdd1DWQxdhPsE6FOhc1IjKqm7kHNnVjVjXHV0iroQrRXWXf2/btvtY1tnAZVWHAp2JqesYVnQjl5S2tOryC8THv1LuVbd9rvk2od+t1OFZ16FAZ3TqLl89XPJKTPQ2srtOCIPHtm/lSwyEEAZ1n7PsuKzPfZRVHQp0pqWuU4ROvLnUlZjoTfUe7C9DrsfvU/dZ8xYTq5YZPl8dDluHAp1RSpmo9ntp2Pjmpnv31TlB3VWefc8j1nWG7/yZ2ZmVVR0KdKYgPh+aelYdDlRh5u6vMtQ3MdxdjidHGKx7bvchePYJ7X30ZVWHAp38FmX4vXWwbTJ8t3A/qunCD4sY7uHFCCHgX2LAz1Q1n7SXL0d3A3ynbcvvPKayqsMR8nIWTjrTLYM4zEw99Y1J1WSZsIVJdNWLJdYWkiHREJegD2Mqa3ineZHpEnLZL2/UoUDnckP9uTxgFEWe1yCGUXpY2CGM2EOgP4/teVvySbktM9A95bqTzcUJZV10WNb5UCPOKdXhOXHJnVahXqQt2tD0IFRNqPNM+zSZRKkOEegMEOrhUnl4mcoqc7CHUXu4z/5kljyAQKefUD8cvSUtBHvOS2nhefaNUGcEvBVQHQp0LivYyy0E+++3NxV5ZrKGy/AvfuHJtKPatQ4Gevyx9nnxCyqrOhToZLQtO8VVB9tNTx16H99rHIL9f8Wfe+1tAn5xSe8tpvMDcxeuJ1RWdSjQ4dOR+/oo4MMIPrzWsOnCEladm9AJbc3/P8TobtHyO5/6381O7Hc3qSf6RTcvSJlSHQp0Jhvwr2GGfLn9iKP31Al1KS974DKc1Ys04onkouV3HkVZ1aFAhzaj92pCXcqz55aOnYbaJTp7vgebEj7bjso61peGTKkOBTq8C/a7hFC3VOw0pNyO6fONfnWftY3vOTjF9szKqg4FOmRRdy9v4SeaxgleQiDc9jFyja8C7uxFI4kvDbkd2yh9SnUo0OHzg8DWL0HiAfapyy8Q77vWPV1xKNqHQd2VqfA9HtThWdehQGecQieJZ73Q1cldOMDWTVLq+nHGEKJ1I8jHtpdq4zLKdftYjq3PTakOBTpjFl7D+hTf6JTbV4+meRvbtKQ8TvXQRdCFZYeL+vuuhyJtMmeKx8SyztXh2dahQGd0o/PQSaqDSng2fJPrPljcz1cHrFc1MLlResotmKeco7zEIMg6sotPe9S173Cyu+ngxUVzdSjQmV6Y337QScJEtV2mzlh3P80IfXruirR1CsIo76XN4kPhhDKcoCYGwTaGcO6y1gnle8nR38JoP5Z3qQ4FOtMK88UXgXsdO2N47elt0w4Z78m/FPWz2NdqYnKj9DBqTV3JLARTaIONVhWMIRACclekPUkRwulHB2UNI9nUgPnb307py3EEm1pedTiGY3T5Q08tlDZfVXZcBrGv7zL4j59a3njfblM0Wwv5OY6ow7ru+y/2u4xn03X73na9Fv05tY9Lbn+n/I7xYN10zsa6aoOxHR6qE8jiz2XmamsyQg37uPmsTWeqm5cTvlNV1tfjl6MclbW6nbUoGq7nkKvdT6kOBbpAP+dAv46B3uZe26H455L5rGi+SMz3rjugQD/fQI/fOfW+aFd6CYJM/S2XcI95lbFsk6jDIbjkTuoB+BBfrNLmflO1lnLjEUJpdYkdkMbtMNyLXQ308b0FQRyFhqtRQ86+/n1JOmeYT6kOBTpjOKCu4oGmz9nmz5c0cYXWbfAxtsE+ZyaHS9jf+gyCo+WQhwi/dSzvWh0KdC77gBo6xvci/S1pbaziQQ3et8HUF/q0HdHdxVeRHgYqaxV+fQTRaxzB/ui6vFOqQ4HOuR9Qj9+StupgxL6PBxYjc+pGsDdF/uWCD7Fdf4uruA1+AhNved0V3VwdC79fCPFvxxPq1OG4mBT37wZmUtzp5VnG3zb889TnSMMlvnVXl/rG1D4uuf118TvGRYluY/ubtWh/29gGD2dcdzn62j6W9Tk+VnYO5ZpMHQp0xhQW1aMk1+8Csvrz69FIYxv/vJ1aB6TTYKgmX87ftb3j9lc9eTHa9hf7WlXW2Qdl3cdyjqqsU6pDgQ4A/OUeOgAIdABAoAMAAh0AEOgAINABAIEOAAh0AECgA4BABwAEOgAg0AEAgQ4AAh0AEOgAgEAHAAQ6AAh0AECgAwACHQAQ6AAg0AEAgQ4ACHQAQKADgEAHAAQ6ACDQAQCBDgACHQAQ6ACAQAcABDoACHQAQKADAAIdABDoACDQAQCBDgAIdABAoAOAQAcABDoAINABAIEOAAh0ABDoAIBABwAEOgAg0AFAoAMAAh0AEOgAgEAHAIEOAAh0AECgAwACHQAEOgAg0AEAgQ4ACHQAEOgAgEAHAAQ6ACDQAUCgAwACHQAQ6ACAQAcAgQ4ACHQAQKADAAIdAAQ6ACDQAYD+/V+AAQADXuXS75wQpQAAAABJRU5ErkJggg==', + }; + + return this.params(params); + } + + withMedium(externalToolMedium?: ExternalToolMedium): this { + const params: DeepPartial = { + medium: { + mediumId: 'mediumId', + publisher: 'publisher', + ...externalToolMedium, + }, + }; + + return this.params(params); + } +} + +export const externalToolFactory = ExternalToolFactory.define(ExternalTool, ({ sequence }) => { + return { + id: new ObjectId().toHexString(), + name: `external-tool-${sequence}`, + description: 'description', + url: 'https://url.com/', + config: basicToolConfigFactory.build(), + logoUrl: 'https://logo.com/', + isHidden: false, + isDeactivated: false, + openNewTab: false, + version: 1, + createdAt: new Date(2020, 1, 1), + }; +}); diff --git a/apps/server/src/modules/tool/external-tool/testing/index.ts b/apps/server/src/modules/tool/external-tool/testing/index.ts index 6ebcda28f7a..e5ea9294080 100644 --- a/apps/server/src/modules/tool/external-tool/testing/index.ts +++ b/apps/server/src/modules/tool/external-tool/testing/index.ts @@ -1 +1,4 @@ export { externalToolEntityFactory, customParameterEntityFactory } from './external-tool-entity.factory'; +export { externalToolFactory } from './external-tool.factory'; +export { externalToolParameterDatasheetTemplateDataFactory } from './external-tool-datasheet-template-data.factory'; +export { toolConfigurationStatusFactory } from './tool-configuration-status.factory'; diff --git a/apps/server/src/modules/tool/external-tool/testing/tool-configuration-status.factory.ts b/apps/server/src/modules/tool/external-tool/testing/tool-configuration-status.factory.ts new file mode 100644 index 00000000000..64fed88854c --- /dev/null +++ b/apps/server/src/modules/tool/external-tool/testing/tool-configuration-status.factory.ts @@ -0,0 +1,12 @@ +import { ContextExternalToolConfigurationStatus } from '@modules/tool/common/domain'; +import { Factory } from 'fishery'; + +export const toolConfigurationStatusFactory = Factory.define(() => { + return { + isOutdatedOnScopeContext: false, + isOutdatedOnScopeSchool: false, + isIncompleteOnScopeContext: false, + isIncompleteOperationalOnScopeContext: false, + isDeactivated: false, + }; +}); diff --git a/apps/server/src/modules/tool/external-tool/uc/dto/external-tool.types.ts b/apps/server/src/modules/tool/external-tool/uc/dto/external-tool.types.ts index 6aeac6f8328..b474d2dccd2 100644 --- a/apps/server/src/modules/tool/external-tool/uc/dto/external-tool.types.ts +++ b/apps/server/src/modules/tool/external-tool/uc/dto/external-tool.types.ts @@ -1,6 +1,6 @@ -import { BasicToolConfig, ExternalToolMedium, Lti11ToolConfig, Oauth2ToolConfig } from '../../domain'; import { CustomParameter } from '../../../common/domain'; import { ToolContextType } from '../../../common/enum'; +import { BasicToolConfig, ExternalToolMedium, Lti11ToolConfig, Oauth2ToolConfig } from '../../domain'; type PartialBy = Omit & Partial>; @@ -39,8 +39,6 @@ export type ExternalToolDto = { openNewTab: boolean; - version: number; - restrictToContexts?: ToolContextType[]; medium?: ExternalToolMediumDto; diff --git a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts index 662abd20bd2..c8e6ec2e7c0 100644 --- a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts +++ b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts @@ -18,13 +18,13 @@ import { externalToolFactory, oauth2ToolConfigFactory, roleFactory, - schoolExternalToolFactory, setupEntities, userFactory, } from '@shared/testing'; import { CustomParameter } from '../../common/domain'; import { ExternalToolSearchQuery } from '../../common/interface'; import { CommonToolMetadataService } from '../../common/service/common-tool-metadata.service'; +import { schoolExternalToolFactory } from '../../school-external-tool/testing'; import { ExternalTool, ExternalToolDatasheetTemplateData, @@ -363,26 +363,24 @@ describe('ExternalToolUc', () => { const setup = () => { const { externalTool, toolId } = setupDefault(); - const externalToolDOtoUpdate: ExternalToolUpdate = { - id: toolId, - ...externalTool, + const externalToolToUpdate: ExternalToolUpdate = { + ...externalTool.getProps(), name: 'newName', url: undefined, - version: 1, }; - const updatedExternalToolDO: ExternalTool = externalToolFactory.build({ + const updatedExternalTool: ExternalTool = externalToolFactory.build({ ...externalTool, name: 'newName', url: undefined, }); - externalToolService.updateExternalTool.mockResolvedValue(updatedExternalToolDO); - externalToolService.findById.mockResolvedValue(new ExternalTool(externalToolDOtoUpdate)); + externalToolService.updateExternalTool.mockResolvedValue(updatedExternalTool); + externalToolService.findById.mockResolvedValue(new ExternalTool(externalToolToUpdate)); return { externalTool, - updatedExternalToolDO, - externalToolDOtoUpdate, + updatedExternalToolDO: updatedExternalTool, + externalToolDOtoUpdate: externalToolToUpdate, toolId, }; }; @@ -553,7 +551,7 @@ describe('ExternalToolUc', () => { it('should check that the user has TOOL_ADMIN permission', async () => { const { user, tool } = setup(); - await uc.getMetadataForExternalTool(user.id, tool.id!); + await uc.getMetadataForExternalTool(user.id, tool.id); expect(authorizationService.checkAllPermissions).toHaveBeenCalledWith(user, [Permission.TOOL_ADMIN]); }); diff --git a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts index 982a1dede42..f075990f516 100644 --- a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts +++ b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts @@ -1,3 +1,4 @@ +import { ObjectId } from '@mikro-orm/mongodb'; import { AuthorizationService } from '@modules/authorization'; import { School, SchoolService } from '@modules/school'; import { SchoolExternalTool } from '@modules/tool/school-external-tool/domain'; @@ -35,7 +36,7 @@ export class ExternalToolUc { async createExternalTool(userId: EntityId, externalToolCreate: ExternalToolCreate): Promise { await this.ensurePermission(userId, Permission.TOOL_ADMIN); - const externalTool = new ExternalTool({ ...externalToolCreate }); + const externalTool: ExternalTool = new ExternalTool({ ...externalToolCreate, id: new ObjectId().toHexString() }); externalTool.logo = await this.externalToolLogoService.fetchLogo(externalTool); await this.toolValidationService.validateCreate(externalTool); @@ -61,7 +62,7 @@ export class ExternalToolUc { await this.toolValidationService.validateUpdate(toolId, toUpdate); - const saved: ExternalTool = await this.externalToolService.updateExternalTool(toUpdate, loaded); + const saved: ExternalTool = await this.externalToolService.updateExternalTool(toUpdate); return saved; } diff --git a/apps/server/src/shared/testing/factory/domainobject/tool/external-tool.factory.ts b/apps/server/src/shared/testing/factory/domainobject/tool/external-tool.factory.ts index 15293c4a408..b23b9a86172 100644 --- a/apps/server/src/shared/testing/factory/domainobject/tool/external-tool.factory.ts +++ b/apps/server/src/shared/testing/factory/domainobject/tool/external-tool.factory.ts @@ -1,3 +1,4 @@ +import { ObjectId } from '@mikro-orm/mongodb'; import { CustomParameter } from '@modules/tool/common/domain'; import { CustomParameterLocation, @@ -126,17 +127,19 @@ class ExternalToolFactory extends DoBaseFactory } } -export const externalToolFactory = ExternalToolFactory.define(ExternalTool, ({ sequence }) => { - return { - name: `external-tool-${sequence}`, - description: 'description', - url: 'https://url.com/', - config: basicToolConfigFactory.build(), - logoUrl: 'https://logo.com/', - isHidden: false, - isDeactivated: false, - openNewTab: false, - version: 1, - createdAt: new Date(2020, 1, 1), - }; -}); +export const externalToolFactory = ExternalToolFactory.define( + ExternalTool, + ({ sequence }) => + new ExternalTool({ + id: new ObjectId().toHexString(), + name: `external-tool-${sequence}`, + description: 'description', + url: 'https://url.com/', + config: basicToolConfigFactory.build(), + logoUrl: 'https://logo.com/', + isHidden: false, + isDeactivated: false, + openNewTab: false, + createdAt: new Date(2020, 1, 1), + }) +); From 1bb20bfb0d9a2db6e2bd5f428693318372110e7d Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Tue, 14 May 2024 17:11:19 +0200 Subject: [PATCH 03/26] N21-1885 WIP --- .../external-tool/uc/external-tool.uc.spec.ts | 2 +- .../uc/school-external-tool.uc.spec.ts | 33 +++++++++---------- .../school-external-tool.repo.spec.ts | 19 ++++++++--- .../school-external-tool.repo.ts | 7 ++-- .../tool/external-tool.factory.ts | 30 ++++++++--------- 5 files changed, 48 insertions(+), 43 deletions(-) diff --git a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts index c8e6ec2e7c0..11e43880ccf 100644 --- a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts +++ b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts @@ -255,7 +255,7 @@ describe('ExternalToolUc', () => { it('should call ExternalToolLogoService', async () => { const { currentUser, externalTool } = setup(); - await uc.createExternalTool(currentUser.userId, externalTool); + await uc.createExternalTool(currentUser.userId, externalTool.getProps()); expect(logoService.fetchLogo).toHaveBeenCalledWith(externalTool); }); diff --git a/apps/server/src/modules/tool/school-external-tool/uc/school-external-tool.uc.spec.ts b/apps/server/src/modules/tool/school-external-tool/uc/school-external-tool.uc.spec.ts index 39c6a4d6a36..cabac4f0753 100644 --- a/apps/server/src/modules/tool/school-external-tool/uc/school-external-tool.uc.spec.ts +++ b/apps/server/src/modules/tool/school-external-tool/uc/school-external-tool.uc.spec.ts @@ -1,17 +1,17 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { ObjectId } from '@mikro-orm/mongodb'; import { AuthorizationContextBuilder, AuthorizationService } from '@modules/authorization'; +import { schoolFactory } from '@modules/school/testing'; import { Test, TestingModule } from '@nestjs/testing'; import { User } from '@shared/domain/entity'; import { Permission } from '@shared/domain/interface'; -import { EntityId } from '@shared/domain/types'; -import { schoolExternalToolFactory, setupEntities, userFactory } from '@shared/testing'; +import { setupEntities, userFactory } from '@shared/testing'; import { School, SchoolService } from '@src/modules/school'; -import { schoolFactory } from '@modules/school/testing'; import { CommonToolMetadataService } from '../../common/service/common-tool-metadata.service'; import { ContextExternalToolService } from '../../context-external-tool'; -import { SchoolExternalTool, SchoolExternalToolWithId } from '../domain'; +import { SchoolExternalTool } from '../domain'; import { SchoolExternalToolService, SchoolExternalToolValidationService } from '../service'; +import { schoolExternalToolFactory } from '../testing'; import { SchoolExternalToolQueryInput } from './dto/school-external-tool.types'; import { SchoolExternalToolUc } from './school-external-tool.uc'; @@ -179,7 +179,7 @@ describe('SchoolExternalToolUc', () => { return { user, - schoolExternalToolId: tool.id as EntityId, + schoolExternalToolId: tool.id, school, }; }; @@ -199,9 +199,9 @@ describe('SchoolExternalToolUc', () => { describe('when calls services', () => { const setup = () => { - const tool: SchoolExternalToolWithId = schoolExternalToolFactory.buildWithId({ + const tool: SchoolExternalTool = schoolExternalToolFactory.buildWithId({ schoolId: new ObjectId().toHexString(), - }) as SchoolExternalToolWithId; + }); const user: User = userFactory.buildWithId(); const school: School = schoolFactory.build({ id: tool.schoolId }); @@ -297,9 +297,9 @@ describe('SchoolExternalToolUc', () => { describe('getSchoolExternalTool', () => { describe('when checks permission', () => { const setup = () => { - const tool: SchoolExternalToolWithId = schoolExternalToolFactory.buildWithId({ + const tool: SchoolExternalTool = schoolExternalToolFactory.buildWithId({ schoolId: new ObjectId().toHexString(), - }) as SchoolExternalToolWithId; + }); const user: User = userFactory.buildWithId(); const school: School = schoolFactory.build({ id: tool.schoolId }); @@ -329,9 +329,9 @@ describe('SchoolExternalToolUc', () => { describe('when userId and schoolExternalTool are given', () => { const setup = () => { - const tool: SchoolExternalToolWithId = schoolExternalToolFactory.buildWithId({ + const tool: SchoolExternalTool = schoolExternalToolFactory.buildWithId({ schoolId: new ObjectId().toHexString(), - }) as SchoolExternalToolWithId; + }); const user: User = userFactory.buildWithId(); schoolExternalToolService.findById.mockResolvedValue(tool); @@ -371,7 +371,7 @@ describe('SchoolExternalToolUc', () => { userId: user.id, updatedTool, school, - schoolExternalToolId: updatedTool.id as EntityId, + schoolExternalToolId: updatedTool.id, }; }; @@ -416,10 +416,7 @@ describe('SchoolExternalToolUc', () => { describe('when authorize user', () => { const setupMetadata = () => { const toolId = new ObjectId().toHexString(); - const tool: SchoolExternalToolWithId = schoolExternalToolFactory.buildWithId( - { id: toolId }, - toolId - ) as SchoolExternalToolWithId; + const tool: SchoolExternalTool = schoolExternalToolFactory.buildWithId({ id: toolId }, toolId); const userId: string = new ObjectId().toHexString(); const user: User = userFactory.buildWithId({}, userId); const school: School = schoolFactory.build({ id: tool.schoolId }); @@ -453,9 +450,9 @@ describe('SchoolExternalToolUc', () => { const user: User = userFactory.buildWithId(); const toolId: string = new ObjectId().toHexString(); const school: School = schoolFactory.build({ id: new ObjectId().toHexString() }); - const schoolExternalTool: SchoolExternalToolWithId = schoolExternalToolFactory.buildWithId({ + const schoolExternalTool: SchoolExternalTool = schoolExternalToolFactory.buildWithId({ id: toolId, - }) as SchoolExternalToolWithId; + }); schoolExternalToolService.findById.mockResolvedValueOnce(schoolExternalTool); authorizationService.getUserWithPermissions.mockResolvedValueOnce(user); diff --git a/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.spec.ts b/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.spec.ts index f4cc82daba3..ecda3014ae0 100644 --- a/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.spec.ts +++ b/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.spec.ts @@ -1,6 +1,6 @@ import { createMock } from '@golevelup/ts-jest'; import { MongoMemoryDatabaseModule } from '@infra/database'; -import { EntityManager, ObjectId } from '@mikro-orm/mongodb'; +import { EntityManager } from '@mikro-orm/mongodb'; import { CustomParameterEntry } from '@modules/tool/common/domain'; import { ExternalToolEntity } from '@modules/tool/external-tool/entity'; import { externalToolEntityFactory } from '@modules/tool/external-tool/testing'; @@ -145,17 +145,26 @@ describe(SchoolExternalToolRepo.name, () => { }); describe('save', () => { - function setup() { + const setup = () => { + const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ + school: schoolEntityFactory.buildWithId(), + tool: externalToolEntityFactory.buildWithId(), + }); + const domainObject: SchoolExternalTool = schoolExternalToolFactory.build({ - toolId: new ObjectId().toHexString(), + id: schoolExternalToolEntity.id, + toolId: schoolExternalToolEntity.tool.id, parameters: [new CustomParameterEntry({ name: 'param', value: 'value' })], - schoolId: new ObjectId().toHexString(), + schoolId: schoolExternalToolEntity.school.id, }); + em.persist([schoolExternalToolEntity]); + em.clear(); + return { domainObject, }; - } + }; it('should save a SchoolExternalTool', async () => { const { domainObject } = setup(); diff --git a/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.ts b/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.ts index 03c22d1c4a7..46a79e1ade7 100644 --- a/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.ts +++ b/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.ts @@ -19,9 +19,10 @@ export class SchoolExternalToolRepo { } public async createOrUpdate(domainObject: SchoolExternalTool): Promise { - const existing: SchoolExternalToolEntity | undefined = this.em - .getUnitOfWork() - .getById(SchoolExternalToolEntity.name, domainObject.id); + const existing: SchoolExternalToolEntity | null = await this.em.findOne( + SchoolExternalToolEntity.name, + domainObject.id + ); const entityProps: SchoolExternalToolEntityProps = this.mapDomainObjectToEntityProps(domainObject); let entity: SchoolExternalToolEntity = new SchoolExternalToolEntity(entityProps); diff --git a/apps/server/src/shared/testing/factory/domainobject/tool/external-tool.factory.ts b/apps/server/src/shared/testing/factory/domainobject/tool/external-tool.factory.ts index b23b9a86172..094e7915464 100644 --- a/apps/server/src/shared/testing/factory/domainobject/tool/external-tool.factory.ts +++ b/apps/server/src/shared/testing/factory/domainobject/tool/external-tool.factory.ts @@ -127,19 +127,17 @@ class ExternalToolFactory extends DoBaseFactory } } -export const externalToolFactory = ExternalToolFactory.define( - ExternalTool, - ({ sequence }) => - new ExternalTool({ - id: new ObjectId().toHexString(), - name: `external-tool-${sequence}`, - description: 'description', - url: 'https://url.com/', - config: basicToolConfigFactory.build(), - logoUrl: 'https://logo.com/', - isHidden: false, - isDeactivated: false, - openNewTab: false, - createdAt: new Date(2020, 1, 1), - }) -); +export const externalToolFactory = ExternalToolFactory.define(ExternalTool, ({ sequence }) => { + return { + id: new ObjectId().toHexString(), + name: `external-tool-${sequence}`, + description: 'description', + url: 'https://url.com/', + config: basicToolConfigFactory.build(), + logoUrl: 'https://logo.com/', + isHidden: false, + isDeactivated: false, + openNewTab: false, + createdAt: new Date(2020, 1, 1), + }; +}); From 5cabc6fe1cba083dea7ea0c9d6cfd32a361f2d38 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Wed, 15 May 2024 09:04:40 +0200 Subject: [PATCH 04/26] N21-1885 some test fixes --- .../service/course-copy.service.spec.ts | 4 +- .../common-tool-metadata.service.spec.ts | 3 +- ...xternal-tool-configuration.service.spec.ts | 16 +++---- .../school-external-tool.repo.spec.ts | 44 ++++++++++++++++++- 4 files changed, 53 insertions(+), 14 deletions(-) diff --git a/apps/server/src/modules/learnroom/service/course-copy.service.spec.ts b/apps/server/src/modules/learnroom/service/course-copy.service.spec.ts index 130ba69f7df..cbd8bee44d6 100644 --- a/apps/server/src/modules/learnroom/service/course-copy.service.spec.ts +++ b/apps/server/src/modules/learnroom/service/course-copy.service.spec.ts @@ -7,10 +7,9 @@ import { ContextExternalToolService } from '@modules/tool/context-external-tool/ import { ToolFeatures } from '@modules/tool/tool-config'; import { Test, TestingModule } from '@nestjs/testing'; import { Course } from '@shared/domain/entity'; -import { LegacyBoardRepo, CourseRepo, UserRepo } from '@shared/repo'; +import { CourseRepo, LegacyBoardRepo, UserRepo } from '@shared/repo'; import { boardFactory, - contextExternalToolFactory, courseFactory, courseGroupFactory, schoolEntityFactory, @@ -18,6 +17,7 @@ import { userFactory, } from '@shared/testing'; import { IToolFeatures } from '@src/modules/tool/tool-config'; +import { contextExternalToolFactory } from '../../tool/context-external-tool/testing'; import { BoardCopyService } from './board-copy.service'; import { CourseCopyService } from './course-copy.service'; import { RoomsService } from './rooms.service'; diff --git a/apps/server/src/modules/tool/common/service/common-tool-metadata.service.spec.ts b/apps/server/src/modules/tool/common/service/common-tool-metadata.service.spec.ts index 6b4af06ab1c..3b759ce156b 100644 --- a/apps/server/src/modules/tool/common/service/common-tool-metadata.service.spec.ts +++ b/apps/server/src/modules/tool/common/service/common-tool-metadata.service.spec.ts @@ -3,10 +3,11 @@ import { ObjectId } from '@mikro-orm/mongodb'; import { ContentElementService } from '@modules/board'; import { Test, TestingModule } from '@nestjs/testing'; import { ContextExternalToolRepo, SchoolExternalToolRepo } from '@shared/repo'; -import { contextExternalToolFactory, schoolExternalToolFactory } from '@shared/testing'; import { ContextExternalTool } from '../../context-external-tool/domain'; +import { contextExternalToolFactory } from '../../context-external-tool/testing'; import { ExternalToolMetadata } from '../../external-tool/domain'; import { SchoolExternalTool, SchoolExternalToolMetadata } from '../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../school-external-tool/testing'; import { CommonToolMetadataService } from './common-tool-metadata.service'; describe(CommonToolMetadataService.name, () => { diff --git a/apps/server/src/modules/tool/external-tool/service/external-tool-configuration.service.spec.ts b/apps/server/src/modules/tool/external-tool/service/external-tool-configuration.service.spec.ts index f4720a0551f..59a1fdd2d0c 100644 --- a/apps/server/src/modules/tool/external-tool/service/external-tool-configuration.service.spec.ts +++ b/apps/server/src/modules/tool/external-tool/service/external-tool-configuration.service.spec.ts @@ -2,17 +2,15 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { Test, TestingModule } from '@nestjs/testing'; import { Page } from '@shared/domain/domainobject'; import { EntityId } from '@shared/domain/types'; -import { - customParameterFactory, - externalToolFactory, - schoolExternalToolFactory, - schoolToolConfigurationStatusFactory, - setupEntities, -} from '@shared/testing'; +import { customParameterFactory, externalToolFactory, setupEntities } from '@shared/testing'; import { CustomParameter } from '../../common/domain'; import { CustomParameterScope, ToolContextType } from '../../common/enum'; import { CommonToolService } from '../../common/service'; import { SchoolExternalTool } from '../../school-external-tool/domain'; +import { + schoolExternalToolConfigurationStatusFactory, + schoolExternalToolFactory, +} from '../../school-external-tool/testing'; import { ToolFeatures } from '../../tool-config'; import { ExternalTool } from '../domain'; import { ContextExternalToolTemplateInfo } from '../uc'; @@ -129,12 +127,12 @@ describe('ExternalToolConfigurationService', () => { availableSchoolExternalTools.forEach((tool): void => { if (tool.id === 'deactivatedToolId') { - tool.status = schoolToolConfigurationStatusFactory.build({ + tool.status = schoolExternalToolConfigurationStatusFactory.build({ isDeactivated: true, isOutdatedOnScopeSchool: false, }); } - tool.status = schoolToolConfigurationStatusFactory.build({ + tool.status = schoolExternalToolConfigurationStatusFactory.build({ isDeactivated: false, isOutdatedOnScopeSchool: false, }); diff --git a/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.spec.ts b/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.spec.ts index ecda3014ae0..c5590f444b0 100644 --- a/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.spec.ts +++ b/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.spec.ts @@ -144,7 +144,7 @@ describe(SchoolExternalToolRepo.name, () => { }); }); - describe('save', () => { + describe('createOrUpdate', () => { const setup = () => { const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ school: schoolEntityFactory.buildWithId(), @@ -177,7 +177,7 @@ describe(SchoolExternalToolRepo.name, () => { }); }); - describe('find is called', () => { + describe('find', () => { describe('when school is set', () => { const setup = async () => { const { school, schoolExternalTool1 } = createTools(); @@ -292,4 +292,44 @@ describe(SchoolExternalToolRepo.name, () => { }); }); }); + + describe('deleteById', () => { + const setup = async () => { + const { schoolExternalTool1 } = createTools(); + + await em.persistAndFlush([schoolExternalTool1]); + em.clear(); + + return { schoolExternalTool1 }; + }; + + it('should delete a SchoolExternalTool', async () => { + const { schoolExternalTool1 } = await setup(); + + repo.deleteById(schoolExternalTool1.id); + + const result: SchoolExternalTool[] = await repo.find({ schoolId: schoolExternalTool1.school.id }); + + expect(result).toHaveLength(0); + }); + }); + + describe('findById', () => { + const setup = async () => { + const { schoolExternalTool1 } = createTools(); + + await em.persistAndFlush([schoolExternalTool1]); + em.clear(); + + return { schoolExternalTool1 }; + }; + + it('should find a SchoolExternalTool by id', async () => { + const { schoolExternalTool1 } = await setup(); + + const result: SchoolExternalTool = await repo.findById(schoolExternalTool1.id); + + expect(result.id).toEqual(schoolExternalTool1.id); + }); + }); }); From 960adc2e521b9340a0af49dc308088e7b1cf5824 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Wed, 15 May 2024 09:38:10 +0200 Subject: [PATCH 05/26] N21-1885 moving factories --- ...l-configuration-status-response.factory.ts | 2 +- .../context-external-tool/testing/index.ts | 1 + ...hool-external-tool-response.mapper.spec.ts | 26 ++-- .../school-external-tool/testing/index.ts | 1 + ...l-configuration-status-response.factory.ts | 10 ++ .../uc/school-external-tool.uc.spec.ts | 14 +- .../oauth2-tool-launch.strategy.spec.ts | 6 +- .../testing/factory/domainobject/index.ts | 1 - ...al-tool-datasheet-template-data.factory.ts | 67 -------- .../tool/external-tool.factory.ts | 143 ------------------ .../factory/domainobject/tool/index.ts | 7 - .../tool/tool-configuration-status.factory.ts | 12 -- .../src/shared/testing/factory/index.ts | 3 - ...l-configuration-status-response.factory.ts | 10 -- 14 files changed, 37 insertions(+), 266 deletions(-) rename apps/server/src/{shared/testing/factory => modules/tool/context-external-tool/testing}/context-external-tool-configuration-status-response.factory.ts (83%) create mode 100644 apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-configuration-status-response.factory.ts delete mode 100644 apps/server/src/shared/testing/factory/domainobject/tool/external-tool-datasheet-template-data.factory.ts delete mode 100644 apps/server/src/shared/testing/factory/domainobject/tool/external-tool.factory.ts delete mode 100644 apps/server/src/shared/testing/factory/domainobject/tool/index.ts delete mode 100644 apps/server/src/shared/testing/factory/domainobject/tool/tool-configuration-status.factory.ts delete mode 100644 apps/server/src/shared/testing/factory/school-tool-configuration-status-response.factory.ts diff --git a/apps/server/src/shared/testing/factory/context-external-tool-configuration-status-response.factory.ts b/apps/server/src/modules/tool/context-external-tool/testing/context-external-tool-configuration-status-response.factory.ts similarity index 83% rename from apps/server/src/shared/testing/factory/context-external-tool-configuration-status-response.factory.ts rename to apps/server/src/modules/tool/context-external-tool/testing/context-external-tool-configuration-status-response.factory.ts index 2075119bf72..c501b4119a9 100644 --- a/apps/server/src/shared/testing/factory/context-external-tool-configuration-status-response.factory.ts +++ b/apps/server/src/modules/tool/context-external-tool/testing/context-external-tool-configuration-status-response.factory.ts @@ -1,5 +1,5 @@ -import { ContextExternalToolConfigurationStatusResponse } from '@modules/tool/common/controller/dto/context-external-tool-configuration-status.response'; import { Factory } from 'fishery'; +import { ContextExternalToolConfigurationStatusResponse } from '../../common/controller/dto/context-external-tool-configuration-status.response'; export const contextExternalToolConfigurationStatusResponseFactory = Factory.define(() => { diff --git a/apps/server/src/modules/tool/context-external-tool/testing/index.ts b/apps/server/src/modules/tool/context-external-tool/testing/index.ts index 372d84debe4..fe6d6040ded 100644 --- a/apps/server/src/modules/tool/context-external-tool/testing/index.ts +++ b/apps/server/src/modules/tool/context-external-tool/testing/index.ts @@ -1,2 +1,3 @@ export { contextExternalToolEntityFactory } from './context-external-tool-entity.factory'; export { contextExternalToolFactory } from './context-external-tool.factory'; +export { contextExternalToolConfigurationStatusResponseFactory } from './context-external-tool-configuration-status-response.factory'; diff --git a/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-response.mapper.spec.ts b/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-response.mapper.spec.ts index 73580d89633..a3dae02d9ba 100644 --- a/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-response.mapper.spec.ts +++ b/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-response.mapper.spec.ts @@ -1,11 +1,10 @@ -import { - schoolExternalToolFactory, - schoolToolConfigurationStatusFactory, - schoolToolConfigurationStatusResponseFactory, -} from '@shared/testing/factory'; - import { SchoolExternalToolResponse, SchoolExternalToolSearchListResponse } from '../controller/dto'; import { SchoolExternalTool } from '../domain'; +import { + schoolExternalToolConfigurationStatusFactory, + schoolExternalToolConfigurationStatusResponseFactory, + schoolExternalToolFactory, +} from '../testing'; import { SchoolExternalToolResponseMapper } from './school-external-tool-response.mapper'; describe('SchoolExternalToolResponseMapper', () => { @@ -45,35 +44,33 @@ describe('SchoolExternalToolResponseMapper', () => { expect(response.data).toEqual( expect.objectContaining([ { - id: do1.id as string, + id: do1.id, name: do1.name as string, schoolId: do1.schoolId, toolId: do1.toolId, - toolVersion: do1.toolVersion, parameters: [ { name: do1.parameters[0].name, value: do1.parameters[0].value, }, ], - status: schoolToolConfigurationStatusResponseFactory.build({ + status: schoolExternalToolConfigurationStatusResponseFactory.build({ isOutdatedOnScopeSchool: false, isDeactivated: false, }), }, { - id: do2.id as string, + id: do2.id, name: do2.name as string, schoolId: do2.schoolId, toolId: do2.toolId, - toolVersion: do2.toolVersion, parameters: [ { name: do2.parameters[0].name, value: do2.parameters[0].value, }, ], - status: schoolToolConfigurationStatusFactory.build({ + status: schoolExternalToolConfigurationStatusFactory.build({ isOutdatedOnScopeSchool: false, isDeactivated: false, }), @@ -85,8 +82,7 @@ describe('SchoolExternalToolResponseMapper', () => { describe('when optional parameter are missing', () => { const setup = () => { - const do1: SchoolExternalTool = schoolExternalToolFactory.buildWithId(); - do1.id = undefined; + const do1: SchoolExternalTool = schoolExternalToolFactory.build({ id: undefined }); do1.name = undefined; do1.status = undefined; @@ -108,7 +104,7 @@ describe('SchoolExternalToolResponseMapper', () => { expect.objectContaining({ id: '', name: '', - status: schoolToolConfigurationStatusResponseFactory.build({ + status: schoolExternalToolConfigurationStatusResponseFactory.build({ isOutdatedOnScopeSchool: false, isDeactivated: false, }), diff --git a/apps/server/src/modules/tool/school-external-tool/testing/index.ts b/apps/server/src/modules/tool/school-external-tool/testing/index.ts index 8760012efb6..55b1de1dbfa 100644 --- a/apps/server/src/modules/tool/school-external-tool/testing/index.ts +++ b/apps/server/src/modules/tool/school-external-tool/testing/index.ts @@ -1,3 +1,4 @@ export { schoolExternalToolEntityFactory } from './school-external-tool-entity.factory'; export { schoolExternalToolFactory } from './school-external-tool.factory'; export { schoolExternalToolConfigurationStatusFactory } from './school-external-tool-configuration-status.factory'; +export { schoolExternalToolConfigurationStatusResponseFactory } from './school-external-tool-configuration-status-response.factory'; diff --git a/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-configuration-status-response.factory.ts b/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-configuration-status-response.factory.ts new file mode 100644 index 00000000000..a381fadc03b --- /dev/null +++ b/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-configuration-status-response.factory.ts @@ -0,0 +1,10 @@ +import { Factory } from 'fishery'; +import { SchoolExternalToolConfigurationStatusResponse } from '../controller/dto/school-external-tool-configuration.response'; + +export const schoolExternalToolConfigurationStatusResponseFactory = + Factory.define(() => { + return { + isOutdatedOnScopeSchool: false, + isDeactivated: false, + }; + }); diff --git a/apps/server/src/modules/tool/school-external-tool/uc/school-external-tool.uc.spec.ts b/apps/server/src/modules/tool/school-external-tool/uc/school-external-tool.uc.spec.ts index cabac4f0753..30919794391 100644 --- a/apps/server/src/modules/tool/school-external-tool/uc/school-external-tool.uc.spec.ts +++ b/apps/server/src/modules/tool/school-external-tool/uc/school-external-tool.uc.spec.ts @@ -279,7 +279,7 @@ describe('SchoolExternalToolUc', () => { it('should call schoolExternalToolValidationService.validate()', async () => { const { user, tool } = setup(); - await uc.createSchoolExternalTool(user.id, tool); + await uc.createSchoolExternalTool(user.id, tool.getProps()); expect(schoolExternalToolValidationService.validate).toHaveBeenCalledWith(tool); }); @@ -287,7 +287,7 @@ describe('SchoolExternalToolUc', () => { it('should call schoolExternalToolService.createSchoolExternalTool', async () => { const { user, tool } = setup(); - await uc.createSchoolExternalTool(user.id, tool); + await uc.createSchoolExternalTool(user.id, tool.getProps()); expect(schoolExternalToolService.saveSchoolExternalTool).toHaveBeenCalledWith(tool); }); @@ -390,7 +390,7 @@ describe('SchoolExternalToolUc', () => { it('should call schoolExternalToolValidationService.validate()', async () => { const { updatedTool, schoolExternalToolId, user } = setup(); - await uc.updateSchoolExternalTool(user.id, schoolExternalToolId, updatedTool); + await uc.updateSchoolExternalTool(user.id, schoolExternalToolId, updatedTool.getProps()); expect(schoolExternalToolValidationService.validate).toHaveBeenCalledWith(updatedTool); }); @@ -398,7 +398,7 @@ describe('SchoolExternalToolUc', () => { it('should call the service to update the tool', async () => { const { updatedTool, schoolExternalToolId, user } = setup(); - await uc.updateSchoolExternalTool(user.id, schoolExternalToolId, updatedTool); + await uc.updateSchoolExternalTool(user.id, schoolExternalToolId, updatedTool.getProps()); expect(schoolExternalToolService.saveSchoolExternalTool).toHaveBeenCalledWith(updatedTool); }); @@ -406,7 +406,11 @@ describe('SchoolExternalToolUc', () => { it('should return a schoolExternalTool', async () => { const { updatedTool, schoolExternalToolId, user } = setup(); - const result: SchoolExternalTool = await uc.updateSchoolExternalTool(user.id, schoolExternalToolId, updatedTool); + const result: SchoolExternalTool = await uc.updateSchoolExternalTool( + user.id, + schoolExternalToolId, + updatedTool.getProps() + ); expect(result).toEqual(updatedTool); }); diff --git a/apps/server/src/modules/tool/tool-launch/service/launch-strategy/oauth2-tool-launch.strategy.spec.ts b/apps/server/src/modules/tool/tool-launch/service/launch-strategy/oauth2-tool-launch.strategy.spec.ts index d1e1e1662fb..608ef0597ab 100644 --- a/apps/server/src/modules/tool/tool-launch/service/launch-strategy/oauth2-tool-launch.strategy.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/service/launch-strategy/oauth2-tool-launch.strategy.spec.ts @@ -1,16 +1,18 @@ import { createMock } from '@golevelup/ts-jest'; import { Test, TestingModule } from '@nestjs/testing'; -import { contextExternalToolFactory, externalToolFactory, schoolExternalToolFactory } from '@shared/testing'; import { ContextExternalTool } from '../../../context-external-tool/domain'; +import { contextExternalToolFactory } from '../../../context-external-tool/testing'; import { ExternalTool } from '../../../external-tool/domain'; +import { externalToolFactory } from '../../../external-tool/testing'; import { SchoolExternalTool } from '../../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../../school-external-tool/testing'; import { LaunchRequestMethod, PropertyData } from '../../types'; import { AutoContextIdStrategy, AutoContextNameStrategy, + AutoMediumIdStrategy, AutoSchoolIdStrategy, AutoSchoolNumberStrategy, - AutoMediumIdStrategy, } from '../auto-parameter-strategy'; import { OAuth2ToolLaunchStrategy } from './oauth2-tool-launch.strategy'; import { ToolLaunchParams } from './tool-launch-params.interface'; diff --git a/apps/server/src/shared/testing/factory/domainobject/index.ts b/apps/server/src/shared/testing/factory/domainobject/index.ts index 68a77a221f4..f1998f50167 100644 --- a/apps/server/src/shared/testing/factory/domainobject/index.ts +++ b/apps/server/src/shared/testing/factory/domainobject/index.ts @@ -1,5 +1,4 @@ export * from './board'; -export * from './tool'; export * from './groups'; export * from './do-base.factory'; export * from './legacy-school.factory'; diff --git a/apps/server/src/shared/testing/factory/domainobject/tool/external-tool-datasheet-template-data.factory.ts b/apps/server/src/shared/testing/factory/domainobject/tool/external-tool-datasheet-template-data.factory.ts deleted file mode 100644 index 96f18c0751d..00000000000 --- a/apps/server/src/shared/testing/factory/domainobject/tool/external-tool-datasheet-template-data.factory.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { CustomParameterLocation, LtiMessageType, LtiPrivacyPermission } from '@modules/tool/common/enum'; -import { - ExternalToolDatasheetTemplateData, - ExternalToolParameterDatasheetTemplateData, -} from '@modules/tool/external-tool/domain'; -import { DeepPartial, Factory } from 'fishery'; - -export const externalToolParameterDatasheetTemplateDataFactory = Factory.define< - ExternalToolParameterDatasheetTemplateData, - ExternalToolParameterDatasheetTemplateData ->(({ sequence }) => { - return { - name: `custom-parameter-${sequence}`, - properties: '', - type: 'Zeichenkette', - scope: 'Schule', - location: CustomParameterLocation.BODY, - }; -}); - -export class ExternalToolDatasheetTemplateDataFactory extends Factory { - asOauth2Tool(): this { - const params: DeepPartial = { - toolType: 'OAuth 2.0', - skipConsent: 'Zustimmung überspringen: ja', - toolUrl: 'https://www.oauth2-baseUrl.com/', - }; - return this.params(params); - } - - asLti11Tool(): this { - const params: DeepPartial = { - toolType: 'LTI 1.1', - messageType: LtiMessageType.BASIC_LTI_LAUNCH_REQUEST, - privacy: LtiPrivacyPermission.PSEUDONYMOUS, - toolUrl: 'https://www.lti11-baseUrl.com/', - }; - return this.params(params); - } - - withParameters(number: number, customParam?: DeepPartial): this { - const params: DeepPartial = { - parameters: externalToolParameterDatasheetTemplateDataFactory.buildList(number, customParam), - }; - return this.params(params); - } - - withOptionalProperties(): this { - const params: DeepPartial = { - isDeactivated: 'Das Tool ist instanzweit deaktiviert', - restrictToContexts: 'Kurs, Kurs-Board', - }; - return this.params(params); - } -} -export const externalToolDatasheetTemplateDataFactory = ExternalToolDatasheetTemplateDataFactory.define( - ({ sequence }) => { - return { - createdAt: new Date().toLocaleDateString('de-DE'), - creatorName: `John Doe ${sequence}`, - instance: 'dBildungscloud', - toolName: `external-tool-${sequence}`, - toolUrl: 'https://www.basic-baseUrl.com/', - toolType: 'Basic', - }; - } -); diff --git a/apps/server/src/shared/testing/factory/domainobject/tool/external-tool.factory.ts b/apps/server/src/shared/testing/factory/domainobject/tool/external-tool.factory.ts deleted file mode 100644 index 094e7915464..00000000000 --- a/apps/server/src/shared/testing/factory/domainobject/tool/external-tool.factory.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { ObjectId } from '@mikro-orm/mongodb'; -import { CustomParameter } from '@modules/tool/common/domain'; -import { - CustomParameterLocation, - CustomParameterScope, - CustomParameterType, - LtiMessageType, - LtiPrivacyPermission, - TokenEndpointAuthMethod, - ToolConfigType, -} from '@modules/tool/common/enum'; -import { - BasicToolConfig, - ExternalTool, - ExternalToolMedium, - ExternalToolProps, - Lti11ToolConfig, - Oauth2ToolConfig, -} from '@modules/tool/external-tool/domain'; -import { DeepPartial } from 'fishery'; -import { DoBaseFactory } from '../do-base.factory'; - -export const basicToolConfigFactory = DoBaseFactory.define(BasicToolConfig, () => { - return { - type: ToolConfigType.BASIC, - baseUrl: 'https://www.basic-baseUrl.com/', - }; -}); - -class Oauth2ToolConfigFactory extends DoBaseFactory { - withExternalData(oauth2Params?: DeepPartial): this { - const params: DeepPartial = { - clientSecret: 'clientSecret', - scope: 'offline openid', - frontchannelLogoutUri: 'https://www.frontchannel.com/', - redirectUris: ['https://www.redirect.com/'], - tokenEndpointAuthMethod: TokenEndpointAuthMethod.CLIENT_SECRET_POST, - }; - - return this.params({ ...params, ...oauth2Params }); - } -} - -export const oauth2ToolConfigFactory = Oauth2ToolConfigFactory.define(Oauth2ToolConfig, () => { - return { - type: ToolConfigType.OAUTH2, - baseUrl: 'https://www.oauth2-baseUrl.com/', - clientId: 'clientId', - skipConsent: false, - }; -}); - -export const lti11ToolConfigFactory = DoBaseFactory.define(Lti11ToolConfig, () => { - return { - type: ToolConfigType.LTI11, - baseUrl: 'https://www.lti11-baseUrl.com/', - key: 'key', - secret: 'secret', - privacy_permission: LtiPrivacyPermission.PSEUDONYMOUS, - lti_message_type: LtiMessageType.BASIC_LTI_LAUNCH_REQUEST, - launch_presentation_locale: 'de-DE', - }; -}); - -class CustomParameterFactory extends DoBaseFactory { - buildListWithEachType(params?: DeepPartial): CustomParameter[] { - const globalParameter = this.build({ ...params, scope: CustomParameterScope.GLOBAL }); - const schoolParameter = this.build({ ...params, scope: CustomParameterScope.SCHOOL }); - const contextParameter = this.build({ ...params, scope: CustomParameterScope.CONTEXT }); - - return [globalParameter, schoolParameter, contextParameter]; - } -} - -export const customParameterFactory = CustomParameterFactory.define(CustomParameter, ({ sequence }) => { - return { - name: `custom-parameter-${sequence}`, - displayName: 'User Friendly Name', - type: CustomParameterType.STRING, - scope: CustomParameterScope.SCHOOL, - location: CustomParameterLocation.BODY, - isOptional: false, - isProtected: false, - }; -}); - -class ExternalToolFactory extends DoBaseFactory { - withOauth2Config(customParam?: DeepPartial): this { - const params: DeepPartial = { - config: oauth2ToolConfigFactory.build(customParam), - }; - return this.params(params); - } - - withLti11Config(customParam?: DeepPartial): this { - const params: DeepPartial = { - config: lti11ToolConfigFactory.build(customParam), - }; - return this.params(params); - } - - withCustomParameters(number: number, customParam?: DeepPartial): this { - const params: DeepPartial = { - parameters: customParameterFactory.buildList(number, customParam), - }; - return this.params(params); - } - - withBase64Logo(): this { - const params: DeepPartial = { - logo: 'iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAYAAAAeGRPoAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ2MUQ2Q0Y5RTQxMTExRTdBMTg3QkQ2MDVGMUFEMUIwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQ2MUQ2Q0ZBRTQxMTExRTdBMTg3QkQ2MDVGMUFEMUIwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDYxRDZDRjdFNDExMTFFN0ExODdCRDYwNUYxQUQxQjAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDYxRDZDRjhFNDExMTFFN0ExODdCRDYwNUYxQUQxQjAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz45EjsrAAALfUlEQVR42uzdgXWjOAIGYHLvGsiV4CnBU4JTgqeEpIS4hKSEpIS4BLsEu4RJCeMScmhGzPplkyCMAGO+7z3ezs3tYsuS+BEIcfX29lYAAOP2Hz8BAAh0AECgAwACHQAQ6AAg0AEAgQ4ACHQAQKADgEAHAAQ6ACDQAQCBDgACHQAQ6ACAQAcABDoACHQAQKADAAIdABDoACDQAQCBDgAIdABAoAOAQAcABDoAINABAIEOAAIdABDoAIBABwAEOgAIdABAoAMAAh0AEOgAINABAIEOAAh0AECgA4BABwAEOgAg0AEAgQ4ACHQAEOgAgEAHAAQ6ACDQAUCgAwACHQAQ6ACAQAcAgQ4ACHQAQKADAAIdAAQ6ACDQAQCBDgAIdAAQ6ACAQAcABDoAINABQKADAAIdABDoAIBABwCBDgAIdABAoAMAAh0ABDoAINABgN79109AbldXV9flPxblNov/DOblFv7+UG77+HfVn39vb29vB78emdpg1fauP2iDwWvcgm3883aMbbAs6/yorPP414ujf+W4z+2r/12WdasOL6zdl4Ufa4fdvGu0gyp/x6sTyjD0jx8a/03GOgn1cVtuyxN3EQ4267CV3+t16u2jhz701lfb6DEAlnGbt2yDz+ccDDHEq7LOTtzNIZY11PVaHV6AEOhj3ErhgP12LtuJZRj6e28y1cW8g/p4CgeqKbePHvpQ522jp3LMYnvJWWe/2rbBjsq66Kht/wwn4+pw3Jt76LQ9o76NB5jco+Gw35/l/p/iJXx43/auy+2+CqPMu7+O+9zFzziHsj511Nf+Bmr5GT/jlTZ1OEICnbZh/lT8c0+rC1WwL/3ivLvkvCu3h44/KrTth/LzdvFy8BBlXXQUeJ8F+6b8zIeuT6SnVIcCnXM/oC5jmPchdMiXqZxlk3QiuStOv3d8inkc6c0HKOum45Pmj9zHYJ+pQ4HOZR9Qr08I8zBRZRu3U4RJcs9+fWHe44nkRyeWu/gd+ijr04BlrRzU4Xh4bI1T3CaMGMKB4LH4M4N2/0Gnrh5JqWbr1u3vzmNtwrxhEFSzuEP7ez1+TCu2v9lR+2syagv3mvcfteuMZb0vml1ifz0q6/74KZF3Za3Km/Lb/cjd56ZUh4OYyuy/1NnPZhknfe9fNd/9JQR0g/1Vk1d+frK/hym2D+3vX7O7G83YbtgGm86yDn1g1lFZlw3Lumy4/9Df7mv68VwdjrBPC3SBnrlT7lru//2BZtekUwv0y2t/MYB+JR6kH9q0lzjK2yV+1q6jx7dSy3qf4Xe9/2C/t+rQY2tMQ91lrceWV4zCf/8tXmZzqZ2iSH+SIrSVVZv2Ei/BhgV1UuZrzDuYqJlS1upyeNu+doj7+F78s+LaY/l3z+pwnAQ6WQM9x4pT8UDzI3TKi7vHRdN7rovEe753uYIotr+7xEC4zzUTPD45kvIM+E3Old1iH/sew3ylDgU609Hb4zPnvtY0vUgZPd11MaqMgbBP6A+5RngPiWXdd1DWQxdhPsE6FOhc1IjKqm7kHNnVjVjXHV0iroQrRXWXf2/btvtY1tnAZVWHAp2JqesYVnQjl5S2tOryC8THv1LuVbd9rvk2od+t1OFZ16FAZ3TqLl89XPJKTPQ2srtOCIPHtm/lSwyEEAZ1n7PsuKzPfZRVHQp0pqWuU4ROvLnUlZjoTfUe7C9DrsfvU/dZ8xYTq5YZPl8dDluHAp1RSpmo9ntp2Pjmpnv31TlB3VWefc8j1nWG7/yZ2ZmVVR0KdKYgPh+aelYdDlRh5u6vMtQ3MdxdjidHGKx7bvchePYJ7X30ZVWHAp38FmX4vXWwbTJ8t3A/qunCD4sY7uHFCCHgX2LAz1Q1n7SXL0d3A3ynbcvvPKayqsMR8nIWTjrTLYM4zEw99Y1J1WSZsIVJdNWLJdYWkiHREJegD2Mqa3ineZHpEnLZL2/UoUDnckP9uTxgFEWe1yCGUXpY2CGM2EOgP4/teVvySbktM9A95bqTzcUJZV10WNb5UCPOKdXhOXHJnVahXqQt2tD0IFRNqPNM+zSZRKkOEegMEOrhUnl4mcoqc7CHUXu4z/5kljyAQKefUD8cvSUtBHvOS2nhefaNUGcEvBVQHQp0LivYyy0E+++3NxV5ZrKGy/AvfuHJtKPatQ4Gevyx9nnxCyqrOhToZLQtO8VVB9tNTx16H99rHIL9f8Wfe+1tAn5xSe8tpvMDcxeuJ1RWdSjQ4dOR+/oo4MMIPrzWsOnCEladm9AJbc3/P8TobtHyO5/6381O7Hc3qSf6RTcvSJlSHQp0Jhvwr2GGfLn9iKP31Al1KS974DKc1Ys04onkouV3HkVZ1aFAhzaj92pCXcqz55aOnYbaJTp7vgebEj7bjso61peGTKkOBTq8C/a7hFC3VOw0pNyO6fONfnWftY3vOTjF9szKqg4FOmRRdy9v4SeaxgleQiDc9jFyja8C7uxFI4kvDbkd2yh9SnUo0OHzg8DWL0HiAfapyy8Q77vWPV1xKNqHQd2VqfA9HtThWdehQGecQieJZ73Q1cldOMDWTVLq+nHGEKJ1I8jHtpdq4zLKdftYjq3PTakOBTpjFl7D+hTf6JTbV4+meRvbtKQ8TvXQRdCFZYeL+vuuhyJtMmeKx8SyztXh2dahQGd0o/PQSaqDSng2fJPrPljcz1cHrFc1MLlResotmKeco7zEIMg6sotPe9S173Cyu+ngxUVzdSjQmV6Y337QScJEtV2mzlh3P80IfXruirR1CsIo76XN4kPhhDKcoCYGwTaGcO6y1gnle8nR38JoP5Z3qQ4FOtMK88UXgXsdO2N47elt0w4Z78m/FPWz2NdqYnKj9DBqTV3JLARTaIONVhWMIRACclekPUkRwulHB2UNI9nUgPnb307py3EEm1pedTiGY3T5Q08tlDZfVXZcBrGv7zL4j59a3njfblM0Wwv5OY6ow7ru+y/2u4xn03X73na9Fv05tY9Lbn+n/I7xYN10zsa6aoOxHR6qE8jiz2XmamsyQg37uPmsTWeqm5cTvlNV1tfjl6MclbW6nbUoGq7nkKvdT6kOBbpAP+dAv46B3uZe26H455L5rGi+SMz3rjugQD/fQI/fOfW+aFd6CYJM/S2XcI95lbFsk6jDIbjkTuoB+BBfrNLmflO1lnLjEUJpdYkdkMbtMNyLXQ308b0FQRyFhqtRQ86+/n1JOmeYT6kOBTpjOKCu4oGmz9nmz5c0cYXWbfAxtsE+ZyaHS9jf+gyCo+WQhwi/dSzvWh0KdC77gBo6xvci/S1pbaziQQ3et8HUF/q0HdHdxVeRHgYqaxV+fQTRaxzB/ui6vFOqQ4HOuR9Qj9+StupgxL6PBxYjc+pGsDdF/uWCD7Fdf4uruA1+AhNved0V3VwdC79fCPFvxxPq1OG4mBT37wZmUtzp5VnG3zb889TnSMMlvnVXl/rG1D4uuf118TvGRYluY/ubtWh/29gGD2dcdzn62j6W9Tk+VnYO5ZpMHQp0xhQW1aMk1+8Csvrz69FIYxv/vJ1aB6TTYKgmX87ftb3j9lc9eTHa9hf7WlXW2Qdl3cdyjqqsU6pDgQ4A/OUeOgAIdABAoAMAAh0AEOgAINABAIEOAAh0AECgA4BABwAEOgAg0AEAgQ4AAh0AEOgAgEAHAAQ6AAh0AECgAwACHQAQ6AAg0AEAgQ4ACHQAQKADgEAHAAQ6ACDQAQCBDgACHQAQ6ACAQAcABDoACHQAQKADAAIdABDoACDQAQCBDgAIdABAoAOAQAcABDoAINABAIEOAAh0ABDoAIBABwAEOgAg0AFAoAMAAh0AEOgAgEAHAIEOAAh0AECgAwACHQAEOgAg0AEAgQ4ACHQAEOgAgEAHAAQ6ACDQAUCgAwACHQAQ6ACAQAcAgQ4ACHQAQKADAAIdAAQ6ACDQAYD+/V+AAQADXuXS75wQpQAAAABJRU5ErkJggg==', - }; - - return this.params(params); - } - - withMedium(externalToolMedium?: ExternalToolMedium): this { - const params: DeepPartial = { - medium: { - mediumId: 'mediumId', - publisher: 'publisher', - ...externalToolMedium, - }, - }; - - return this.params(params); - } -} - -export const externalToolFactory = ExternalToolFactory.define(ExternalTool, ({ sequence }) => { - return { - id: new ObjectId().toHexString(), - name: `external-tool-${sequence}`, - description: 'description', - url: 'https://url.com/', - config: basicToolConfigFactory.build(), - logoUrl: 'https://logo.com/', - isHidden: false, - isDeactivated: false, - openNewTab: false, - createdAt: new Date(2020, 1, 1), - }; -}); diff --git a/apps/server/src/shared/testing/factory/domainobject/tool/index.ts b/apps/server/src/shared/testing/factory/domainobject/tool/index.ts deleted file mode 100644 index 9dd50c3b0eb..00000000000 --- a/apps/server/src/shared/testing/factory/domainobject/tool/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from './external-tool.factory'; -export * from './tool-configuration-status.factory'; -export { - externalToolDatasheetTemplateDataFactory, - ExternalToolDatasheetTemplateDataFactory, - externalToolParameterDatasheetTemplateDataFactory, -} from './external-tool-datasheet-template-data.factory'; diff --git a/apps/server/src/shared/testing/factory/domainobject/tool/tool-configuration-status.factory.ts b/apps/server/src/shared/testing/factory/domainobject/tool/tool-configuration-status.factory.ts deleted file mode 100644 index 64fed88854c..00000000000 --- a/apps/server/src/shared/testing/factory/domainobject/tool/tool-configuration-status.factory.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ContextExternalToolConfigurationStatus } from '@modules/tool/common/domain'; -import { Factory } from 'fishery'; - -export const toolConfigurationStatusFactory = Factory.define(() => { - return { - isOutdatedOnScopeContext: false, - isOutdatedOnScopeSchool: false, - isIncompleteOnScopeContext: false, - isIncompleteOperationalOnScopeContext: false, - isDeactivated: false, - }; -}); diff --git a/apps/server/src/shared/testing/factory/index.ts b/apps/server/src/shared/testing/factory/index.ts index 2d9b17b91c1..cffe42b46fa 100644 --- a/apps/server/src/shared/testing/factory/index.ts +++ b/apps/server/src/shared/testing/factory/index.ts @@ -38,8 +38,5 @@ export * from './jwt.test.factory'; export * from './axios-error.factory'; export * from './tldraw-file-dto.factory'; export { externalSchoolDtoFactory } from './external-school-dto.factory'; -export * from './context-external-tool-configuration-status-response.factory'; -export * from './school-tool-configuration-status-response.factory'; export { schoolSystemOptionsEntityFactory } from './school-system-options-entity.factory'; export { countyEmbeddableFactory } from './county.embeddable.factory'; -export { schoolExternalToolConfigurationStatusEntityFactory } from './school-external-tool-configuration-status-entity.factory'; diff --git a/apps/server/src/shared/testing/factory/school-tool-configuration-status-response.factory.ts b/apps/server/src/shared/testing/factory/school-tool-configuration-status-response.factory.ts deleted file mode 100644 index 480b68a181a..00000000000 --- a/apps/server/src/shared/testing/factory/school-tool-configuration-status-response.factory.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SchoolExternalToolConfigurationStatusResponse } from '@modules/tool/school-external-tool/controller/dto/school-external-tool-configuration.response'; -import { Factory } from 'fishery'; - -export const schoolToolConfigurationStatusResponseFactory = - Factory.define(() => { - return { - isOutdatedOnScopeSchool: false, - isDeactivated: false, - }; - }); From 26057c74908bce9bac4936876954af0aab41bc1e Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Wed, 15 May 2024 11:24:05 +0200 Subject: [PATCH 06/26] N21-1885 adjust repos --- .../entity/context-external-tool.entity.ts | 4 +- .../context-external-tool.service.spec.ts | 10 +- .../service/context-external-tool.service.ts | 2 +- .../context-external-tool-entity.factory.ts | 4 +- ...l-tool-configuration-status.entity.spec.ts | 2 +- .../school-external-tool.entity.spec.ts | 2 +- .../school-external-tool.service.spec.ts | 2 +- .../service/school-external-tool.service.ts | 4 +- .../school-external-tool/testing/index.ts | 1 + ...ool-configuration-status-entity.factory.ts | 2 +- .../school-external-tool-entity.factory.ts | 2 +- .../tool-launch.controller.api.spec.ts | 2 +- ....ts => context-external-tool.repo.spec.ts} | 26 +++--- .../context-external-tool.repo.ts | 92 +++++++++++++------ .../school-external-tool.repo.spec.ts | 17 ++-- .../school-external-tool.repo.ts | 7 +- 16 files changed, 108 insertions(+), 71 deletions(-) rename apps/server/src/{shared/testing/factory => modules/tool/school-external-tool/testing}/school-external-tool-configuration-status-entity.factory.ts (62%) rename apps/server/src/shared/repo/contextexternaltool/{context-external-tool.repo.integration.spec.ts => context-external-tool.repo.spec.ts} (94%) diff --git a/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.ts b/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.ts index 822edd68c89..0077295ce8c 100644 --- a/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.ts +++ b/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.ts @@ -5,7 +5,7 @@ import { CustomParameterEntryEntity } from '../../common/entity'; import { SchoolExternalToolEntity } from '../../school-external-tool/entity'; import { ContextExternalToolType } from './context-external-tool-type.enum'; -export interface ContextExternalToolProperties { +export interface ContextExternalToolEntityProps { id?: EntityId; schoolTool: SchoolExternalToolEntity; @@ -36,7 +36,7 @@ export class ContextExternalToolEntity extends BaseEntityWithTimestamps { @Embedded(() => CustomParameterEntryEntity, { array: true }) parameters: CustomParameterEntryEntity[]; - constructor(props: ContextExternalToolProperties) { + constructor(props: ContextExternalToolEntityProps) { super(); if (props.id) { this.id = props.id; diff --git a/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.spec.ts b/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.spec.ts index 0f6f01699e6..c6b01502ecf 100644 --- a/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.spec.ts @@ -5,16 +5,14 @@ import { NotFoundException } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { Permission } from '@shared/domain/interface'; import { ContextExternalToolRepo } from '@shared/repo'; -import { - customParameterFactory, - externalToolFactory, - legacySchoolDoFactory, -} from '@shared/testing/factory/domainobject'; +import { legacySchoolDoFactory } from '@shared/testing'; import { CustomParameter } from '../../common/domain'; import { ToolContextType } from '../../common/enum'; import { CommonToolService } from '../../common/service'; import { ExternalToolService } from '../../external-tool'; import { ExternalTool } from '../../external-tool/domain'; +import { externalToolFactory } from '../../external-tool/testing'; +import { customParameterFactory } from '../../external-tool/testing/external-tool.factory'; import { SchoolExternalToolService } from '../../school-external-tool'; import { SchoolExternalTool } from '../../school-external-tool/domain'; import { schoolExternalToolFactory } from '../../school-external-tool/testing'; @@ -27,7 +25,7 @@ import { import { contextExternalToolFactory } from '../testing'; import { ContextExternalToolService } from './context-external-tool.service'; -describe('ContextExternalToolService', () => { +describe(ContextExternalToolService.name, () => { let module: TestingModule; let service: ContextExternalToolService; let externalToolService: DeepMocked; diff --git a/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.ts b/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.ts index b853e2bf4fd..196ba638fa0 100644 --- a/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.ts +++ b/apps/server/src/modules/tool/context-external-tool/service/context-external-tool.service.ts @@ -112,7 +112,7 @@ export class ContextExternalToolService { } }); - const copiedTool = await this.contextExternalToolRepo.save(contextExternalTool); + const copiedTool: ContextExternalTool = await this.contextExternalToolRepo.save(contextExternalTool); return copiedTool; } diff --git a/apps/server/src/modules/tool/context-external-tool/testing/context-external-tool-entity.factory.ts b/apps/server/src/modules/tool/context-external-tool/testing/context-external-tool-entity.factory.ts index ac39b2b401f..ffaa41ab061 100644 --- a/apps/server/src/modules/tool/context-external-tool/testing/context-external-tool-entity.factory.ts +++ b/apps/server/src/modules/tool/context-external-tool/testing/context-external-tool-entity.factory.ts @@ -1,7 +1,7 @@ import { CustomParameterEntryEntity } from '@modules/tool/common/entity'; import { ContextExternalToolEntity, - ContextExternalToolProperties, + ContextExternalToolEntityProps, ContextExternalToolType, } from '@modules/tool/context-external-tool/entity'; import { schoolExternalToolEntityFactory } from '@modules/tool/school-external-tool/testing/school-external-tool-entity.factory'; @@ -10,7 +10,7 @@ import { courseFactory } from '@shared/testing/factory/course.factory'; export const contextExternalToolEntityFactory = BaseFactory.define< ContextExternalToolEntity, - ContextExternalToolProperties + ContextExternalToolEntityProps >(ContextExternalToolEntity, () => { return { contextId: courseFactory.buildWithId().id, diff --git a/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool-configuration-status.entity.spec.ts b/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool-configuration-status.entity.spec.ts index ded662d34a6..87a3985ac31 100644 --- a/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool-configuration-status.entity.spec.ts +++ b/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool-configuration-status.entity.spec.ts @@ -1,5 +1,5 @@ import { setupEntities } from '@shared/testing'; -import { schoolExternalToolConfigurationStatusEntityFactory } from '@shared/testing/factory/school-external-tool-configuration-status-entity.factory'; +import { schoolExternalToolConfigurationStatusEntityFactory } from '../testing/school-external-tool-configuration-status-entity.factory'; import { SchoolExternalToolConfigurationStatusEntity } from './school-external-tool-configuration-status.entity'; describe('SchoolExternalToolConfigurationStatusEntity', () => { diff --git a/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool.entity.spec.ts b/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool.entity.spec.ts index 4e963743a72..191251b5f5c 100644 --- a/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool.entity.spec.ts +++ b/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool.entity.spec.ts @@ -1,9 +1,9 @@ import { basicToolConfigFactory, schoolEntityFactory, setupEntities } from '@shared/testing'; -import { schoolExternalToolConfigurationStatusEntityFactory } from '@shared/testing/factory/school-external-tool-configuration-status-entity.factory'; import { CustomParameterLocation, CustomParameterScope, CustomParameterType, ToolConfigType } from '../../common/enum'; import { CustomParameterEntity, ExternalToolConfigEntity, ExternalToolEntity } from '../../external-tool/entity'; import { customParameterEntityFactory, externalToolEntityFactory } from '../../external-tool/testing'; import { schoolExternalToolEntityFactory } from '../testing'; +import { schoolExternalToolConfigurationStatusEntityFactory } from '../testing/school-external-tool-configuration-status-entity.factory'; import { SchoolExternalToolEntity } from './school-external-tool.entity'; describe('SchoolExternalToolEntity', () => { diff --git a/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.spec.ts b/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.spec.ts index 61df16455ac..be49b4fb2ef 100644 --- a/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.spec.ts +++ b/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.spec.ts @@ -317,7 +317,7 @@ describe(SchoolExternalToolService.name, () => { await service.saveSchoolExternalTool(schoolExternalTool); - expect(schoolExternalToolRepo.createOrUpdate).toHaveBeenCalledWith(schoolExternalTool); + expect(schoolExternalToolRepo.save).toHaveBeenCalledWith(schoolExternalTool); }); it('should enrich data from externalTool', async () => { diff --git a/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.ts b/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.ts index 8c46de1a63c..0a05ceb5685 100644 --- a/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.ts +++ b/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.ts @@ -82,9 +82,7 @@ export class SchoolExternalToolService { } public async saveSchoolExternalTool(schoolExternalTool: SchoolExternalTool): Promise { - let createdSchoolExternalTool: SchoolExternalTool = await this.schoolExternalToolRepo.createOrUpdate( - schoolExternalTool - ); + let createdSchoolExternalTool: SchoolExternalTool = await this.schoolExternalToolRepo.save(schoolExternalTool); createdSchoolExternalTool = await this.enrichDataFromExternalTool(createdSchoolExternalTool); return createdSchoolExternalTool; diff --git a/apps/server/src/modules/tool/school-external-tool/testing/index.ts b/apps/server/src/modules/tool/school-external-tool/testing/index.ts index 55b1de1dbfa..2c15f549607 100644 --- a/apps/server/src/modules/tool/school-external-tool/testing/index.ts +++ b/apps/server/src/modules/tool/school-external-tool/testing/index.ts @@ -2,3 +2,4 @@ export { schoolExternalToolEntityFactory } from './school-external-tool-entity.f export { schoolExternalToolFactory } from './school-external-tool.factory'; export { schoolExternalToolConfigurationStatusFactory } from './school-external-tool-configuration-status.factory'; export { schoolExternalToolConfigurationStatusResponseFactory } from './school-external-tool-configuration-status-response.factory'; +export { schoolExternalToolConfigurationStatusEntityFactory } from './school-external-tool-configuration-status-entity.factory'; diff --git a/apps/server/src/shared/testing/factory/school-external-tool-configuration-status-entity.factory.ts b/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-configuration-status-entity.factory.ts similarity index 62% rename from apps/server/src/shared/testing/factory/school-external-tool-configuration-status-entity.factory.ts rename to apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-configuration-status-entity.factory.ts index eabba9658b3..73b02ad773d 100644 --- a/apps/server/src/shared/testing/factory/school-external-tool-configuration-status-entity.factory.ts +++ b/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-configuration-status-entity.factory.ts @@ -1,5 +1,5 @@ -import { SchoolExternalToolConfigurationStatusEntity } from '@modules/tool/school-external-tool/entity/school-external-tool-configuration-status.entity'; import { Factory } from 'fishery'; +import { SchoolExternalToolConfigurationStatusEntity } from '../entity/school-external-tool-configuration-status.entity'; export const schoolExternalToolConfigurationStatusEntityFactory = Factory.define(() => { diff --git a/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-entity.factory.ts b/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-entity.factory.ts index 003c2372730..a90ceafd0ba 100644 --- a/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-entity.factory.ts +++ b/apps/server/src/modules/tool/school-external-tool/testing/school-external-tool-entity.factory.ts @@ -2,7 +2,7 @@ import { externalToolEntityFactory } from '@modules/tool/external-tool/testing'; import { SchoolExternalToolEntity, SchoolExternalToolEntityProps } from '@modules/tool/school-external-tool/entity'; import { BaseFactory } from '@shared/testing/factory/base.factory'; import { schoolEntityFactory } from '@shared/testing/factory/school-entity.factory'; -import { schoolExternalToolConfigurationStatusEntityFactory } from '@shared/testing/factory/school-external-tool-configuration-status-entity.factory'; +import { schoolExternalToolConfigurationStatusEntityFactory } from './school-external-tool-configuration-status-entity.factory'; export const schoolExternalToolEntityFactory = BaseFactory.define< SchoolExternalToolEntity, diff --git a/apps/server/src/modules/tool/tool-launch/controller/api-test/tool-launch.controller.api.spec.ts b/apps/server/src/modules/tool/tool-launch/controller/api-test/tool-launch.controller.api.spec.ts index b04a56d2abf..766d1ed07b8 100644 --- a/apps/server/src/modules/tool/tool-launch/controller/api-test/tool-launch.controller.api.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/controller/api-test/tool-launch.controller.api.spec.ts @@ -13,7 +13,6 @@ import { TestApiClient, UserAndAccountTestFactory, } from '@shared/testing'; -import { schoolExternalToolConfigurationStatusEntityFactory } from '@shared/testing/factory/school-external-tool-configuration-status-entity.factory'; import { Response } from 'supertest'; import { CustomParameterLocation, CustomParameterScope, ToolConfigType } from '../../../common/enum'; import { ContextExternalToolEntity, ContextExternalToolType } from '../../../context-external-tool/entity'; @@ -22,6 +21,7 @@ import { ExternalToolEntity } from '../../../external-tool/entity'; import { externalToolEntityFactory } from '../../../external-tool/testing'; import { SchoolExternalToolEntity } from '../../../school-external-tool/entity'; import { schoolExternalToolEntityFactory } from '../../../school-external-tool/testing'; +import { schoolExternalToolConfigurationStatusEntityFactory } from '../../../school-external-tool/testing/school-external-tool-configuration-status-entity.factory'; import { LaunchRequestMethod } from '../../types'; import { ToolLaunchParams, ToolLaunchRequestResponse } from '../dto'; diff --git a/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.integration.spec.ts b/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.spec.ts similarity index 94% rename from apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.integration.spec.ts rename to apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.spec.ts index 3f19a93f47b..98b7e5e2814 100644 --- a/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.integration.spec.ts +++ b/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.spec.ts @@ -5,18 +5,21 @@ import { CustomParameterEntry } from '@modules/tool/common/domain'; import { ToolContextType } from '@modules/tool/common/enum'; import { ContextExternalTool, ContextExternalToolProps } from '@modules/tool/context-external-tool/domain'; import { ContextExternalToolEntity, ContextExternalToolType } from '@modules/tool/context-external-tool/entity'; -import { contextExternalToolEntityFactory } from '@modules/tool/context-external-tool/testing'; +import { + contextExternalToolEntityFactory, + contextExternalToolFactory, +} from '@modules/tool/context-external-tool/testing'; import { ContextExternalToolQuery } from '@modules/tool/context-external-tool/uc/dto/context-external-tool.types'; import { SchoolExternalToolEntity } from '@modules/tool/school-external-tool/entity'; import { schoolExternalToolEntityFactory } from '@modules/tool/school-external-tool/testing'; import { Test, TestingModule } from '@nestjs/testing'; import { SchoolEntity } from '@shared/domain/entity'; import { ExternalToolRepoMapper } from '@shared/repo/externaltool/external-tool.repo.mapper'; -import { cleanupCollections, contextExternalToolFactory, schoolEntityFactory } from '@shared/testing'; import { LegacyLogger } from '@src/core/logger'; +import { cleanupCollections, schoolEntityFactory } from '../../testing'; import { ContextExternalToolRepo } from './context-external-tool.repo'; -describe('ContextExternalToolRepo', () => { +describe(ContextExternalToolRepo.name, () => { let module: TestingModule; let repo: ContextExternalToolRepo; let em: EntityManager; @@ -136,7 +139,6 @@ describe('ContextExternalToolRepo', () => { schoolToolId: new ObjectId().toHexString(), schoolId: undefined, }, - toolVersion: 1, }); return { @@ -144,7 +146,7 @@ describe('ContextExternalToolRepo', () => { }; } - it('should save a ContextExternalToolDO', async () => { + it('should save a ContextExternalTool', async () => { const { domainObject } = setup(); const { id, ...expected } = domainObject; @@ -168,7 +170,6 @@ describe('ContextExternalToolRepo', () => { schoolToolId: new ObjectId().toHexString(), schoolId: undefined, }, - toolVersion: 1, }); return { @@ -176,7 +177,7 @@ describe('ContextExternalToolRepo', () => { }; } - it('should save a ContextExternalToolDO', async () => { + it('should save a ContextExternalTool', async () => { const { domainObject } = setup(); const { id, ...expected } = domainObject; @@ -199,7 +200,6 @@ describe('ContextExternalToolRepo', () => { schoolToolRef: { schoolToolId: new ObjectId().toHexString(), }, - toolVersion: 1, }); return { @@ -366,9 +366,9 @@ describe('ContextExternalToolRepo', () => { it('should return a context external tool', async () => { const { contextExternalTool, schoolExternalTool } = await setup(); - const result = await repo.findById(contextExternalTool.id); + const result: ContextExternalTool = await repo.findById(contextExternalTool.id); - expect(result).toEqual({ + expect(result.getProps()).toEqual({ id: contextExternalTool.id, contextRef: { id: contextExternalTool.contextId, @@ -385,7 +385,6 @@ describe('ContextExternalToolRepo', () => { schoolToolId: schoolExternalTool.id, schoolId: schoolExternalTool.school.id, }, - toolVersion: contextExternalTool.toolVersion, }); }); }); @@ -411,9 +410,9 @@ describe('ContextExternalToolRepo', () => { it('should return a context external tool', async () => { const { contextExternalTool, schoolExternalTool } = await setup(); - const result = await repo.findByIdOrNull(contextExternalTool.id); + const result: ContextExternalTool | null = await repo.findByIdOrNull(contextExternalTool.id); - expect(result).toEqual({ + expect(result?.getProps()).toEqual({ id: contextExternalTool.id, contextRef: { id: contextExternalTool.contextId, @@ -430,7 +429,6 @@ describe('ContextExternalToolRepo', () => { schoolToolId: schoolExternalTool.id, schoolId: schoolExternalTool.school.id, }, - toolVersion: contextExternalTool.toolVersion, }); }); }); diff --git a/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts b/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts index fa87448dc2c..20d9027bd63 100644 --- a/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts +++ b/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts @@ -1,59 +1,99 @@ -import { EntityData, EntityName } from '@mikro-orm/core'; +import { EntityName, Primary, Utils } from '@mikro-orm/core'; import { EntityManager } from '@mikro-orm/mongodb'; import { ToolContextType } from '@modules/tool/common/enum/tool-context-type.enum'; import { ContextExternalTool, ContextRef } from '@modules/tool/context-external-tool/domain'; -import { ContextExternalToolEntity, ContextExternalToolType } from '@modules/tool/context-external-tool/entity'; +import { + ContextExternalToolEntity, + ContextExternalToolEntityProps, + ContextExternalToolType, +} from '@modules/tool/context-external-tool/entity'; import { ContextExternalToolQuery } from '@modules/tool/context-external-tool/uc/dto/context-external-tool.types'; import { SchoolExternalToolRef } from '@modules/tool/school-external-tool/domain'; import { SchoolExternalToolEntity } from '@modules/tool/school-external-tool/entity'; -import { Injectable } from '@nestjs/common'; +import { Injectable, InternalServerErrorException } from '@nestjs/common'; import { EntityId } from '@shared/domain/types'; -import { BaseDORepo } from '@shared/repo'; -import { LegacyLogger } from '@src/core/logger'; import { ExternalToolRepoMapper } from '../externaltool'; import { ContextExternalToolScope } from './context-external-tool.scope'; @Injectable() -export class ContextExternalToolRepo extends BaseDORepo { - constructor(protected readonly _em: EntityManager, protected readonly logger: LegacyLogger) { - super(_em, logger); - } +export class ContextExternalToolRepo { + constructor(protected readonly em: EntityManager) {} get entityName(): EntityName { return ContextExternalToolEntity; } async deleteBySchoolExternalToolIds(schoolExternalToolIds: string[]): Promise { - const count: Promise = this._em.nativeDelete(this.entityName, { + const count: Promise = this.em.nativeDelete(this.entityName, { schoolTool: { $in: schoolExternalToolIds }, }); return count; } - async find(query: ContextExternalToolQuery): Promise { + public async save(domainObject: ContextExternalTool): Promise { + const existing: ContextExternalToolEntity | null = await this.em.findOne( + ContextExternalToolEntity.name, + domainObject.id + ); + + const entityProps: ContextExternalToolEntityProps = this.mapDomainObjectToEntityProps(domainObject); + let entity: ContextExternalToolEntity = new ContextExternalToolEntity(entityProps); + + if (existing) { + entity = this.em.assign(existing, entity); + } else { + this.em.persist(entity); + } + await this.em.flush(); + + const savedDomainObject: ContextExternalTool = Object.assign(this.mapEntityToDomainObject(entity), { + ...domainObject, + }); + + return savedDomainObject; + } + + public async delete(domainObjects: ContextExternalTool | ContextExternalTool[]): Promise { + const ids: Primary[] = Utils.asArray(domainObjects).map((dob) => { + if (!dob.id) { + throw new InternalServerErrorException('Cannot delete object without id'); + } + return dob.id; + }); + + const entities: ContextExternalToolEntity[] = ids.map((id) => this.em.getReference(this.entityName, id)); + + await this.em.remove(entities).flush(); + } + + public async find(query: ContextExternalToolQuery): Promise { const scope: ContextExternalToolScope = this.buildScope(query); - const entities: ContextExternalToolEntity[] = await this._em.find(this.entityName, scope.query, { + const entities: ContextExternalToolEntity[] = await this.em.find(this.entityName, scope.query, { populate: ['schoolTool.school'], }); - const dos: ContextExternalTool[] = entities.map((entity: ContextExternalToolEntity) => this.mapEntityToDO(entity)); + const dos: ContextExternalTool[] = entities.map((entity: ContextExternalToolEntity) => + this.mapEntityToDomainObject(entity) + ); return dos; } - async findBySchoolToolIdsAndContextType( + public async findBySchoolToolIdsAndContextType( schoolExternalToolIds: string[], contextType: ContextExternalToolType ): Promise { - const entities = await this._em.find(this.entityName, { schoolTool: { $in: schoolExternalToolIds }, contextType }); + const entities = await this.em.find(this.entityName, { schoolTool: { $in: schoolExternalToolIds }, contextType }); - const dos: ContextExternalTool[] = entities.map((entity: ContextExternalToolEntity) => this.mapEntityToDO(entity)); + const dos: ContextExternalTool[] = entities.map((entity: ContextExternalToolEntity) => + this.mapEntityToDomainObject(entity) + ); return dos; } - public override async findById(id: EntityId): Promise { - const entity: ContextExternalToolEntity = await this._em.findOneOrFail( + public async findById(id: EntityId): Promise { + const entity: ContextExternalToolEntity = await this.em.findOneOrFail( this.entityName, { id }, { @@ -61,13 +101,13 @@ export class ContextExternalToolRepo extends BaseDORepo { - const entity: ContextExternalToolEntity | null = await this._em.findOne( + const entity: ContextExternalToolEntity | null = await this.em.findOne( this.entityName, { id }, { @@ -79,7 +119,7 @@ export class ContextExternalToolRepo extends BaseDORepo { + private mapDomainObjectToEntityProps(entityDO: ContextExternalTool): ContextExternalToolEntityProps { return { contextId: entityDO.contextRef.id, contextType: this.mapContextTypeToEntityType(entityDO.contextRef.type), displayName: entityDO.displayName, - schoolTool: this._em.getReference(SchoolExternalToolEntity, entityDO.schoolToolRef.schoolToolId), + schoolTool: this.em.getReference(SchoolExternalToolEntity, entityDO.schoolToolRef.schoolToolId), parameters: ExternalToolRepoMapper.mapCustomParameterEntryDOsToEntities(entityDO.parameters), }; } @@ -139,7 +179,7 @@ export class ContextExternalToolRepo extends BaseDORepo { @@ -144,7 +143,7 @@ describe(SchoolExternalToolRepo.name, () => { }); }); - describe('createOrUpdate', () => { + describe('save', () => { const setup = () => { const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ school: schoolEntityFactory.buildWithId(), @@ -170,7 +169,7 @@ describe(SchoolExternalToolRepo.name, () => { const { domainObject } = setup(); const { id, ...expected } = domainObject; - const result: SchoolExternalTool = await repo.createOrUpdate(domainObject); + const result: SchoolExternalTool = await repo.save(domainObject); expect(result).toMatchObject(expected); expect(result.id).toBeDefined(); diff --git a/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.ts b/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.ts index 46a79e1ade7..39f9ce92c82 100644 --- a/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.ts +++ b/apps/server/src/shared/repo/schoolexternaltool/school-external-tool.repo.ts @@ -18,7 +18,7 @@ export class SchoolExternalToolRepo { return SchoolExternalToolEntity; } - public async createOrUpdate(domainObject: SchoolExternalTool): Promise { + public async save(domainObject: SchoolExternalTool): Promise { const existing: SchoolExternalToolEntity | null = await this.em.findOne( SchoolExternalToolEntity.name, domainObject.id @@ -34,7 +34,9 @@ export class SchoolExternalToolRepo { } await this.em.flush(); - const savedDomainObject: SchoolExternalTool = this.mapEntityToDomainObject(entity); + const savedDomainObject: SchoolExternalTool = Object.assign(this.mapEntityToDomainObject(entity), { + ...domainObject, + }); return savedDomainObject; } @@ -108,6 +110,7 @@ export class SchoolExternalToolRepo { private mapDomainObjectToEntityProps(entityDO: SchoolExternalTool): SchoolExternalToolEntityProps { return { + id: entityDO.id, school: this.em.getReference(SchoolEntity, entityDO.schoolId), tool: this.em.getReference(ExternalToolEntity, entityDO.toolId), schoolParameters: ExternalToolRepoMapper.mapCustomParameterEntryDOsToEntities(entityDO.parameters), From b2ee8c6de4f7d2040d2d7d2841743e45c8f88262 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Wed, 15 May 2024 13:03:51 +0200 Subject: [PATCH 07/26] N21-1885 updates imports for linter --- .../modules/board/repo/board-do.repo.spec.ts | 6 ++- .../repo/recursive-delete.visitor.spec.ts | 2 +- .../board-do-copy.service.spec.ts | 6 +-- .../service/content-element.service.spec.ts | 2 +- .../media-available-line.service.spec.ts | 15 ++---- .../media-board/media-element.service.spec.ts | 32 ++++++------ .../media-available-line.uc.spec.ts | 4 +- .../uc/media-board/media-element.uc.spec.ts | 22 ++++----- .../service/id-token.service.spec.ts | 3 +- .../oauth-provider.login-flow.service.spec.ts | 3 +- .../uc/oauth-provider.login-flow.uc.spec.ts | 10 +--- .../service/feathers-roster.service.spec.ts | 24 ++++----- .../service/pseudonym.service.spec.ts | 21 ++++---- ...y-value-missing.loggable-exception.spec.ts | 2 +- ...r-type-mismatch.loggable-exception.spec.ts | 2 +- ...ter-value-regex.loggable-exception.spec.ts | 2 +- .../service/common-tool.service.spec.ts | 2 +- .../common-tool-validation.service.spec.ts | 9 ++-- .../parameter-array-entry-validator.spec.ts | 4 +- ...ameter-array-unknown-key-validator.spec.ts | 2 +- .../parameter-entry-regex-validator.spec.ts | 2 +- .../parameter-entry-type-validator.spec.ts | 2 +- .../common/uc/tool-permission-helper.spec.ts | 6 +-- .../api-test/tool-reference.api.spec.ts | 11 +---- ...external-tool-authorizable.service.spec.ts | 12 +++-- .../tool-configuration-status.service.spec.ts | 49 +++++++++---------- .../service/tool-reference.service.spec.ts | 14 ++---- .../uc/context-external-tool.uc.spec.ts | 45 ++++++++--------- .../uc/tool-reference.uc.spec.ts | 7 +-- .../api-test/tool-configuration.api.spec.ts | 9 +--- .../controller/api-test/tool.api.spec.ts | 9 ++-- .../domain/external-tool.do.spec.ts | 7 +-- .../external-tool-datasheet.mapper.spec.ts | 16 +++--- .../external-tool-request.mapper.spec.ts | 20 +++----- .../external-tool-response.mapper.spec.ts | 20 +++----- .../service/datasheet-pdf.service.spec.ts | 8 +-- ...xternal-tool-configuration.service.spec.ts | 3 +- .../external-tool-logo-service.spec.ts | 11 +++-- ...-tool-parameter-validation.service.spec.ts | 5 +- .../external-tool-validation.service.spec.ts | 12 ++--- .../service/external-tool.service.spec.ts | 10 ++-- .../tool/external-tool/testing/index.ts | 9 +++- .../uc/external-tool-configuration.uc.spec.ts | 27 ++++------ .../external-tool/uc/external-tool.uc.spec.ts | 28 +++++------ .../school-external-tool.entity.spec.ts | 15 +++--- ...chool-external-tool-request.mapper.spec.ts | 16 +++--- ...l-external-tool-validation.service.spec.ts | 7 +-- .../school-external-tool.service.spec.ts | 6 +-- .../tool-launch.controller.api.spec.ts | 36 +++++--------- ...parameter-value.loggable-exception.spec.ts | 7 +-- ...-not-launchable.loggable-exception.spec.ts | 2 +- .../auto-context-id.strategy.spec.ts | 5 +- .../auto-context-name.strategy.spec.ts | 11 ++--- .../auto-medium-id.strategy.spec.ts | 4 +- .../auto-school-id.strategy.spec.ts | 5 +- .../auto-school-number.strategy.spec.ts | 8 +-- .../abstract-launch.strategy.spec.ts | 11 ++--- .../basic-tool-launch.strategy.spec.ts | 4 +- .../lti11-tool-launch.strategy.spec.ts | 16 +++--- .../service/tool-launch.service.spec.ts | 25 +++++----- 60 files changed, 313 insertions(+), 380 deletions(-) diff --git a/apps/server/src/modules/board/repo/board-do.repo.spec.ts b/apps/server/src/modules/board/repo/board-do.repo.spec.ts index 08a8d107862..aff55ac0609 100644 --- a/apps/server/src/modules/board/repo/board-do.repo.spec.ts +++ b/apps/server/src/modules/board/repo/board-do.repo.spec.ts @@ -6,7 +6,10 @@ import { CollaborativeTextEditorService } from '@modules/collaborative-text-edit import { FilesStorageClientAdapterService } from '@modules/files-storage-client'; import { DrawingElementAdapterService } from '@modules/tldraw-client'; import { ContextExternalToolService } from '@modules/tool/context-external-tool/service'; -import { contextExternalToolEntityFactory } from '@modules/tool/context-external-tool/testing'; +import { + contextExternalToolEntityFactory, + contextExternalToolFactory, +} from '@modules/tool/context-external-tool/testing'; import { NotFoundException } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { @@ -33,7 +36,6 @@ import { columnBoardNodeFactory, columnFactory, columnNodeFactory, - contextExternalToolFactory, courseFactory, externalToolElementNodeFactory, fileElementFactory, diff --git a/apps/server/src/modules/board/repo/recursive-delete.visitor.spec.ts b/apps/server/src/modules/board/repo/recursive-delete.visitor.spec.ts index e0373dad5d2..7a4acaf96ab 100644 --- a/apps/server/src/modules/board/repo/recursive-delete.visitor.spec.ts +++ b/apps/server/src/modules/board/repo/recursive-delete.visitor.spec.ts @@ -5,12 +5,12 @@ import { CollaborativeTextEditorService } from '@modules/collaborative-text-edit import { FileDto, FilesStorageClientAdapterService } from '@modules/files-storage-client'; import { DrawingElementAdapterService } from '@modules/tldraw-client'; import { ContextExternalToolService } from '@modules/tool/context-external-tool/service'; +import { contextExternalToolFactory } from '@modules/tool/context-external-tool/testing'; import { Test, TestingModule } from '@nestjs/testing'; import { collaborativeTextEditorElementFactory, columnBoardFactory, columnFactory, - contextExternalToolFactory, drawingElementFactory, externalToolElementFactory, fileElementFactory, diff --git a/apps/server/src/modules/board/service/board-do-copy-service/board-do-copy.service.spec.ts b/apps/server/src/modules/board/service/board-do-copy-service/board-do-copy.service.spec.ts index d3417a587cc..2a2da5f0e08 100644 --- a/apps/server/src/modules/board/service/board-do-copy-service/board-do-copy.service.spec.ts +++ b/apps/server/src/modules/board/service/board-do-copy-service/board-do-copy.service.spec.ts @@ -1,8 +1,11 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { FileRecordParentType } from '@infra/rabbitmq'; +import { ObjectId } from '@mikro-orm/mongodb'; import { CopyElementType, CopyStatus, CopyStatusEnum } from '@modules/copy-helper'; import { ContextExternalTool } from '@modules/tool/context-external-tool/domain'; import { ContextExternalToolService } from '@modules/tool/context-external-tool/service'; +import { contextExternalToolFactory } from '@modules/tool/context-external-tool/testing'; +import { ToolFeatures } from '@modules/tool/tool-config'; import { Test, TestingModule } from '@nestjs/testing'; import { Card, @@ -28,7 +31,6 @@ import { cardFactory, columnBoardFactory, columnFactory, - contextExternalToolFactory, drawingElementFactory, externalToolElementFactory, fileElementFactory, @@ -38,8 +40,6 @@ import { submissionContainerElementFactory, submissionItemFactory, } from '@shared/testing'; -import { ObjectId } from '@mikro-orm/mongodb'; -import { ToolFeatures } from '@modules/tool/tool-config'; import { BoardDoCopyService } from './board-do-copy.service'; import { SchoolSpecificFileCopyService } from './school-specific-file-copy.interface'; diff --git a/apps/server/src/modules/board/service/content-element.service.spec.ts b/apps/server/src/modules/board/service/content-element.service.spec.ts index 5849debb8da..cacd9a9a80d 100644 --- a/apps/server/src/modules/board/service/content-element.service.spec.ts +++ b/apps/server/src/modules/board/service/content-element.service.spec.ts @@ -12,7 +12,6 @@ import { import { InputFormat } from '@shared/domain/types'; import { cardFactory, - contextExternalToolFactory, drawingElementFactory, fileElementFactory, linkElementFactory, @@ -20,6 +19,7 @@ import { setupEntities, submissionContainerElementFactory, } from '@shared/testing'; +import { contextExternalToolFactory } from '@src/modules/tool/context-external-tool/testing'; import { DrawingContentBody, FileContentBody, diff --git a/apps/server/src/modules/board/service/media-board/media-available-line.service.spec.ts b/apps/server/src/modules/board/service/media-board/media-available-line.service.spec.ts index a1d4d64deef..9ba9f9d0dfd 100644 --- a/apps/server/src/modules/board/service/media-board/media-available-line.service.spec.ts +++ b/apps/server/src/modules/board/service/media-board/media-available-line.service.spec.ts @@ -3,22 +3,17 @@ import { ExternalToolService } from '@modules/tool'; import { CustomParameterScope, ToolContextType } from '@modules/tool/common/enum'; import { ContextExternalToolService } from '@modules/tool/context-external-tool'; import { ContextExternalTool } from '@modules/tool/context-external-tool/domain'; +import { contextExternalToolFactory } from '@modules/tool/context-external-tool/testing'; import { ExternalTool } from '@modules/tool/external-tool/domain'; import { ExternalToolLogoService } from '@modules/tool/external-tool/service'; +import { externalToolFactory } from '@modules/tool/external-tool/testing'; import { SchoolExternalToolService } from '@modules/tool/school-external-tool'; import { SchoolExternalTool } from '@modules/tool/school-external-tool/domain'; +import { schoolExternalToolFactory } from '@modules/tool/school-external-tool/testing'; import { Test, TestingModule } from '@nestjs/testing'; import { MediaAvailableLine, MediaBoard, MediaExternalToolElement, Page } from '@shared/domain/domainobject'; import { User } from '@shared/domain/entity'; -import { - contextExternalToolFactory, - externalToolFactory, - mediaBoardFactory, - mediaExternalToolElementFactory, - schoolExternalToolFactory, - setupEntities, - userFactory, -} from '@shared/testing'; +import { mediaBoardFactory, mediaExternalToolElementFactory, setupEntities, userFactory } from '@shared/testing'; import { MediaAvailableLineService } from './media-available-line.service'; describe(MediaAvailableLineService.name, () => { @@ -82,7 +77,7 @@ describe(MediaAvailableLineService.name, () => { .buildWithId(); const usedContextExternalTool: ContextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(usedSchoolExternalTool.id as string, user.school.id) + .withSchoolExternalToolRef(usedSchoolExternalTool.id, user.school.id) .buildWithId(); const mediaExternalToolElement: MediaExternalToolElement = mediaExternalToolElementFactory.build({ diff --git a/apps/server/src/modules/board/service/media-board/media-element.service.spec.ts b/apps/server/src/modules/board/service/media-board/media-element.service.spec.ts index 1d58166380f..f243937f880 100644 --- a/apps/server/src/modules/board/service/media-board/media-element.service.spec.ts +++ b/apps/server/src/modules/board/service/media-board/media-element.service.spec.ts @@ -1,17 +1,17 @@ import { createMock, type DeepMocked } from '@golevelup/ts-jest'; import { ObjectId } from '@mikro-orm/mongodb'; import { ToolContextType } from '@modules/tool/common/enum'; -import type { ContextExternalToolWithId } from '@modules/tool/context-external-tool/domain'; +import { ContextExternalTool } from '@modules/tool/context-external-tool/domain'; import { ContextExternalToolService } from '@modules/tool/context-external-tool/service'; -import { SchoolExternalToolWithId } from '@modules/tool/school-external-tool/domain'; +import { contextExternalToolFactory } from '@modules/tool/context-external-tool/testing'; +import { SchoolExternalTool } from '@modules/tool/school-external-tool/domain'; +import { schoolExternalToolFactory } from '@modules/tool/school-external-tool/testing'; import { NotFoundException } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { - contextExternalToolFactory, mediaBoardFactory, mediaExternalToolElementFactory, mediaLineFactory, - schoolExternalToolFactory, setupEntities, userFactory, } from '@shared/testing'; @@ -106,14 +106,12 @@ describe(MediaElementService.name, () => { describe('when creating a new context external tool', () => { const setup = () => { const user = userFactory.build(); - const schoolExternalTool = schoolExternalToolFactory - .withSchoolId(user.school.id) - .build() as SchoolExternalToolWithId; + const schoolExternalTool: SchoolExternalTool = schoolExternalToolFactory.withSchoolId(user.school.id).build(); const mediaBoard = mediaBoardFactory.build(); - const contextExternalTool = contextExternalToolFactory + const contextExternalTool: ContextExternalTool = contextExternalToolFactory .withSchoolExternalToolRef(schoolExternalTool.id, user.school.id) .withContextRef(mediaBoard.id, ToolContextType.MEDIA_BOARD) - .buildWithId() as ContextExternalToolWithId; + .buildWithId(); contextExternalToolService.saveContextExternalTool.mockResolvedValueOnce(contextExternalTool); @@ -141,7 +139,6 @@ describe(MediaElementService.name, () => { id: mediaBoard.id, type: ToolContextType.MEDIA_BOARD, }, - toolVersion: contextExternalTool.toolVersion, parameters: contextExternalTool.parameters, }); }); @@ -160,7 +157,6 @@ describe(MediaElementService.name, () => { id: mediaBoard.id, type: ToolContextType.MEDIA_BOARD, }, - toolVersion: 0, parameters: [], }); }); @@ -171,7 +167,7 @@ describe(MediaElementService.name, () => { describe('when creating a new element', () => { const setup = () => { const line = mediaLineFactory.build(); - const contextExternalTool = contextExternalToolFactory.buildWithId() as ContextExternalToolWithId; + const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId(); return { line, @@ -250,8 +246,10 @@ describe(MediaElementService.name, () => { describe('checkElementExists', () => { describe('when an element exists', () => { const setup = () => { - const schoolExternalTool = schoolExternalToolFactory.buildWithId() as SchoolExternalToolWithId; - const contextExternalTool = contextExternalToolFactory.withSchoolExternalToolRef(schoolExternalTool.id).build(); + const schoolExternalTool: SchoolExternalTool = schoolExternalToolFactory.buildWithId(); + const contextExternalTool: ContextExternalTool = contextExternalToolFactory + .withSchoolExternalToolRef(schoolExternalTool.id) + .build(); const element = mediaExternalToolElementFactory.build({ contextExternalToolId: contextExternalTool.id }); const line = mediaLineFactory.addChild(element).build(); const mediaBoard = mediaBoardFactory.addChild(line).build(); @@ -275,8 +273,10 @@ describe(MediaElementService.name, () => { describe('when an element does not exist', () => { const setup = () => { - const schoolExternalTool = schoolExternalToolFactory.buildWithId() as SchoolExternalToolWithId; - const contextExternalTool = contextExternalToolFactory.withSchoolExternalToolRef(schoolExternalTool.id).build(); + const schoolExternalTool: SchoolExternalTool = schoolExternalToolFactory.buildWithId(); + const contextExternalTool: ContextExternalTool = contextExternalToolFactory + .withSchoolExternalToolRef(schoolExternalTool.id) + .build(); const element = mediaExternalToolElementFactory.build({ contextExternalToolId: new ObjectId().toHexString() }); const line = mediaLineFactory.addChild(element).build(); const mediaBoard = mediaBoardFactory.addChild(line).build(); diff --git a/apps/server/src/modules/board/uc/media-board/media-available-line.uc.spec.ts b/apps/server/src/modules/board/uc/media-board/media-available-line.uc.spec.ts index 981fc0bb9e8..6f5e9eebad3 100644 --- a/apps/server/src/modules/board/uc/media-board/media-available-line.uc.spec.ts +++ b/apps/server/src/modules/board/uc/media-board/media-available-line.uc.spec.ts @@ -2,7 +2,9 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { ObjectId } from '@mikro-orm/mongodb'; import { AuthorizationService } from '@modules/authorization'; import { ExternalTool } from '@modules/tool/external-tool/domain'; +import { externalToolFactory } from '@modules/tool/external-tool/testing'; import { SchoolExternalTool } from '@modules/tool/school-external-tool/domain'; +import { schoolExternalToolFactory } from '@modules/tool/school-external-tool/testing'; import { MediaUserLicense, mediaUserLicenseFactory, UserLicenseService } from '@modules/user-license'; import { MediaUserLicenseService } from '@modules/user-license/service'; import { ConfigService } from '@nestjs/config'; @@ -18,12 +20,10 @@ import { import { User } from '@shared/domain/entity'; import { boardDoAuthorizableFactory, - externalToolFactory, mediaAvailableLineElementFactory, mediaAvailableLineFactory, mediaBoardFactory, mediaExternalToolElementFactory, - schoolExternalToolFactory, setupEntities, userFactory, } from '@shared/testing'; diff --git a/apps/server/src/modules/board/uc/media-board/media-element.uc.spec.ts b/apps/server/src/modules/board/uc/media-board/media-element.uc.spec.ts index 8b063eb87da..12588e46c60 100644 --- a/apps/server/src/modules/board/uc/media-board/media-element.uc.spec.ts +++ b/apps/server/src/modules/board/uc/media-board/media-element.uc.spec.ts @@ -1,19 +1,19 @@ import { createMock, type DeepMocked } from '@golevelup/ts-jest'; -import { ContextExternalToolWithId } from '@modules//tool/context-external-tool/domain'; import { AuthorizationContextBuilder, AuthorizationService } from '@modules/authorization'; +import { ContextExternalTool } from '@modules/tool/context-external-tool/domain'; +import { contextExternalToolFactory } from '@modules/tool/context-external-tool/testing'; import { SchoolExternalToolService } from '@modules/tool/school-external-tool'; -import { SchoolExternalToolWithId } from '@modules/tool/school-external-tool/domain'; +import { SchoolExternalTool } from '@modules/tool/school-external-tool/domain'; +import { schoolExternalToolFactory } from '@modules/tool/school-external-tool/testing'; import { ConfigService } from '@nestjs/config'; import { Test, TestingModule } from '@nestjs/testing'; import { FeatureDisabledLoggableException } from '@shared/common/loggable-exception'; import { MediaExternalToolElement } from '@shared/domain/domainobject'; import { boardDoAuthorizableFactory, - contextExternalToolFactory, mediaBoardFactory, mediaExternalToolElementFactory, mediaLineFactory, - schoolExternalToolFactory, setupEntities, userFactory as userEntityFactory, } from '@shared/testing'; @@ -164,11 +164,10 @@ describe(MediaElementUc.name, () => { const mediaBoard = mediaBoardFactory.build(); const mediaLine = mediaLineFactory.build(); const mediaElement = mediaExternalToolElementFactory.build(); - const schoolExternalTool: SchoolExternalToolWithId = - schoolExternalToolFactory.buildWithId() as SchoolExternalToolWithId; - const contextExternalTool: ContextExternalToolWithId = contextExternalToolFactory + const schoolExternalTool: SchoolExternalTool = schoolExternalToolFactory.buildWithId(); + const contextExternalTool: ContextExternalTool = contextExternalToolFactory .withSchoolExternalToolRef(schoolExternalTool.id, user.school.id) - .buildWithId() as ContextExternalToolWithId; + .buildWithId(); const boardDoAuthorizable = boardDoAuthorizableFactory.build(); configService.get.mockReturnValueOnce(true); @@ -235,11 +234,10 @@ describe(MediaElementUc.name, () => { const mediaBoard = mediaBoardFactory.build(); const mediaLine = mediaLineFactory.build(); const mediaElement = mediaExternalToolElementFactory.build(); - const schoolExternalTool: SchoolExternalToolWithId = - schoolExternalToolFactory.buildWithId() as SchoolExternalToolWithId; - const contextExternalTool: ContextExternalToolWithId = contextExternalToolFactory + const schoolExternalTool: SchoolExternalTool = schoolExternalToolFactory.buildWithId(); + const contextExternalTool: ContextExternalTool = contextExternalToolFactory .withSchoolExternalToolRef(schoolExternalTool.id, user.school.id) - .buildWithId() as ContextExternalToolWithId; + .buildWithId(); const boardDoAuthorizable = boardDoAuthorizableFactory.build(); configService.get.mockReturnValueOnce(true); diff --git a/apps/server/src/modules/oauth-provider/service/id-token.service.spec.ts b/apps/server/src/modules/oauth-provider/service/id-token.service.spec.ts index 4a58a3e8336..703590b142a 100644 --- a/apps/server/src/modules/oauth-provider/service/id-token.service.spec.ts +++ b/apps/server/src/modules/oauth-provider/service/id-token.service.spec.ts @@ -4,12 +4,13 @@ import { OauthScope } from '@modules/oauth-provider/interface/oauth-scope.enum'; import { IdTokenService } from '@modules/oauth-provider/service/id-token.service'; import { PseudonymService } from '@modules/pseudonym/service'; import { ExternalTool } from '@modules/tool/external-tool/domain'; +import { externalToolFactory } from '@modules/tool/external-tool/testing'; import { UserService } from '@modules/user/service/user.service'; import { Test, TestingModule } from '@nestjs/testing'; import { Pseudonym, UserDO } from '@shared/domain/domainobject'; import { TeamEntity } from '@shared/domain/entity'; import { TeamsRepo } from '@shared/repo'; -import { externalToolFactory, pseudonymFactory, setupEntities, userDoFactory } from '@shared/testing'; +import { pseudonymFactory, setupEntities, userDoFactory } from '@shared/testing'; import { teamFactory } from '@shared/testing/factory/team.factory'; import { IdTokenCreationLoggableException } from '../error/id-token-creation-exception.loggable'; import { OauthProviderLoginFlowService } from './oauth-provider.login-flow.service'; diff --git a/apps/server/src/modules/oauth-provider/service/oauth-provider.login-flow.service.spec.ts b/apps/server/src/modules/oauth-provider/service/oauth-provider.login-flow.service.spec.ts index b25709dbb69..df118628596 100644 --- a/apps/server/src/modules/oauth-provider/service/oauth-provider.login-flow.service.spec.ts +++ b/apps/server/src/modules/oauth-provider/service/oauth-provider.login-flow.service.spec.ts @@ -2,11 +2,12 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { LtiToolService } from '@modules/lti-tool'; import { ExternalTool } from '@modules/tool/external-tool/domain'; import { ExternalToolService } from '@modules/tool/external-tool/service'; +import { externalToolFactory } from '@modules/tool/external-tool/testing'; import { IToolFeatures, ToolFeatures } from '@modules/tool/tool-config'; import { NotFoundException } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { LtiToolDO } from '@shared/domain/domainobject'; -import { externalToolFactory, ltiToolDOFactory, setupEntities } from '@shared/testing'; +import { ltiToolDOFactory, setupEntities } from '@shared/testing'; import { OauthProviderLoginFlowService } from './oauth-provider.login-flow.service'; describe('OauthProviderLoginFlowService', () => { diff --git a/apps/server/src/modules/oauth-provider/uc/oauth-provider.login-flow.uc.spec.ts b/apps/server/src/modules/oauth-provider/uc/oauth-provider.login-flow.uc.spec.ts index 8133b73aae2..87d7164e88e 100644 --- a/apps/server/src/modules/oauth-provider/uc/oauth-provider.login-flow.uc.spec.ts +++ b/apps/server/src/modules/oauth-provider/uc/oauth-provider.login-flow.uc.spec.ts @@ -4,19 +4,13 @@ import { ProviderLoginResponse, ProviderRedirectResponse } from '@infra/oauth-pr import { AuthorizationService } from '@modules/authorization'; import { PseudonymService } from '@modules/pseudonym'; import { ExternalTool } from '@modules/tool/external-tool/domain'; +import { externalToolFactory } from '@modules/tool/external-tool/testing'; import { UserService } from '@modules/user'; import { InternalServerErrorException, UnprocessableEntityException } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { LtiToolDO, Pseudonym, UserDO } from '@shared/domain/domainobject'; import { Permission } from '@shared/domain/interface'; -import { - externalToolFactory, - ltiToolDOFactory, - pseudonymFactory, - setupEntities, - userDoFactory, - userFactory, -} from '@shared/testing'; +import { ltiToolDOFactory, pseudonymFactory, setupEntities, userDoFactory, userFactory } from '@shared/testing'; import { AcceptQuery, LoginRequestBody, OAuthRejectableBody } from '../controller/dto'; import { OauthProviderLoginFlowService } from '../service/oauth-provider.login-flow.service'; import { OauthProviderLoginFlowUc } from './oauth-provider.login-flow.uc'; diff --git a/apps/server/src/modules/pseudonym/service/feathers-roster.service.spec.ts b/apps/server/src/modules/pseudonym/service/feathers-roster.service.spec.ts index aca9784660e..9785d1baed5 100644 --- a/apps/server/src/modules/pseudonym/service/feathers-roster.service.spec.ts +++ b/apps/server/src/modules/pseudonym/service/feathers-roster.service.spec.ts @@ -1,14 +1,18 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { DatabaseObjectNotFoundException } from '@mikro-orm/core'; +import { ObjectId } from '@mikro-orm/mongodb'; import { CourseService } from '@modules/learnroom/service/course.service'; import { ToolContextType } from '@modules/tool/common/enum'; import { ContextExternalTool, ContextRef } from '@modules/tool/context-external-tool/domain'; import { ContextExternalToolService } from '@modules/tool/context-external-tool/service'; +import { contextExternalToolFactory } from '@modules/tool/context-external-tool/testing'; import { ExternalTool } from '@modules/tool/external-tool/domain'; import { ExternalToolService } from '@modules/tool/external-tool/service'; -import { SchoolExternalTool, SchoolExternalToolWithId } from '@modules/tool/school-external-tool/domain'; +import { externalToolFactory } from '@modules/tool/external-tool/testing'; +import { SchoolExternalTool } from '@modules/tool/school-external-tool/domain'; import { SchoolExternalToolService } from '@modules/tool/school-external-tool/service'; +import { schoolExternalToolFactory } from '@modules/tool/school-external-tool/testing'; import { UserService } from '@modules/user'; import { Test, TestingModule } from '@nestjs/testing'; import { NotFoundLoggableException } from '@shared/common/loggable-exception'; @@ -16,18 +20,14 @@ import { LegacySchoolDo, Pseudonym, UserDO } from '@shared/domain/domainobject'; import { Course, SchoolEntity } from '@shared/domain/entity'; import { RoleName } from '@shared/domain/interface'; import { - contextExternalToolFactory, courseFactory, - externalToolFactory, legacySchoolDoFactory, pseudonymFactory, schoolEntityFactory, - schoolExternalToolFactory, setupEntities, UserAndAccountTestFactory, userDoFactory, } from '@shared/testing'; -import { ObjectId } from '@mikro-orm/mongodb'; import { FeathersRosterService } from './feathers-roster.service'; import { PseudonymService } from './pseudonym.service'; @@ -205,17 +205,17 @@ describe('FeathersRosterService', () => { const school: LegacySchoolDo = legacySchoolDoFactory.buildWithId(); const clientId = 'testClientId'; const externalTool: ExternalTool = externalToolFactory.withOauth2Config({ clientId }).buildWithId(); - const externalToolId: string = externalTool.id as string; + const externalToolId: string = externalTool.id; const otherExternalTool: ExternalTool = externalToolFactory.buildWithId(); const schoolExternalTool = schoolExternalToolFactory.buildWithId({ toolId: externalTool.id, schoolId: school.id, - }) as SchoolExternalToolWithId; + }); const otherSchoolExternalTool = schoolExternalToolFactory.buildWithId({ toolId: otherExternalTool.id, schoolId: school.id, - }) as SchoolExternalToolWithId; + }); const pseudonym: Pseudonym = pseudonymFactory.build(); const user: UserDO = userDoFactory .withRoles([{ id: new ObjectId().toHexString(), name: RoleName.STUDENT }]) @@ -365,7 +365,7 @@ describe('FeathersRosterService', () => { const schoolEntity: SchoolEntity = schoolEntityFactory.buildWithId(); const school: LegacySchoolDo = legacySchoolDoFactory.build({ id: schoolEntity.id }); const externalTool: ExternalTool = externalToolFactory.buildWithId(); - const externalToolId: string = externalTool.id as string; + const externalToolId: string = externalTool.id; const otherExternalTool: ExternalTool = externalToolFactory.buildWithId(); const schoolExternalTool: SchoolExternalTool = schoolExternalToolFactory.buildWithId({ toolId: externalTool.id, @@ -376,7 +376,7 @@ describe('FeathersRosterService', () => { schoolId: school.id, }); const contextExternalTool: ContextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string, schoolExternalTool.schoolId) + .withSchoolExternalToolRef(schoolExternalTool.id, schoolExternalTool.schoolId) .buildWithId({ contextRef: new ContextRef({ id: courseA.id, @@ -385,7 +385,7 @@ describe('FeathersRosterService', () => { }); const otherContextExternalTool: ContextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(otherSchoolExternalTool.id as string, otherSchoolExternalTool.schoolId) + .withSchoolExternalToolRef(otherSchoolExternalTool.id, otherSchoolExternalTool.schoolId) .buildWithId({ contextRef: new ContextRef({ id: courseA.id, @@ -590,7 +590,7 @@ describe('FeathersRosterService', () => { describe('when no school external tool was found which belongs to the external tool', () => { const setup = () => { const externalTool: ExternalTool = externalToolFactory.buildWithId(); - const externalToolId: string = externalTool.id as string; + const externalToolId: string = externalTool.id; const course: Course = courseFactory.buildWithId(); courseService.findById.mockResolvedValue(course); diff --git a/apps/server/src/modules/pseudonym/service/pseudonym.service.spec.ts b/apps/server/src/modules/pseudonym/service/pseudonym.service.spec.ts index eccc00d7c04..ce0ffe0d55e 100644 --- a/apps/server/src/modules/pseudonym/service/pseudonym.service.spec.ts +++ b/apps/server/src/modules/pseudonym/service/pseudonym.service.spec.ts @@ -1,22 +1,23 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { Configuration } from '@hpi-schul-cloud/commons/lib'; -import { ExternalTool } from '@modules/tool/external-tool/domain'; -import { InternalServerErrorException, NotFoundException } from '@nestjs/common'; -import { Test, TestingModule } from '@nestjs/testing'; -import { IFindOptions } from '@shared/domain/interface'; -import { LtiToolDO, Page, Pseudonym, UserDO } from '@shared/domain/domainobject'; -import { externalToolFactory, ltiToolDOFactory, pseudonymFactory, userDoFactory } from '@shared/testing/factory'; -import { Logger } from '@src/core/logger'; -import { ObjectId } from 'bson'; -import { EventBus } from '@nestjs/cqrs'; import { + DataDeletedEvent, DomainDeletionReportBuilder, DomainName, DomainOperationReportBuilder, OperationType, - DataDeletedEvent, } from '@modules/deletion'; import { deletionRequestFactory } from '@modules/deletion/domain/testing'; +import { ExternalTool } from '@modules/tool/external-tool/domain'; +import { externalToolFactory } from '@modules/tool/external-tool/testing'; +import { InternalServerErrorException, NotFoundException } from '@nestjs/common'; +import { EventBus } from '@nestjs/cqrs'; +import { Test, TestingModule } from '@nestjs/testing'; +import { LtiToolDO, Page, Pseudonym, UserDO } from '@shared/domain/domainobject'; +import { IFindOptions } from '@shared/domain/interface'; +import { ltiToolDOFactory, pseudonymFactory, userDoFactory } from '@shared/testing/factory'; +import { Logger } from '@src/core/logger'; +import { ObjectId } from 'bson'; import { PseudonymSearchQuery } from '../domain'; import { ExternalToolPseudonymRepo, PseudonymsRepo } from '../repo'; import { PseudonymService } from './pseudonym.service'; diff --git a/apps/server/src/modules/tool/common/domain/error/tool-parameter-mandatory-value-missing.loggable-exception.spec.ts b/apps/server/src/modules/tool/common/domain/error/tool-parameter-mandatory-value-missing.loggable-exception.spec.ts index 1dc12574766..2a7cd6b21bf 100644 --- a/apps/server/src/modules/tool/common/domain/error/tool-parameter-mandatory-value-missing.loggable-exception.spec.ts +++ b/apps/server/src/modules/tool/common/domain/error/tool-parameter-mandatory-value-missing.loggable-exception.spec.ts @@ -1,4 +1,4 @@ -import { customParameterFactory } from '@shared/testing'; +import { customParameterFactory } from '@modules/tool/external-tool/testing'; import { CustomParameter } from '../custom-parameter.do'; import { ToolParameterMandatoryValueMissingLoggableException } from './tool-parameter-mandatory-value-missing-loggable.exception'; diff --git a/apps/server/src/modules/tool/common/domain/error/tool-parameter-type-mismatch.loggable-exception.spec.ts b/apps/server/src/modules/tool/common/domain/error/tool-parameter-type-mismatch.loggable-exception.spec.ts index e3d1692af13..2b99e6099b1 100644 --- a/apps/server/src/modules/tool/common/domain/error/tool-parameter-type-mismatch.loggable-exception.spec.ts +++ b/apps/server/src/modules/tool/common/domain/error/tool-parameter-type-mismatch.loggable-exception.spec.ts @@ -1,4 +1,4 @@ -import { customParameterFactory } from '@shared/testing'; +import { customParameterFactory } from '@modules/tool/external-tool/testing'; import { CustomParameter } from '../custom-parameter.do'; import { ToolParameterTypeMismatchLoggableException } from './tool-parameter-type-mismatch.loggable-exception'; diff --git a/apps/server/src/modules/tool/common/domain/error/tool-parameter-value-regex.loggable-exception.spec.ts b/apps/server/src/modules/tool/common/domain/error/tool-parameter-value-regex.loggable-exception.spec.ts index 3f21d07beda..7acac551ccb 100644 --- a/apps/server/src/modules/tool/common/domain/error/tool-parameter-value-regex.loggable-exception.spec.ts +++ b/apps/server/src/modules/tool/common/domain/error/tool-parameter-value-regex.loggable-exception.spec.ts @@ -1,4 +1,4 @@ -import { customParameterFactory } from '@shared/testing'; +import { customParameterFactory } from '@modules/tool/external-tool/testing'; import { CustomParameter } from '../custom-parameter.do'; import { ToolParameterValueRegexLoggableException } from './tool-parameter-value-regex.loggable-exception'; diff --git a/apps/server/src/modules/tool/common/service/common-tool.service.spec.ts b/apps/server/src/modules/tool/common/service/common-tool.service.spec.ts index b828c2ee8fc..4ded9a304a0 100644 --- a/apps/server/src/modules/tool/common/service/common-tool.service.spec.ts +++ b/apps/server/src/modules/tool/common/service/common-tool.service.spec.ts @@ -1,5 +1,5 @@ +import { externalToolFactory } from '@modules/tool/external-tool/testing'; import { Test, TestingModule } from '@nestjs/testing'; -import { externalToolFactory } from '@shared/testing'; import { ExternalTool } from '../../external-tool/domain'; import { ToolContextType } from '../enum'; import { CommonToolService } from './common-tool.service'; diff --git a/apps/server/src/modules/tool/common/service/validation/common-tool-validation.service.spec.ts b/apps/server/src/modules/tool/common/service/validation/common-tool-validation.service.spec.ts index 8fe0c12d4b7..6b7c73fd042 100644 --- a/apps/server/src/modules/tool/common/service/validation/common-tool-validation.service.spec.ts +++ b/apps/server/src/modules/tool/common/service/validation/common-tool-validation.service.spec.ts @@ -1,11 +1,8 @@ import { Test, TestingModule } from '@nestjs/testing'; import { ValidationError } from '@shared/common'; -import { - contextExternalToolFactory, - customParameterFactory, - externalToolFactory, - schoolExternalToolFactory, -} from '@shared/testing'; +import { contextExternalToolFactory } from '../../../context-external-tool/testing'; +import { customParameterFactory, externalToolFactory } from '../../../external-tool/testing'; +import { schoolExternalToolFactory } from '../../../school-external-tool/testing'; import { CustomParameterEntry } from '../../domain'; import { CustomParameterScope } from '../../enum'; import { CommonToolValidationService } from './common-tool-validation.service'; diff --git a/apps/server/src/modules/tool/common/service/validation/rules/parameter-array-entry-validator.spec.ts b/apps/server/src/modules/tool/common/service/validation/rules/parameter-array-entry-validator.spec.ts index 6704abe4857..b764f1ed541 100644 --- a/apps/server/src/modules/tool/common/service/validation/rules/parameter-array-entry-validator.spec.ts +++ b/apps/server/src/modules/tool/common/service/validation/rules/parameter-array-entry-validator.spec.ts @@ -1,10 +1,10 @@ import { ValidationError } from '@shared/common'; -import { customParameterFactory } from '@shared/testing'; +import { customParameterFactory } from '../../../../external-tool/testing'; import { CustomParameter, CustomParameterEntry, - ToolParameterRequiredLoggableException, ToolParameterMandatoryValueMissingLoggableException, + ToolParameterRequiredLoggableException, } from '../../../domain'; import { ParameterArrayEntryValidator } from './parameter-array-entry-validator'; diff --git a/apps/server/src/modules/tool/common/service/validation/rules/parameter-array-unknown-key-validator.spec.ts b/apps/server/src/modules/tool/common/service/validation/rules/parameter-array-unknown-key-validator.spec.ts index 6539d93d060..4b096e781a5 100644 --- a/apps/server/src/modules/tool/common/service/validation/rules/parameter-array-unknown-key-validator.spec.ts +++ b/apps/server/src/modules/tool/common/service/validation/rules/parameter-array-unknown-key-validator.spec.ts @@ -1,5 +1,5 @@ import { ValidationError } from '@shared/common'; -import { customParameterFactory } from '@shared/testing'; +import { customParameterFactory } from '../../../../external-tool/testing'; import { CustomParameter, CustomParameterEntry, ToolParameterUnknownLoggableException } from '../../../domain'; import { ParameterArrayUnknownKeyValidator } from './parameter-array-unknown-key-validator'; diff --git a/apps/server/src/modules/tool/common/service/validation/rules/parameter-entry-regex-validator.spec.ts b/apps/server/src/modules/tool/common/service/validation/rules/parameter-entry-regex-validator.spec.ts index c1f505fd5b5..c8b99c99345 100644 --- a/apps/server/src/modules/tool/common/service/validation/rules/parameter-entry-regex-validator.spec.ts +++ b/apps/server/src/modules/tool/common/service/validation/rules/parameter-entry-regex-validator.spec.ts @@ -1,5 +1,5 @@ import { ValidationError } from '@shared/common'; -import { customParameterFactory } from '@shared/testing'; +import { customParameterFactory } from '../../../../external-tool/testing'; import { CustomParameter, CustomParameterEntry, ToolParameterValueRegexLoggableException } from '../../../domain'; import { ParameterEntryRegexValidator } from './parameter-entry-regex-validator'; diff --git a/apps/server/src/modules/tool/common/service/validation/rules/parameter-entry-type-validator.spec.ts b/apps/server/src/modules/tool/common/service/validation/rules/parameter-entry-type-validator.spec.ts index 601ec3c2e54..0b949df28fa 100644 --- a/apps/server/src/modules/tool/common/service/validation/rules/parameter-entry-type-validator.spec.ts +++ b/apps/server/src/modules/tool/common/service/validation/rules/parameter-entry-type-validator.spec.ts @@ -1,5 +1,5 @@ import { ValidationError } from '@shared/common'; -import { customParameterFactory } from '@shared/testing'; +import { customParameterFactory } from '../../../../external-tool/testing'; import { CustomParameter, CustomParameterEntry, ToolParameterTypeMismatchLoggableException } from '../../../domain'; import { CustomParameterType } from '../../../enum'; import { ParameterEntryTypeValidator } from './parameter-entry-type-validator'; diff --git a/apps/server/src/modules/tool/common/uc/tool-permission-helper.spec.ts b/apps/server/src/modules/tool/common/uc/tool-permission-helper.spec.ts index 5bdd41c2762..e57a0a63e5f 100644 --- a/apps/server/src/modules/tool/common/uc/tool-permission-helper.spec.ts +++ b/apps/server/src/modules/tool/common/uc/tool-permission-helper.spec.ts @@ -1,10 +1,10 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { + AuthorizableReferenceType, AuthorizationContext, AuthorizationContextBuilder, AuthorizationService, ForbiddenLoggableException, - AuthorizableReferenceType, } from '@modules/authorization'; import { BoardDoAuthorizableService, ContentElementService } from '@modules/board'; import { CourseService } from '@modules/learnroom'; @@ -14,14 +14,14 @@ import { Test, TestingModule } from '@nestjs/testing'; import { BoardDoAuthorizable, ExternalToolElement } from '@shared/domain/domainobject'; import { Permission } from '@shared/domain/interface'; import { - contextExternalToolFactory, + boardDoAuthorizableFactory, courseFactory, externalToolElementFactory, setupEntities, userFactory, - boardDoAuthorizableFactory, } from '@shared/testing'; import { ContextExternalTool, ContextRef } from '../../context-external-tool/domain'; +import { contextExternalToolFactory } from '../../context-external-tool/testing'; import { ToolContextType } from '../enum'; import { ToolPermissionHelper } from './tool-permission-helper'; diff --git a/apps/server/src/modules/tool/context-external-tool/controller/api-test/tool-reference.api.spec.ts b/apps/server/src/modules/tool/context-external-tool/controller/api-test/tool-reference.api.spec.ts index dfb0f457ead..5ae82ae737e 100644 --- a/apps/server/src/modules/tool/context-external-tool/controller/api-test/tool-reference.api.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/controller/api-test/tool-reference.api.spec.ts @@ -6,22 +6,19 @@ import { Course, SchoolEntity } from '@shared/domain/entity'; import { Permission } from '@shared/domain/interface'; import { cleanupCollections, - contextExternalToolConfigurationStatusResponseFactory, courseFactory, - customParameterFactory, schoolEntityFactory, TestApiClient, UserAndAccountTestFactory, } from '@shared/testing'; - import { Response } from 'supertest'; import { CustomParameterLocation, CustomParameterScope, ToolContextType } from '../../../common/enum'; import { ExternalToolEntity } from '../../../external-tool/entity'; -import { externalToolEntityFactory } from '../../../external-tool/testing'; +import { customParameterFactory, externalToolEntityFactory } from '../../../external-tool/testing'; import { SchoolExternalToolEntity } from '../../../school-external-tool/entity'; import { schoolExternalToolEntityFactory } from '../../../school-external-tool/testing'; import { ContextExternalToolEntity, ContextExternalToolType } from '../../entity'; -import { contextExternalToolEntityFactory } from '../../testing'; +import { contextExternalToolConfigurationStatusResponseFactory, contextExternalToolEntityFactory } from '../../testing'; import { ContextExternalToolContextParams, ToolReferenceListResponse, ToolReferenceResponse } from '../dto'; describe('ToolReferenceController (API)', () => { @@ -133,14 +130,12 @@ describe('ToolReferenceController (API)', () => { const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ school, tool: externalToolEntity, - toolVersion: externalToolEntity.version, }); const contextExternalToolEntity: ContextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ schoolTool: schoolExternalToolEntity, contextId: course.id, contextType: ContextExternalToolType.COURSE, displayName: 'This is a test tool', - toolVersion: schoolExternalToolEntity.toolVersion, }); await em.persistAndFlush([ @@ -268,14 +263,12 @@ describe('ToolReferenceController (API)', () => { const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ school, tool: externalToolEntity, - toolVersion: externalToolEntity.version, }); const contextExternalToolEntity: ContextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ schoolTool: schoolExternalToolEntity, contextId: course.id, contextType: ContextExternalToolType.COURSE, displayName: 'This is a test tool', - toolVersion: schoolExternalToolEntity.toolVersion, }); await em.persistAndFlush([ diff --git a/apps/server/src/modules/tool/context-external-tool/service/context-external-tool-authorizable.service.spec.ts b/apps/server/src/modules/tool/context-external-tool/service/context-external-tool-authorizable.service.spec.ts index a0698e904a9..42c6eb8829a 100644 --- a/apps/server/src/modules/tool/context-external-tool/service/context-external-tool-authorizable.service.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/service/context-external-tool-authorizable.service.spec.ts @@ -1,10 +1,12 @@ -import { contextExternalToolFactory, legacySchoolDoFactory, schoolExternalToolFactory } from '@shared/testing'; -import { Test, TestingModule } from '@nestjs/testing'; import { createMock, DeepMocked } from '@golevelup/ts-jest'; +import { Test, TestingModule } from '@nestjs/testing'; import { ContextExternalToolRepo } from '@shared/repo'; -import { ContextExternalToolAuthorizableService } from './context-external-tool-authorizable.service'; +import { legacySchoolDoFactory } from '@shared/testing'; import { SchoolExternalTool } from '../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../school-external-tool/testing'; import { ContextExternalTool } from '../domain'; +import { contextExternalToolFactory } from '../testing'; +import { ContextExternalToolAuthorizableService } from './context-external-tool-authorizable.service'; describe('ContextExternalToolAuthorizableService', () => { let module: TestingModule; @@ -43,14 +45,14 @@ describe('ContextExternalToolAuthorizableService', () => { schoolId, }); const contextExternalTool: ContextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string, schoolExternalTool.schoolId) + .withSchoolExternalToolRef(schoolExternalTool.id, schoolExternalTool.schoolId) .build(); contextExternalToolRepo.findById.mockResolvedValue(contextExternalTool); return { contextExternalTool, - contextExternalToolId: contextExternalTool.id as string, + contextExternalToolId: contextExternalTool.id, }; }; diff --git a/apps/server/src/modules/tool/context-external-tool/service/tool-configuration-status.service.spec.ts b/apps/server/src/modules/tool/context-external-tool/service/tool-configuration-status.service.spec.ts index a73384fed12..5f3fb6cd096 100644 --- a/apps/server/src/modules/tool/context-external-tool/service/tool-configuration-status.service.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/service/tool-configuration-status.service.spec.ts @@ -1,12 +1,6 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { Test, TestingModule } from '@nestjs/testing'; import { ValidationError } from '@shared/common'; -import { - contextExternalToolFactory, - customParameterFactory, - externalToolFactory, - schoolExternalToolFactory, -} from '@shared/testing'; import { ContextExternalToolConfigurationStatus, ToolParameterDuplicateLoggableException, @@ -14,6 +8,9 @@ import { ToolParameterOptionalValueMissingLoggableException, } from '../../common/domain'; import { CommonToolValidationService } from '../../common/service'; +import { customParameterFactory, externalToolFactory } from '../../external-tool/testing'; +import { schoolExternalToolFactory } from '../../school-external-tool/testing'; +import { contextExternalToolFactory } from '../testing'; import { ToolConfigurationStatusService } from './tool-configuration-status.service'; describe(ToolConfigurationStatusService.name, () => { @@ -50,10 +47,10 @@ describe(ToolConfigurationStatusService.name, () => { const setup = () => { const externalTool = externalToolFactory.buildWithId(); const schoolExternalTool = schoolExternalToolFactory.buildWithId({ - toolId: externalTool.id as string, + toolId: externalTool.id, }); const contextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string) + .withSchoolExternalToolRef(schoolExternalTool.id) .buildWithId(); commonToolValidationService.validateParameters.mockReturnValue([]); @@ -104,10 +101,10 @@ describe(ToolConfigurationStatusService.name, () => { const setup = () => { const externalTool = externalToolFactory.buildWithId(); const schoolExternalTool = schoolExternalToolFactory.buildWithId({ - toolId: externalTool.id as string, + toolId: externalTool.id, }); const contextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string) + .withSchoolExternalToolRef(schoolExternalTool.id) .buildWithId(); commonToolValidationService.validateParameters.mockReturnValueOnce([new ValidationError('')]); @@ -159,10 +156,10 @@ describe(ToolConfigurationStatusService.name, () => { const setup = () => { const externalTool = externalToolFactory.buildWithId(); const schoolExternalTool = schoolExternalToolFactory.buildWithId({ - toolId: externalTool.id as string, + toolId: externalTool.id, }); const contextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string) + .withSchoolExternalToolRef(schoolExternalTool.id) .buildWithId(); commonToolValidationService.validateParameters.mockReturnValueOnce([]); @@ -214,10 +211,10 @@ describe(ToolConfigurationStatusService.name, () => { const setup = () => { const externalTool = externalToolFactory.buildWithId(); const schoolExternalTool = schoolExternalToolFactory.buildWithId({ - toolId: externalTool.id as string, + toolId: externalTool.id, }); const contextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string) + .withSchoolExternalToolRef(schoolExternalTool.id) .buildWithId(); commonToolValidationService.validateParameters.mockReturnValueOnce([new ValidationError('')]); @@ -270,10 +267,10 @@ describe(ToolConfigurationStatusService.name, () => { const customParameter = customParameterFactory.build(); const externalTool = externalToolFactory.buildWithId({ parameters: [customParameter] }); const schoolExternalTool = schoolExternalToolFactory.buildWithId({ - toolId: externalTool.id as string, + toolId: externalTool.id, }); const contextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string) + .withSchoolExternalToolRef(schoolExternalTool.id) .buildWithId(); commonToolValidationService.validateParameters.mockReturnValueOnce([]); @@ -314,10 +311,10 @@ describe(ToolConfigurationStatusService.name, () => { const customParameter = customParameterFactory.build(); const externalTool = externalToolFactory.buildWithId({ parameters: [customParameter] }); const schoolExternalTool = schoolExternalToolFactory.buildWithId({ - toolId: externalTool.id as string, + toolId: externalTool.id, }); const contextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string) + .withSchoolExternalToolRef(schoolExternalTool.id) .buildWithId(); commonToolValidationService.validateParameters.mockReturnValueOnce([]); @@ -357,10 +354,10 @@ describe(ToolConfigurationStatusService.name, () => { const customParameter = customParameterFactory.build(); const externalTool = externalToolFactory.buildWithId({ parameters: [customParameter] }); const schoolExternalTool = schoolExternalToolFactory.buildWithId({ - toolId: externalTool.id as string, + toolId: externalTool.id, }); const contextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string) + .withSchoolExternalToolRef(schoolExternalTool.id) .buildWithId(); commonToolValidationService.validateParameters.mockReturnValueOnce([]); @@ -400,11 +397,11 @@ describe(ToolConfigurationStatusService.name, () => { const setup = () => { const externalTool = externalToolFactory.buildWithId(); const schoolExternalTool = schoolExternalToolFactory.buildWithId({ - toolId: externalTool.id as string, + toolId: externalTool.id, status: { isDeactivated: true }, }); const contextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string) + .withSchoolExternalToolRef(schoolExternalTool.id) .buildWithId(); commonToolValidationService.validateParameters.mockReturnValueOnce([new ValidationError('')]); @@ -440,10 +437,10 @@ describe(ToolConfigurationStatusService.name, () => { const setup = () => { const externalTool = externalToolFactory.buildWithId({ isDeactivated: true }); const schoolExternalTool = schoolExternalToolFactory.buildWithId({ - toolId: externalTool.id as string, + toolId: externalTool.id, }); const contextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string) + .withSchoolExternalToolRef(schoolExternalTool.id) .buildWithId(); commonToolValidationService.validateParameters.mockReturnValueOnce([new ValidationError('')]); @@ -479,10 +476,10 @@ describe(ToolConfigurationStatusService.name, () => { const setup = () => { const externalTool = externalToolFactory.buildWithId(); const schoolExternalTool = schoolExternalToolFactory.buildWithId({ - toolId: externalTool.id as string, + toolId: externalTool.id, }); const contextExternalTool = contextExternalToolFactory - .withSchoolExternalToolRef(schoolExternalTool.id as string) + .withSchoolExternalToolRef(schoolExternalTool.id) .buildWithId(); commonToolValidationService.validateParameters.mockReturnValueOnce([new ValidationError('')]); diff --git a/apps/server/src/modules/tool/context-external-tool/service/tool-reference.service.spec.ts b/apps/server/src/modules/tool/context-external-tool/service/tool-reference.service.spec.ts index 816192c2dc2..3e60c4eb44d 100644 --- a/apps/server/src/modules/tool/context-external-tool/service/tool-reference.service.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/service/tool-reference.service.spec.ts @@ -1,16 +1,12 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { ObjectId } from '@mikro-orm/mongodb'; import { Test, TestingModule } from '@nestjs/testing'; -import { - contextExternalToolFactory, - externalToolFactory, - schoolExternalToolFactory, - toolConfigurationStatusFactory, -} from '@shared/testing'; import { ExternalToolLogoService, ExternalToolService } from '../../external-tool/service'; +import { externalToolFactory, toolConfigurationStatusFactory } from '../../external-tool/testing'; import { SchoolExternalToolService } from '../../school-external-tool'; -import { SchoolExternalToolWithId } from '../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../school-external-tool/testing'; import { ToolReference } from '../domain'; +import { contextExternalToolFactory } from '../testing'; import { ContextExternalToolService } from './context-external-tool.service'; import { ToolConfigurationStatusService } from './tool-configuration-status.service'; import { ToolReferenceService } from './tool-reference.service'; @@ -74,8 +70,8 @@ describe('ToolReferenceService', () => { const contextExternalToolId = new ObjectId().toHexString(); const externalTool = externalToolFactory.buildWithId(); const schoolExternalTool = schoolExternalToolFactory.buildWithId({ - toolId: externalTool.id as string, - }) as SchoolExternalToolWithId; + toolId: externalTool.id, + }); const contextExternalTool = contextExternalToolFactory .withSchoolExternalToolRef(schoolExternalTool.id) .buildWithId(undefined, contextExternalToolId); diff --git a/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts b/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts index d6b868b8d01..31da314a22b 100644 --- a/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts @@ -13,14 +13,15 @@ import { Test, TestingModule } from '@nestjs/testing'; import { User } from '@shared/domain/entity'; import { Permission } from '@shared/domain/interface'; import { EntityId } from '@shared/domain/types'; -import { contextExternalToolFactory, schoolExternalToolFactory, setupEntities, userFactory } from '@shared/testing'; +import { setupEntities, userFactory } from '@shared/testing'; import { ToolContextType } from '../../common/enum'; import { ToolPermissionHelper } from '../../common/uc/tool-permission-helper'; -import { SchoolExternalToolWithId } from '../../school-external-tool/domain'; import { SchoolExternalToolService } from '../../school-external-tool'; -import { ContextExternalTool, ContextExternalToolWithId } from '../domain'; +import { schoolExternalToolFactory } from '../../school-external-tool/testing'; +import { ContextExternalTool } from '../domain'; import { ContextExternalToolService } from '../service'; import { ContextExternalToolValidationService } from '../service/context-external-tool-validation.service'; +import { contextExternalToolFactory } from '../testing'; import { ContextExternalToolUc } from './context-external-tool.uc'; describe('ContextExternalToolUc', () => { @@ -85,7 +86,7 @@ describe('ContextExternalToolUc', () => { const schoolExternalTool = schoolExternalToolFactory.buildWithId({ schoolId, - }) as SchoolExternalToolWithId; + }); const contextExternalTool = contextExternalToolFactory.buildWithId({ displayName: 'Course', @@ -97,7 +98,7 @@ describe('ContextExternalToolUc', () => { id: 'contextId', type: ToolContextType.COURSE, }, - }) as ContextExternalToolWithId; + }); schoolExternalToolService.findById.mockResolvedValueOnce(schoolExternalTool); contextExternalToolService.saveContextExternalTool.mockResolvedValue(contextExternalTool); @@ -162,7 +163,7 @@ describe('ContextExternalToolUc', () => { const schoolExternalTool = schoolExternalToolFactory.buildWithId({ schoolId, - }) as SchoolExternalToolWithId; + }); const contextExternalTool = contextExternalToolFactory.buildWithId({ displayName: 'Course', @@ -174,7 +175,7 @@ describe('ContextExternalToolUc', () => { id: 'contextId', type: ToolContextType.COURSE, }, - }) as ContextExternalToolWithId; + }); const context: AuthorizationContext = AuthorizationContextBuilder.write([Permission.CONTEXT_TOOL_ADMIN]); @@ -209,7 +210,7 @@ describe('ContextExternalToolUc', () => { const schoolExternalTool = schoolExternalToolFactory.buildWithId({ schoolId, - }) as SchoolExternalToolWithId; + }); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId({ displayName: 'Course', @@ -254,7 +255,7 @@ describe('ContextExternalToolUc', () => { const schoolExternalTool = schoolExternalToolFactory.buildWithId({ schoolId, - }) as SchoolExternalToolWithId; + }); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId({ displayName: 'Course', @@ -298,7 +299,7 @@ describe('ContextExternalToolUc', () => { const schoolExternalTool = schoolExternalToolFactory.buildWithId({ schoolId, - }) as SchoolExternalToolWithId; + }); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId({ displayName: 'Course', @@ -344,7 +345,7 @@ describe('ContextExternalToolUc', () => { const schoolExternalTool = schoolExternalToolFactory.buildWithId({ schoolId, - }) as SchoolExternalToolWithId; + }); const contextExternalTool = contextExternalToolFactory.buildWithId({ displayName: 'Course', @@ -356,7 +357,7 @@ describe('ContextExternalToolUc', () => { id: 'contextId', type: ToolContextType.COURSE, }, - }) as ContextExternalToolWithId; + }); schoolExternalToolService.findById.mockResolvedValueOnce(schoolExternalTool); contextExternalToolService.saveContextExternalTool.mockResolvedValue(contextExternalTool); @@ -420,7 +421,7 @@ describe('ContextExternalToolUc', () => { const schoolExternalTool = schoolExternalToolFactory.buildWithId({ schoolId, - }) as SchoolExternalToolWithId; + }); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId({ displayName: 'Course', @@ -438,7 +439,7 @@ describe('ContextExternalToolUc', () => { return { contextExternalTool, - contextExternalToolId: contextExternalTool.id as string, + contextExternalToolId: contextExternalTool.id, userId, }; }; @@ -472,7 +473,7 @@ describe('ContextExternalToolUc', () => { const schoolExternalTool = schoolExternalToolFactory.buildWithId({ schoolId, - }) as SchoolExternalToolWithId; + }); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId({ displayName: 'Course', @@ -494,7 +495,7 @@ describe('ContextExternalToolUc', () => { return { contextExternalTool, - contextExternalToolId: contextExternalTool.id as string, + contextExternalToolId: contextExternalTool.id, userId, schoolId, error, @@ -518,7 +519,7 @@ describe('ContextExternalToolUc', () => { const schoolExternalTool = schoolExternalToolFactory.buildWithId({ schoolId, - }) as SchoolExternalToolWithId; + }); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId({ displayName: 'Course', @@ -540,7 +541,7 @@ describe('ContextExternalToolUc', () => { return { contextExternalTool, - contextExternalToolId: contextExternalTool.id as string, + contextExternalToolId: contextExternalTool.id, userId, schoolId, error, @@ -571,7 +572,7 @@ describe('ContextExternalToolUc', () => { return { contextExternalTool, - contextExternalToolId: contextExternalTool.id as string, + contextExternalToolId: contextExternalTool.id, user, }; }; @@ -739,7 +740,7 @@ describe('ContextExternalToolUc', () => { it('should call contextExternalToolService to ensure permission ', async () => { const { contextExternalTool, user } = setup(); - await uc.getContextExternalTool(user.id, contextExternalTool.id as string); + await uc.getContextExternalTool(user.id, contextExternalTool.id); expect(toolPermissionHelper.ensureContextPermissions).toHaveBeenCalledWith( user, @@ -751,7 +752,7 @@ describe('ContextExternalToolUc', () => { it('should call contextExternalToolService to get contextExternalTool ', async () => { const { contextExternalTool, user } = setup(); - await uc.getContextExternalTool(user.id, contextExternalTool.id as string); + await uc.getContextExternalTool(user.id, contextExternalTool.id); expect(contextExternalToolService.findByIdOrFail).toHaveBeenCalledWith(contextExternalTool.id); }); @@ -791,7 +792,7 @@ describe('ContextExternalToolUc', () => { it('should throw forbiddenLoggableException', async () => { const { contextExternalTool, userId } = setup(); - const func = () => uc.getContextExternalTool(userId, contextExternalTool.id as string); + const func = () => uc.getContextExternalTool(userId, contextExternalTool.id); await expect(func).rejects.toThrow( new ForbiddenLoggableException(userId, 'contextExternalTool', { diff --git a/apps/server/src/modules/tool/context-external-tool/uc/tool-reference.uc.spec.ts b/apps/server/src/modules/tool/context-external-tool/uc/tool-reference.uc.spec.ts index 439a5b671ab..4b6519e0bf5 100644 --- a/apps/server/src/modules/tool/context-external-tool/uc/tool-reference.uc.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/uc/tool-reference.uc.spec.ts @@ -3,12 +3,13 @@ import { AuthorizationContextBuilder, AuthorizationService } from '@modules/auth import { ForbiddenException } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { Permission } from '@shared/domain/interface'; -import { contextExternalToolFactory, externalToolFactory, toolConfigurationStatusFactory } from '@shared/testing'; import { ToolContextType } from '../../common/enum'; import { ToolPermissionHelper } from '../../common/uc/tool-permission-helper'; import { ExternalTool } from '../../external-tool/domain'; +import { externalToolFactory, toolConfigurationStatusFactory } from '../../external-tool/testing'; import { ContextExternalTool, ToolReference } from '../domain'; import { ContextExternalToolService, ToolReferenceService } from '../service'; +import { contextExternalToolFactory } from '../testing'; import { ToolReferenceUc } from './tool-reference.uc'; describe('ToolReferenceUc', () => { @@ -62,7 +63,7 @@ describe('ToolReferenceUc', () => { const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId(); const toolReference: ToolReference = new ToolReference({ logoUrl: externalTool.logoUrl, - contextToolId: contextExternalTool.id as string, + contextToolId: contextExternalTool.id, displayName: contextExternalTool.displayName as string, status: toolConfigurationStatusFactory.build({ isOutdatedOnScopeSchool: false, @@ -151,7 +152,7 @@ describe('ToolReferenceUc', () => { ); const toolReference: ToolReference = new ToolReference({ logoUrl: externalTool.logoUrl, - contextToolId: contextExternalTool.id as string, + contextToolId: contextExternalTool.id, displayName: contextExternalTool.displayName as string, status: toolConfigurationStatusFactory.build({ isOutdatedOnScopeSchool: false, diff --git a/apps/server/src/modules/tool/external-tool/controller/api-test/tool-configuration.api.spec.ts b/apps/server/src/modules/tool/external-tool/controller/api-test/tool-configuration.api.spec.ts index 9fa1435de7f..36b52567367 100644 --- a/apps/server/src/modules/tool/external-tool/controller/api-test/tool-configuration.api.spec.ts +++ b/apps/server/src/modules/tool/external-tool/controller/api-test/tool-configuration.api.spec.ts @@ -10,7 +10,6 @@ import { accountFactory, boardFactory, courseFactory, - customParameterFactory, schoolEntityFactory, TestApiClient, UserAndAccountTestFactory, @@ -28,7 +27,7 @@ import { contextExternalToolEntityFactory } from '../../../context-external-tool import { SchoolExternalToolEntity } from '../../../school-external-tool/entity'; import { schoolExternalToolEntityFactory } from '../../../school-external-tool/testing'; import { ExternalToolEntity } from '../../entity'; -import { externalToolEntityFactory } from '../../testing'; +import { customParameterFactory, externalToolEntityFactory } from '../../testing'; import { ContextExternalToolConfigurationTemplateListResponse, ContextExternalToolConfigurationTemplateResponse, @@ -214,14 +213,12 @@ describe('ToolConfigurationController (API)', () => { location: CustomParameterLocationParams.BODY, }, ], - version: externalTool.version, }, { externalToolId: externalToolWithoutContextRestriction.id, name: externalToolWithoutContextRestriction.name, parameters: [], schoolExternalToolId: schoolExternalTool2.id, - version: externalToolWithoutContextRestriction.version, }, ], }); @@ -239,7 +236,6 @@ describe('ToolConfigurationController (API)', () => { name: externalToolWithoutContextRestriction.name, parameters: [], schoolExternalToolId: schoolExternalTool2.id, - version: externalToolWithoutContextRestriction.version, }, ], }); @@ -373,7 +369,6 @@ describe('ToolConfigurationController (API)', () => { location: CustomParameterLocationParams.BODY, }, ], - version: externalTool.version, }, ], }); @@ -486,7 +481,6 @@ describe('ToolConfigurationController (API)', () => { externalToolId: externalTool.id, name: externalTool.name, logoUrl: externalTool.logoUrl, - version: externalTool.version, parameters: [ { name: schoolParameter.name, @@ -642,7 +636,6 @@ describe('ToolConfigurationController (API)', () => { schoolExternalToolId: schoolExternalTool.id, name: externalTool.name, logoUrl: externalTool.logoUrl, - version: externalTool.version, parameters: [ { name: contextParameter.name, diff --git a/apps/server/src/modules/tool/external-tool/controller/api-test/tool.api.spec.ts b/apps/server/src/modules/tool/external-tool/controller/api-test/tool.api.spec.ts index 91e0bfff6d5..06acba1847e 100644 --- a/apps/server/src/modules/tool/external-tool/controller/api-test/tool.api.spec.ts +++ b/apps/server/src/modules/tool/external-tool/controller/api-test/tool.api.spec.ts @@ -10,7 +10,6 @@ import { cleanupCollections, columnBoardNodeFactory, externalToolElementNodeFactory, - externalToolFactory, schoolEntityFactory, TestApiClient, UserAndAccountTestFactory, @@ -28,7 +27,7 @@ import { ContextExternalToolEntity, ContextExternalToolType } from '../../../con import { contextExternalToolEntityFactory } from '../../../context-external-tool/testing'; import { SchoolExternalToolEntity } from '../../../school-external-tool/entity'; import { ExternalToolEntity } from '../../entity'; -import { externalToolEntityFactory } from '../../testing'; +import { externalToolEntityFactory, externalToolFactory } from '../../testing'; import { ExternalToolCreateParams, ExternalToolMetadataResponse, @@ -157,7 +156,6 @@ describe('ToolController (API)', () => { logoUrl: 'https://link.to-my-logo.com', url: 'https://link.to-my-tool.com', openNewTab: true, - version: 1, }); }); }); @@ -403,7 +401,7 @@ describe('ToolController (API)', () => { const externalToolEntity: ExternalToolEntity = externalToolEntityFactory .withBase64Logo() .withMedium() - .buildWithId({ version: 1 }, toolId); + .buildWithId({ id: toolId }); const base64Logo: string = externalToolEntity.logoBase64 as string; const logoBuffer: Buffer = Buffer.from(base64Logo, 'base64'); @@ -464,7 +462,6 @@ describe('ToolController (API)', () => { logoUrl: 'https://link.to-my-logo.com', url: 'https://link.to-my-tool.com', openNewTab: true, - version: 2, medium: { mediumId: params.medium?.mediumId ?? '', publisher: params.medium?.publisher, @@ -517,7 +514,7 @@ describe('ToolController (API)', () => { const setup = async () => { const toolId: string = new ObjectId().toHexString(); const params = { ...postParams, id: toolId }; - const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ version: 1 }, toolId); + const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ id: toolId }); const { adminUser, adminAccount } = UserAndAccountTestFactory.buildAdmin(); await em.persistAndFlush([adminAccount, adminUser, externalToolEntity]); diff --git a/apps/server/src/modules/tool/external-tool/domain/external-tool.do.spec.ts b/apps/server/src/modules/tool/external-tool/domain/external-tool.do.spec.ts index b47fef01f6a..abef2a4541d 100644 --- a/apps/server/src/modules/tool/external-tool/domain/external-tool.do.spec.ts +++ b/apps/server/src/modules/tool/external-tool/domain/external-tool.do.spec.ts @@ -1,7 +1,8 @@ -import { basicToolConfigFactory, externalToolFactory } from '@shared/testing'; +import { ObjectId } from '@mikro-orm/mongodb'; +import { basicToolConfigFactory, externalToolFactory } from '../testing'; import { ExternalTool } from './external-tool.do'; -describe('ExternalTool', () => { +describe(ExternalTool.name, () => { describe('isLti11Config', () => { describe('when external tool with config.type Lti11 is given', () => { it('should return true', () => { @@ -55,8 +56,8 @@ describe('ExternalTool', () => { expect(() => { // eslint-disable-next-line no-new new ExternalTool({ + id: new ObjectId().toHexString(), name: 'tool', - version: 1, isHidden: false, openNewTab: false, config: basicToolConfigFactory.build(), diff --git a/apps/server/src/modules/tool/external-tool/mapper/external-tool-datasheet.mapper.spec.ts b/apps/server/src/modules/tool/external-tool/mapper/external-tool-datasheet.mapper.spec.ts index a80fc8763ab..26bc472710c 100644 --- a/apps/server/src/modules/tool/external-tool/mapper/external-tool-datasheet.mapper.spec.ts +++ b/apps/server/src/modules/tool/external-tool/mapper/external-tool-datasheet.mapper.spec.ts @@ -3,21 +3,21 @@ import { School } from '@modules/school'; import { schoolFactory } from '@modules/school/testing'; import { SchoolExternalTool } from '@modules/tool/school-external-tool/domain'; import { UserDO } from '@shared/domain/domainobject'; -import { - customParameterFactory, - externalToolDatasheetTemplateDataFactory, - externalToolFactory, - externalToolParameterDatasheetTemplateDataFactory, - schoolExternalToolFactory, - userDoFactory, -} from '@shared/testing'; +import { userDoFactory } from '@shared/testing'; import { CustomParameter } from '../../common/domain'; import { CustomParameterScope, CustomParameterType, ToolContextType } from '../../common/enum'; +import { schoolExternalToolFactory } from '../../school-external-tool/testing'; import { ExternalToolDatasheetTemplateData, ExternalToolParameterDatasheetTemplateData, ExternalToolParameterDatasheetTemplateProperty, } from '../domain'; +import { + customParameterFactory, + externalToolDatasheetTemplateDataFactory, + externalToolFactory, + externalToolParameterDatasheetTemplateDataFactory, +} from '../testing'; import { ExternalToolDatasheetMapper } from './external-tool-datasheet.mapper'; describe(ExternalToolDatasheetMapper.name, () => { diff --git a/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts b/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts index 77653bfe691..b1f035066a1 100644 --- a/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts +++ b/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts @@ -1,13 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; import { SortOrder, SortOrderMap } from '@shared/domain/interface'; -import { - basicToolConfigFactory, - customParameterFactory, - externalToolFactory, - lti11ToolConfigFactory, - oauth2ToolConfigFactory, -} from '@shared/testing'; import { CustomParameter } from '../../common/domain'; import { CustomParameterLocation, @@ -35,6 +28,13 @@ import { SortExternalToolParams, } from '../controller/dto'; import { BasicToolConfig, ExternalTool, Lti11ToolConfig, Oauth2ToolConfig } from '../domain'; +import { + basicToolConfigFactory, + customParameterFactory, + externalToolFactory, + lti11ToolConfigFactory, + oauth2ToolConfigFactory, +} from '../testing'; import { ExternalToolRequestMapper } from './external-tool-request.mapper'; describe('ExternalToolRequestMapper', () => { @@ -109,7 +109,6 @@ describe('ExternalToolRequestMapper', () => { parameters: [customParameterDO], isHidden: true, openNewTab: true, - version: 1, config: basicToolConfigDO, isDeactivated: true, createdAt: undefined, @@ -195,7 +194,6 @@ describe('ExternalToolRequestMapper', () => { parameters: [customParameterDO], isHidden: true, openNewTab: true, - version: 1, config: lti11ToolConfigDO, isDeactivated: false, createdAt: undefined, @@ -285,7 +283,6 @@ describe('ExternalToolRequestMapper', () => { parameters: [customParameterDO], isHidden: true, openNewTab: true, - version: 1, config: oauth2ToolConfigDO, isDeactivated: false, createdAt: undefined, @@ -365,7 +362,6 @@ describe('ExternalToolRequestMapper', () => { parameters: [customParameterDO], isHidden: true, openNewTab: true, - version: 1, config: basicToolConfigDO, isDeactivated: false, createdAt: undefined, @@ -455,7 +451,6 @@ describe('ExternalToolRequestMapper', () => { parameters: [customParameterDO], isHidden: true, openNewTab: true, - version: 1, config: lti11ToolConfigDO, isDeactivated: false, createdAt: undefined, @@ -549,7 +544,6 @@ describe('ExternalToolRequestMapper', () => { parameters: [customParameterDO], isHidden: true, openNewTab: true, - version: 1, config: oauth2ToolConfigDO, isDeactivated: false, createdAt: undefined, diff --git a/apps/server/src/modules/tool/external-tool/mapper/external-tool-response.mapper.spec.ts b/apps/server/src/modules/tool/external-tool/mapper/external-tool-response.mapper.spec.ts index dfb17b9f7ec..b84ebad1822 100644 --- a/apps/server/src/modules/tool/external-tool/mapper/external-tool-response.mapper.spec.ts +++ b/apps/server/src/modules/tool/external-tool/mapper/external-tool-response.mapper.spec.ts @@ -1,10 +1,3 @@ -import { - basicToolConfigFactory, - customParameterFactory, - externalToolFactory, - lti11ToolConfigFactory, - oauth2ToolConfigFactory, -} from '@shared/testing'; import { CustomParameter } from '../../common/domain'; import { CustomParameterLocation, @@ -26,6 +19,13 @@ import { Oauth2ToolConfigResponse, } from '../controller/dto'; import { BasicToolConfig, ExternalTool, Lti11ToolConfig, Oauth2ToolConfig } from '../domain'; +import { + basicToolConfigFactory, + customParameterFactory, + externalToolFactory, + lti11ToolConfigFactory, + oauth2ToolConfigFactory, +} from '../testing'; import { ExternalToolResponseMapper } from './external-tool-response.mapper'; describe('ExternalToolResponseMapper', () => { @@ -77,7 +77,6 @@ describe('ExternalToolResponseMapper', () => { parameters: [customParameter], isHidden: true, openNewTab: true, - version: 1, config: basicToolConfig, isDeactivated: true, }); @@ -90,7 +89,6 @@ describe('ExternalToolResponseMapper', () => { parameters: [customParameterResponse], isHidden: true, openNewTab: true, - version: 1, config: basicToolConfigResponse, isDeactivated: true, description: externalTool.description, @@ -171,7 +169,6 @@ describe('ExternalToolResponseMapper', () => { parameters: [customParameter], isHidden: true, openNewTab: true, - version: 1, config: oauth2ToolConfigDO, isDeactivated: false, }); @@ -184,7 +181,6 @@ describe('ExternalToolResponseMapper', () => { parameters: [customParameterResponse], isHidden: true, openNewTab: true, - version: 1, config: oauth2ToolConfigResponse, isDeactivated: false, description: externalTool.description, @@ -260,7 +256,6 @@ describe('ExternalToolResponseMapper', () => { parameters: [customParameter], isHidden: true, openNewTab: true, - version: 1, config: lti11ToolConfigDO, isDeactivated: false, }); @@ -273,7 +268,6 @@ describe('ExternalToolResponseMapper', () => { parameters: [customParameterResponse], isHidden: true, openNewTab: true, - version: 1, config: lti11ToolConfigResponse, isDeactivated: false, description: externalTool.description, diff --git a/apps/server/src/modules/tool/external-tool/service/datasheet-pdf.service.spec.ts b/apps/server/src/modules/tool/external-tool/service/datasheet-pdf.service.spec.ts index 05de876f21c..93dd006f836 100644 --- a/apps/server/src/modules/tool/external-tool/service/datasheet-pdf.service.spec.ts +++ b/apps/server/src/modules/tool/external-tool/service/datasheet-pdf.service.spec.ts @@ -1,15 +1,11 @@ import { Test, TestingModule } from '@nestjs/testing'; import { UserDO } from '@shared/domain/domainobject'; -import { - customParameterFactory, - externalToolDatasheetTemplateDataFactory, - externalToolFactory, - userDoFactory, -} from '@shared/testing'; +import { userDoFactory } from '@shared/testing'; import { createPdf, TCreatedPdf } from 'pdfmake/build/pdfmake'; import { TDocumentDefinitions } from 'pdfmake/interfaces'; import { CustomParameter } from '../../common/domain'; import { ExternalTool, ExternalToolDatasheetTemplateData } from '../domain'; +import { customParameterFactory, externalToolDatasheetTemplateDataFactory, externalToolFactory } from '../testing'; import { DatasheetPdfService } from './datasheet-pdf.service'; jest.mock('pdfmake/build/pdfmake'); diff --git a/apps/server/src/modules/tool/external-tool/service/external-tool-configuration.service.spec.ts b/apps/server/src/modules/tool/external-tool/service/external-tool-configuration.service.spec.ts index 59a1fdd2d0c..54b5149f57a 100644 --- a/apps/server/src/modules/tool/external-tool/service/external-tool-configuration.service.spec.ts +++ b/apps/server/src/modules/tool/external-tool/service/external-tool-configuration.service.spec.ts @@ -2,7 +2,7 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { Test, TestingModule } from '@nestjs/testing'; import { Page } from '@shared/domain/domainobject'; import { EntityId } from '@shared/domain/types'; -import { customParameterFactory, externalToolFactory, setupEntities } from '@shared/testing'; +import { setupEntities } from '@shared/testing'; import { CustomParameter } from '../../common/domain'; import { CustomParameterScope, ToolContextType } from '../../common/enum'; import { CommonToolService } from '../../common/service'; @@ -13,6 +13,7 @@ import { } from '../../school-external-tool/testing'; import { ToolFeatures } from '../../tool-config'; import { ExternalTool } from '../domain'; +import { customParameterFactory, externalToolFactory } from '../testing'; import { ContextExternalToolTemplateInfo } from '../uc'; import { ExternalToolConfigurationService } from './external-tool-configuration.service'; diff --git a/apps/server/src/modules/tool/external-tool/service/external-tool-logo-service.spec.ts b/apps/server/src/modules/tool/external-tool/service/external-tool-logo-service.spec.ts index 32388ad6c32..40d7185ac98 100644 --- a/apps/server/src/modules/tool/external-tool/service/external-tool-logo-service.spec.ts +++ b/apps/server/src/modules/tool/external-tool/service/external-tool-logo-service.spec.ts @@ -2,7 +2,7 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { HttpService } from '@nestjs/axios'; import { HttpException, HttpStatus } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; -import { axiosResponseFactory, externalToolFactory } from '@shared/testing'; +import { axiosResponseFactory } from '@shared/testing'; import { Logger } from '@src/core/logger'; import { of, throwError } from 'rxjs'; import { IToolFeatures, ToolFeatures } from '../../tool-config'; @@ -15,6 +15,7 @@ import { ExternalToolLogoSizeExceededLoggableException, ExternalToolLogoWrongFileTypeLoggableException, } from '../loggable'; +import { externalToolFactory } from '../testing'; import { ExternalToolLogoService } from './external-tool-logo.service'; import { ExternalToolService } from './external-tool.service'; @@ -91,7 +92,7 @@ describe('ExternalToolLogoService', () => { const externalTool: ExternalTool = externalToolFactory.withBase64Logo().buildWithId(); const baseUrl = toolFeatures.backEndUrl; - const id = externalTool.id as string; + const { id } = externalTool; const expected = `${baseUrl}/v3/tools/external-tools/${id}/logo`; return { @@ -328,7 +329,7 @@ describe('ExternalToolLogoService', () => { externalToolService.findById.mockResolvedValue(externalTool); return { - externalToolId: externalTool.id as string, + externalToolId: externalTool.id, base64logo: externalTool.logo as string, }; }; @@ -354,7 +355,7 @@ describe('ExternalToolLogoService', () => { externalToolService.findById.mockResolvedValue(externalTool); return { - externalToolId: externalTool.id as string, + externalToolId: externalTool.id, }; }; @@ -374,7 +375,7 @@ describe('ExternalToolLogoService', () => { externalToolService.findById.mockResolvedValue(externalTool); return { - externalToolId: externalTool.id as string, + externalToolId: externalTool.id, }; }; diff --git a/apps/server/src/modules/tool/external-tool/service/external-tool-parameter-validation.service.spec.ts b/apps/server/src/modules/tool/external-tool/service/external-tool-parameter-validation.service.spec.ts index ceef0aeb178..a5f6c50f4cd 100644 --- a/apps/server/src/modules/tool/external-tool/service/external-tool-parameter-validation.service.spec.ts +++ b/apps/server/src/modules/tool/external-tool/service/external-tool-parameter-validation.service.spec.ts @@ -1,14 +1,11 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { Test, TestingModule } from '@nestjs/testing'; import { ValidationError } from '@shared/common'; -import { - customParameterFactory, - externalToolFactory, -} from '@shared/testing/factory/domainobject/tool/external-tool.factory'; import { CustomParameter } from '../../common/domain'; import { CustomParameterScope, CustomParameterType } from '../../common/enum'; import { CommonToolValidationService } from '../../common/service'; import { ExternalTool } from '../domain'; +import { customParameterFactory, externalToolFactory } from '../testing'; import { ExternalToolParameterValidationService } from './external-tool-parameter-validation.service'; import { ExternalToolService } from './index'; diff --git a/apps/server/src/modules/tool/external-tool/service/external-tool-validation.service.spec.ts b/apps/server/src/modules/tool/external-tool/service/external-tool-validation.service.spec.ts index 42efcd6559a..7216a57414e 100644 --- a/apps/server/src/modules/tool/external-tool/service/external-tool-validation.service.spec.ts +++ b/apps/server/src/modules/tool/external-tool/service/external-tool-validation.service.spec.ts @@ -1,9 +1,9 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { Test, TestingModule } from '@nestjs/testing'; import { ValidationError } from '@shared/common'; -import { externalToolFactory } from '@shared/testing/factory/domainobject/tool/external-tool.factory'; import { IToolFeatures, ToolFeatures } from '../../tool-config'; import { ExternalTool } from '../domain'; +import { externalToolFactory } from '../testing'; import { ExternalToolLogoService } from './external-tool-logo.service'; import { ExternalToolParameterValidationService } from './external-tool-parameter-validation.service'; import { ExternalToolValidationService } from './external-tool-validation.service'; @@ -212,7 +212,7 @@ describe('ExternalToolValidationService', () => { return { externalTool, - externalToolId: externalTool.id as string, + externalToolId: externalTool.id, }; }; @@ -231,7 +231,6 @@ describe('ExternalToolValidationService', () => { .withOauth2Config({ clientId: 'ClientId', clientSecret: 'secret' }) .buildWithId(); - externalOauthTool.id = 'toolId'; externalToolService.findById.mockResolvedValue(externalOauthTool); return { @@ -273,7 +272,7 @@ describe('ExternalToolValidationService', () => { return { existingExternalOauthTool, newExternalTool, - newExternalToolId: newExternalTool.id as string, + newExternalToolId: newExternalTool.id, }; }; @@ -304,7 +303,7 @@ describe('ExternalToolValidationService', () => { it('should pass', async () => { const { externalOauthTool } = setup(); - const result: Promise = service.validateUpdate(externalOauthTool.id as string, externalOauthTool); + const result: Promise = service.validateUpdate(externalOauthTool.id, externalOauthTool); await expect(result).resolves.not.toThrow(); }); @@ -328,7 +327,7 @@ describe('ExternalToolValidationService', () => { it('should throw', async () => { const { externalOauthTool } = setup(); - const result: Promise = service.validateUpdate(externalOauthTool.id as string, externalOauthTool); + const result: Promise = service.validateUpdate(externalOauthTool.id, externalOauthTool); await expect(result).rejects.toThrow( new ValidationError( @@ -342,7 +341,6 @@ describe('ExternalToolValidationService', () => { describe('when external tool has another config type then oauth', () => { const setup = () => { const externalLtiToolDO: ExternalTool = externalToolFactory.withLti11Config().buildWithId(); - externalLtiToolDO.id = 'toolId'; externalToolService.findById.mockResolvedValue(externalLtiToolDO); diff --git a/apps/server/src/modules/tool/external-tool/service/external-tool.service.spec.ts b/apps/server/src/modules/tool/external-tool/service/external-tool.service.spec.ts index ecc0e62f2dc..6b26b389bbd 100644 --- a/apps/server/src/modules/tool/external-tool/service/external-tool.service.spec.ts +++ b/apps/server/src/modules/tool/external-tool/service/external-tool.service.spec.ts @@ -7,11 +7,11 @@ import { Test, TestingModule } from '@nestjs/testing'; import { Page } from '@shared/domain/domainobject'; import { IFindOptions, SortOrder } from '@shared/domain/interface'; import { ContextExternalToolRepo, ExternalToolRepo, SchoolExternalToolRepo } from '@shared/repo'; -import { externalToolFactory, lti11ToolConfigFactory, oauth2ToolConfigFactory } from '@shared/testing'; import { LegacyLogger } from '@src/core/logger'; import { ExternalToolSearchQuery } from '../../common/interface'; import { SchoolExternalTool } from '../../school-external-tool/domain'; import { ExternalTool, Lti11ToolConfig, Oauth2ToolConfig } from '../domain'; +import { externalToolFactory, lti11ToolConfigFactory, oauth2ToolConfigFactory } from '../testing'; import { ExternalToolServiceMapper } from './external-tool-service.mapper'; import { ExternalToolService } from './external-tool.service'; @@ -516,7 +516,7 @@ describe(ExternalToolService.name, () => { }; it('should call externalToolServiceMapper', async () => { - const { changedTool, existingTool } = setup(); + const { changedTool } = setup(); await service.updateExternalTool(changedTool); @@ -549,7 +549,7 @@ describe(ExternalToolService.name, () => { }; it('should call oauthProviderService', async () => { - const { changedTool, oauthClientId, existingTool } = setup(); + const { changedTool, oauthClientId } = setup(); await service.updateExternalTool(changedTool); @@ -582,7 +582,7 @@ describe(ExternalToolService.name, () => { }; it('should update the oauth2Client', async () => { - const { changedTool, oauthClientId, providerOauthClient, existingTool } = setup(); + const { changedTool, oauthClientId, providerOauthClient } = setup(); await service.updateExternalTool(changedTool); @@ -611,7 +611,7 @@ describe(ExternalToolService.name, () => { }; it('should throw an error ', async () => { - const { changedTool, existingTool } = setup(); + const { changedTool } = setup(); const func = () => service.updateExternalTool(changedTool); diff --git a/apps/server/src/modules/tool/external-tool/testing/index.ts b/apps/server/src/modules/tool/external-tool/testing/index.ts index e5ea9294080..c4bedd9e861 100644 --- a/apps/server/src/modules/tool/external-tool/testing/index.ts +++ b/apps/server/src/modules/tool/external-tool/testing/index.ts @@ -1,4 +1,11 @@ export { externalToolEntityFactory, customParameterEntityFactory } from './external-tool-entity.factory'; -export { externalToolFactory } from './external-tool.factory'; +export { + externalToolFactory, + customParameterFactory, + basicToolConfigFactory, + lti11ToolConfigFactory, + oauth2ToolConfigFactory, +} from './external-tool.factory'; export { externalToolParameterDatasheetTemplateDataFactory } from './external-tool-datasheet-template-data.factory'; export { toolConfigurationStatusFactory } from './tool-configuration-status.factory'; +export { externalToolDatasheetTemplateDataFactory } from './external-tool-datasheet-template-data.factory'; diff --git a/apps/server/src/modules/tool/external-tool/uc/external-tool-configuration.uc.spec.ts b/apps/server/src/modules/tool/external-tool/uc/external-tool-configuration.uc.spec.ts index df9969f8fd9..38af6c85ddb 100644 --- a/apps/server/src/modules/tool/external-tool/uc/external-tool-configuration.uc.spec.ts +++ b/apps/server/src/modules/tool/external-tool/uc/external-tool-configuration.uc.spec.ts @@ -7,23 +7,19 @@ import { Test, TestingModule } from '@nestjs/testing'; import { Page } from '@shared/domain/domainobject'; import { User } from '@shared/domain/entity'; import { Permission } from '@shared/domain/interface'; -import { - contextExternalToolFactory, - customParameterFactory, - externalToolFactory, - schoolExternalToolFactory, - setupEntities, - userFactory, -} from '@shared/testing'; +import { setupEntities, userFactory } from '@shared/testing'; import { School, SchoolService } from '@src/modules/school'; import { CustomParameterScope, ToolContextType } from '../../common/enum'; import { ToolPermissionHelper } from '../../common/uc/tool-permission-helper'; import { ContextExternalToolService } from '../../context-external-tool'; import { ContextExternalTool } from '../../context-external-tool/domain'; +import { contextExternalToolFactory } from '../../context-external-tool/testing'; import { SchoolExternalToolService } from '../../school-external-tool'; -import { SchoolExternalTool, SchoolExternalToolWithId } from '../../school-external-tool/domain'; +import { SchoolExternalTool } from '../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../school-external-tool/testing'; import { ExternalTool } from '../domain'; import { ExternalToolConfigurationService, ExternalToolLogoService, ExternalToolService } from '../service'; +import { customParameterFactory, externalToolFactory } from '../testing'; import { ExternalToolConfigurationUc } from './external-tool-configuration.uc'; describe('ExternalToolConfigurationUc', () => { @@ -447,7 +443,7 @@ describe('ExternalToolConfigurationUc', () => { schoolId: school.id, }, schoolExternalToolId - ) as SchoolExternalToolWithId; + ); schoolService.getSchoolById.mockResolvedValueOnce(school); authorizationService.getUserWithPermissions.mockResolvedValueOnce(user); @@ -486,10 +482,7 @@ describe('ExternalToolConfigurationUc', () => { describe('when the user has insufficient permission to read an external tool', () => { const setup = () => { const schoolExternalToolId: string = new ObjectId().toHexString(); - const schoolExternalTool = schoolExternalToolFactory.buildWithId( - undefined, - schoolExternalToolId - ) as SchoolExternalToolWithId; + const schoolExternalTool = schoolExternalToolFactory.buildWithId(undefined, schoolExternalToolId); schoolExternalToolService.findById.mockResolvedValueOnce(schoolExternalTool); authorizationService.checkPermission.mockImplementation(() => { @@ -523,7 +516,7 @@ describe('ExternalToolConfigurationUc', () => { schoolId: 'schoolId', }, schoolExternalToolId - ) as SchoolExternalToolWithId; + ); schoolExternalToolService.findById.mockResolvedValueOnce(schoolExternalTool); externalToolService.findById.mockResolvedValueOnce(externalTool); @@ -551,7 +544,7 @@ describe('ExternalToolConfigurationUc', () => { const schoolExternalTool = schoolExternalToolFactory.buildWithId({ toolId: externalTool.id, - }) as SchoolExternalToolWithId; + }); const contextExternalToolId: string = new ObjectId().toHexString(); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId( @@ -636,7 +629,7 @@ describe('ExternalToolConfigurationUc', () => { const schoolExternalTool = schoolExternalToolFactory.buildWithId({ toolId: externalTool.id, - }) as SchoolExternalToolWithId; + }); const contextExternalToolId: string = new ObjectId().toHexString(); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId( diff --git a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts index 11e43880ccf..eaa6abe25f6 100644 --- a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts +++ b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts @@ -12,15 +12,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { Page } from '@shared/domain/domainobject/page'; import { Role, User } from '@shared/domain/entity'; import { IFindOptions, Permission, SortOrder } from '@shared/domain/interface'; -import { - customParameterFactory, - externalToolDatasheetTemplateDataFactory, - externalToolFactory, - oauth2ToolConfigFactory, - roleFactory, - setupEntities, - userFactory, -} from '@shared/testing'; +import { roleFactory, setupEntities, userFactory } from '@shared/testing'; import { CustomParameter } from '../../common/domain'; import { ExternalToolSearchQuery } from '../../common/interface'; import { CommonToolMetadataService } from '../../common/service/common-tool-metadata.service'; @@ -38,6 +30,12 @@ import { ExternalToolService, ExternalToolValidationService, } from '../service'; +import { + customParameterFactory, + externalToolDatasheetTemplateDataFactory, + externalToolFactory, + oauth2ToolConfigFactory, +} from '../testing'; import { ExternalToolUpdate } from './dto'; import { ExternalToolUc } from './external-tool.uc'; @@ -171,7 +169,7 @@ describe('ExternalToolUc', () => { const { currentUser } = setupAuthorization(); const { externalTool } = setupDefault(); - await uc.createExternalTool(currentUser.userId, externalTool); + await uc.createExternalTool(currentUser.userId, externalTool.getProps()); expect(authorizationService.getUserWithPermissions).toHaveBeenCalledWith(currentUser.userId); }); @@ -180,7 +178,7 @@ describe('ExternalToolUc', () => { const { currentUser, user } = setupAuthorization(); const { externalTool } = setupDefault(); - await uc.createExternalTool(currentUser.userId, externalTool); + await uc.createExternalTool(currentUser.userId, externalTool.getProps()); expect(authorizationService.checkAllPermissions).toHaveBeenCalledWith(user, [Permission.TOOL_ADMIN]); }); @@ -202,7 +200,7 @@ describe('ExternalToolUc', () => { const { currentUser } = setupAuthorization(); const { externalTool } = setupDefault(); - await uc.createExternalTool(currentUser.userId, externalTool); + await uc.createExternalTool(currentUser.userId, externalTool.getProps()); expect(toolValidationService.validateCreate).toHaveBeenCalledWith(externalTool); }); @@ -223,7 +221,7 @@ describe('ExternalToolUc', () => { const { currentUser } = setupAuthorization(); const { externalTool } = setupDefault(); - await uc.createExternalTool(currentUser.userId, externalTool); + await uc.createExternalTool(currentUser.userId, externalTool.getProps()); expect(externalToolService.createExternalTool).toHaveBeenCalledWith(externalTool); }); @@ -232,7 +230,7 @@ describe('ExternalToolUc', () => { const { currentUser } = setupAuthorization(); const { externalTool } = setupDefault(); - const result: ExternalTool = await uc.createExternalTool(currentUser.userId, externalTool); + const result: ExternalTool = await uc.createExternalTool(currentUser.userId, externalTool.getProps()); expect(result).toEqual(externalTool); }); @@ -477,7 +475,7 @@ describe('ExternalToolUc', () => { it('should call ExternalToolLogoService', async () => { const { currentUser, externalTool } = setupLogo(); - await uc.createExternalTool(currentUser.userId, externalTool); + await uc.createExternalTool(currentUser.userId, externalTool.getProps()); expect(logoService.fetchLogo).toHaveBeenCalledWith(externalTool); }); diff --git a/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool.entity.spec.ts b/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool.entity.spec.ts index 191251b5f5c..d1f03b47d80 100644 --- a/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool.entity.spec.ts +++ b/apps/server/src/modules/tool/school-external-tool/entity/school-external-tool.entity.spec.ts @@ -1,9 +1,12 @@ -import { basicToolConfigFactory, schoolEntityFactory, setupEntities } from '@shared/testing'; +import { schoolEntityFactory, setupEntities } from '@shared/testing'; import { CustomParameterLocation, CustomParameterScope, CustomParameterType, ToolConfigType } from '../../common/enum'; import { CustomParameterEntity, ExternalToolConfigEntity, ExternalToolEntity } from '../../external-tool/entity'; -import { customParameterEntityFactory, externalToolEntityFactory } from '../../external-tool/testing'; -import { schoolExternalToolEntityFactory } from '../testing'; -import { schoolExternalToolConfigurationStatusEntityFactory } from '../testing/school-external-tool-configuration-status-entity.factory'; +import { + basicToolConfigFactory, + customParameterEntityFactory, + externalToolEntityFactory, +} from '../../external-tool/testing'; +import { schoolExternalToolConfigurationStatusEntityFactory, schoolExternalToolEntityFactory } from '../testing'; import { SchoolExternalToolEntity } from './school-external-tool.entity'; describe('SchoolExternalToolEntity', () => { @@ -48,14 +51,12 @@ describe('SchoolExternalToolEntity', () => { parameters: [customParameter], isHidden: true, openNewTab: true, - version: 1, isDeactivated: false, }); const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ tool: externalToolEntity, school: schoolEntityFactory.buildWithId(), schoolParameters: [], - toolVersion: 1, status: schoolExternalToolConfigurationStatusEntityFactory.build(), }); @@ -87,14 +88,12 @@ describe('SchoolExternalToolEntity', () => { parameters: [customParameter], isHidden: true, openNewTab: true, - version: 1, isDeactivated: false, }); const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ tool: externalToolEntity, school: schoolEntityFactory.buildWithId(), schoolParameters: [], - toolVersion: 1, status: schoolExternalToolConfigurationStatusEntityFactory.build(), }); diff --git a/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-request.mapper.spec.ts b/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-request.mapper.spec.ts index dbbc9717c04..9fe3f7f1d33 100644 --- a/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-request.mapper.spec.ts +++ b/apps/server/src/modules/tool/school-external-tool/mapper/school-external-tool-request.mapper.spec.ts @@ -1,7 +1,7 @@ -import { schoolToolConfigurationStatusFactory } from '@shared/testing'; -import { SchoolExternalToolRequestMapper } from './school-external-tool-request.mapper'; -import { SchoolExternalToolDto } from '../uc/dto/school-external-tool.types'; import { CustomParameterEntryParam, SchoolExternalToolPostParams } from '../controller/dto'; +import { schoolExternalToolConfigurationStatusFactory } from '../testing'; +import { SchoolExternalToolDto } from '../uc/dto/school-external-tool.types'; +import { SchoolExternalToolRequestMapper } from './school-external-tool-request.mapper'; describe('SchoolExternalToolRequestMapper', () => { const mapper: SchoolExternalToolRequestMapper = new SchoolExternalToolRequestMapper(); @@ -15,7 +15,6 @@ describe('SchoolExternalToolRequestMapper', () => { }; const params: SchoolExternalToolPostParams = { toolId: 'toolId', - version: 1, schoolId: 'schoolId', parameters: [param], isDeactivated: true, @@ -33,11 +32,11 @@ describe('SchoolExternalToolRequestMapper', () => { const schoolExternalToolDto: SchoolExternalToolDto = mapper.mapSchoolExternalToolRequest(params); expect(schoolExternalToolDto).toEqual({ + id: expect.any(String), toolId: params.toolId, parameters: [{ name: param.name, value: param.value }], schoolId: params.schoolId, - toolVersion: params.version, - status: schoolToolConfigurationStatusFactory.build({ isDeactivated: true }), + status: schoolExternalToolConfigurationStatusFactory.build({ isDeactivated: true }), }); }); }); @@ -46,7 +45,6 @@ describe('SchoolExternalToolRequestMapper', () => { const setup = () => { const params: SchoolExternalToolPostParams = { toolId: 'toolId', - version: 1, schoolId: 'schoolId', parameters: undefined, isDeactivated: false, @@ -63,11 +61,11 @@ describe('SchoolExternalToolRequestMapper', () => { const schoolExternalToolDto: SchoolExternalToolDto = mapper.mapSchoolExternalToolRequest(params); expect(schoolExternalToolDto).toEqual({ + id: expect.any(String), toolId: params.toolId, parameters: [], schoolId: params.schoolId, - toolVersion: params.version, - status: schoolToolConfigurationStatusFactory.build(), + status: schoolExternalToolConfigurationStatusFactory.build(), }); }); }); diff --git a/apps/server/src/modules/tool/school-external-tool/service/school-external-tool-validation.service.spec.ts b/apps/server/src/modules/tool/school-external-tool/service/school-external-tool-validation.service.spec.ts index 8d1b0e040e4..40c24eff88e 100644 --- a/apps/server/src/modules/tool/school-external-tool/service/school-external-tool-validation.service.spec.ts +++ b/apps/server/src/modules/tool/school-external-tool/service/school-external-tool-validation.service.spec.ts @@ -1,11 +1,12 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { Test, TestingModule } from '@nestjs/testing'; import { ValidationError } from '@shared/common'; -import { externalToolFactory, schoolExternalToolFactory } from '@shared/testing'; import { CommonToolValidationService } from '../../common/service'; import { ExternalTool } from '../../external-tool/domain'; import { ExternalToolService } from '../../external-tool/service'; +import { externalToolFactory } from '../../external-tool/testing'; import { SchoolExternalTool } from '../domain'; +import { schoolExternalToolFactory } from '../testing'; import { SchoolExternalToolValidationService } from './school-external-tool-validation.service'; describe(SchoolExternalToolValidationService.name, () => { @@ -42,8 +43,8 @@ describe(SchoolExternalToolValidationService.name, () => { describe('validate', () => { describe('when the schoolExternalTool is valid', () => { const setup = () => { - const schoolExternalTool: SchoolExternalTool = schoolExternalToolFactory.buildWithId({ toolVersion: 1337 }); - const externalTool: ExternalTool = externalToolFactory.buildWithId({ version: 8383 }); + const schoolExternalTool: SchoolExternalTool = schoolExternalToolFactory.buildWithId(); + const externalTool: ExternalTool = externalToolFactory.buildWithId(); externalToolService.findById.mockResolvedValue(externalTool); commonToolValidationService.validateParameters.mockReturnValueOnce([]); diff --git a/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.spec.ts b/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.spec.ts index be49b4fb2ef..f0e8f89640f 100644 --- a/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.spec.ts +++ b/apps/server/src/modules/tool/school-external-tool/service/school-external-tool.service.spec.ts @@ -2,9 +2,9 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { Test, TestingModule } from '@nestjs/testing'; import { ApiValidationError } from '@shared/common'; import { SchoolExternalToolRepo } from '@shared/repo'; -import { externalToolFactory } from '@shared/testing/factory'; import { ExternalToolService } from '../../external-tool'; import { ExternalTool } from '../../external-tool/domain'; +import { externalToolFactory } from '../../external-tool/testing'; import { SchoolExternalTool } from '../domain'; import { schoolExternalToolConfigurationStatusFactory, schoolExternalToolFactory } from '../testing'; import { SchoolExternalToolQuery } from '../uc/dto/school-external-tool.types'; @@ -264,10 +264,10 @@ describe(SchoolExternalToolService.name, () => { }; }; - it('should call the schoolExternalToolRepo', async () => { + it('should call the schoolExternalToolRepo', () => { const { schoolExternalToolId } = setup(); - await service.deleteSchoolExternalToolById(schoolExternalToolId); + service.deleteSchoolExternalToolById(schoolExternalToolId); expect(schoolExternalToolRepo.deleteById).toHaveBeenCalledWith(schoolExternalToolId); }); diff --git a/apps/server/src/modules/tool/tool-launch/controller/api-test/tool-launch.controller.api.spec.ts b/apps/server/src/modules/tool/tool-launch/controller/api-test/tool-launch.controller.api.spec.ts index 766d1ed07b8..7afdd718eef 100644 --- a/apps/server/src/modules/tool/tool-launch/controller/api-test/tool-launch.controller.api.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/controller/api-test/tool-launch.controller.api.spec.ts @@ -4,24 +4,22 @@ import { HttpStatus, INestApplication } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { Course, SchoolEntity } from '@shared/domain/entity'; import { Permission } from '@shared/domain/interface'; -import { - basicToolConfigFactory, - contextExternalToolFactory, - courseFactory, - customParameterFactory, - schoolEntityFactory, - TestApiClient, - UserAndAccountTestFactory, -} from '@shared/testing'; +import { courseFactory, schoolEntityFactory, TestApiClient, UserAndAccountTestFactory } from '@shared/testing'; import { Response } from 'supertest'; import { CustomParameterLocation, CustomParameterScope, ToolConfigType } from '../../../common/enum'; import { ContextExternalToolEntity, ContextExternalToolType } from '../../../context-external-tool/entity'; -import { contextExternalToolEntityFactory } from '../../../context-external-tool/testing'; +import { contextExternalToolEntityFactory, contextExternalToolFactory } from '../../../context-external-tool/testing'; import { ExternalToolEntity } from '../../../external-tool/entity'; -import { externalToolEntityFactory } from '../../../external-tool/testing'; +import { + basicToolConfigFactory, + customParameterFactory, + externalToolEntityFactory, +} from '../../../external-tool/testing'; import { SchoolExternalToolEntity } from '../../../school-external-tool/entity'; -import { schoolExternalToolEntityFactory } from '../../../school-external-tool/testing'; -import { schoolExternalToolConfigurationStatusEntityFactory } from '../../../school-external-tool/testing/school-external-tool-configuration-status-entity.factory'; +import { + schoolExternalToolConfigurationStatusEntityFactory, + schoolExternalToolEntityFactory, +} from '../../../school-external-tool/testing'; import { LaunchRequestMethod } from '../../types'; import { ToolLaunchParams, ToolLaunchRequestResponse } from '../dto'; @@ -66,7 +64,6 @@ describe('ToolLaunchController (API)', () => { const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ config: basicToolConfigFactory.build({ baseUrl: 'https://mockurl.de', type: ToolConfigType.BASIC }), - version: 0, parameters: [ customParameterFactory.build({ name: 'schoolMockParameter', @@ -134,18 +131,15 @@ describe('ToolLaunchController (API)', () => { const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ config: basicToolConfigFactory.build({ baseUrl: 'https://mockurl.de', type: ToolConfigType.BASIC }), - version: 1, }); const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ tool: externalToolEntity, school, - toolVersion: 0, }); const contextExternalToolEntity: ContextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ schoolTool: schoolExternalToolEntity, contextId: course.id, contextType: ContextExternalToolType.COURSE, - toolVersion: 0, }); const params: ToolLaunchParams = { contextExternalToolId: contextExternalToolEntity.id }; @@ -186,19 +180,16 @@ describe('ToolLaunchController (API)', () => { const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ config: basicToolConfigFactory.build({ baseUrl: 'https://mockurl.de', type: ToolConfigType.BASIC }), - version: 1, isDeactivated: true, }); const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ tool: externalToolEntity, school, - toolVersion: 0, }); const contextExternalToolEntity: ContextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ schoolTool: schoolExternalToolEntity, contextId: course.id, contextType: ContextExternalToolType.COURSE, - toolVersion: 0, }); const params: ToolLaunchParams = { contextExternalToolId: contextExternalToolEntity.id }; @@ -238,12 +229,10 @@ describe('ToolLaunchController (API)', () => { const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId({ config: basicToolConfigFactory.build({ baseUrl: 'https://mockurl.de', type: ToolConfigType.BASIC }), - version: 1, }); const schoolExternalToolEntity: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ tool: externalToolEntity, school, - toolVersion: 0, status: schoolExternalToolConfigurationStatusEntityFactory.build({ isDeactivated: true, }), @@ -252,7 +241,6 @@ describe('ToolLaunchController (API)', () => { schoolTool: schoolExternalToolEntity, contextId: course.id, contextType: ContextExternalToolType.COURSE, - toolVersion: 0, }); const params: ToolLaunchParams = { contextExternalToolId: contextExternalToolEntity.id }; @@ -338,7 +326,7 @@ describe('ToolLaunchController (API)', () => { const setup = () => { const contextExternalTool = contextExternalToolFactory.buildWithId(); const params: ToolLaunchParams = { - contextExternalToolId: contextExternalTool.id as string, + contextExternalToolId: contextExternalTool.id, }; return { params }; diff --git a/apps/server/src/modules/tool/tool-launch/error/missing-tool-parameter-value.loggable-exception.spec.ts b/apps/server/src/modules/tool/tool-launch/error/missing-tool-parameter-value.loggable-exception.spec.ts index 3a903976f06..ffd926f4acd 100644 --- a/apps/server/src/modules/tool/tool-launch/error/missing-tool-parameter-value.loggable-exception.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/error/missing-tool-parameter-value.loggable-exception.spec.ts @@ -1,7 +1,8 @@ -import { contextExternalToolFactory, customParameterFactory } from '@shared/testing'; -import { MissingToolParameterValueLoggableException } from './missing-tool-parameter-value.loggable-exception'; -import { ContextExternalTool } from '../../context-external-tool/domain'; import { CustomParameter } from '../../common/domain'; +import { ContextExternalTool } from '../../context-external-tool/domain'; +import { contextExternalToolFactory } from '../../context-external-tool/testing'; +import { customParameterFactory } from '../../external-tool/testing'; +import { MissingToolParameterValueLoggableException } from './missing-tool-parameter-value.loggable-exception'; describe('MissingToolParameterValueLoggableException', () => { describe('getLogMessage', () => { diff --git a/apps/server/src/modules/tool/tool-launch/error/tool-status-not-launchable.loggable-exception.spec.ts b/apps/server/src/modules/tool/tool-launch/error/tool-status-not-launchable.loggable-exception.spec.ts index 3c081301fdd..20fa466d994 100644 --- a/apps/server/src/modules/tool/tool-launch/error/tool-status-not-launchable.loggable-exception.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/error/tool-status-not-launchable.loggable-exception.spec.ts @@ -1,4 +1,4 @@ -import { toolConfigurationStatusFactory } from '@shared/testing'; +import { toolConfigurationStatusFactory } from '../../external-tool/testing'; import { ToolStatusNotLaunchableLoggableException } from './tool-status-not-launchable.loggable-exception'; describe('ToolStatusNotLaunchableLoggableException', () => { diff --git a/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-context-id.strategy.spec.ts b/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-context-id.strategy.spec.ts index d1865d231c2..f825fc12d46 100644 --- a/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-context-id.strategy.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-context-id.strategy.spec.ts @@ -1,7 +1,8 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { contextExternalToolFactory, schoolExternalToolFactory } from '@shared/testing'; import { ContextExternalTool } from '../../../context-external-tool/domain'; +import { contextExternalToolFactory } from '../../../context-external-tool/testing'; import { SchoolExternalTool } from '../../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../../school-external-tool/testing'; import { AutoContextIdStrategy } from './auto-context-id.strategy'; describe(AutoContextIdStrategy.name, () => { @@ -31,7 +32,7 @@ describe(AutoContextIdStrategy.name, () => { const schoolExternalTool: SchoolExternalTool = schoolExternalToolFactory.buildWithId(); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId({ schoolToolRef: { - schoolToolId: schoolExternalTool.id as string, + schoolToolId: schoolExternalTool.id, }, contextRef: { id: contextId, diff --git a/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-context-name.strategy.spec.ts b/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-context-name.strategy.spec.ts index 7c7dc5fc87a..8554f66ad80 100644 --- a/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-context-name.strategy.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-context-name.strategy.spec.ts @@ -5,17 +5,12 @@ import { CourseService } from '@modules/learnroom'; import { Test, TestingModule } from '@nestjs/testing'; import { BoardExternalReferenceType, ColumnBoard, ExternalToolElement } from '@shared/domain/domainobject'; import { Course } from '@shared/domain/entity'; -import { - columnBoardFactory, - contextExternalToolFactory, - courseFactory, - externalToolElementFactory, - schoolExternalToolFactory, - setupEntities, -} from '@shared/testing'; +import { columnBoardFactory, courseFactory, externalToolElementFactory, setupEntities } from '@shared/testing'; import { ToolContextType } from '../../../common/enum'; import { ContextExternalTool } from '../../../context-external-tool/domain'; +import { contextExternalToolFactory } from '../../../context-external-tool/testing'; import { SchoolExternalTool } from '../../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../../school-external-tool/testing'; import { ParameterTypeNotImplementedLoggableException } from '../../error'; import { AutoContextNameStrategy } from './auto-context-name.strategy'; diff --git a/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-medium-id.strategy.spec.ts b/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-medium-id.strategy.spec.ts index 79fdfaa0a20..48a6f8a1b7f 100644 --- a/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-medium-id.strategy.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-medium-id.strategy.spec.ts @@ -1,10 +1,12 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { Test, TestingModule } from '@nestjs/testing'; -import { contextExternalToolFactory, externalToolFactory, schoolExternalToolFactory } from '@shared/testing'; import { ContextExternalTool } from '../../../context-external-tool/domain'; +import { contextExternalToolFactory } from '../../../context-external-tool/testing'; import { ExternalTool } from '../../../external-tool/domain'; import { ExternalToolService } from '../../../external-tool/service'; +import { externalToolFactory } from '../../../external-tool/testing'; import { SchoolExternalTool } from '../../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../../school-external-tool/testing'; import { AutoMediumIdStrategy } from './auto-medium-id.strategy'; describe(AutoMediumIdStrategy.name, () => { diff --git a/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-school-id.strategy.spec.ts b/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-school-id.strategy.spec.ts index 2b184c51140..445b7576bae 100644 --- a/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-school-id.strategy.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-school-id.strategy.spec.ts @@ -1,7 +1,8 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { contextExternalToolFactory, schoolExternalToolFactory } from '@shared/testing'; import { ContextExternalTool } from '../../../context-external-tool/domain'; +import { contextExternalToolFactory } from '../../../context-external-tool/testing'; import { SchoolExternalTool } from '../../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../../school-external-tool/testing'; import { AutoSchoolIdStrategy } from './auto-school-id.strategy'; describe(AutoSchoolIdStrategy.name, () => { @@ -33,7 +34,7 @@ describe(AutoSchoolIdStrategy.name, () => { }); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId({ schoolToolRef: { - schoolToolId: schoolExternalTool.id as string, + schoolToolId: schoolExternalTool.id, schoolId, }, }); diff --git a/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-school-number.strategy.spec.ts b/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-school-number.strategy.spec.ts index 01f67d2c98e..122e559cad3 100644 --- a/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-school-number.strategy.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/service/auto-parameter-strategy/auto-school-number.strategy.spec.ts @@ -2,9 +2,11 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { LegacySchoolService } from '@modules/legacy-school'; import { Test, TestingModule } from '@nestjs/testing'; import { LegacySchoolDo } from '@shared/domain/domainobject'; -import { contextExternalToolFactory, legacySchoolDoFactory, schoolExternalToolFactory } from '@shared/testing'; +import { legacySchoolDoFactory } from '@shared/testing'; import { ContextExternalTool } from '../../../context-external-tool/domain'; +import { contextExternalToolFactory } from '../../../context-external-tool/testing'; import { SchoolExternalTool } from '../../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../../school-external-tool/testing'; import { AutoSchoolNumberStrategy } from './auto-school-number.strategy'; describe(AutoSchoolNumberStrategy.name, () => { @@ -48,7 +50,7 @@ describe(AutoSchoolNumberStrategy.name, () => { }); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId({ schoolToolRef: { - schoolToolId: schoolExternalTool.id as string, + schoolToolId: schoolExternalTool.id, schoolId: school.id, }, }); @@ -82,7 +84,7 @@ describe(AutoSchoolNumberStrategy.name, () => { }); const contextExternalTool: ContextExternalTool = contextExternalToolFactory.buildWithId({ schoolToolRef: { - schoolToolId: schoolExternalTool.id as string, + schoolToolId: schoolExternalTool.id, schoolId: school.id, }, }); diff --git a/apps/server/src/modules/tool/tool-launch/service/launch-strategy/abstract-launch.strategy.spec.ts b/apps/server/src/modules/tool/tool-launch/service/launch-strategy/abstract-launch.strategy.spec.ts index 27d81daaf90..843f11a511a 100644 --- a/apps/server/src/modules/tool/tool-launch/service/launch-strategy/abstract-launch.strategy.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/service/launch-strategy/abstract-launch.strategy.spec.ts @@ -3,17 +3,14 @@ import { ObjectId } from '@mikro-orm/mongodb'; import { Injectable } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { EntityId } from '@shared/domain/types'; -import { - contextExternalToolFactory, - customParameterFactory, - externalToolFactory, - schoolExternalToolFactory, -} from '@shared/testing'; import { CustomParameterEntry } from '../../../common/domain'; import { CustomParameterLocation, CustomParameterScope, CustomParameterType } from '../../../common/enum'; import { ContextExternalTool } from '../../../context-external-tool/domain'; +import { contextExternalToolFactory } from '../../../context-external-tool/testing'; import { ExternalTool } from '../../../external-tool/domain'; +import { customParameterFactory, externalToolFactory } from '../../../external-tool/testing'; import { SchoolExternalTool } from '../../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../../school-external-tool/testing'; import { MissingToolParameterValueLoggableException, ParameterTypeNotImplementedLoggableException } from '../../error'; import { LaunchRequestMethod, @@ -26,9 +23,9 @@ import { import { AutoContextIdStrategy, AutoContextNameStrategy, + AutoMediumIdStrategy, AutoSchoolIdStrategy, AutoSchoolNumberStrategy, - AutoMediumIdStrategy, } from '../auto-parameter-strategy'; import { AbstractLaunchStrategy } from './abstract-launch.strategy'; import { ToolLaunchParams } from './tool-launch-params.interface'; diff --git a/apps/server/src/modules/tool/tool-launch/service/launch-strategy/basic-tool-launch.strategy.spec.ts b/apps/server/src/modules/tool/tool-launch/service/launch-strategy/basic-tool-launch.strategy.spec.ts index 7335f0d149a..e6d3780b6a9 100644 --- a/apps/server/src/modules/tool/tool-launch/service/launch-strategy/basic-tool-launch.strategy.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/service/launch-strategy/basic-tool-launch.strategy.spec.ts @@ -1,9 +1,11 @@ import { createMock } from '@golevelup/ts-jest'; import { Test, TestingModule } from '@nestjs/testing'; -import { contextExternalToolFactory, externalToolFactory, schoolExternalToolFactory } from '@shared/testing'; import { ContextExternalTool } from '../../../context-external-tool/domain'; +import { contextExternalToolFactory } from '../../../context-external-tool/testing'; import { ExternalTool } from '../../../external-tool/domain'; +import { externalToolFactory } from '../../../external-tool/testing'; import { SchoolExternalTool } from '../../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../../school-external-tool/testing'; import { LaunchRequestMethod, PropertyData, PropertyLocation } from '../../types'; import { AutoContextIdStrategy, diff --git a/apps/server/src/modules/tool/tool-launch/service/launch-strategy/lti11-tool-launch.strategy.spec.ts b/apps/server/src/modules/tool/tool-launch/service/launch-strategy/lti11-tool-launch.strategy.spec.ts index 610ecefb48f..8f97bd2b7b6 100644 --- a/apps/server/src/modules/tool/tool-launch/service/launch-strategy/lti11-tool-launch.strategy.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/service/launch-strategy/lti11-tool-launch.strategy.spec.ts @@ -1,30 +1,28 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; +import { ObjectId } from '@mikro-orm/mongodb'; import { PseudonymService } from '@modules/pseudonym/service'; import { UserService } from '@modules/user'; import { InternalServerErrorException, UnprocessableEntityException } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { Pseudonym, UserDO } from '@shared/domain/domainobject'; import { RoleName } from '@shared/domain/interface'; -import { - contextExternalToolFactory, - externalToolFactory, - schoolExternalToolFactory, - userDoFactory, -} from '@shared/testing'; +import { userDoFactory } from '@shared/testing'; import { pseudonymFactory } from '@shared/testing/factory/domainobject/pseudonym.factory'; -import { ObjectId } from '@mikro-orm/mongodb'; import { Authorization } from 'oauth-1.0a'; import { LtiMessageType, LtiPrivacyPermission, LtiRole } from '../../../common/enum'; import { ContextExternalTool } from '../../../context-external-tool/domain'; +import { contextExternalToolFactory } from '../../../context-external-tool/testing'; import { ExternalTool } from '../../../external-tool/domain'; +import { externalToolFactory } from '../../../external-tool/testing'; import { SchoolExternalTool } from '../../../school-external-tool/domain'; +import { schoolExternalToolFactory } from '../../../school-external-tool/testing'; import { LaunchRequestMethod, PropertyData, PropertyLocation } from '../../types'; import { AutoContextIdStrategy, AutoContextNameStrategy, + AutoMediumIdStrategy, AutoSchoolIdStrategy, AutoSchoolNumberStrategy, - AutoMediumIdStrategy, } from '../auto-parameter-strategy'; import { Lti11EncryptionService } from '../lti11-encryption.service'; import { Lti11ToolLaunchStrategy } from './lti11-tool-launch.strategy'; @@ -168,7 +166,7 @@ describe('Lti11ToolLaunchStrategy', () => { new PropertyData({ name: 'lti_version', value: 'LTI-1p0', location: PropertyLocation.BODY }), new PropertyData({ name: 'resource_link_id', - value: contextExternalTool.id as string, + value: contextExternalTool.id, location: PropertyLocation.BODY, }), new PropertyData({ diff --git a/apps/server/src/modules/tool/tool-launch/service/tool-launch.service.spec.ts b/apps/server/src/modules/tool/tool-launch/service/tool-launch.service.spec.ts index 3bf4b57df06..5b5a6e8f7c5 100644 --- a/apps/server/src/modules/tool/tool-launch/service/tool-launch.service.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/service/tool-launch.service.spec.ts @@ -1,19 +1,19 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { InternalServerErrorException } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; +import { ToolConfigType } from '../../common/enum'; +import { ContextExternalTool } from '../../context-external-tool/domain'; +import { ToolConfigurationStatusService } from '../../context-external-tool/service'; +import { contextExternalToolFactory } from '../../context-external-tool/testing'; +import { ExternalToolService } from '../../external-tool'; +import { BasicToolConfig, ExternalTool } from '../../external-tool/domain'; import { basicToolConfigFactory, - contextExternalToolFactory, externalToolFactory, - schoolExternalToolFactory, toolConfigurationStatusFactory, -} from '@shared/testing'; -import { ToolConfigType } from '../../common/enum'; -import { ContextExternalTool } from '../../context-external-tool/domain'; -import { BasicToolConfig, ExternalTool } from '../../external-tool/domain'; -import { ExternalToolService } from '../../external-tool'; -import { SchoolExternalToolWithId } from '../../school-external-tool/domain'; +} from '../../external-tool/testing'; import { SchoolExternalToolService } from '../../school-external-tool'; +import { schoolExternalToolFactory } from '../../school-external-tool/testing'; import { ToolStatusNotLaunchableLoggableException } from '../error'; import { LaunchRequestMethod, ToolLaunchData, ToolLaunchDataType, ToolLaunchRequest } from '../types'; import { @@ -23,7 +23,6 @@ import { ToolLaunchParams, } from './launch-strategy'; import { ToolLaunchService } from './tool-launch.service'; -import { ToolConfigurationStatusService } from '../../context-external-tool/service'; describe('ToolLaunchService', () => { let module: TestingModule; @@ -83,7 +82,7 @@ describe('ToolLaunchService', () => { describe('getLaunchData', () => { describe('when the tool config type is BASIC', () => { const setup = () => { - const schoolExternalTool = schoolExternalToolFactory.buildWithId() as SchoolExternalToolWithId; + const schoolExternalTool = schoolExternalToolFactory.buildWithId(); const contextExternalTool: ContextExternalTool = contextExternalToolFactory .withSchoolExternalToolRef(schoolExternalTool.id) .build(); @@ -165,7 +164,7 @@ describe('ToolLaunchService', () => { describe('when the tool config type is unknown', () => { const setup = () => { - const schoolExternalTool = schoolExternalToolFactory.buildWithId() as SchoolExternalToolWithId; + const schoolExternalTool = schoolExternalToolFactory.buildWithId(); const contextExternalTool: ContextExternalTool = contextExternalToolFactory .withSchoolExternalToolRef(schoolExternalTool.id) .build(); @@ -204,7 +203,7 @@ describe('ToolLaunchService', () => { describe('when tool configuration status is not launchable', () => { const setup = () => { - const schoolExternalTool = schoolExternalToolFactory.buildWithId() as SchoolExternalToolWithId; + const schoolExternalTool = schoolExternalToolFactory.buildWithId(); const contextExternalTool: ContextExternalTool = contextExternalToolFactory .withSchoolExternalToolRef(schoolExternalTool.id) .build(); @@ -244,7 +243,7 @@ describe('ToolLaunchService', () => { return { launchParams, userId, - contextExternalToolId: contextExternalTool.id as string, + contextExternalToolId: contextExternalTool.id, }; }; From 0f83d460c9f689d09874f8571fcf01f9b2b923da Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Wed, 15 May 2024 14:34:29 +0200 Subject: [PATCH 08/26] N21-1885 updates imports 2 --- ...arameter-optional-value-missing-loggable-exception.spec.ts | 2 +- .../error/tool-parameter-required.loggable-exception.spec.ts | 2 +- .../controller/api-test/tool-school.api.spec.ts | 4 ---- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/server/src/modules/tool/common/domain/error/tool-parameter-optional-value-missing-loggable-exception.spec.ts b/apps/server/src/modules/tool/common/domain/error/tool-parameter-optional-value-missing-loggable-exception.spec.ts index 2c047219822..274397b45fb 100644 --- a/apps/server/src/modules/tool/common/domain/error/tool-parameter-optional-value-missing-loggable-exception.spec.ts +++ b/apps/server/src/modules/tool/common/domain/error/tool-parameter-optional-value-missing-loggable-exception.spec.ts @@ -1,4 +1,4 @@ -import { customParameterFactory } from '@shared/testing'; +import { customParameterFactory } from '@modules/tool/external-tool/testing'; import { CustomParameter } from '../custom-parameter.do'; import { ToolParameterOptionalValueMissingLoggableException } from './tool-parameter-optional-value-missing-loggable-exception'; diff --git a/apps/server/src/modules/tool/common/domain/error/tool-parameter-required.loggable-exception.spec.ts b/apps/server/src/modules/tool/common/domain/error/tool-parameter-required.loggable-exception.spec.ts index ff43272a8a3..17bcbd46e1d 100644 --- a/apps/server/src/modules/tool/common/domain/error/tool-parameter-required.loggable-exception.spec.ts +++ b/apps/server/src/modules/tool/common/domain/error/tool-parameter-required.loggable-exception.spec.ts @@ -1,4 +1,4 @@ -import { customParameterFactory } from '@shared/testing'; +import { customParameterFactory } from '../../../external-tool/testing'; import { CustomParameter } from '../custom-parameter.do'; import { ToolParameterRequiredLoggableException } from './tool-parameter-required.loggable-exception'; diff --git a/apps/server/src/modules/tool/school-external-tool/controller/api-test/tool-school.api.spec.ts b/apps/server/src/modules/tool/school-external-tool/controller/api-test/tool-school.api.spec.ts index 59e3221db2c..a1bd904344e 100644 --- a/apps/server/src/modules/tool/school-external-tool/controller/api-test/tool-school.api.spec.ts +++ b/apps/server/src/modules/tool/school-external-tool/controller/api-test/tool-school.api.spec.ts @@ -1,14 +1,11 @@ import { EntityManager, MikroORM } from '@mikro-orm/core'; import { ObjectId } from '@mikro-orm/mongodb'; -import { AccountEntity } from '@modules/account/entity/account.entity'; import { ServerTestModule } from '@modules/server'; import { HttpStatus, INestApplication } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { ColumnBoardNode, ExternalToolElementNodeEntity, SchoolEntity, User } from '@shared/domain/entity'; import { Permission } from '@shared/domain/interface'; import { - TestApiClient, - UserAndAccountTestFactory, columnBoardNodeFactory, externalToolElementNodeFactory, schoolEntityFactory, @@ -16,7 +13,6 @@ import { UserAndAccountTestFactory, userFactory, } from '@shared/testing'; -import { schoolToolConfigurationStatusFactory } from '@shared/testing/factory'; import { AccountEntity } from '@src/modules/account/domain/entity/account.entity'; import { accountFactory } from '@src/modules/account/testing'; import { ContextExternalToolEntity, ContextExternalToolType } from '../../../context-external-tool/entity'; From 0ae279244e78d066c31fc32e7fb207923dabb453 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Wed, 15 May 2024 14:42:51 +0200 Subject: [PATCH 09/26] N21-1885 fixes tests --- .../validation/rules/parameter-entry-value-validator.spec.ts | 2 +- .../entity/context-external-tool.entity.spec.ts | 3 --- .../service/context-external-tool-validation.service.spec.ts | 5 +++-- .../uc/context-external-tool.uc.spec.ts | 2 +- .../tool/external-tool/entity/external-tool.entity.spec.ts | 1 - 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/apps/server/src/modules/tool/common/service/validation/rules/parameter-entry-value-validator.spec.ts b/apps/server/src/modules/tool/common/service/validation/rules/parameter-entry-value-validator.spec.ts index 4784f3054c8..63dffd305d8 100644 --- a/apps/server/src/modules/tool/common/service/validation/rules/parameter-entry-value-validator.spec.ts +++ b/apps/server/src/modules/tool/common/service/validation/rules/parameter-entry-value-validator.spec.ts @@ -1,5 +1,5 @@ import { ValidationError } from '@shared/common'; -import { customParameterFactory } from '@shared/testing'; +import { customParameterFactory } from '../../../../external-tool/testing'; import { CustomParameter, CustomParameterEntry, diff --git a/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.spec.ts b/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.spec.ts index 5bf07d1f105..b9933a70315 100644 --- a/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.spec.ts @@ -51,18 +51,15 @@ describe('ExternalToolEntity', () => { parameters: [customParameter], isHidden: true, openNewTab: true, - version: 1, }); const schoolTool: SchoolExternalToolEntity = schoolExternalToolEntityFactory.buildWithId({ tool: externalToolEntity, school: schoolEntityFactory.buildWithId(), schoolParameters: [], - toolVersion: 1, }); const contextExternalToolEntity: ContextExternalToolEntity = contextExternalToolEntityFactory.buildWithId({ schoolTool, parameters: [], - toolVersion: 1, }); expect(contextExternalToolEntity instanceof ContextExternalToolEntity).toEqual(true); diff --git a/apps/server/src/modules/tool/context-external-tool/service/context-external-tool-validation.service.spec.ts b/apps/server/src/modules/tool/context-external-tool/service/context-external-tool-validation.service.spec.ts index 29cdba8d13e..0f5a7f19601 100644 --- a/apps/server/src/modules/tool/context-external-tool/service/context-external-tool-validation.service.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/service/context-external-tool-validation.service.spec.ts @@ -1,14 +1,15 @@ import { createMock, DeepMocked } from '@golevelup/ts-jest'; +import { ContextExternalToolNameAlreadyExistsLoggableException } from '@modules/tool/common/domain'; import { UnprocessableEntityException } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { ValidationError } from '@shared/common'; -import { contextExternalToolFactory, externalToolFactory } from '@shared/testing'; -import { ContextExternalToolNameAlreadyExistsLoggableException } from '@modules/tool/common/domain'; import { CommonToolValidationService } from '../../common/service'; import { ExternalTool } from '../../external-tool/domain'; import { ExternalToolService } from '../../external-tool/service'; +import { externalToolFactory } from '../../external-tool/testing'; import { SchoolExternalToolService } from '../../school-external-tool/service'; import { ContextExternalTool } from '../domain'; +import { contextExternalToolFactory } from '../testing'; import { ContextExternalToolValidationService } from './context-external-tool-validation.service'; import { ContextExternalToolService } from './context-external-tool.service'; diff --git a/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts b/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts index 31da314a22b..46fa245623d 100644 --- a/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts @@ -24,7 +24,7 @@ import { ContextExternalToolValidationService } from '../service/context-externa import { contextExternalToolFactory } from '../testing'; import { ContextExternalToolUc } from './context-external-tool.uc'; -describe('ContextExternalToolUc', () => { +describe(ContextExternalToolUc.name, () => { let module: TestingModule; let uc: ContextExternalToolUc; diff --git a/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.spec.ts b/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.spec.ts index 0ab767552c8..7d685b12a84 100644 --- a/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.spec.ts +++ b/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.spec.ts @@ -58,7 +58,6 @@ describe('ExternalToolEntity', () => { isHidden: true, isDeactivated: false, openNewTab: true, - version: 1, }); return { externalToolEntity, From d83f5bfcdc8012763a9aa6cca9da163d1a07bc49 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Wed, 15 May 2024 14:54:24 +0200 Subject: [PATCH 10/26] N21-1885 fixes tests 2 --- .../uc/context-external-tool.uc.spec.ts | 8 ++++---- .../tool/tool-launch/uc/tool-launch.uc.spec.ts | 11 ++++------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts b/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts index 46fa245623d..a233bba351c 100644 --- a/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts @@ -114,7 +114,7 @@ describe(ContextExternalToolUc.name, () => { it('should call contextExternalToolService', async () => { const { contextExternalTool, user, schoolId } = setup(); - await uc.createContextExternalTool(user.id, schoolId, contextExternalTool); + await uc.createContextExternalTool(user.id, schoolId, contextExternalTool.getProps()); expect(contextExternalToolService.saveContextExternalTool).toHaveBeenCalledWith(contextExternalTool); }); @@ -122,7 +122,7 @@ describe(ContextExternalToolUc.name, () => { it('should call contextExternalToolService to ensure permissions', async () => { const { contextExternalTool, user, schoolId } = setup(); - await uc.createContextExternalTool(user.id, schoolId, contextExternalTool); + await uc.createContextExternalTool(user.id, schoolId, contextExternalTool.getProps()); expect(toolPermissionHelper.ensureContextPermissions).toHaveBeenCalledWith( user, @@ -134,7 +134,7 @@ describe(ContextExternalToolUc.name, () => { it('should check for context restrictions', async () => { const { contextExternalTool, user, schoolId } = setup(); - await uc.createContextExternalTool(user.id, schoolId, contextExternalTool); + await uc.createContextExternalTool(user.id, schoolId, contextExternalTool.getProps()); expect(contextExternalToolService.checkContextRestrictions).toHaveBeenCalledWith(contextExternalTool); }); @@ -142,7 +142,7 @@ describe(ContextExternalToolUc.name, () => { it('should call contextExternalToolValidationService', async () => { const { contextExternalTool, user, schoolId } = setup(); - await uc.createContextExternalTool(user.id, schoolId, contextExternalTool); + await uc.createContextExternalTool(user.id, schoolId, contextExternalTool.getProps()); expect(contextExternalToolValidationService.validate).toHaveBeenCalledWith(contextExternalTool); }); diff --git a/apps/server/src/modules/tool/tool-launch/uc/tool-launch.uc.spec.ts b/apps/server/src/modules/tool/tool-launch/uc/tool-launch.uc.spec.ts index 6d460eb0e05..5844ffaa068 100644 --- a/apps/server/src/modules/tool/tool-launch/uc/tool-launch.uc.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/uc/tool-launch.uc.spec.ts @@ -10,17 +10,14 @@ import { ConfigService } from '@nestjs/config'; import { Test, TestingModule } from '@nestjs/testing'; import { User } from '@shared/domain/entity'; import { Permission } from '@shared/domain/interface'; -import { - contextExternalToolFactory, - externalToolFactory, - schoolExternalToolFactory, - setupEntities, - userFactory, -} from '@shared/testing'; +import { setupEntities, userFactory } from '@shared/testing'; import { AuthorizationContextBuilder, AuthorizationService } from '@src/modules/authorization'; import { ToolPermissionHelper } from '../../common/uc/tool-permission-helper'; import { ContextExternalTool } from '../../context-external-tool/domain'; import { ContextExternalToolService } from '../../context-external-tool/service'; +import { contextExternalToolFactory } from '../../context-external-tool/testing'; +import { externalToolFactory } from '../../external-tool/testing'; +import { schoolExternalToolFactory } from '../../school-external-tool/testing'; import { ToolLaunchService } from '../service'; import { ToolLaunchData, ToolLaunchDataType, ToolLaunchRequest } from '../types'; import { ToolLaunchUc } from './tool-launch.uc'; From 1a94f033d28f20c70902bb412ff2a8ee3fe392cb Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Thu, 16 May 2024 09:30:35 +0200 Subject: [PATCH 11/26] N21-1885 fixes tests 3 --- .../uc/context-external-tool.uc.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts b/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts index a233bba351c..46fa245623d 100644 --- a/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts @@ -114,7 +114,7 @@ describe(ContextExternalToolUc.name, () => { it('should call contextExternalToolService', async () => { const { contextExternalTool, user, schoolId } = setup(); - await uc.createContextExternalTool(user.id, schoolId, contextExternalTool.getProps()); + await uc.createContextExternalTool(user.id, schoolId, contextExternalTool); expect(contextExternalToolService.saveContextExternalTool).toHaveBeenCalledWith(contextExternalTool); }); @@ -122,7 +122,7 @@ describe(ContextExternalToolUc.name, () => { it('should call contextExternalToolService to ensure permissions', async () => { const { contextExternalTool, user, schoolId } = setup(); - await uc.createContextExternalTool(user.id, schoolId, contextExternalTool.getProps()); + await uc.createContextExternalTool(user.id, schoolId, contextExternalTool); expect(toolPermissionHelper.ensureContextPermissions).toHaveBeenCalledWith( user, @@ -134,7 +134,7 @@ describe(ContextExternalToolUc.name, () => { it('should check for context restrictions', async () => { const { contextExternalTool, user, schoolId } = setup(); - await uc.createContextExternalTool(user.id, schoolId, contextExternalTool.getProps()); + await uc.createContextExternalTool(user.id, schoolId, contextExternalTool); expect(contextExternalToolService.checkContextRestrictions).toHaveBeenCalledWith(contextExternalTool); }); @@ -142,7 +142,7 @@ describe(ContextExternalToolUc.name, () => { it('should call contextExternalToolValidationService', async () => { const { contextExternalTool, user, schoolId } = setup(); - await uc.createContextExternalTool(user.id, schoolId, contextExternalTool.getProps()); + await uc.createContextExternalTool(user.id, schoolId, contextExternalTool); expect(contextExternalToolValidationService.validate).toHaveBeenCalledWith(contextExternalTool); }); From 36c1d711884bd0b251e690a1d9c986a857c18428 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Thu, 16 May 2024 11:26:18 +0200 Subject: [PATCH 12/26] N21-1885 external tool entity without basedorepo --- .../entity/external-tool.entity.ts | 4 +- .../testing/external-tool-entity.factory.ts | 18 ++--- .../lti11-tool-launch.strategy.spec.ts | 33 ---------- .../lti11-tool-launch.strategy.ts | 6 +- .../external-tool.repo.integration.spec.ts | 6 +- .../externaltool/external-tool.repo.mapper.ts | 4 +- .../repo/externaltool/external-tool.repo.ts | 65 ++++++++++++------- 7 files changed, 59 insertions(+), 77 deletions(-) diff --git a/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts b/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts index 0496d0cadf9..b4790595ccb 100644 --- a/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts +++ b/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts @@ -7,7 +7,7 @@ import { BasicToolConfigEntity, Lti11ToolConfigEntity, Oauth2ToolConfigEntity } import { CustomParameterEntity } from './custom-parameter'; import { ExternalToolMediumEntity } from './external-tool-medium.entity'; -export interface ExternalToolProps { +export interface ExternalToolEntityProps { id?: EntityId; name: string; @@ -74,7 +74,7 @@ export class ExternalToolEntity extends BaseEntityWithTimestamps { @Embedded(() => ExternalToolMediumEntity, { nullable: true, object: true }) medium?: ExternalToolMediumEntity; - constructor(props: ExternalToolProps) { + constructor(props: ExternalToolEntityProps) { super(); this.name = props.name; this.description = props.description; diff --git a/apps/server/src/modules/tool/external-tool/testing/external-tool-entity.factory.ts b/apps/server/src/modules/tool/external-tool/testing/external-tool-entity.factory.ts index b13f7a40bcb..5da47740fab 100644 --- a/apps/server/src/modules/tool/external-tool/testing/external-tool-entity.factory.ts +++ b/apps/server/src/modules/tool/external-tool/testing/external-tool-entity.factory.ts @@ -11,24 +11,24 @@ import { BasicToolConfigEntity, CustomParameterEntity, ExternalToolEntity, + ExternalToolEntityProps, ExternalToolMediumEntity, - ExternalToolProps, Lti11ToolConfigEntity, Oauth2ToolConfigEntity, } from '@modules/tool/external-tool/entity'; import { BaseFactory } from '@shared/testing/factory/base.factory'; import { DeepPartial } from 'fishery'; -export class ExternalToolEntityFactory extends BaseFactory { +export class ExternalToolEntityFactory extends BaseFactory { withName(name: string): this { - const params: DeepPartial = { + const params: DeepPartial = { name, }; return this.params(params); } withBasicConfig(): this { - const params: DeepPartial = { + const params: DeepPartial = { config: new BasicToolConfigEntity({ type: ToolConfigType.BASIC, baseUrl: 'mockBaseUrl', @@ -38,7 +38,7 @@ export class ExternalToolEntityFactory extends BaseFactory = { + const params: DeepPartial = { config: new Oauth2ToolConfigEntity({ type: ToolConfigType.OAUTH2, baseUrl: 'mockBaseUrl', @@ -50,7 +50,7 @@ export class ExternalToolEntityFactory extends BaseFactory = { + const params: DeepPartial = { config: new Lti11ToolConfigEntity({ type: ToolConfigType.BASIC, baseUrl: 'mockBaseUrl', @@ -65,7 +65,7 @@ export class ExternalToolEntityFactory extends BaseFactory = { + const params: DeepPartial = { logoBase64: 'iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAYAAAAeGRPoAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ2MUQ2Q0Y5RTQxMTExRTdBMTg3QkQ2MDVGMUFEMUIwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQ2MUQ2Q0ZBRTQxMTExRTdBMTg3QkQ2MDVGMUFEMUIwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDYxRDZDRjdFNDExMTFFN0ExODdCRDYwNUYxQUQxQjAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDYxRDZDRjhFNDExMTFFN0ExODdCRDYwNUYxQUQxQjAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz45EjsrAAALfUlEQVR42uzdgXWjOAIGYHLvGsiV4CnBU4JTgqeEpIS4hKSEpIS4BLsEu4RJCeMScmhGzPplkyCMAGO+7z3ezs3tYsuS+BEIcfX29lYAAOP2Hz8BAAh0AECgAwACHQAQ6AAg0AEAgQ4ACHQAQKADgEAHAAQ6ACDQAQCBDgACHQAQ6ACAQAcABDoACHQAQKADAAIdABDoACDQAQCBDgAIdABAoAOAQAcABDoAINABAIEOAAIdABDoAIBABwAEOgAIdABAoAMAAh0AEOgAINABAIEOAAh0AECgA4BABwAEOgAg0AEAgQ4ACHQAEOgAgEAHAAQ6ACDQAUCgAwACHQAQ6ACAQAcAgQ4ACHQAQKADAAIdAAQ6ACDQAQCBDgAIdAAQ6ACAQAcABDoAINABQKADAAIdABDoAIBABwCBDgAIdABAoAMAAh0ABDoAINABgN79109AbldXV9flPxblNov/DOblFv7+UG77+HfVn39vb29vB78emdpg1fauP2iDwWvcgm3883aMbbAs6/yorPP414ujf+W4z+2r/12WdasOL6zdl4Ufa4fdvGu0gyp/x6sTyjD0jx8a/03GOgn1cVtuyxN3EQ4267CV3+t16u2jhz701lfb6DEAlnGbt2yDz+ccDDHEq7LOTtzNIZY11PVaHV6AEOhj3ErhgP12LtuJZRj6e28y1cW8g/p4CgeqKbePHvpQ522jp3LMYnvJWWe/2rbBjsq66Kht/wwn4+pw3Jt76LQ9o76NB5jco+Gw35/l/p/iJXx43/auy+2+CqPMu7+O+9zFzziHsj511Nf+Bmr5GT/jlTZ1OEICnbZh/lT8c0+rC1WwL/3ivLvkvCu3h44/KrTth/LzdvFy8BBlXXQUeJ8F+6b8zIeuT6SnVIcCnXM/oC5jmPchdMiXqZxlk3QiuStOv3d8inkc6c0HKOum45Pmj9zHYJ+pQ4HOZR9Qr08I8zBRZRu3U4RJcs9+fWHe44nkRyeWu/gd+ijr04BlrRzU4Xh4bI1T3CaMGMKB4LH4M4N2/0Gnrh5JqWbr1u3vzmNtwrxhEFSzuEP7ez1+TCu2v9lR+2syagv3mvcfteuMZb0vml1ifz0q6/74KZF3Za3Km/Lb/cjd56ZUh4OYyuy/1NnPZhknfe9fNd/9JQR0g/1Vk1d+frK/hym2D+3vX7O7G83YbtgGm86yDn1g1lFZlw3Lumy4/9Df7mv68VwdjrBPC3SBnrlT7lru//2BZtekUwv0y2t/MYB+JR6kH9q0lzjK2yV+1q6jx7dSy3qf4Xe9/2C/t+rQY2tMQ91lrceWV4zCf/8tXmZzqZ2iSH+SIrSVVZv2Ei/BhgV1UuZrzDuYqJlS1upyeNu+doj7+F78s+LaY/l3z+pwnAQ6WQM9x4pT8UDzI3TKi7vHRdN7rovEe753uYIotr+7xEC4zzUTPD45kvIM+E3Old1iH/sew3ylDgU609Hb4zPnvtY0vUgZPd11MaqMgbBP6A+5RngPiWXdd1DWQxdhPsE6FOhc1IjKqm7kHNnVjVjXHV0iroQrRXWXf2/btvtY1tnAZVWHAp2JqesYVnQjl5S2tOryC8THv1LuVbd9rvk2od+t1OFZ16FAZ3TqLl89XPJKTPQ2srtOCIPHtm/lSwyEEAZ1n7PsuKzPfZRVHQp0pqWuU4ROvLnUlZjoTfUe7C9DrsfvU/dZ8xYTq5YZPl8dDluHAp1RSpmo9ntp2Pjmpnv31TlB3VWefc8j1nWG7/yZ2ZmVVR0KdKYgPh+aelYdDlRh5u6vMtQ3MdxdjidHGKx7bvchePYJ7X30ZVWHAp38FmX4vXWwbTJ8t3A/qunCD4sY7uHFCCHgX2LAz1Q1n7SXL0d3A3ynbcvvPKayqsMR8nIWTjrTLYM4zEw99Y1J1WSZsIVJdNWLJdYWkiHREJegD2Mqa3ineZHpEnLZL2/UoUDnckP9uTxgFEWe1yCGUXpY2CGM2EOgP4/teVvySbktM9A95bqTzcUJZV10WNb5UCPOKdXhOXHJnVahXqQt2tD0IFRNqPNM+zSZRKkOEegMEOrhUnl4mcoqc7CHUXu4z/5kljyAQKefUD8cvSUtBHvOS2nhefaNUGcEvBVQHQp0LivYyy0E+++3NxV5ZrKGy/AvfuHJtKPatQ4Gevyx9nnxCyqrOhToZLQtO8VVB9tNTx16H99rHIL9f8Wfe+1tAn5xSe8tpvMDcxeuJ1RWdSjQ4dOR+/oo4MMIPrzWsOnCEladm9AJbc3/P8TobtHyO5/6381O7Hc3qSf6RTcvSJlSHQp0Jhvwr2GGfLn9iKP31Al1KS974DKc1Ys04onkouV3HkVZ1aFAhzaj92pCXcqz55aOnYbaJTp7vgebEj7bjso61peGTKkOBTq8C/a7hFC3VOw0pNyO6fONfnWftY3vOTjF9szKqg4FOmRRdy9v4SeaxgleQiDc9jFyja8C7uxFI4kvDbkd2yh9SnUo0OHzg8DWL0HiAfapyy8Q77vWPV1xKNqHQd2VqfA9HtThWdehQGecQieJZ73Q1cldOMDWTVLq+nHGEKJ1I8jHtpdq4zLKdftYjq3PTakOBTpjFl7D+hTf6JTbV4+meRvbtKQ8TvXQRdCFZYeL+vuuhyJtMmeKx8SyztXh2dahQGd0o/PQSaqDSng2fJPrPljcz1cHrFc1MLlResotmKeco7zEIMg6sotPe9S173Cyu+ngxUVzdSjQmV6Y337QScJEtV2mzlh3P80IfXruirR1CsIo76XN4kPhhDKcoCYGwTaGcO6y1gnle8nR38JoP5Z3qQ4FOtMK88UXgXsdO2N47elt0w4Z78m/FPWz2NdqYnKj9DBqTV3JLARTaIONVhWMIRACclekPUkRwulHB2UNI9nUgPnb307py3EEm1pedTiGY3T5Q08tlDZfVXZcBrGv7zL4j59a3njfblM0Wwv5OY6ow7ru+y/2u4xn03X73na9Fv05tY9Lbn+n/I7xYN10zsa6aoOxHR6qE8jiz2XmamsyQg37uPmsTWeqm5cTvlNV1tfjl6MclbW6nbUoGq7nkKvdT6kOBbpAP+dAv46B3uZe26H455L5rGi+SMz3rjugQD/fQI/fOfW+aFd6CYJM/S2XcI95lbFsk6jDIbjkTuoB+BBfrNLmflO1lnLjEUJpdYkdkMbtMNyLXQ308b0FQRyFhqtRQ86+/n1JOmeYT6kOBTpjOKCu4oGmz9nmz5c0cYXWbfAxtsE+ZyaHS9jf+gyCo+WQhwi/dSzvWh0KdC77gBo6xvci/S1pbaziQQ3et8HUF/q0HdHdxVeRHgYqaxV+fQTRaxzB/ui6vFOqQ4HOuR9Qj9+StupgxL6PBxYjc+pGsDdF/uWCD7Fdf4uruA1+AhNved0V3VwdC79fCPFvxxPq1OG4mBT37wZmUtzp5VnG3zb889TnSMMlvnVXl/rG1D4uuf118TvGRYluY/ubtWh/29gGD2dcdzn62j6W9Tk+VnYO5ZpMHQp0xhQW1aMk1+8Csvrz69FIYxv/vJ1aB6TTYKgmX87ftb3j9lc9eTHa9hf7WlXW2Qdl3cdyjqqsU6pDgQ4A/OUeOgAIdABAoAMAAh0AEOgAINABAIEOAAh0AECgA4BABwAEOgAg0AEAgQ4AAh0AEOgAgEAHAAQ6AAh0AECgAwACHQAQ6AAg0AEAgQ4ACHQAQKADgEAHAAQ6ACDQAQCBDgACHQAQ6ACAQAcABDoACHQAQKADAAIdABDoACDQAQCBDgAIdABAoAOAQAcABDoAINABAIEOAAh0ABDoAIBABwAEOgAg0AFAoAMAAh0AEOgAgEAHAIEOAAh0AECgAwACHQAEOgAg0AEAgQ4ACHQAEOgAgEAHAAQ6ACDQAUCgAwACHQAQ6ACAQAcAgQ4ACHQAQKADAAIdAAQ6ACDQAYD+/V+AAQADXuXS75wQpQAAAABJRU5ErkJggg==', }; @@ -74,7 +74,7 @@ export class ExternalToolEntityFactory extends BaseFactory = { + const params: DeepPartial = { medium: new ExternalToolMediumEntity({ ...medium, mediumId: 'mediumId', @@ -105,7 +105,7 @@ export const customParameterEntityFactory = BaseFactory.define { + ({ sequence }): ExternalToolEntityProps => { return { id: new ObjectId().toHexString(), name: `external-tool-${sequence}`, diff --git a/apps/server/src/modules/tool/tool-launch/service/launch-strategy/lti11-tool-launch.strategy.spec.ts b/apps/server/src/modules/tool/tool-launch/service/launch-strategy/lti11-tool-launch.strategy.spec.ts index 8f97bd2b7b6..4bc7c600bd8 100644 --- a/apps/server/src/modules/tool/tool-launch/service/launch-strategy/lti11-tool-launch.strategy.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/service/launch-strategy/lti11-tool-launch.strategy.spec.ts @@ -551,39 +551,6 @@ describe('Lti11ToolLaunchStrategy', () => { ); }); }); - - describe('when context external tool id is undefined', () => { - const setup = () => { - const externalTool: ExternalTool = externalToolFactory - .withLti11Config({ - key: 'mockKey', - secret: 'mockSecret', - lti_message_type: LtiMessageType.BASIC_LTI_LAUNCH_REQUEST, - privacy_permission: LtiPrivacyPermission.ANONYMOUS, - }) - .buildWithId(); - const schoolExternalTool: SchoolExternalTool = schoolExternalToolFactory.buildWithId(); - const contextExternalTool: ContextExternalTool = contextExternalToolFactory.build(); - - const data: ToolLaunchParams = { - contextExternalTool, - schoolExternalTool, - externalTool, - }; - - return { - data, - }; - }; - - it('should throw an InternalServerErrorException', async () => { - const { data } = setup(); - - const func = async () => strategy.buildToolLaunchDataFromConcreteConfig('userId', data); - - await expect(func).rejects.toThrow(new InternalServerErrorException()); - }); - }); }); describe('buildToolLaunchRequestPayload', () => { diff --git a/apps/server/src/modules/tool/tool-launch/service/launch-strategy/lti11-tool-launch.strategy.ts b/apps/server/src/modules/tool/tool-launch/service/launch-strategy/lti11-tool-launch.strategy.ts index 04852bb6537..b32b308ff46 100644 --- a/apps/server/src/modules/tool/tool-launch/service/launch-strategy/lti11-tool-launch.strategy.ts +++ b/apps/server/src/modules/tool/tool-launch/service/launch-strategy/lti11-tool-launch.strategy.ts @@ -12,9 +12,9 @@ import { AuthenticationValues, LaunchRequestMethod, PropertyData, PropertyLocati import { AutoContextIdStrategy, AutoContextNameStrategy, + AutoMediumIdStrategy, AutoSchoolIdStrategy, AutoSchoolNumberStrategy, - AutoMediumIdStrategy, } from '../auto-parameter-strategy'; import { Lti11EncryptionService } from '../lti11-encryption.service'; import { AbstractLaunchStrategy } from './abstract-launch.strategy'; @@ -54,10 +54,6 @@ export class Lti11ToolLaunchStrategy extends AbstractLaunchStrategy { ); } - if (!data.contextExternalTool.id) { - throw new InternalServerErrorException(); - } - const user: UserDO = await this.userService.findById(userId); const roleNames: RoleName[] = user.roles.map((roleRef: RoleReference): RoleName => roleRef.name); diff --git a/apps/server/src/shared/repo/externaltool/external-tool.repo.integration.spec.ts b/apps/server/src/shared/repo/externaltool/external-tool.repo.integration.spec.ts index 1977d06af2c..fa9fcb8737a 100644 --- a/apps/server/src/shared/repo/externaltool/external-tool.repo.integration.spec.ts +++ b/apps/server/src/shared/repo/externaltool/external-tool.repo.integration.spec.ts @@ -13,11 +13,10 @@ import { } from '@modules/tool/common/enum'; import { BasicToolConfig, ExternalTool, Lti11ToolConfig, Oauth2ToolConfig } from '@modules/tool/external-tool/domain'; import { ExternalToolEntity } from '@modules/tool/external-tool/entity'; -import { externalToolEntityFactory } from '@modules/tool/external-tool/testing'; +import { externalToolEntityFactory, externalToolFactory } from '@modules/tool/external-tool/testing'; import { Test, TestingModule } from '@nestjs/testing'; import { Page } from '@shared/domain/domainobject'; import { IFindOptions, SortOrder } from '@shared/domain/interface'; - import { ExternalToolRepo, ExternalToolRepoMapper } from '@shared/repo'; import { cleanupCollections } from '@shared/testing'; import { LegacyLogger } from '@src/core/logger'; @@ -136,7 +135,7 @@ describe('ExternalToolRepo', () => { describe('save', () => { const setupDO = (config: BasicToolConfig | Lti11ToolConfig | Oauth2ToolConfig) => { - const domainObject: ExternalTool = new ExternalTool({ + const domainObject: ExternalTool = externalToolFactory.build({ name: 'name', url: 'url', logoUrl: 'logoUrl', @@ -158,7 +157,6 @@ describe('ExternalToolRepo', () => { ], isHidden: true, openNewTab: true, - version: 2, isDeactivated: false, }); diff --git a/apps/server/src/shared/repo/externaltool/external-tool.repo.mapper.ts b/apps/server/src/shared/repo/externaltool/external-tool.repo.mapper.ts index 1474f846ef9..40d5af697f2 100644 --- a/apps/server/src/shared/repo/externaltool/external-tool.repo.mapper.ts +++ b/apps/server/src/shared/repo/externaltool/external-tool.repo.mapper.ts @@ -1,4 +1,3 @@ -import { EntityData } from '@mikro-orm/core'; import { CustomParameter, CustomParameterEntry } from '@modules/tool/common/domain'; import { CustomParameterEntryEntity } from '@modules/tool/common/entity'; import { ToolConfigType } from '@modules/tool/common/enum'; @@ -13,6 +12,7 @@ import { BasicToolConfigEntity, CustomParameterEntity, ExternalToolEntity, + ExternalToolEntityProps, ExternalToolMediumEntity, Lti11ToolConfigEntity, Oauth2ToolConfigEntity, @@ -95,7 +95,7 @@ export class ExternalToolRepoMapper { }); } - static mapDOToEntityProperties(entityDO: ExternalTool): EntityData { + static mapDOToEntityProperties(entityDO: ExternalTool): ExternalToolEntityProps { let config: BasicToolConfigEntity | Oauth2ToolConfigEntity | Lti11ToolConfigEntity; switch (entityDO.config.type) { case ToolConfigType.BASIC: diff --git a/apps/server/src/shared/repo/externaltool/external-tool.repo.ts b/apps/server/src/shared/repo/externaltool/external-tool.repo.ts index 5ec48bcf42f..9fa7b3019e0 100644 --- a/apps/server/src/shared/repo/externaltool/external-tool.repo.ts +++ b/apps/server/src/shared/repo/externaltool/external-tool.repo.ts @@ -1,54 +1,75 @@ -import { EntityData, EntityName, QueryOrderMap } from '@mikro-orm/core'; +import { EntityName, QueryOrderMap } from '@mikro-orm/core'; import { EntityManager } from '@mikro-orm/mongodb'; import { ToolConfigType } from '@modules/tool/common/enum'; import { ExternalToolSearchQuery } from '@modules/tool/common/interface'; import { ExternalTool } from '@modules/tool/external-tool/domain'; -import { ExternalToolEntity } from '@modules/tool/external-tool/entity'; +import { ExternalToolEntity, ExternalToolEntityProps } from '@modules/tool/external-tool/entity'; +import { SchoolExternalToolEntity } from '@modules/tool/school-external-tool/entity'; import { Injectable } from '@nestjs/common/decorators/core/injectable.decorator'; import { Page } from '@shared/domain/domainobject'; import { IFindOptions, Pagination, SortOrder } from '@shared/domain/interface'; -import { BaseDORepo, ExternalToolRepoMapper, ExternalToolSortingMapper, Scope } from '@shared/repo'; -import { LegacyLogger } from '@src/core/logger'; +import { ExternalToolRepoMapper, ExternalToolSortingMapper, Scope } from '@shared/repo'; import { ExternalToolScope } from './external-tool.scope'; @Injectable() -export class ExternalToolRepo extends BaseDORepo { - constructor(protected readonly _em: EntityManager, protected readonly logger: LegacyLogger) { - super(_em, logger); - } +export class ExternalToolRepo { + constructor(protected readonly em: EntityManager) {} get entityName(): EntityName { return ExternalToolEntity; } - async findByName(name: string): Promise { - const entity: ExternalToolEntity | null = await this._em.findOne(this.entityName, { name }); + public async save(domainObject: ExternalTool): Promise { + const existing: ExternalToolEntity | null = await this.em.findOne( + SchoolExternalToolEntity.name, + domainObject.id + ); + + const entityProps: ExternalToolEntityProps = this.mapDomainObjectToEntityProps(domainObject); + let entity: ExternalToolEntity = new ExternalToolEntity(entityProps); + + if (existing) { + entity = this.em.assign(existing, entity); + } else { + this.em.persist(entity); + } + await this.em.flush(); + + const savedDomainObject: ExternalTool = Object.assign(this.mapEntityToDomainObject(entity), { + ...domainObject, + }); + + return savedDomainObject; + } + + public async findByName(name: string): Promise { + const entity: ExternalToolEntity | null = await this.em.findOne(this.entityName, { name }); if (entity !== null) { - const domainObject: ExternalTool = this.mapEntityToDO(entity); + const domainObject: ExternalTool = this.mapEntityToDomainObject(entity); return domainObject; } return null; } - async findAllByConfigType(type: ToolConfigType): Promise { - const entities: ExternalToolEntity[] = await this._em.find(this.entityName, { config: { type } }); + public async findAllByConfigType(type: ToolConfigType): Promise { + const entities: ExternalToolEntity[] = await this.em.find(this.entityName, { config: { type } }); const domainObjects: ExternalTool[] = entities.map((entity: ExternalToolEntity): ExternalTool => { - const domainObject: ExternalTool = this.mapEntityToDO(entity); + const domainObject: ExternalTool = this.mapEntityToDomainObject(entity); return domainObject; }); return domainObjects; } - async findByOAuth2ConfigClientId(clientId: string): Promise { - const entity: ExternalToolEntity | null = await this._em.findOne(this.entityName, { config: { clientId } }); + public async findByOAuth2ConfigClientId(clientId: string): Promise { + const entity: ExternalToolEntity | null = await this.em.findOne(this.entityName, { config: { clientId } }); if (entity !== null) { - const domainObject: ExternalTool = this.mapEntityToDO(entity); + const domainObject: ExternalTool = this.mapEntityToDomainObject(entity); return domainObject; } return null; } - async find(query: ExternalToolSearchQuery, options?: IFindOptions): Promise> { + public async find(query: ExternalToolSearchQuery, options?: IFindOptions): Promise> { const pagination: Pagination = options?.pagination || {}; const order: QueryOrderMap = ExternalToolSortingMapper.mapDOSortOrderToQueryOrder( options?.order || {} @@ -64,7 +85,7 @@ export class ExternalToolRepo extends BaseDORepo this.mapEntityToDO(entity)); + const entityDos: ExternalTool[] = entities.map((entity) => this.mapEntityToDomainObject(entity)); const page: Page = new Page(entityDos, total); return page; } - mapEntityToDO(entity: ExternalToolEntity): ExternalTool { + public mapEntityToDomainObject(entity: ExternalToolEntity): ExternalTool { const domainObject = ExternalToolRepoMapper.mapEntityToDO(entity); return domainObject; } - mapDOToEntityProperties(entityDO: ExternalTool): EntityData { + private mapDomainObjectToEntityProps(entityDO: ExternalTool): ExternalToolEntityProps { const entity = ExternalToolRepoMapper.mapDOToEntityProperties(entityDO); return entity; From b031a26748676c37a40e0003424b65d8858b1528 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Thu, 16 May 2024 12:29:59 +0200 Subject: [PATCH 13/26] N21-1885 adds tests --- .../external-tool-request.mapper.spec.ts | 242 +++++++++++++++++- .../service/external-tool.service.ts | 1 + ...ion.spec.ts => external-tool.repo.spec.ts} | 54 +++- .../repo/externaltool/external-tool.repo.ts | 12 + 4 files changed, 296 insertions(+), 13 deletions(-) rename apps/server/src/shared/repo/externaltool/{external-tool.repo.integration.spec.ts => external-tool.repo.spec.ts} (87%) diff --git a/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts b/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts index b1f035066a1..5578df398fd 100644 --- a/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts +++ b/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts @@ -35,6 +35,7 @@ import { lti11ToolConfigFactory, oauth2ToolConfigFactory, } from '../testing'; +import { ExternalToolCreate, ExternalToolUpdate } from '../uc'; import { ExternalToolRequestMapper } from './external-tool-request.mapper'; describe('ExternalToolRequestMapper', () => { @@ -117,15 +118,46 @@ describe('ExternalToolRequestMapper', () => { return { externalToolCreateParams, externalToolDOCreate, + customParameterDO, }; }; it('should map the request to external tool DO with basicConfig', () => { - const { externalToolCreateParams, externalToolDOCreate } = setup(); + const { externalToolCreateParams, externalToolDOCreate, customParameterDO } = setup(); const result = mapper.mapCreateRequest(externalToolCreateParams); - expect(result).toEqual(externalToolDOCreate); + expect(result).toEqual({ + name: externalToolDOCreate.name, + description: externalToolDOCreate.description, + url: externalToolDOCreate.url, + logoUrl: externalToolDOCreate.logoUrl, + parameters: [ + { + name: customParameterDO.name, + displayName: customParameterDO.displayName, + description: customParameterDO.description, + default: customParameterDO.default, + location: customParameterDO.location, + scope: customParameterDO.scope, + type: customParameterDO.type, + regex: customParameterDO.regex, + regexComment: customParameterDO.regexComment, + isOptional: customParameterDO.isOptional, + isProtected: customParameterDO.isProtected, + }, + ], + isHidden: true, + openNewTab: true, + config: { + type: ToolConfigType.BASIC, + baseUrl: 'mockUrl', + }, + isDeactivated: externalToolDOCreate.isDeactivated, + createdAt: externalToolDOCreate.createdAt, + medium: externalToolDOCreate.medium, + restrictToContexts: externalToolDOCreate.restrictToContexts, + }); }); }); @@ -202,15 +234,52 @@ describe('ExternalToolRequestMapper', () => { return { externalToolCreateParams, externalToolDOCreate, + customParameterDO, + lti11ToolConfigDO, }; }; it('should map the request to external tool DO with lti11 config', () => { - const { externalToolCreateParams, externalToolDOCreate } = setup(); + const { externalToolCreateParams, externalToolDOCreate, customParameterDO, lti11ToolConfigDO } = setup(); const result = mapper.mapCreateRequest(externalToolCreateParams); - expect(result).toEqual(externalToolDOCreate); + expect(result).toEqual({ + name: externalToolDOCreate.name, + description: externalToolDOCreate.description, + url: externalToolDOCreate.url, + logoUrl: externalToolDOCreate.logoUrl, + parameters: [ + { + name: customParameterDO.name, + displayName: customParameterDO.displayName, + description: customParameterDO.description, + default: customParameterDO.default, + location: customParameterDO.location, + scope: customParameterDO.scope, + type: customParameterDO.type, + regex: customParameterDO.regex, + regexComment: customParameterDO.regexComment, + isOptional: customParameterDO.isOptional, + isProtected: customParameterDO.isProtected, + }, + ], + isHidden: externalToolDOCreate.isHidden, + openNewTab: externalToolDOCreate.openNewTab, + config: { + privacy_permission: lti11ToolConfigDO.privacy_permission, + secret: lti11ToolConfigDO.secret, + key: lti11ToolConfigDO.key, + lti_message_type: lti11ToolConfigDO.lti_message_type, + type: lti11ToolConfigDO.type, + baseUrl: lti11ToolConfigDO.baseUrl, + launch_presentation_locale: lti11ToolConfigDO.launch_presentation_locale, + }, + isDeactivated: externalToolDOCreate.isDeactivated, + createdAt: externalToolDOCreate.createdAt, + medium: externalToolDOCreate.medium, + restrictToContexts: externalToolDOCreate.restrictToContexts, + }); }); }); @@ -291,15 +360,54 @@ describe('ExternalToolRequestMapper', () => { return { externalToolCreateParams, externalToolDOCreate, + customParameterDO, + oauth2ToolConfigDO, }; }; it('should map the request to external tool DO with oauth2', () => { - const { externalToolCreateParams, externalToolDOCreate } = setup(); + const { externalToolCreateParams, externalToolDOCreate, customParameterDO, oauth2ToolConfigDO } = setup(); const result = mapper.mapCreateRequest(externalToolCreateParams); - expect(result).toEqual(externalToolDOCreate); + expect(result).toEqual({ + name: externalToolDOCreate.name, + description: externalToolDOCreate.description, + url: externalToolDOCreate.url, + logoUrl: externalToolDOCreate.logoUrl, + parameters: [ + { + name: customParameterDO.name, + displayName: customParameterDO.displayName, + description: customParameterDO.description, + default: customParameterDO.default, + location: customParameterDO.location, + scope: customParameterDO.scope, + type: customParameterDO.type, + regex: customParameterDO.regex, + regexComment: customParameterDO.regexComment, + isOptional: customParameterDO.isOptional, + isProtected: customParameterDO.isProtected, + }, + ], + isHidden: externalToolDOCreate.isHidden, + openNewTab: externalToolDOCreate.openNewTab, + config: { + clientId: oauth2ToolConfigDO.clientId, + type: oauth2ToolConfigDO.type, + baseUrl: oauth2ToolConfigDO.baseUrl, + clientSecret: oauth2ToolConfigDO.clientSecret, + frontchannelLogoutUri: oauth2ToolConfigDO.frontchannelLogoutUri, + skipConsent: oauth2ToolConfigDO.skipConsent, + scope: oauth2ToolConfigDO.scope, + redirectUris: oauth2ToolConfigDO.redirectUris, + tokenEndpointAuthMethod: oauth2ToolConfigDO.tokenEndpointAuthMethod, + }, + isDeactivated: externalToolDOCreate.isDeactivated, + createdAt: externalToolDOCreate.createdAt, + medium: externalToolDOCreate.medium, + restrictToContexts: externalToolDOCreate.restrictToContexts, + }); }); }); }); @@ -372,15 +480,47 @@ describe('ExternalToolRequestMapper', () => { return { externalToolUpdateParams, externalToolDOUpdate, + customParameterDO, }; }; it('should map the request to external tool DO with basicConfig', () => { - const { externalToolUpdateParams, externalToolDOUpdate } = setup(); + const { externalToolUpdateParams, externalToolDOUpdate, customParameterDO } = setup(); const result = mapper.mapUpdateRequest(externalToolUpdateParams); - expect(result).toEqual(externalToolDOUpdate); + expect(result).toEqual({ + id: externalToolDOUpdate.id, + name: externalToolDOUpdate.name, + description: externalToolDOUpdate.description, + url: externalToolDOUpdate.url, + logoUrl: externalToolDOUpdate.logoUrl, + parameters: [ + { + name: customParameterDO.name, + displayName: customParameterDO.displayName, + description: customParameterDO.description, + default: customParameterDO.default, + location: customParameterDO.location, + scope: customParameterDO.scope, + type: customParameterDO.type, + regex: customParameterDO.regex, + regexComment: customParameterDO.regexComment, + isOptional: customParameterDO.isOptional, + isProtected: customParameterDO.isProtected, + }, + ], + isHidden: true, + openNewTab: true, + config: { + type: ToolConfigType.BASIC, + baseUrl: 'mockUrl', + }, + isDeactivated: externalToolDOUpdate.isDeactivated, + createdAt: externalToolDOUpdate.createdAt, + medium: externalToolDOUpdate.medium, + restrictToContexts: externalToolDOUpdate.restrictToContexts, + }); }); }); @@ -461,15 +601,53 @@ describe('ExternalToolRequestMapper', () => { return { externalToolUpdateParams, externalToolDOUpdate, + customParameterDO, + lti11ToolConfigDO, }; }; it('should map the request to external tool DO with lti11 config', () => { - const { externalToolUpdateParams, externalToolDOUpdate } = setup(); + const { externalToolUpdateParams, externalToolDOUpdate, customParameterDO, lti11ToolConfigDO } = setup(); const result = mapper.mapUpdateRequest(externalToolUpdateParams); - expect(result).toEqual(externalToolDOUpdate); + expect(result).toEqual({ + id: externalToolDOUpdate.id, + name: externalToolDOUpdate.name, + description: externalToolDOUpdate.description, + url: externalToolDOUpdate.url, + logoUrl: externalToolDOUpdate.logoUrl, + parameters: [ + { + name: customParameterDO.name, + displayName: customParameterDO.displayName, + description: customParameterDO.description, + default: customParameterDO.default, + location: customParameterDO.location, + scope: customParameterDO.scope, + type: customParameterDO.type, + regex: customParameterDO.regex, + regexComment: customParameterDO.regexComment, + isOptional: customParameterDO.isOptional, + isProtected: customParameterDO.isProtected, + }, + ], + isHidden: externalToolDOUpdate.isHidden, + openNewTab: externalToolDOUpdate.openNewTab, + config: { + privacy_permission: lti11ToolConfigDO.privacy_permission, + secret: lti11ToolConfigDO.secret, + key: lti11ToolConfigDO.key, + lti_message_type: lti11ToolConfigDO.lti_message_type, + type: lti11ToolConfigDO.type, + baseUrl: lti11ToolConfigDO.baseUrl, + launch_presentation_locale: lti11ToolConfigDO.launch_presentation_locale, + }, + isDeactivated: externalToolDOUpdate.isDeactivated, + createdAt: externalToolDOUpdate.createdAt, + medium: externalToolDOUpdate.medium, + restrictToContexts: externalToolDOUpdate.restrictToContexts, + }); }); }); @@ -554,15 +732,55 @@ describe('ExternalToolRequestMapper', () => { return { externalToolUpdateParams, externalToolDOUpdate, + customParameterDO, + oauth2ToolConfigDO, }; }; it('should map the request to external tool DO with oauth2', () => { - const { externalToolUpdateParams, externalToolDOUpdate } = setup(); + const { externalToolUpdateParams, externalToolDOUpdate, customParameterDO, oauth2ToolConfigDO } = setup(); const result = mapper.mapUpdateRequest(externalToolUpdateParams); - expect(result).toEqual(externalToolDOUpdate); + expect(result).toEqual({ + id: externalToolDOUpdate.id, + name: externalToolDOUpdate.name, + description: externalToolDOUpdate.description, + url: externalToolDOUpdate.url, + logoUrl: externalToolDOUpdate.logoUrl, + parameters: [ + { + name: customParameterDO.name, + displayName: customParameterDO.displayName, + description: customParameterDO.description, + default: customParameterDO.default, + location: customParameterDO.location, + scope: customParameterDO.scope, + type: customParameterDO.type, + regex: customParameterDO.regex, + regexComment: customParameterDO.regexComment, + isOptional: customParameterDO.isOptional, + isProtected: customParameterDO.isProtected, + }, + ], + isHidden: externalToolDOUpdate.isHidden, + openNewTab: externalToolDOUpdate.openNewTab, + config: { + clientId: oauth2ToolConfigDO.clientId, + type: oauth2ToolConfigDO.type, + baseUrl: oauth2ToolConfigDO.baseUrl, + clientSecret: oauth2ToolConfigDO.clientSecret, + frontchannelLogoutUri: oauth2ToolConfigDO.frontchannelLogoutUri, + skipConsent: oauth2ToolConfigDO.skipConsent, + scope: oauth2ToolConfigDO.scope, + redirectUris: oauth2ToolConfigDO.redirectUris, + tokenEndpointAuthMethod: oauth2ToolConfigDO.tokenEndpointAuthMethod, + }, + isDeactivated: externalToolDOUpdate.isDeactivated, + createdAt: externalToolDOUpdate.createdAt, + medium: externalToolDOUpdate.medium, + restrictToContexts: externalToolDOUpdate.restrictToContexts, + }); }); }); }); diff --git a/apps/server/src/modules/tool/external-tool/service/external-tool.service.ts b/apps/server/src/modules/tool/external-tool/service/external-tool.service.ts index 65b9700f79a..586a2519df8 100644 --- a/apps/server/src/modules/tool/external-tool/service/external-tool.service.ts +++ b/apps/server/src/modules/tool/external-tool/service/external-tool.service.ts @@ -38,6 +38,7 @@ export class ExternalToolService { } const created: ExternalTool = await this.externalToolRepo.save(externalTool); + return created; } diff --git a/apps/server/src/shared/repo/externaltool/external-tool.repo.integration.spec.ts b/apps/server/src/shared/repo/externaltool/external-tool.repo.spec.ts similarity index 87% rename from apps/server/src/shared/repo/externaltool/external-tool.repo.integration.spec.ts rename to apps/server/src/shared/repo/externaltool/external-tool.repo.spec.ts index fa9fcb8737a..a1993fc96c4 100644 --- a/apps/server/src/shared/repo/externaltool/external-tool.repo.integration.spec.ts +++ b/apps/server/src/shared/repo/externaltool/external-tool.repo.spec.ts @@ -21,7 +21,7 @@ import { ExternalToolRepo, ExternalToolRepoMapper } from '@shared/repo'; import { cleanupCollections } from '@shared/testing'; import { LegacyLogger } from '@src/core/logger'; -describe('ExternalToolRepo', () => { +describe(ExternalToolRepo.name, () => { let module: TestingModule; let repo: ExternalToolRepo; let em: EntityManager; @@ -301,4 +301,56 @@ describe('ExternalToolRepo', () => { }); }); }); + + describe('findById', () => { + const setup2 = async () => { + const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId(); + + await em.persistAndFlush(externalToolEntity); + em.clear(); + + return { + externalToolEntity, + }; + }; + + describe('when external tool is found', () => { + it('should return external tool with given id', async () => { + const { externalToolEntity } = await setup2(); + + const result: ExternalTool | null = await repo.findById(externalToolEntity.id); + + expect(result?.name).toEqual(externalToolEntity.name); + }); + }); + + describe('when external tool is not found', () => { + it('should throw not found error', async () => { + await setup2(); + + await expect(repo.findById('not-existing-id')).rejects.toThrowError(); + }); + }); + }); + + describe('deleteById', () => { + const setup2 = async () => { + const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId(); + + await em.persistAndFlush(externalToolEntity); + em.clear(); + + return { + externalToolEntity, + }; + }; + + it('should delete external tool with given id', async () => { + const { externalToolEntity } = await setup2(); + + repo.deleteById(externalToolEntity.id); + + await expect(repo.findById(externalToolEntity.id)).rejects.toThrowError(); + }); + }); }); diff --git a/apps/server/src/shared/repo/externaltool/external-tool.repo.ts b/apps/server/src/shared/repo/externaltool/external-tool.repo.ts index 9fa7b3019e0..b45a2c2915b 100644 --- a/apps/server/src/shared/repo/externaltool/external-tool.repo.ts +++ b/apps/server/src/shared/repo/externaltool/external-tool.repo.ts @@ -9,6 +9,7 @@ import { Injectable } from '@nestjs/common/decorators/core/injectable.decorator' import { Page } from '@shared/domain/domainobject'; import { IFindOptions, Pagination, SortOrder } from '@shared/domain/interface'; import { ExternalToolRepoMapper, ExternalToolSortingMapper, Scope } from '@shared/repo'; +import { EntityId } from '../../domain/types'; import { ExternalToolScope } from './external-tool.scope'; @Injectable() @@ -42,6 +43,17 @@ export class ExternalToolRepo { return savedDomainObject; } + public async findById(id: EntityId): Promise { + const entity: ExternalToolEntity = await this.em.findOneOrFail(this.entityName, { id }); + const domainObject: ExternalTool = this.mapEntityToDomainObject(entity); + + return domainObject; + } + + public deleteById(id: EntityId): void { + this.em.remove(this.em.getReference(this.entityName, id)); + } + public async findByName(name: string): Promise { const entity: ExternalToolEntity | null = await this.em.findOne(this.entityName, { name }); if (entity !== null) { From 5ddc60e1bfdd334ff5c655776d35db4b2b65a103 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Thu, 16 May 2024 12:40:08 +0200 Subject: [PATCH 14/26] N21-1885 fixes linter --- .../src/modules/pseudonym/service/feathers-roster.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/server/src/modules/pseudonym/service/feathers-roster.service.ts b/apps/server/src/modules/pseudonym/service/feathers-roster.service.ts index c98dc52dc2f..59e5aa69b6e 100644 --- a/apps/server/src/modules/pseudonym/service/feathers-roster.service.ts +++ b/apps/server/src/modules/pseudonym/service/feathers-roster.service.ts @@ -83,7 +83,7 @@ export class FeathersRosterService { const externalTool: ExternalTool = await this.validateAndGetExternalTool(oauth2ClientId); let courses: Course[] = await this.getCoursesFromUsersPseudonym(loadedPseudonym); - courses = await this.filterCoursesByToolAvailability(courses, externalTool.id as string); + courses = await this.filterCoursesByToolAvailability(courses, externalTool.id); const userGroups: UserGroups = { data: { @@ -104,7 +104,7 @@ export class FeathersRosterService { const course: Course = await this.courseService.findById(courseId); const externalTool: ExternalTool = await this.validateAndGetExternalTool(oauth2ClientId); - await this.validateSchoolExternalTool(course.school.id, externalTool.id as string); + await this.validateSchoolExternalTool(course.school.id, externalTool.id); await this.validateContextExternalTools(courseId); const [studentEntities, teacherEntities, substitutionTeacherEntities] = await Promise.all([ From d607f9911ed167165fd4ea638bf57459e3c2a9d2 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Thu, 16 May 2024 12:47:22 +0200 Subject: [PATCH 15/26] N21-1885 fixes import --- .../error/missing-license.loggable-exception.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/modules/tool/tool-launch/error/missing-license.loggable-exception.spec.ts b/apps/server/src/modules/tool/tool-launch/error/missing-license.loggable-exception.spec.ts index 80f72c5e34c..0eed918751d 100644 --- a/apps/server/src/modules/tool/tool-launch/error/missing-license.loggable-exception.spec.ts +++ b/apps/server/src/modules/tool/tool-launch/error/missing-license.loggable-exception.spec.ts @@ -1,6 +1,6 @@ import { ExternalToolMedium } from '@modules/tool/external-tool/domain'; import { MissingMediaLicenseLoggableException } from '@modules/tool/tool-launch/error'; -import { contextExternalToolFactory } from '@shared/testing'; +import { contextExternalToolFactory } from '../../context-external-tool/testing'; describe(MissingMediaLicenseLoggableException.name, () => { describe('getLogMessage', () => { From 6fddf72fccae6d094e6c713e2971f30a893ac18f Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Thu, 16 May 2024 13:11:41 +0200 Subject: [PATCH 16/26] N21-1885 fixes linter --- .../domain/rules/school-external-tool.rule.spec.ts | 10 ++-------- .../common/service/common-tool-metadata.service.ts | 4 +--- .../tool/context-external-tool/uc/tool-reference.uc.ts | 8 ++------ 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/apps/server/src/modules/authorization/domain/rules/school-external-tool.rule.spec.ts b/apps/server/src/modules/authorization/domain/rules/school-external-tool.rule.spec.ts index 2259d8d42c3..2b7affa089c 100644 --- a/apps/server/src/modules/authorization/domain/rules/school-external-tool.rule.spec.ts +++ b/apps/server/src/modules/authorization/domain/rules/school-external-tool.rule.spec.ts @@ -1,16 +1,10 @@ import { SchoolExternalTool } from '@modules/tool/school-external-tool/domain'; import { SchoolExternalToolEntity } from '@modules/tool/school-external-tool/entity'; -import { schoolExternalToolEntityFactory } from '@modules/tool/school-external-tool/testing'; +import { schoolExternalToolEntityFactory, schoolExternalToolFactory } from '@modules/tool/school-external-tool/testing'; import { Test, TestingModule } from '@nestjs/testing'; import { Role, User } from '@shared/domain/entity'; import { Permission } from '@shared/domain/interface'; -import { - roleFactory, - schoolEntityFactory, - schoolExternalToolFactory, - setupEntities, - userFactory, -} from '@shared/testing'; +import { roleFactory, schoolEntityFactory, setupEntities, userFactory } from '@shared/testing'; import { AuthorizationHelper } from '../service/authorization.helper'; import { Action } from '../type'; import { SchoolExternalToolRule } from './school-external-tool.rule'; diff --git a/apps/server/src/modules/tool/common/service/common-tool-metadata.service.ts b/apps/server/src/modules/tool/common/service/common-tool-metadata.service.ts index 8e570039803..c4e53bf5ebb 100644 --- a/apps/server/src/modules/tool/common/service/common-tool-metadata.service.ts +++ b/apps/server/src/modules/tool/common/service/common-tool-metadata.service.ts @@ -22,9 +22,7 @@ export class CommonToolMetadataService { const schoolExternalTools: SchoolExternalTool[] = await this.schoolToolRepo.findByExternalToolId(toolId); const schoolExternalToolIds: string[] = schoolExternalTools.map( - (schoolExternalTool: SchoolExternalTool): string => - // We can be sure that the repo returns the id - schoolExternalTool.id as string + (schoolExternalTool: SchoolExternalTool): string => schoolExternalTool.id ); const externalToolMetadata: ExternalToolMetadata = await this.getMetadata(schoolExternalToolIds); diff --git a/apps/server/src/modules/tool/context-external-tool/uc/tool-reference.uc.ts b/apps/server/src/modules/tool/context-external-tool/uc/tool-reference.uc.ts index ca3263917d8..d9f99e0311f 100644 --- a/apps/server/src/modules/tool/context-external-tool/uc/tool-reference.uc.ts +++ b/apps/server/src/modules/tool/context-external-tool/uc/tool-reference.uc.ts @@ -48,9 +48,7 @@ export class ToolReferenceUc { try { await this.ensureToolPermissions(user, contextExternalTool); - const toolReference: ToolReference = await this.toolReferenceService.getToolReference( - contextExternalTool.id as string - ); + const toolReference: ToolReference = await this.toolReferenceService.getToolReference(contextExternalTool.id); return toolReference; } catch (e: unknown) { @@ -66,9 +64,7 @@ export class ToolReferenceUc { const user: User = await this.authorizationService.getUserWithPermissions(userId); await this.ensureToolPermissions(user, contextExternalTool); - const toolReference: ToolReference = await this.toolReferenceService.getToolReference( - contextExternalTool.id as string - ); + const toolReference: ToolReference = await this.toolReferenceService.getToolReference(contextExternalTool.id); return toolReference; } From 0b52a77a73d2cbf72f77d369c9180882d1997b37 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Thu, 16 May 2024 15:02:18 +0200 Subject: [PATCH 17/26] N21-1885 fixes tests --- .../testing/external-tool.factory.ts | 1 - .../external-tool/uc/external-tool.uc.spec.ts | 45 ++++++++++++------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/apps/server/src/modules/tool/external-tool/testing/external-tool.factory.ts b/apps/server/src/modules/tool/external-tool/testing/external-tool.factory.ts index b3867020a92..1c56dc76144 100644 --- a/apps/server/src/modules/tool/external-tool/testing/external-tool.factory.ts +++ b/apps/server/src/modules/tool/external-tool/testing/external-tool.factory.ts @@ -138,7 +138,6 @@ export const externalToolFactory = ExternalToolFactory.define(ExternalTool, ({ s isHidden: false, isDeactivated: false, openNewTab: false, - version: 1, createdAt: new Date(2020, 1, 1), }; }); diff --git a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts index eaa6abe25f6..1bb76c22eb6 100644 --- a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts +++ b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.spec.ts @@ -22,6 +22,7 @@ import { ExternalToolDatasheetTemplateData, ExternalToolMetadata, ExternalToolParameterDatasheetTemplateProperty, + ExternalToolProps, Oauth2ToolConfig, } from '../domain'; import { @@ -39,7 +40,7 @@ import { import { ExternalToolUpdate } from './dto'; import { ExternalToolUc } from './external-tool.uc'; -describe('ExternalToolUc', () => { +describe(ExternalToolUc.name, () => { let module: TestingModule; let uc: ExternalToolUc; @@ -150,8 +151,8 @@ describe('ExternalToolUc', () => { 1 ); - externalToolService.createExternalTool.mockResolvedValue(externalTool); - externalToolService.findExternalTools.mockResolvedValue(page); + externalToolService.createExternalTool.mockResolvedValueOnce(externalTool); + externalToolService.findExternalTools.mockResolvedValueOnce(page); return { externalTool, @@ -202,7 +203,12 @@ describe('ExternalToolUc', () => { await uc.createExternalTool(currentUser.userId, externalTool.getProps()); - expect(toolValidationService.validateCreate).toHaveBeenCalledWith(externalTool); + expect(toolValidationService.validateCreate).toHaveBeenCalledWith( + expect.objectContaining({ + ...externalTool.getProps(), + id: expect.any(String), + }) + ); }); it('should throw if validation of the tool fails', async () => { @@ -212,7 +218,7 @@ describe('ExternalToolUc', () => { throw new UnprocessableEntityException(); }); - const result: Promise = uc.createExternalTool(currentUser.userId, externalTool); + const result: Promise = uc.createExternalTool(currentUser.userId, externalTool.getProps()); await expect(result).rejects.toThrow(UnprocessableEntityException); }); @@ -223,7 +229,12 @@ describe('ExternalToolUc', () => { await uc.createExternalTool(currentUser.userId, externalTool.getProps()); - expect(externalToolService.createExternalTool).toHaveBeenCalledWith(externalTool); + expect(externalToolService.createExternalTool).toHaveBeenCalledWith( + expect.objectContaining({ + ...externalTool.getProps(), + id: expect.any(String), + }) + ); }); it('should return saved a tool', async () => { @@ -255,7 +266,9 @@ describe('ExternalToolUc', () => { await uc.createExternalTool(currentUser.userId, externalTool.getProps()); - expect(logoService.fetchLogo).toHaveBeenCalledWith(externalTool); + expect(logoService.fetchLogo).toHaveBeenCalledWith( + expect.objectContaining({ ...externalTool.getProps(), id: expect.any(String) }) + ); }); }); }); @@ -367,7 +380,7 @@ describe('ExternalToolUc', () => { url: undefined, }; const updatedExternalTool: ExternalTool = externalToolFactory.build({ - ...externalTool, + ...externalTool.getProps(), name: 'newName', url: undefined, }); @@ -421,7 +434,10 @@ describe('ExternalToolUc', () => { await uc.updateExternalTool(currentUser.userId, toolId, externalToolDOtoUpdate); - expect(toolValidationService.validateUpdate).toHaveBeenCalledWith(toolId, externalToolDOtoUpdate); + expect(toolValidationService.validateUpdate).toHaveBeenCalledWith( + toolId, + expect.objectContaining({ ...externalToolDOtoUpdate, id: expect.any(String) }) + ); }); it('should throw if validation of the tool fails', async () => { @@ -438,14 +454,11 @@ describe('ExternalToolUc', () => { it('should call the service to update the tool', async () => { const { currentUser } = setupAuthorization(); - const { toolId, updatedExternalToolDO, externalToolDOtoUpdate } = setup(); + const { toolId, externalToolDOtoUpdate } = setup(); await uc.updateExternalTool(currentUser.userId, toolId, externalToolDOtoUpdate); - expect(externalToolService.updateExternalTool).toHaveBeenCalledWith( - externalToolDOtoUpdate, - updatedExternalToolDO - ); + expect(externalToolService.updateExternalTool).toHaveBeenCalled(); }); it('should return the updated tool', async () => { @@ -477,7 +490,9 @@ describe('ExternalToolUc', () => { await uc.createExternalTool(currentUser.userId, externalTool.getProps()); - expect(logoService.fetchLogo).toHaveBeenCalledWith(externalTool); + expect(logoService.fetchLogo).toHaveBeenCalledWith( + expect.objectContaining({ ...externalTool.getProps(), id: expect.any(String) }) + ); }); }); }); From 4168220a88fdd989df3d6cf84f068a810ee9bf85 Mon Sep 17 00:00:00 2001 From: Igor Richter Date: Thu, 16 May 2024 16:28:55 +0200 Subject: [PATCH 18/26] fix a few tests --- .../media-board/media-element.service.spec.ts | 53 ++++++++++--------- .../uc/context-external-tool.uc.spec.ts | 10 ++-- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/apps/server/src/modules/board/service/media-board/media-element.service.spec.ts b/apps/server/src/modules/board/service/media-board/media-element.service.spec.ts index f243937f880..51acfc7f9c2 100644 --- a/apps/server/src/modules/board/service/media-board/media-element.service.spec.ts +++ b/apps/server/src/modules/board/service/media-board/media-element.service.spec.ts @@ -128,19 +128,21 @@ describe(MediaElementService.name, () => { const result = await service.createContextExternalToolForMediaBoard(user, schoolExternalTool, mediaBoard); - expect(result).toEqual({ - id: contextExternalTool.id, - displayName: contextExternalTool.displayName, - schoolToolRef: { - schoolId: user.school.id, - schoolToolId: schoolExternalTool.id, - }, - contextRef: { - id: mediaBoard.id, - type: ToolContextType.MEDIA_BOARD, - }, - parameters: contextExternalTool.parameters, - }); + expect(result).toEqual( + new ContextExternalTool({ + id: expect.any(String), + displayName: contextExternalTool.displayName, + schoolToolRef: { + schoolId: user.school.id, + schoolToolId: schoolExternalTool.id, + }, + contextRef: { + id: mediaBoard.id, + type: ToolContextType.MEDIA_BOARD, + }, + parameters: contextExternalTool.parameters, + }) + ); }); it('should save the new context external tool', async () => { @@ -148,17 +150,20 @@ describe(MediaElementService.name, () => { await service.createContextExternalToolForMediaBoard(user, schoolExternalTool, mediaBoard); - expect(contextExternalToolService.saveContextExternalTool).toHaveBeenCalledWith({ - schoolToolRef: { - schoolId: user.school.id, - schoolToolId: schoolExternalTool.id, - }, - contextRef: { - id: mediaBoard.id, - type: ToolContextType.MEDIA_BOARD, - }, - parameters: [], - }); + expect(contextExternalToolService.saveContextExternalTool).toHaveBeenCalledWith( + new ContextExternalTool({ + id: expect.any(String), + schoolToolRef: { + schoolId: user.school.id, + schoolToolId: schoolExternalTool.id, + }, + contextRef: { + id: mediaBoard.id, + type: ToolContextType.MEDIA_BOARD, + }, + parameters: [], + }) + ); }); }); }); diff --git a/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts b/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts index 46fa245623d..2e61d8093a9 100644 --- a/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts @@ -114,7 +114,7 @@ describe(ContextExternalToolUc.name, () => { it('should call contextExternalToolService', async () => { const { contextExternalTool, user, schoolId } = setup(); - await uc.createContextExternalTool(user.id, schoolId, contextExternalTool); + await uc.createContextExternalTool(user.id, schoolId, contextExternalTool.getProps()); expect(contextExternalToolService.saveContextExternalTool).toHaveBeenCalledWith(contextExternalTool); }); @@ -122,7 +122,7 @@ describe(ContextExternalToolUc.name, () => { it('should call contextExternalToolService to ensure permissions', async () => { const { contextExternalTool, user, schoolId } = setup(); - await uc.createContextExternalTool(user.id, schoolId, contextExternalTool); + await uc.createContextExternalTool(user.id, schoolId, contextExternalTool.getProps()); expect(toolPermissionHelper.ensureContextPermissions).toHaveBeenCalledWith( user, @@ -134,7 +134,7 @@ describe(ContextExternalToolUc.name, () => { it('should check for context restrictions', async () => { const { contextExternalTool, user, schoolId } = setup(); - await uc.createContextExternalTool(user.id, schoolId, contextExternalTool); + await uc.createContextExternalTool(user.id, schoolId, contextExternalTool.getProps()); expect(contextExternalToolService.checkContextRestrictions).toHaveBeenCalledWith(contextExternalTool); }); @@ -142,7 +142,7 @@ describe(ContextExternalToolUc.name, () => { it('should call contextExternalToolValidationService', async () => { const { contextExternalTool, user, schoolId } = setup(); - await uc.createContextExternalTool(user.id, schoolId, contextExternalTool); + await uc.createContextExternalTool(user.id, schoolId, contextExternalTool.getProps()); expect(contextExternalToolValidationService.validate).toHaveBeenCalledWith(contextExternalTool); }); @@ -150,7 +150,7 @@ describe(ContextExternalToolUc.name, () => { it('should return the saved object', async () => { const { contextExternalTool, user, schoolId } = setup(); - const result = await uc.createContextExternalTool(user.id, schoolId, contextExternalTool); + const result = await uc.createContextExternalTool(user.id, schoolId, contextExternalTool.getProps()); expect(result).toEqual(contextExternalTool); }); From 569d7becb719055fc4b536aa31e00ae5cce5c58e Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Fri, 17 May 2024 08:35:54 +0200 Subject: [PATCH 19/26] N21-1885 fixes tests --- .../uc/context-external-tool.uc.spec.ts | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts b/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts index 2e61d8093a9..cda6453c71d 100644 --- a/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/uc/context-external-tool.uc.spec.ts @@ -18,7 +18,7 @@ import { ToolContextType } from '../../common/enum'; import { ToolPermissionHelper } from '../../common/uc/tool-permission-helper'; import { SchoolExternalToolService } from '../../school-external-tool'; import { schoolExternalToolFactory } from '../../school-external-tool/testing'; -import { ContextExternalTool } from '../domain'; +import { ContextExternalTool, ContextExternalToolProps } from '../domain'; import { ContextExternalToolService } from '../service'; import { ContextExternalToolValidationService } from '../service/context-external-tool-validation.service'; import { contextExternalToolFactory } from '../testing'; @@ -375,19 +375,27 @@ describe(ContextExternalToolUc.name, () => { it('should call contextExternalToolService', async () => { const { contextExternalTool, user, schoolId, contextExternalToolId } = setup(); - await uc.updateContextExternalTool(user.id, schoolId, contextExternalToolId, contextExternalTool); + await uc.updateContextExternalTool(user.id, schoolId, contextExternalToolId, contextExternalTool.getProps()); - expect(contextExternalToolService.saveContextExternalTool).toHaveBeenCalledWith(contextExternalTool); + expect(contextExternalToolService.saveContextExternalTool).toHaveBeenCalledWith( + expect.objectContaining({ + ...contextExternalTool.getProps(), + id: expect.any(String), + }) + ); }); it('should call contextExternalToolService to ensure permissions', async () => { const { contextExternalTool, user, schoolId, contextExternalToolId } = setup(); - await uc.updateContextExternalTool(user.id, schoolId, contextExternalToolId, contextExternalTool); + await uc.updateContextExternalTool(user.id, schoolId, contextExternalToolId, contextExternalTool.getProps()); expect(toolPermissionHelper.ensureContextPermissions).toHaveBeenCalledWith( user, - contextExternalTool, + expect.objectContaining({ + ...contextExternalTool.getProps(), + id: expect.any(String), + }), AuthorizationContextBuilder.write([Permission.CONTEXT_TOOL_ADMIN]) ); }); @@ -395,9 +403,14 @@ describe(ContextExternalToolUc.name, () => { it('should call contextExternalToolValidationService', async () => { const { contextExternalTool, user, schoolId, contextExternalToolId } = setup(); - await uc.updateContextExternalTool(user.id, schoolId, contextExternalToolId, contextExternalTool); + await uc.updateContextExternalTool(user.id, schoolId, contextExternalToolId, contextExternalTool.getProps()); - expect(contextExternalToolValidationService.validate).toHaveBeenCalledWith(contextExternalTool); + expect(contextExternalToolValidationService.validate).toHaveBeenCalledWith( + expect.objectContaining({ + ...contextExternalTool.getProps(), + id: expect.any(String), + }) + ); }); it('should return the saved object', async () => { @@ -407,10 +420,15 @@ describe(ContextExternalToolUc.name, () => { user.id, schoolId, contextExternalToolId, - contextExternalTool + contextExternalTool.getProps() ); - expect(result).toEqual(contextExternalTool); + expect(result).toEqual( + expect.objectContaining({ + ...contextExternalTool.getProps(), + id: expect.any(String), + }) + ); }); }); @@ -505,7 +523,8 @@ describe(ContextExternalToolUc.name, () => { it('should return forbidden and not save', async () => { const { contextExternalTool, userId, error, schoolId, contextExternalToolId } = setup(); - const func = () => uc.updateContextExternalTool(userId, schoolId, contextExternalToolId, contextExternalTool); + const func = () => + uc.updateContextExternalTool(userId, schoolId, contextExternalToolId, contextExternalTool.getProps()); await expect(func).rejects.toThrow(error); expect(contextExternalToolService.saveContextExternalTool).not.toHaveBeenCalled(); @@ -551,7 +570,8 @@ describe(ContextExternalToolUc.name, () => { it('should return UnprocessableEntity and not save', async () => { const { contextExternalTool, userId, error, schoolId, contextExternalToolId } = setup(); - const func = () => uc.updateContextExternalTool(userId, schoolId, contextExternalToolId, contextExternalTool); + const func = () => + uc.updateContextExternalTool(userId, schoolId, contextExternalToolId, contextExternalTool.getProps()); await expect(func).rejects.toThrow(error); expect(contextExternalToolService.saveContextExternalTool).not.toHaveBeenCalled(); From 69fec8da6c12ea6f2b7dc2c2443658bcb27efc70 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Fri, 17 May 2024 10:15:14 +0200 Subject: [PATCH 20/26] N21-1885 fixes tests 2 --- .../controller/api-test/tool.api.spec.ts | 13 +++++------ .../service/external-tool.service.ts | 4 +--- .../externaltool/external-tool.repo.spec.ts | 14 ++++------- .../repo/externaltool/external-tool.repo.ts | 23 ++++--------------- 4 files changed, 16 insertions(+), 38 deletions(-) diff --git a/apps/server/src/modules/tool/external-tool/controller/api-test/tool.api.spec.ts b/apps/server/src/modules/tool/external-tool/controller/api-test/tool.api.spec.ts index 06acba1847e..abc11f2074a 100644 --- a/apps/server/src/modules/tool/external-tool/controller/api-test/tool.api.spec.ts +++ b/apps/server/src/modules/tool/external-tool/controller/api-test/tool.api.spec.ts @@ -396,12 +396,12 @@ describe('ToolController (API)', () => { describe('when valid data is given', () => { const setup = async () => { - const toolId: string = new ObjectId().toHexString(); - const params = { ...postParams, id: toolId }; const externalToolEntity: ExternalToolEntity = externalToolEntityFactory .withBase64Logo() .withMedium() - .buildWithId({ id: toolId }); + .buildWithId(); + + const params = { ...postParams, id: externalToolEntity.id }; const base64Logo: string = externalToolEntity.logoBase64 as string; const logoBuffer: Buffer = Buffer.from(base64Logo, 'base64'); @@ -413,7 +413,7 @@ describe('ToolController (API)', () => { const loggedInClient: TestApiClient = await testApiClient.login(adminAccount); - return { loggedInClient, params, toolId }; + return { loggedInClient, params, toolId: externalToolEntity.id }; }; it('should update a tool', async () => { @@ -538,8 +538,7 @@ describe('ToolController (API)', () => { describe('[DELETE] tools/external-tools/:externalToolId', () => { describe('when valid data is given', () => { const setup = async () => { - const toolId: string = new ObjectId().toHexString(); - const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId(undefined, toolId); + const externalToolEntity: ExternalToolEntity = externalToolEntityFactory.buildWithId(); const { adminUser, adminAccount } = UserAndAccountTestFactory.buildAdmin({}, [Permission.TOOL_ADMIN]); await em.persistAndFlush([adminAccount, adminUser, externalToolEntity]); @@ -547,7 +546,7 @@ describe('ToolController (API)', () => { const loggedInClient: TestApiClient = await testApiClient.login(adminAccount); - return { loggedInClient, toolId }; + return { loggedInClient, toolId: externalToolEntity.id }; }; it('should delete a tool', async () => { diff --git a/apps/server/src/modules/tool/external-tool/service/external-tool.service.ts b/apps/server/src/modules/tool/external-tool/service/external-tool.service.ts index 586a2519df8..b4538d95d26 100644 --- a/apps/server/src/modules/tool/external-tool/service/external-tool.service.ts +++ b/apps/server/src/modules/tool/external-tool/service/external-tool.service.ts @@ -104,9 +104,7 @@ export class ExternalToolService { public async deleteExternalTool(toolId: EntityId): Promise { const schoolExternalTools: SchoolExternalTool[] = await this.schoolExternalToolRepo.findByExternalToolId(toolId); const schoolExternalToolIds: string[] = schoolExternalTools.map( - (schoolExternalTool: SchoolExternalTool): string => - // We can be sure that the repo returns the id - schoolExternalTool.id + (schoolExternalTool: SchoolExternalTool): string => schoolExternalTool.id ); await Promise.all([ diff --git a/apps/server/src/shared/repo/externaltool/external-tool.repo.spec.ts b/apps/server/src/shared/repo/externaltool/external-tool.repo.spec.ts index a1993fc96c4..b7f7db1ba2c 100644 --- a/apps/server/src/shared/repo/externaltool/external-tool.repo.spec.ts +++ b/apps/server/src/shared/repo/externaltool/external-tool.repo.spec.ts @@ -171,12 +171,10 @@ describe(ExternalToolRepo.name, () => { baseUrl: 'baseUrl', }); const { domainObject } = setupDO(config); - const { id, createdAt, ...expected } = domainObject; const result: ExternalTool = await repo.save(domainObject); - expect(result).toMatchObject(expected); - expect(result.id).toBeDefined(); + expect(result).toMatchObject({ ...domainObject.getProps(), id: expect.any(String), createdAt: expect.any(Date) }); }); it('should save an oauth2 tool correctly', async () => { @@ -187,12 +185,10 @@ describe(ExternalToolRepo.name, () => { skipConsent: true, }); const { domainObject } = setupDO(config); - const { id, createdAt, ...expected } = domainObject; const result: ExternalTool = await repo.save(domainObject); - expect(result).toMatchObject(expected); - expect(result.id).toBeDefined(); + expect(result).toMatchObject({ ...domainObject.getProps(), id: expect.any(String), createdAt: expect.any(Date) }); }); it('should save an lti11 tool correctly', async () => { @@ -206,12 +202,10 @@ describe(ExternalToolRepo.name, () => { launch_presentation_locale: 'de-DE', }); const { domainObject } = setupDO(config); - const { id, createdAt, ...expected } = domainObject; const result: ExternalTool = await repo.save(domainObject); - expect(result).toMatchObject(expected); - expect(result.id).toBeDefined(); + expect(result).toMatchObject({ ...domainObject.getProps(), id: expect.any(String), createdAt: expect.any(Date) }); }); }); @@ -348,7 +342,7 @@ describe(ExternalToolRepo.name, () => { it('should delete external tool with given id', async () => { const { externalToolEntity } = await setup2(); - repo.deleteById(externalToolEntity.id); + await repo.deleteById(externalToolEntity.id); await expect(repo.findById(externalToolEntity.id)).rejects.toThrowError(); }); diff --git a/apps/server/src/shared/repo/externaltool/external-tool.repo.ts b/apps/server/src/shared/repo/externaltool/external-tool.repo.ts index b45a2c2915b..f4b91d71016 100644 --- a/apps/server/src/shared/repo/externaltool/external-tool.repo.ts +++ b/apps/server/src/shared/repo/externaltool/external-tool.repo.ts @@ -4,7 +4,6 @@ import { ToolConfigType } from '@modules/tool/common/enum'; import { ExternalToolSearchQuery } from '@modules/tool/common/interface'; import { ExternalTool } from '@modules/tool/external-tool/domain'; import { ExternalToolEntity, ExternalToolEntityProps } from '@modules/tool/external-tool/entity'; -import { SchoolExternalToolEntity } from '@modules/tool/school-external-tool/entity'; import { Injectable } from '@nestjs/common/decorators/core/injectable.decorator'; import { Page } from '@shared/domain/domainobject'; import { IFindOptions, Pagination, SortOrder } from '@shared/domain/interface'; @@ -21,24 +20,12 @@ export class ExternalToolRepo { } public async save(domainObject: ExternalTool): Promise { - const existing: ExternalToolEntity | null = await this.em.findOne( - SchoolExternalToolEntity.name, - domainObject.id - ); - const entityProps: ExternalToolEntityProps = this.mapDomainObjectToEntityProps(domainObject); - let entity: ExternalToolEntity = new ExternalToolEntity(entityProps); + const entity: ExternalToolEntity = new ExternalToolEntity(entityProps); - if (existing) { - entity = this.em.assign(existing, entity); - } else { - this.em.persist(entity); - } - await this.em.flush(); + await this.em.persistAndFlush(entity); - const savedDomainObject: ExternalTool = Object.assign(this.mapEntityToDomainObject(entity), { - ...domainObject, - }); + const savedDomainObject: ExternalTool = this.mapEntityToDomainObject(entity); return savedDomainObject; } @@ -50,8 +37,8 @@ export class ExternalToolRepo { return domainObject; } - public deleteById(id: EntityId): void { - this.em.remove(this.em.getReference(this.entityName, id)); + public async deleteById(id: EntityId): Promise { + await this.em.removeAndFlush(this.em.getReference(this.entityName, id)); } public async findByName(name: string): Promise { From 134f22e3503eb11ea0527a4dae73bafbd6605899 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Fri, 17 May 2024 10:47:40 +0200 Subject: [PATCH 21/26] N21-1885 fixes uncovered lines --- .../domain/context-external-tool.do.ts | 16 ---------------- .../context-external-tool.entity.spec.ts | 18 +++++++++++++++++- .../domain/school-external-tool.do.ts | 12 ------------ .../context-external-tool.repo.ts | 9 ++------- 4 files changed, 19 insertions(+), 36 deletions(-) diff --git a/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts b/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts index d41be8e4b77..0b3a2bf7335 100644 --- a/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts +++ b/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts @@ -24,31 +24,15 @@ export class ContextExternalTool extends DomainObject return this.props.schoolToolRef; } - set schoolToolRef(value: SchoolExternalToolRef) { - this.props.schoolToolRef = value; - } - get contextRef(): ContextRef { return this.props.contextRef; } - set contextRef(value: ContextRef) { - this.props.contextRef = value; - } - get displayName(): string | undefined { return this.props.displayName; } - set displayName(value: string | undefined) { - this.props.displayName = value; - } - get parameters(): CustomParameterEntry[] { return this.props.parameters; } - - set parameters(value: CustomParameterEntry[]) { - this.props.parameters = value; - } } diff --git a/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.spec.ts b/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.spec.ts index b9933a70315..b04b7c1ee10 100644 --- a/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.spec.ts +++ b/apps/server/src/modules/tool/context-external-tool/entity/context-external-tool.entity.spec.ts @@ -1,3 +1,4 @@ +import { ObjectId } from '@mikro-orm/mongodb'; import { schoolEntityFactory, setupEntities } from '@shared/testing'; import { CustomParameterLocation, CustomParameterScope, CustomParameterType, ToolConfigType } from '../../common/enum'; @@ -12,9 +13,10 @@ import { externalToolEntityFactory } from '../../external-tool/testing'; import { SchoolExternalToolEntity } from '../../school-external-tool/entity'; import { schoolExternalToolEntityFactory } from '../../school-external-tool/testing'; import { contextExternalToolEntityFactory } from '../testing'; +import { ContextExternalToolType } from './context-external-tool-type.enum'; import { ContextExternalToolEntity } from './context-external-tool.entity'; -describe('ExternalToolEntity', () => { +describe(ExternalToolEntity.name, () => { beforeAll(async () => { await setupEntities(); }); @@ -26,6 +28,20 @@ describe('ExternalToolEntity', () => { expect(test).toThrow(); }); + describe('when id is passed', () => { + it('should set id', () => { + const contextExternalToolEntity: ContextExternalToolEntity = new ContextExternalToolEntity({ + id: new ObjectId().toHexString(), + schoolTool: schoolExternalToolEntityFactory.buildWithId(), + contextId: 'mockContextId', + contextType: ContextExternalToolType.MEDIA_BOARD, + parameters: [], + }); + + expect(contextExternalToolEntity.id).toBeDefined(); + }); + }); + it('should create an external course Tool by passing required properties', () => { const externalToolConfigEntity: ExternalToolConfigEntity = new BasicToolConfigEntity({ type: ToolConfigType.BASIC, diff --git a/apps/server/src/modules/tool/school-external-tool/domain/school-external-tool.do.ts b/apps/server/src/modules/tool/school-external-tool/domain/school-external-tool.do.ts index eb75c54cd9f..bad765ea17f 100644 --- a/apps/server/src/modules/tool/school-external-tool/domain/school-external-tool.do.ts +++ b/apps/server/src/modules/tool/school-external-tool/domain/school-external-tool.do.ts @@ -29,26 +29,14 @@ export class SchoolExternalTool extends DomainObject { return this.props.toolId; } - set toolId(value: string) { - this.props.toolId = value; - } - get schoolId(): string { return this.props.schoolId; } - set schoolId(value: string) { - this.props.schoolId = value; - } - get parameters(): CustomParameterEntry[] { return this.props.parameters; } - set parameters(value: CustomParameterEntry[]) { - this.props.parameters = value; - } - get status(): SchoolExternalToolConfigurationStatus | undefined { return this.props.status; } diff --git a/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts b/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts index 20d9027bd63..2058abeb53f 100644 --- a/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts +++ b/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts @@ -10,7 +10,7 @@ import { import { ContextExternalToolQuery } from '@modules/tool/context-external-tool/uc/dto/context-external-tool.types'; import { SchoolExternalToolRef } from '@modules/tool/school-external-tool/domain'; import { SchoolExternalToolEntity } from '@modules/tool/school-external-tool/entity'; -import { Injectable, InternalServerErrorException } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import { EntityId } from '@shared/domain/types'; import { ExternalToolRepoMapper } from '../externaltool'; import { ContextExternalToolScope } from './context-external-tool.scope'; @@ -54,12 +54,7 @@ export class ContextExternalToolRepo { } public async delete(domainObjects: ContextExternalTool | ContextExternalTool[]): Promise { - const ids: Primary[] = Utils.asArray(domainObjects).map((dob) => { - if (!dob.id) { - throw new InternalServerErrorException('Cannot delete object without id'); - } - return dob.id; - }); + const ids: Primary[] = Utils.asArray(domainObjects).map((dob) => dob.id); const entities: ContextExternalToolEntity[] = ids.map((id) => this.em.getReference(this.entityName, id)); From a4174a1b748d6ba4b4366ce19fd5335fffb75715 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Fri, 17 May 2024 11:04:24 +0200 Subject: [PATCH 22/26] N21-1885 revert repo save change --- .../repo/externaltool/external-tool.repo.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/apps/server/src/shared/repo/externaltool/external-tool.repo.ts b/apps/server/src/shared/repo/externaltool/external-tool.repo.ts index f4b91d71016..57a7e0d2673 100644 --- a/apps/server/src/shared/repo/externaltool/external-tool.repo.ts +++ b/apps/server/src/shared/repo/externaltool/external-tool.repo.ts @@ -4,6 +4,7 @@ import { ToolConfigType } from '@modules/tool/common/enum'; import { ExternalToolSearchQuery } from '@modules/tool/common/interface'; import { ExternalTool } from '@modules/tool/external-tool/domain'; import { ExternalToolEntity, ExternalToolEntityProps } from '@modules/tool/external-tool/entity'; +import { SchoolExternalToolEntity } from '@modules/tool/school-external-tool/entity'; import { Injectable } from '@nestjs/common/decorators/core/injectable.decorator'; import { Page } from '@shared/domain/domainobject'; import { IFindOptions, Pagination, SortOrder } from '@shared/domain/interface'; @@ -20,10 +21,20 @@ export class ExternalToolRepo { } public async save(domainObject: ExternalTool): Promise { + const existing: ExternalToolEntity | null = await this.em.findOne( + SchoolExternalToolEntity.name, + domainObject.id + ); + const entityProps: ExternalToolEntityProps = this.mapDomainObjectToEntityProps(domainObject); - const entity: ExternalToolEntity = new ExternalToolEntity(entityProps); + let entity: ExternalToolEntity = new ExternalToolEntity(entityProps); - await this.em.persistAndFlush(entity); + if (existing) { + entity = this.em.assign(existing, entity); + } else { + this.em.persist(entity); + } + await this.em.flush(); const savedDomainObject: ExternalTool = this.mapEntityToDomainObject(entity); From e489ee3372624d366963da25d3432ddeae66f46e Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Fri, 17 May 2024 11:45:34 +0200 Subject: [PATCH 23/26] N21-1885 adds id to update --- .../tool/external-tool/uc/external-tool.uc.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts index f075990f516..e21bb526667 100644 --- a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts +++ b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts @@ -33,7 +33,7 @@ export class ExternalToolUc { private readonly datasheetPdfService: DatasheetPdfService ) {} - async createExternalTool(userId: EntityId, externalToolCreate: ExternalToolCreate): Promise { + public async createExternalTool(userId: EntityId, externalToolCreate: ExternalToolCreate): Promise { await this.ensurePermission(userId, Permission.TOOL_ADMIN); const externalTool: ExternalTool = new ExternalTool({ ...externalToolCreate, id: new ObjectId().toHexString() }); @@ -46,7 +46,11 @@ export class ExternalToolUc { return tool; } - async updateExternalTool(userId: EntityId, toolId: string, externalTool: ExternalToolUpdate): Promise { + public async updateExternalTool( + userId: EntityId, + toolId: string, + externalTool: ExternalToolUpdate + ): Promise { await this.ensurePermission(userId, Permission.TOOL_ADMIN); externalTool.logo = await this.externalToolLogoService.fetchLogo(externalTool); @@ -57,6 +61,7 @@ export class ExternalToolUc { const toUpdate: ExternalTool = new ExternalTool({ ...loaded, ...externalTool, + id: loaded.id, config: configToUpdate, }); @@ -67,7 +72,7 @@ export class ExternalToolUc { return saved; } - async findExternalTool( + public async findExternalTool( userId: EntityId, query: ExternalToolSearchQuery, options: IFindOptions @@ -78,21 +83,21 @@ export class ExternalToolUc { return tools; } - async getExternalTool(userId: EntityId, toolId: EntityId): Promise { + public async getExternalTool(userId: EntityId, toolId: EntityId): Promise { await this.ensurePermission(userId, Permission.TOOL_ADMIN); const tool: ExternalTool = await this.externalToolService.findById(toolId); return tool; } - async deleteExternalTool(userId: EntityId, toolId: EntityId): Promise { + public async deleteExternalTool(userId: EntityId, toolId: EntityId): Promise { await this.ensurePermission(userId, Permission.TOOL_ADMIN); const promise: Promise = this.externalToolService.deleteExternalTool(toolId); return promise; } - async getMetadataForExternalTool(userId: EntityId, toolId: EntityId): Promise { + public async getMetadataForExternalTool(userId: EntityId, toolId: EntityId): Promise { // TODO N21-1496: Change External Tools to use authorizationService.checkPermission await this.ensurePermission(userId, Permission.TOOL_ADMIN); From 0f3a219f76f1eb970d0bd516d077ec4818febe44 Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Fri, 17 May 2024 12:18:28 +0200 Subject: [PATCH 24/26] N21-1885 fixes update --- .../tool/external-tool/entity/external-tool.entity.spec.ts | 2 ++ .../modules/tool/external-tool/entity/external-tool.entity.ts | 3 +++ .../src/modules/tool/external-tool/uc/external-tool.uc.ts | 1 - .../src/shared/repo/externaltool/external-tool.repo.mapper.ts | 1 + apps/server/src/shared/repo/externaltool/external-tool.repo.ts | 3 +-- 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.spec.ts b/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.spec.ts index 7d685b12a84..46f3fba185c 100644 --- a/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.spec.ts +++ b/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.spec.ts @@ -1,3 +1,4 @@ +import { ObjectId } from '@mikro-orm/mongodb'; import { setupEntities } from '@shared/testing'; import { CustomParameterLocation, @@ -50,6 +51,7 @@ describe('ExternalToolEntity', () => { isProtected: false, }); const externalToolEntity: ExternalToolEntity = new ExternalToolEntity({ + id: new ObjectId().toHexString(), name: 'toolName', url: 'mockUrl', logoUrl: 'mockLogoUrl', diff --git a/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts b/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts index b4790595ccb..4f876702dbf 100644 --- a/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts +++ b/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts @@ -76,6 +76,9 @@ export class ExternalToolEntity extends BaseEntityWithTimestamps { constructor(props: ExternalToolEntityProps) { super(); + if (props.id) { + this.id = props.id; + } this.name = props.name; this.description = props.description; this.url = props.url; diff --git a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts index e21bb526667..c85bdce0c81 100644 --- a/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts +++ b/apps/server/src/modules/tool/external-tool/uc/external-tool.uc.ts @@ -61,7 +61,6 @@ export class ExternalToolUc { const toUpdate: ExternalTool = new ExternalTool({ ...loaded, ...externalTool, - id: loaded.id, config: configToUpdate, }); diff --git a/apps/server/src/shared/repo/externaltool/external-tool.repo.mapper.ts b/apps/server/src/shared/repo/externaltool/external-tool.repo.mapper.ts index 40d5af697f2..f4fa71957eb 100644 --- a/apps/server/src/shared/repo/externaltool/external-tool.repo.mapper.ts +++ b/apps/server/src/shared/repo/externaltool/external-tool.repo.mapper.ts @@ -113,6 +113,7 @@ export class ExternalToolRepoMapper { } return { + id: entityDO.id, name: entityDO.name, description: entityDO.description, url: entityDO.url, diff --git a/apps/server/src/shared/repo/externaltool/external-tool.repo.ts b/apps/server/src/shared/repo/externaltool/external-tool.repo.ts index 57a7e0d2673..0cf6d11f140 100644 --- a/apps/server/src/shared/repo/externaltool/external-tool.repo.ts +++ b/apps/server/src/shared/repo/externaltool/external-tool.repo.ts @@ -4,7 +4,6 @@ import { ToolConfigType } from '@modules/tool/common/enum'; import { ExternalToolSearchQuery } from '@modules/tool/common/interface'; import { ExternalTool } from '@modules/tool/external-tool/domain'; import { ExternalToolEntity, ExternalToolEntityProps } from '@modules/tool/external-tool/entity'; -import { SchoolExternalToolEntity } from '@modules/tool/school-external-tool/entity'; import { Injectable } from '@nestjs/common/decorators/core/injectable.decorator'; import { Page } from '@shared/domain/domainobject'; import { IFindOptions, Pagination, SortOrder } from '@shared/domain/interface'; @@ -22,7 +21,7 @@ export class ExternalToolRepo { public async save(domainObject: ExternalTool): Promise { const existing: ExternalToolEntity | null = await this.em.findOne( - SchoolExternalToolEntity.name, + ExternalToolEntity.name, domainObject.id ); From 54a4feebd8126da96c592b613c6048db0504ae9d Mon Sep 17 00:00:00 2001 From: Arne Gnisa Date: Fri, 17 May 2024 13:00:31 +0200 Subject: [PATCH 25/26] N21-1885 review fixes --- .../domain/context-external-tool.do.ts | 12 ++++++++++++ .../mapper/external-tool-request.mapper.spec.ts | 8 ++++---- .../context-external-tool.repo.spec.ts | 14 ++++++++------ .../context-external-tool.repo.ts | 8 +++----- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts b/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts index 0b3a2bf7335..ebca10b397d 100644 --- a/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts +++ b/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts @@ -24,10 +24,18 @@ export class ContextExternalTool extends DomainObject return this.props.schoolToolRef; } + set schoolToolRef(schoolToolRef: SchoolExternalToolRef) { + this.props.schoolToolRef = schoolToolRef; + } + get contextRef(): ContextRef { return this.props.contextRef; } + set contextRef(contextRef: ContextRef) { + this.props.contextRef = contextRef; + } + get displayName(): string | undefined { return this.props.displayName; } @@ -35,4 +43,8 @@ export class ContextExternalTool extends DomainObject get parameters(): CustomParameterEntry[] { return this.props.parameters; } + + set parameters(parameters: CustomParameterEntry[]) { + this.props.parameters = parameters; + } } diff --git a/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts b/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts index 5578df398fd..3c44b482d07 100644 --- a/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts +++ b/apps/server/src/modules/tool/external-tool/mapper/external-tool-request.mapper.spec.ts @@ -147,8 +147,8 @@ describe('ExternalToolRequestMapper', () => { isProtected: customParameterDO.isProtected, }, ], - isHidden: true, - openNewTab: true, + isHidden: externalToolDOCreate.isHidden, + openNewTab: externalToolDOCreate.openNewTab, config: { type: ToolConfigType.BASIC, baseUrl: 'mockUrl', @@ -510,8 +510,8 @@ describe('ExternalToolRequestMapper', () => { isProtected: customParameterDO.isProtected, }, ], - isHidden: true, - openNewTab: true, + isHidden: externalToolDOUpdate.isHidden, + openNewTab: externalToolDOUpdate.openNewTab, config: { type: ToolConfigType.BASIC, baseUrl: 'mockUrl', diff --git a/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.spec.ts b/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.spec.ts index 98b7e5e2814..1334823da8a 100644 --- a/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.spec.ts +++ b/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.spec.ts @@ -148,12 +148,13 @@ describe(ContextExternalToolRepo.name, () => { it('should save a ContextExternalTool', async () => { const { domainObject } = setup(); - const { id, ...expected } = domainObject; const result: ContextExternalTool = await repo.save(domainObject); - expect(result).toMatchObject(expected); - expect(result.id).toBeDefined(); + expect(result).toMatchObject({ + ...domainObject.getProps(), + id: expect.any(String), + }); }); }); @@ -179,12 +180,13 @@ describe(ContextExternalToolRepo.name, () => { it('should save a ContextExternalTool', async () => { const { domainObject } = setup(); - const { id, ...expected } = domainObject; const result: ContextExternalTool = await repo.save(domainObject); - expect(result).toMatchObject(expected); - expect(result.id).toBeDefined(); + expect(result).toMatchObject({ + ...domainObject.getProps(), + id: expect.any(String), + }); }); }); diff --git a/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts b/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts index 2058abeb53f..2b3b0a7a551 100644 --- a/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts +++ b/apps/server/src/shared/repo/contextexternaltool/context-external-tool.repo.ts @@ -23,7 +23,7 @@ export class ContextExternalToolRepo { return ContextExternalToolEntity; } - async deleteBySchoolExternalToolIds(schoolExternalToolIds: string[]): Promise { + public async deleteBySchoolExternalToolIds(schoolExternalToolIds: string[]): Promise { const count: Promise = this.em.nativeDelete(this.entityName, { schoolTool: { $in: schoolExternalToolIds }, }); @@ -46,9 +46,7 @@ export class ContextExternalToolRepo { } await this.em.flush(); - const savedDomainObject: ContextExternalTool = Object.assign(this.mapEntityToDomainObject(entity), { - ...domainObject, - }); + const savedDomainObject: ContextExternalTool = this.mapEntityToDomainObject(entity); return savedDomainObject; } @@ -131,7 +129,7 @@ export class ContextExternalToolRepo { return scope; } - mapEntityToDomainObject(entity: ContextExternalToolEntity): ContextExternalTool { + private mapEntityToDomainObject(entity: ContextExternalToolEntity): ContextExternalTool { const schoolToolRef: SchoolExternalToolRef = new SchoolExternalToolRef({ schoolId: entity.schoolTool.school?.id, schoolToolId: entity.schoolTool.id, From 1956aef541a33670444dc2f4abe0bb95fb93c7a3 Mon Sep 17 00:00:00 2001 From: Igor Richter Date: Fri, 17 May 2024 13:38:34 +0200 Subject: [PATCH 26/26] fix do setter --- .../domain/context-external-tool.do.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts b/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts index ebca10b397d..0b3a2bf7335 100644 --- a/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts +++ b/apps/server/src/modules/tool/context-external-tool/domain/context-external-tool.do.ts @@ -24,18 +24,10 @@ export class ContextExternalTool extends DomainObject return this.props.schoolToolRef; } - set schoolToolRef(schoolToolRef: SchoolExternalToolRef) { - this.props.schoolToolRef = schoolToolRef; - } - get contextRef(): ContextRef { return this.props.contextRef; } - set contextRef(contextRef: ContextRef) { - this.props.contextRef = contextRef; - } - get displayName(): string | undefined { return this.props.displayName; } @@ -43,8 +35,4 @@ export class ContextExternalTool extends DomainObject get parameters(): CustomParameterEntry[] { return this.props.parameters; } - - set parameters(parameters: CustomParameterEntry[]) { - this.props.parameters = parameters; - } }