Skip to content

Commit f6e92ab

Browse files
committed
refactor: 💡 fix error if no votes cast on results
1 parent ddfeb8f commit f6e92ab

File tree

5 files changed

+114
-5
lines changed

5 files changed

+114
-5
lines changed

src/api/entities/CorporateBallot/__tests__/index.ts

+95-1
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,52 @@ describe('CorporateBallot class', () => {
258258
await expect(corporateBallot.results()).rejects.toThrow('The CorporateBallot does not exist');
259259
});
260260

261+
it('should return 0 if no votes have been cast', async () => {
262+
const mockRawMeta = createMockCorporateBallotMeta(mockBallotMeta);
263+
const meshCorporateBallotMetaToCorporateBallotMetaSpy = jest.spyOn(
264+
utilsConversionModule,
265+
'meshCorporateBallotMetaToCorporateBallotMeta'
266+
);
267+
268+
when(meshCorporateBallotMetaToCorporateBallotMetaSpy)
269+
.calledWith(mockRawMeta)
270+
.mockReturnValue(mockBallotMeta);
271+
272+
dsMockUtils.createQueryMock('corporateBallot', 'metas', {
273+
returnValue: dsMockUtils.createMockOption(dsMockUtils.createMockCodec(mockRawMeta, false)),
274+
});
275+
dsMockUtils.createQueryMock('corporateBallot', 'results', {
276+
returnValue: dsMockUtils.createMockVec(),
277+
});
278+
279+
const results = await corporateBallot.results();
280+
281+
expect(results).toEqual({
282+
title: mockBallotMeta.title,
283+
motions: [
284+
{
285+
title: mockBallotMeta.motions[0].title,
286+
infoLink: mockBallotMeta.motions[0].infoLink,
287+
choices: [
288+
{
289+
choice: mockBallotMeta.motions[0].choices[0],
290+
votes: new BigNumber(0),
291+
},
292+
{
293+
choice: mockBallotMeta.motions[0].choices[1],
294+
votes: new BigNumber(0),
295+
},
296+
{
297+
choice: mockBallotMeta.motions[0].choices[2],
298+
votes: new BigNumber(0),
299+
},
300+
],
301+
total: new BigNumber(0),
302+
},
303+
],
304+
});
305+
});
306+
261307
it('should return the results of the CorporateBallot', async () => {
262308
const mockResults = ['100', '200', '300'];
263309
const mockRawMeta = createMockCorporateBallotMeta(mockBallotMeta);
@@ -359,7 +405,6 @@ describe('CorporateBallot class', () => {
359405
},
360406
{
361407
power: mockVotePower2,
362-
fallback: dsMockUtils.createMockOption(),
363408
},
364409
];
365410

@@ -396,6 +441,55 @@ describe('CorporateBallot class', () => {
396441
],
397442
});
398443
});
444+
445+
it('should return the votes of the CorporateBallot by identity', async () => {
446+
const mockRawMeta = createMockCorporateBallotMeta(mockBallotMeta);
447+
dsMockUtils.createQueryMock('corporateBallot', 'metas', {
448+
returnValue: dsMockUtils.createMockOption(dsMockUtils.createMockCodec(mockRawMeta, false)),
449+
});
450+
451+
const meshCorporateBallotMetaToCorporateBallotMetaSpy = jest.spyOn(
452+
utilsConversionModule,
453+
'meshCorporateBallotMetaToCorporateBallotMeta'
454+
);
455+
456+
when(meshCorporateBallotMetaToCorporateBallotMetaSpy)
457+
.calledWith(mockRawMeta)
458+
.mockReturnValue(mockBallotMeta);
459+
460+
dsMockUtils.createQueryMock('corporateBallot', 'votes', {
461+
returnValue: dsMockUtils.createMockVec(),
462+
});
463+
464+
const votes = await corporateBallot.votesByIdentity('12341234-1234-1234-1234-123412341234');
465+
466+
expect(votes).toEqual({
467+
title: mockBallotMeta.title,
468+
motions: [
469+
{
470+
title: mockBallotMeta.motions[0].title,
471+
infoLink: mockBallotMeta.motions[0].infoLink,
472+
choices: [
473+
{
474+
choice: mockBallotMeta.motions[0].choices[0],
475+
power: new BigNumber(0),
476+
fallback: undefined,
477+
},
478+
{
479+
choice: mockBallotMeta.motions[0].choices[1],
480+
power: new BigNumber(0),
481+
fallback: undefined,
482+
},
483+
{
484+
choice: mockBallotMeta.motions[0].choices[2],
485+
power: new BigNumber(0),
486+
fallback: undefined,
487+
},
488+
],
489+
},
490+
],
491+
});
492+
});
399493
});
400494

401495
describe('method: vote', () => {

src/api/entities/CorporateBallot/index.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,10 @@ export class CorporateBallot extends CorporateActionBase {
205205
total: new BigNumber(0),
206206
};
207207
choices.forEach(choice => {
208-
const choiceVoteTally = u128ToBigNumber(rawResults[resultIndex]);
208+
// when no votes have been cast the rawResults[resultIndex] is undefined
209+
const choiceVoteTally = rawResults[resultIndex]
210+
? u128ToBigNumber(rawResults[resultIndex])
211+
: new BigNumber(0);
209212
motionWithResults.choices.push({
210213
choice,
211214
votes: choiceVoteTally,
@@ -261,11 +264,14 @@ export class CorporateBallot extends CorporateActionBase {
261264
title,
262265
infoLink,
263266
choices: choices.map(choice => {
264-
const { power: rawPower, fallback: rawFallback } = rawDidVotes[index];
267+
const { power: rawPower, fallback: rawFallback } = rawDidVotes[index] ?? {
268+
power: new BigNumber(0),
269+
fallback: undefined,
270+
};
265271

266272
let fallback: BigNumber | undefined;
267273

268-
if (rawFallback.isSome) {
274+
if (rawFallback?.isSome) {
269275
fallback = u16ToBigNumber(rawFallback.unwrap());
270276
}
271277

src/api/procedures/castBallotVote.ts

+5
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ export function assertBallotIsActive(ballotDetails: CorporateBallotDetails): voi
4141
throw new PolymeshError({
4242
code: ErrorCode.ValidationError,
4343
message: 'Ballot is not active',
44+
data: {
45+
status,
46+
startDate: ballotDetails.startDate,
47+
endDate: ballotDetails.endDate,
48+
},
4449
});
4550
}
4651
}

src/api/procedures/modifyBallot.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ export function getAuthorization(
198198
transactions.push(TxTags.corporateBallot.ChangeEnd);
199199
}
200200

201-
if (rcv) {
201+
if (typeof rcv !== 'undefined') {
202202
transactions.push(TxTags.corporateBallot.ChangeRcv);
203203
}
204204

src/api/procedures/utils.ts

+4
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,10 @@ export async function assertBallotRecordDateValid(
738738
throw new PolymeshError({
739739
code: ErrorCode.ValidationError,
740740
message: 'The record date cannot be after the ballot start date',
741+
data: {
742+
checkpointDate,
743+
startDate,
744+
},
741745
});
742746
}
743747
}

0 commit comments

Comments
 (0)