diff --git a/apps/api/src/database/seeds/vertical-slice.seed.spec.ts b/apps/api/src/database/seeds/vertical-slice.seed.spec.ts index df32221..102f561 100644 --- a/apps/api/src/database/seeds/vertical-slice.seed.spec.ts +++ b/apps/api/src/database/seeds/vertical-slice.seed.spec.ts @@ -419,4 +419,49 @@ describe('seedVisibleVerticalSlice', () => { ); expect(characterItemRepository.rows).toHaveLength(1); }); + + it('reuses a naturally-looted starting sword instead of inserting a duplicate CharacterItem', async () => { + const locationRepository = new InMemoryRepository(); + const connectionRepository = new InMemoryRepository(); + const characterRepository = new InMemoryRepository(); + const monsterRepository = new InMemoryRepository(); + const locationMonsterRepository = new InMemoryRepository(); + const characterItemRepository = new InMemoryRepository(); + const characterEquipmentRepository = new InMemoryRepository(); + const dataSource = createDataSource( + locationRepository, + connectionRepository, + characterRepository, + monsterRepository, + locationMonsterRepository, + new InMemoryRepository(), + new InMemoryRepository(), + new InMemoryRepository(), + characterItemRepository, + characterEquipmentRepository, + ); + + // Simulate the demo character having already looted a worn-short-sword + // naturally, under a DB-generated id that differs from the seed's + // stable literal constant. + const naturallyLootedItemId = 'naturally-looted-sword-item-id'; + characterItemRepository.rows.push({ + id: naturallyLootedItemId, + characterId: DEMO_CHARACTER_ID, + itemDefinitionId: ITEM_IDS['worn-short-sword'], + quantity: 1, + }); + + await seedVisibleVerticalSlice(dataSource); + + expect(characterItemRepository.rows).toHaveLength(1); + expect(characterEquipmentRepository.rows).toHaveLength(1); + expect(characterEquipmentRepository.rows[0]).toEqual( + expect.objectContaining({ + characterId: DEMO_CHARACTER_ID, + slot: 'WEAPON', + characterItemId: naturallyLootedItemId, + }), + ); + }); }); diff --git a/apps/api/src/database/seeds/vertical-slice.seed.ts b/apps/api/src/database/seeds/vertical-slice.seed.ts index 8af98bc..febeb07 100644 --- a/apps/api/src/database/seeds/vertical-slice.seed.ts +++ b/apps/api/src/database/seeds/vertical-slice.seed.ts @@ -218,8 +218,11 @@ export async function seedVisibleVerticalSlice( const characterEquipmentRepository = dataSource.getRepository(CharacterEquipment); const existingStartingSword = await characterItemRepository.findOneBy({ - id: DEMO_CHARACTER_STARTING_WEAPON_ITEM_ID, + characterId: DEMO_CHARACTER_ID, + itemDefinitionId: ITEM_IDS['worn-short-sword'], }); + const startingSwordItemId = + existingStartingSword?.id ?? DEMO_CHARACTER_STARTING_WEAPON_ITEM_ID; if (!existingStartingSword) { await characterItemRepository.insert({ id: DEMO_CHARACTER_STARTING_WEAPON_ITEM_ID, @@ -238,7 +241,7 @@ export async function seedVisibleVerticalSlice( id: DEMO_CHARACTER_STARTING_WEAPON_EQUIPMENT_ID, characterId: DEMO_CHARACTER_ID, slot: EquipmentSlot.WEAPON, - characterItemId: DEMO_CHARACTER_STARTING_WEAPON_ITEM_ID, + characterItemId: startingSwordItemId, }); } }