Skip to content

Commit

Permalink
fix(raffles): decrement only new tickets (#3591)
Browse files Browse the repository at this point in the history
Fixes #3587
  • Loading branch information
sogehige committed Apr 29, 2020
1 parent 784a7b8 commit 2031557
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/bot/systems/raffles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,7 @@ class Raffles extends System {

if (selectedParticipant.isEligible) {
if (raffle.type === TYPE_TICKETS) {
await points.decrement({ userId: opts.sender.userId }, tickets);
await points.decrement({ userId: opts.sender.userId }, newTickets - curTickets);
}
debug('raffle', '------------------------------------------------------------------------------------------------');
debug('raffle', `Eligible user ${opts.sender.username}#${opts.sender.userId} for raffle ${raffle.id}`);
Expand Down
9 changes: 9 additions & 0 deletions test/helpers/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@ const viewer = {
emotes: [],
};

const viewer2 = {
userId: 3,
username: '__viewer2__',
badges: {},
emotes: [],
};

const owner = {
userId: 2,
username: 'soge',
Expand All @@ -18,8 +25,10 @@ const owner = {
module.exports = {
prepare: async () => {
await getRepository(User).save(viewer);
await getRepository(User).save(viewer2);
await getRepository(User).save(owner);
},
viewer,
viewer2,
owner,
};
109 changes: 109 additions & 0 deletions test/tests/raffles/bug#3587.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/* eslint-disable @typescript-eslint/no-var-requires */
/* global describe it before */

require('../../general.js');

const db = require('../../general.js').db;
const message = require('../../general.js').message;
const user = require('../../general.js').user;
const commons = require('../../../dest/commons');

const { getRepository } = require('typeorm');
const { User } = require('../../../dest/database/entity/user');
const { Raffle } = require('../../../dest/database/entity/raffle');

const raffles = (require('../../../dest/systems/raffles')).default;

const assert = require('assert');

describe('Raffles - user will lose points when join raffle with number and all #3587', () => {
before(async () => {
await db.cleanup();
await message.prepare();
await user.prepare();
raffles.allowOverTicketing = true;
});

it('create ticket raffle', async () => {
raffles.open({ sender: user.owner, parameters: '!winme -min 0 -max 100' });
await message.isSent('raffles.announce-ticket-raffle', { username: 'bot' }, {
keyword: '!winme',
eligibility: await commons.prepare('raffles.eligibility-everyone-item'),
min: 1,
max: 100,
});
});

it('Update viewer and viewer2 to have 200 points', async () => {
await getRepository(User).save({ username: user.viewer.username, userId: user.viewer.userId, points: 200 });
await getRepository(User).save({ username: user.viewer2.username, userId: user.viewer2.userId, points: 200 });
});

it('Viewer bets max points', async () => {
const a = await raffles.participate({ sender: user.viewer, message: '!winme 100' });
assert(a);
});

it('Viewer2 bets 50 points', async () => {
const a = await raffles.participate({ sender: user.viewer2, message: '!winme 50' });
assert(a);
});

it('expecting 2 participants to have bet of 100 and 50', async () => {
const raffle = await getRepository(Raffle).findOne({
relations: ['participants'],
where: { winner: null, isClosed: false },
});
assert.strictEqual(raffle.participants.length, 2);
assert.strictEqual(raffle.participants[0].tickets, 100);
assert.strictEqual(raffle.participants[1].tickets, 50);
});

it('expecting viewer to have 100 points', async () => {
const userFromDb = await getRepository(User).findOne({
where: { username: user.viewer.username },
});
assert.strictEqual(userFromDb.points, 100);
});

it('expecting viewer2 to have 150 points', async () => {
const userFromDb = await getRepository(User).findOne({
where: { username: user.viewer2.username },
});
assert.strictEqual(userFromDb.points, 150);
});

it('Viewer bets max points again with all', async () => {
const a = await raffles.participate({ sender: user.viewer, message: '!winme all' });
assert(a);
});

it('Viewer2 bets max points with all', async () => {
const a = await raffles.participate({ sender: user.viewer2, message: '!winme all' });
assert(a);
});

it('expecting 2 participants to have bet of 100', async () => {
const raffle = await getRepository(Raffle).findOne({
relations: ['participants'],
where: { winner: null, isClosed: false },
});
assert.strictEqual(raffle.participants.length, 2);
assert.strictEqual(raffle.participants[0].tickets, 100);
assert.strictEqual(raffle.participants[1].tickets, 100);
});

it('expecting viewer to still have 100 points', async () => {
const userFromDb = await getRepository(User).findOne({
where: { username: user.viewer.username },
});
assert.strictEqual(userFromDb.points, 100);
});

it('expecting viewer2 to have 100 points', async () => {
const userFromDb = await getRepository(User).findOne({
where: { username: user.viewer2.username },
});
assert.strictEqual(userFromDb.points, 100);
});
});
1 change: 1 addition & 0 deletions test/tests/raffles/ticketsBoundaries.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ describe('Raffles - user should be able to compete within boundaries of tickets'
before(async () => {
await db.cleanup();
await message.prepare();
raffles.allowOverTicketing = false;
});

it('create ticket raffle', async () => {
Expand Down

0 comments on commit 2031557

Please sign in to comment.