Fixed issue where migrating attributes lost their base value calculation

This commit is contained in:
Stefan Zermatten
2022-02-09 12:37:16 +02:00
parent 78c313e3d1
commit 2bdd60b5e8
4 changed files with 72 additions and 5 deletions

View File

@@ -109,12 +109,14 @@ const transformsByPropType = {
{from: 'type', to: 'type', up: () => 'action'},
],
'attribute': [
{from: 'baseValueCalculation', to: 'baseValue.calculation'},
// from: baseValue must be first or else it will delete the field we need
{from: 'baseValue', to: 'baseValue.value', up: nanToNull},
{from: 'baseValueCalculation', to: 'baseValue.calculation', up: calculationUp, down: calculationDown},
{from: 'baseValueErrors', to: 'baseValue.errors', up: trimErrors},
...getComputedPropertyTransforms('spellSlotLevel'),
...getInlineComputationTransforms('description'),
{from: 'value', to: 'total', up: nanToNull},
{from: 'currentValue', to: 'value', up: nanToNull},
{from: 'proficiency', to: 'proficiency', up: stripZero},
],
'buff': [
@@ -214,12 +216,12 @@ function getInlineComputationTransforms(key){
}
function calculationUp(val){
if (!val || !val.replace) return val;
if (typeof val !== 'string') return val;
return val.replace('.value', '.total').replace('.currentValue', '.value');
}
function calculationDown(val){
if (!val || !val.replace) return val;
if (typeof val !== 'string') return val;
return val.replace('.value', '.currentValue').replace('.total', '.value');
}

View File

@@ -1,5 +1,5 @@
import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties.js';
import { migrateProperty } from './2.0-beta.33-dbv1.js';
import { migrateProperty } from './dbv1.js';
import { assert } from 'chai';
const exampleAction = {
@@ -63,6 +63,53 @@ const exampleAction = {
]
};
const exampleAttribute = {
_id:'idRWyoj5oxCv73feM',
name:'Hit Dice',
variableName:'clericHitDice',
attributeType:'hitDice',
type:'attribute',
hitDiceSize:'d8',
baseValueCalculation:'cleric.level',
parent:{'id':'8jSWKxvgQyKbunFtD','collection':'creatureProperties'},
ancestors:[
{'collection':'creatures','id':'m9sdCvs6iDf7qRaGv'},
{'id':'8jSWKxvgQyKbunFtD','collection':'creatureProperties'}
],
order: 84,
value: 20,
tags:[],
baseValue: 20,
damage: 3,
currentValue: 17,
constitutionMod: 2,
dependencies: ['8jSWKxvgQyKbunFtD','qPP5yQXPxS7uhuXo3']
};
const expectedMigratedAttribute = {
_id:'idRWyoj5oxCv73feM',
name:'Hit Dice',
variableName:'clericHitDice',
attributeType:'hitDice',
type:'attribute',
hitDiceSize:'d8',
baseValue: {
calculation: 'cleric.level',
value: 20
},
parent:{'id':'8jSWKxvgQyKbunFtD','collection':'creatureProperties'},
ancestors:[
{'collection':'creatures','id':'m9sdCvs6iDf7qRaGv'},
{'id':'8jSWKxvgQyKbunFtD','collection':'creatureProperties'}
],
order: 84,
total: 20,
tags:[],
damage: 3,
value: 17,
constitutionMod: 2,
}
describe('migrateProperty', function () {
it('Migrates actions reversibly', function () {
const action = {...exampleAction};
@@ -78,4 +125,13 @@ describe('migrateProperty', function () {
assert.deepEqual(action, exampleAction, 'action should not be bashed');
assert.deepEqual(exampleAction, reversedAction, 'operation should be reversible');
});
it ('Migrates attributes as expected', function(){
const attribute = {...exampleAttribute};
const newAttribute = migrateProperty({
collection: CreatureProperties,
prop: attribute
});
assert.deepEqual(newAttribute, expectedMigratedAttribute,
'Attribute should match the expected result');
});
});

View File

@@ -1 +1 @@
import './2.0-beta.33-dbv1.js';
import './v1/dbv1.js';

View File

@@ -44,6 +44,15 @@ describe('transformFields', function () {
assert.equal(doc.name, 'DOC NAME', 'name in uppercase');
});
it('Creates objects on the fly', function () {
let doc = {...originalDoc};
const transformList = [
{from: 'name', to:'newObj.name'},
];
doc = transformFields(doc, transformList);
assert.deepEqual(doc.newObj, {name: 'doc name'});
});
it('Handles empty to and from fields', function () {
let doc = {...originalDoc};
const transformList = [