158 lines
9.2 KiB
Python
158 lines
9.2 KiB
Python
import unittest
|
|
import praw
|
|
import dotenv
|
|
from datetime import datetime
|
|
|
|
import discord
|
|
from discord.ext import commands
|
|
|
|
import Points
|
|
|
|
class User:
|
|
def __init__(self, id, name):
|
|
self.id = id
|
|
self.name = name
|
|
|
|
class TestPoints(unittest.TestCase):
|
|
def setUp(self):
|
|
dotenv.load_dotenv()
|
|
intents = discord.Intents.default()
|
|
intents.message_content = True
|
|
intents.members = True
|
|
bot = commands.Bot(command_prefix=commands.when_mentioned_or('!'), description='Stroopwafel. Shitpost bot extraordinaire.', pm_help=True, intents=intents)
|
|
self.cog = Points.Points(bot)
|
|
|
|
self.user1 = User(10001, "Alice")
|
|
self.user2 = User(10002, "Bob")
|
|
|
|
def test_getUserBalance(self):
|
|
self.cog.pointsCount = {}
|
|
self.cog.pointsCount[self.user1.id] = {"name": self.user1.name, "points": 69}
|
|
self.assertEqual(69, self.cog.getUserBalance(self.user1))
|
|
|
|
def test_getBankBalance(self):
|
|
self.cog.pointsCount = {}
|
|
self.cog.pointsCount[self.user1.id] = {"name": self.user1.name, "points": 1}
|
|
self.cog.pointsCount[self.cog.BANK_ID] = {"name": "DE BANK", "points": 999}
|
|
self.assertEqual(999, self.cog.getBankBalance())
|
|
|
|
def test_isUserOnList(self):
|
|
self.cog.pointsCount = {}
|
|
self.cog.pointsCount[self.user1.id] = {"name": self.user1.name, "points": 1}
|
|
self.cog.pointsCount[self.cog.BANK_ID] = {"name": "DE BANK", "points": 999}
|
|
self.assertTrue(self.cog.isUserOnList(self.user1))
|
|
self.assertFalse(self.cog.isUserOnList(self.user2))
|
|
|
|
def test_transferPoints(self):
|
|
self.cog.pointsCount = {}
|
|
self.cog.pointsCount[self.user1.id] = {"name": self.user1.name, "points": 50}
|
|
self.cog.pointsCount[self.user2.id] = {"name": self.user2.name, "points": 30}
|
|
self.cog.transferPoints(self.user1.id, self.user2.id, 4)
|
|
self.assertEqual(46, self.cog.getUserBalance(self.user1))
|
|
self.assertEqual(34, self.cog.getUserBalance(self.user2))
|
|
|
|
def test_given_bankHasBalanceAndUserHasNotGivenPointsYetToday_when_givingPoints_then_tenPointComeFromBank(self):
|
|
self.cog.pointsCount = {}
|
|
self.cog.pointsCount[self.cog.BANK_ID] = {"name": "DE BANK", "points": 1000}
|
|
self.cog.pointsCount[self.user1.id] = {"name": self.user1.name, "points": 200, "pointTakenOnDate":0, "bankPointsGivenOnDate":0, "theDate":"20220101"}
|
|
self.cog.pointsCount[self.user2.id] = {"name": self.user2.name, "points": 100, "pointTakenOnDate":0, "bankPointsGivenOnDate":0, "theDate":"20220101"}
|
|
self.cog.execute_geefpunten(self.user1.id, self.user2.id, 12)
|
|
self.assertEqual(990, self.cog.getBankBalance())
|
|
self.assertEqual(198, self.cog.getUserBalance(self.user1))
|
|
self.assertEqual(112, self.cog.getUserBalance(self.user2))
|
|
|
|
def test_given_bankHasBalanceButUserHasNoBalanceAndUserHasNotGivenPointsYetToday_when_givingPoints_then_pointComeFromBank(self):
|
|
currentDateStr = datetime.now().strftime("%Y%m%d")
|
|
self.cog.pointsCount = {}
|
|
self.cog.pointsCount[self.cog.BANK_ID] = {"name": "DE BANK", "points": 1000}
|
|
self.cog.pointsCount[self.user1.id] = {"name": self.user1.name, "points": 0, "pointTakenOnDate":10, "bankPointsGivenOnDate":0, "theDate":currentDateStr}
|
|
self.cog.pointsCount[self.user2.id] = {"name": self.user2.name, "points": 100, "pointTakenOnDate":10, "bankPointsGivenOnDate":10, "theDate":currentDateStr}
|
|
self.cog.execute_geefpunten(self.user1.id, self.user2.id, 5)
|
|
self.assertEqual(995, self.cog.getBankBalance())
|
|
self.assertEqual(0, self.cog.getUserBalance(self.user1))
|
|
self.assertEqual(105, self.cog.getUserBalance(self.user2))
|
|
|
|
def test_given_bankIsEmpty_when_givingPoints_then_AllPointsComeFromUser(self):
|
|
self.cog.pointsCount = {}
|
|
self.cog.pointsCount[self.cog.BANK_ID] = {"name": "DE BANK", "points": 0}
|
|
self.cog.pointsCount[self.user1.id] = {"name": self.user1.name, "points": 200, "pointTakenOnDate":0, "bankPointsGivenOnDate":0, "theDate":"20220101"}
|
|
self.cog.pointsCount[self.user2.id] = {"name": self.user2.name, "points": 100, "pointTakenOnDate":0, "bankPointsGivenOnDate":0, "theDate":"20220101"}
|
|
self.cog.execute_geefpunten(self.user1.id, self.user2.id, 15)
|
|
self.assertEqual(0, self.cog.getBankBalance())
|
|
self.assertEqual(185, self.cog.getUserBalance(self.user1))
|
|
self.assertEqual(115, self.cog.getUserBalance(self.user2))
|
|
|
|
def test_given_userHasAlreadyGivenSomeBankPointsToday_when_givingPoints_then_NotAllPointsComeFromBank(self):
|
|
currentDateStr = datetime.now().strftime("%Y%m%d")
|
|
self.cog.pointsCount = {}
|
|
self.cog.pointsCount[self.cog.BANK_ID] = {"name": "DE BANK", "points": 1000}
|
|
self.cog.pointsCount[self.user1.id] = {"name": self.user1.name, "points": 200, "pointTakenOnDate":0, "bankPointsGivenOnDate":0, "theDate":currentDateStr}
|
|
self.cog.pointsCount[self.user2.id] = {"name": self.user2.name, "points": 100, "pointTakenOnDate":0, "bankPointsGivenOnDate":0, "theDate":"20220101"}
|
|
# First a normal transaction:
|
|
self.cog.execute_geefpunten(self.user1.id, self.user2.id, 5)
|
|
self.assertEqual(995, self.cog.getBankBalance())
|
|
self.assertEqual(200, self.cog.getUserBalance(self.user1))
|
|
self.assertEqual(105, self.cog.getUserBalance(self.user2))
|
|
# Then another one:
|
|
self.cog.execute_geefpunten(self.user1.id, self.user2.id, 8)
|
|
self.assertEqual(990, self.cog.getBankBalance()) # Only the first 5 come from the bank
|
|
self.assertEqual(197, self.cog.getUserBalance(self.user1))
|
|
self.assertEqual(113, self.cog.getUserBalance(self.user2))
|
|
# One more:
|
|
self.cog.execute_geefpunten(self.user1.id, self.user2.id, 3)
|
|
self.assertEqual(990, self.cog.getBankBalance()) # All points come out of the user's pocket now
|
|
self.assertEqual(194, self.cog.getUserBalance(self.user1))
|
|
self.assertEqual(116, self.cog.getUserBalance(self.user2))
|
|
|
|
def test_given_usersWithPoints_when_takingPoints_then_pointsGoToTheBank(self):
|
|
self.cog.pointsCount = {}
|
|
self.cog.pointsCount[self.cog.BANK_ID] = {"name": "DE BANK", "points": 1000}
|
|
self.cog.pointsCount[self.user1.id] = {"name": self.user1.name, "points": 200, "pointTakenOnDate":0, "bankPointsGivenOnDate":0, "theDate":"20220101"}
|
|
self.cog.pointsCount[self.user2.id] = {"name": self.user2.name, "points": 100, "pointTakenOnDate":0, "bankPointsGivenOnDate":0, "theDate":"20220101"}
|
|
self.cog.refreshDateVarsAndReturnUserVars(self.user1.id) #usually happens in !neempunten, so this unittest is a bit poor
|
|
self.cog.execute_neempunten(self.user1.id, self.user2.id, 2)
|
|
self.assertEqual(1002, self.cog.getBankBalance())
|
|
self.assertEqual(200, self.cog.getUserBalance(self.user1))
|
|
self.assertEqual(98, self.cog.getUserBalance(self.user2))
|
|
# The user should only have 8 points left to give away today:
|
|
self.assertEqual(8, self.cog.getUsersRemainingPointsToTakeToday(self.user1.id))
|
|
|
|
def test_given_user_when_takingPoints_then_pointsToTakeAreLimited(self):
|
|
self.cog.pointsCount = {}
|
|
self.cog.pointsCount[self.cog.BANK_ID] = {"name": "DE BANK", "points": 1000}
|
|
self.cog.pointsCount[self.user1.id] = {"name": self.user1.name, "points": 200, "pointTakenOnDate":0, "bankPointsGivenOnDate":0, "theDate":"20220101"}
|
|
self.cog.pointsCount[self.user2.id] = {"name": self.user2.name, "points": 100, "pointTakenOnDate":0, "bankPointsGivenOnDate":0, "theDate":"20220101"}
|
|
self.cog.refreshDateVarsAndReturnUserVars(self.user1.id) #usually happens in !neempunten, so this unittest is a bit poor
|
|
self.cog.execute_neempunten(self.user1.id, self.user2.id, 6)
|
|
self.assertEqual(94, self.cog.getUserBalance(self.user2))
|
|
# The user should only have 4 points left to give away today:
|
|
self.assertEqual(4, self.cog.getUsersRemainingPointsToTakeToday(self.user1.id))
|
|
self.cog.execute_neempunten(self.user1.id, self.user2.id, 3)
|
|
self.assertEqual(91, self.cog.getUserBalance(self.user2))
|
|
# The user should only have 1 point left to give away today:
|
|
self.assertEqual(1, self.cog.getUsersRemainingPointsToTakeToday(self.user1.id))
|
|
self.cog.execute_neempunten(self.user1.id, self.user2.id, 1)
|
|
self.assertEqual(90, self.cog.getUserBalance(self.user2))
|
|
# The user should have 0 points left to take away:
|
|
self.assertEqual(0, self.cog.getUsersRemainingPointsToTakeToday(self.user1.id))
|
|
# The actual check whether or not a user can keep on taking points away happens in !neempunten and is not tested here
|
|
|
|
def test_refreshDateVarsAndReturnUserVars(self):
|
|
with self.subTest("Should not be updated yet. Update was just today."):
|
|
currentDateStr = datetime.now().strftime("%Y%m%d")
|
|
self.cog.pointsCount = {}
|
|
self.cog.pointsCount[self.user1.id] = {"name": self.user1.name, "points": 100, "pointTakenOnDate":2, "bankPointsGivenOnDate":1, "theDate":currentDateStr}
|
|
self.cog.refreshDateVarsAndReturnUserVars(self.user1.id)
|
|
# Still today. Values should stay the same:
|
|
self.assertEqual(2, self.cog.pointsCount[self.user1.id]["pointTakenOnDate"])
|
|
self.assertEqual(1, self.cog.pointsCount[self.user1.id]["bankPointsGivenOnDate"])
|
|
with self.subTest("Should be reset. Update was in the past."):
|
|
currentDateStr = datetime.now().strftime("%Y%m%d")
|
|
self.cog.pointsCount = {}
|
|
self.cog.pointsCount[self.user1.id] = {"name": self.user1.name, "points": 100, "pointTakenOnDate":2, "bankPointsGivenOnDate":1, "theDate":"20150101"}
|
|
self.cog.refreshDateVarsAndReturnUserVars(self.user1.id)
|
|
# A new day. Values should be set to 0 again:
|
|
self.assertEqual(0, self.cog.pointsCount[self.user1.id]["pointTakenOnDate"])
|
|
self.assertEqual(0, self.cog.pointsCount[self.user1.id]["bankPointsGivenOnDate"])
|
|
self.assertNotEqual("20150101", self.cog.pointsCount[self.user1.id]["theDate"])
|