From b7a08f95312f0f334d37238e68d2dc537dd17a1a Mon Sep 17 00:00:00 2001 From: Jorge Montejo Date: Fri, 3 Oct 2025 20:46:08 +0200 Subject: [PATCH] single tag exists, connected to one asset, and is not deleted --- server/test/medium.factory.ts | 13 +++++++++++++ .../medium/specs/services/tag.service.spec.ts | 19 ++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/server/test/medium.factory.ts b/server/test/medium.factory.ts index ace0d8f645..0cabd41e84 100644 --- a/server/test/medium.factory.ts +++ b/server/test/medium.factory.ts @@ -53,6 +53,7 @@ import { MemoryTable } from 'src/schema/tables/memory.table'; import { PersonTable } from 'src/schema/tables/person.table'; import { SessionTable } from 'src/schema/tables/session.table'; import { StackTable } from 'src/schema/tables/stack.table'; +import { TagAssetTable } from 'src/schema/tables/tag-asset.table'; import { TagTable } from 'src/schema/tables/tag.table'; import { UserTable } from 'src/schema/tables/user.table'; import { BASE_SERVICE_DEPENDENCIES, BaseService } from 'src/services/base.service'; @@ -248,6 +249,18 @@ export class MediumTestContext { const result = await this.get(TagRepository).create(tag); return { tag, result }; } + + async newTagAsset(tagBulkAssets: { tagIds: string[], assetIds: string[] }) { + const tagsAssets: Insertable[] = []; + for (const tagsId of tagBulkAssets.tagIds) { + for (const assetsId of tagBulkAssets.assetIds) { + tagsAssets.push({ tagsId, assetsId }); + } + } + + const result = await this.get(TagRepository).upsertAssetIds(tagsAssets); + return { tagsAssets, result }; + } } export class SyncTestContext extends MediumTestContext { diff --git a/server/test/medium/specs/services/tag.service.spec.ts b/server/test/medium/specs/services/tag.service.spec.ts index 2cabc18a3b..d1b0a245e1 100644 --- a/server/test/medium/specs/services/tag.service.spec.ts +++ b/server/test/medium/specs/services/tag.service.spec.ts @@ -1,4 +1,5 @@ import { Kysely } from "kysely"; +import { JobStatus } from "src/enum"; import { AccessRepository } from "src/repositories/access.repository"; import { EventRepository } from "src/repositories/event.repository"; import { LoggingRepository } from "src/repositories/logging.repository"; @@ -32,16 +33,28 @@ describe(TagService.name, () => { describe('deleteEmptyTags', () => { it('single tag exists, not connected to any assets, and is deleted', async () => { const { sut, ctx } = setup(); - const tagRepo = ctx.get(TagRepository); const { user } = await ctx.newUser(); - const auth = factory.auth({ user }); const { tag } = await ctx.newTag({ userId: user.id, value: 'tag-1' }); + const tagRepo = ctx.get(TagRepository); await expect(tagRepo.getByValue(user.id, 'tag-1')).resolves.toEqual(expect.objectContaining({ id: tag.id })); - await expect(sut.remove(auth, tag.id)).resolves.toBeUndefined(); + await expect(sut.handleTagCleanup()).resolves.toBe(JobStatus.Success); await expect(tagRepo.getByValue(user.id, 'tag-1')).resolves.toBeUndefined(); }); + it('single tag exists, connected to one asset, and is not deleted', async () => { + const { sut, ctx } = setup(); + const { user } = await ctx.newUser(); + const { asset } = await ctx.newAsset({ ownerId: user.id }); + const { tag } = await ctx.newTag({ userId: user.id, value: 'tag-1' }); + const tagRepo = ctx.get(TagRepository); + + await ctx.newTagAsset({ tagIds: [tag.id], assetIds: [asset.id] }); + + await expect(tagRepo.getByValue(user.id, 'tag-1')).resolves.toEqual(expect.objectContaining({ id: tag.id })); + await expect(sut.handleTagCleanup()).resolves.toBe(JobStatus.Success); + await expect(tagRepo.getByValue(user.id, 'tag-1')).resolves.toEqual(expect.objectContaining({ id: tag.id })); + }) }) }) \ No newline at end of file