10 lines
2.4 KiB
TypeScript
10 lines
2.4 KiB
TypeScript
import {test} from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import {newDb} from 'pg-mem';
|
|
import {Storage,Conflict} from '../server/storage.mjs';
|
|
import {newCharacter,characterSchema,addInventoryItem,changeItemQuantity} from '../src/model.ts';
|
|
const item=(id='one',catalogueId='2014:rope')=>({id,catalogueId,name:'Rope',quantity:1,category:'Adventuring gear' as const,equipped:false,attuned:false,weight:'5 lb.',cost:'1 GP',notes:'Keep dry'});
|
|
test('inventory adds catalogue quantities without replacing notes or mixing editions',()=>{const c=newCharacter();c.inventory='15 gold';const first=addInventoryItem(c,item());first.equipped=true;first.notes='My rope';addInventoryItem(c,item('two'));assert.equal(first.quantity,2);assert.equal(first.notes,'My rope');assert.equal(first.equipped,true);addInventoryItem(c,item('three','2024:rope'));assert.equal(c.inventoryItems?.length,2);assert.equal(c.inventory,'15 gold');assert.throws(()=>addInventoryItem(c,{...item('three'),catalogueId:undefined}));});
|
|
test('inventory validates bounds, unique ids and retains legacy sheets',()=>{const c=newCharacter();delete c.inventoryItems;c.inventory='Longbow, 20 arrows';assert.equal(characterSchema.parse(c).inventoryItems,undefined);assert.equal(characterSchema.parse(c).inventory,c.inventory);const i=addInventoryItem(c,item());changeItemQuantity(i,-9);assert.equal(i.quantity,0);changeItemQuantity(i,10000);assert.equal(i.quantity,9999);assert.throws(()=>addInventoryItem(c,item('two')));assert.throws(()=>changeItemQuantity(i,0.5));assert.throws(()=>characterSchema.parse({...c,inventoryItems:[i,i]}));assert.throws(()=>characterSchema.parse({...c,inventoryItems:[{...i,quantity:-1}]}));});
|
|
test('older clients preserve inventory under revision and account guards; explicit empty clears',async()=>{const pg=newDb().adapters.createPg(),s=new Storage(new pg.Pool());await s.init();const c=newCharacter();c.inventory='Legacy coins';addInventoryItem(c,item());await s.put('alice',c.id,c,0);const old={...c,name:'Older client'};delete old.inventoryItems;await s.put('alice',c.id,old,1);assert.equal((await s.get('alice',c.id)).character.inventoryItems[0].name,'Rope');assert.equal((await s.get('alice',c.id)).character.inventory,'Legacy coins');await assert.rejects(s.put('alice',c.id,old,1),Conflict);await assert.rejects(s.put('bob',c.id,old,2),Conflict);await s.put('alice',c.id,{...old,inventoryItems:[]},2);assert.deepEqual((await s.get('alice',c.id)).character.inventoryItems,[]);});
|