From b56738653d522af005c5fa65f12bf82476697daf Mon Sep 17 00:00:00 2001 From: Sebastiaan de Schaetzen Date: Sun, 18 May 2025 08:51:37 +0200 Subject: [PATCH] Add complete task test with sum of weights == 0 --- backend/api_test.go | 42 ++++++++++++++++++++++++++++++++++++++++++ backend/db.go | 34 ++++++++++++++++++---------------- 2 files changed, 60 insertions(+), 16 deletions(-) diff --git a/backend/api_test.go b/backend/api_test.go index 9273fa6..a5eaf29 100644 --- a/backend/api_test.go +++ b/backend/api_test.go @@ -594,6 +594,38 @@ func TestCompleteTask(t *testing.T) { } } +func TestCompleteTaskAllowanceWeightsSumTo0(t *testing.T) { + e := startServer(t) + taskId := createTestTaskWithAmount(e, 101) + + e.GET("/tasks").Expect().Status(200).JSON().Array().Length().IsEqual(1) + + // Update rest allowance + e.PUT("/user/1/allowance/0").WithJSON(UpdateAllowanceRequest{ + Weight: 0, + }).Expect().Status(200) + // Create two allowance goals + e.POST("/user/1/allowance").WithJSON(CreateAllowanceRequest{ + Name: "Test Allowance 1", + Target: 1000, + Weight: 0, + }).Expect().Status(201) + + // Complete the task + e.POST("/task/" + strconv.Itoa(taskId) + "/complete").Expect().Status(200) + + // Verify the task is marked as completed + e.GET("/task/" + strconv.Itoa(taskId)).Expect().Status(404) + + // Verify the allowances are updated for user 1 + allowances := e.GET("/user/1/allowance").Expect().Status(200).JSON().Array() + allowances.Length().IsEqual(2) + allowances.Value(0).Object().Value("id").Number().IsEqual(0) + allowances.Value(0).Object().Value("progress").Number().IsEqual(101) + allowances.Value(1).Object().Value("id").Number().IsEqual(1) + allowances.Value(1).Object().Value("progress").Number().IsEqual(0) +} + func TestCompleteTaskInvalidId(t *testing.T) { e := startServer(t) e.POST("/task/999/complete").Expect().Status(404) @@ -628,6 +660,16 @@ func TestCompleteAllowance(t *testing.T) { history.Value(1).Object().Value("timestamp").String().AsDateTime().InRange(getDelta(time.Now(), 2.0)) } +func TestCompleteAllowanceInvalidUserId(t *testing.T) { + e := startServer(t) + e.POST("/user/999/allowance/1/complete").Expect().Status(404) +} + +func TestCompleteAllowanceInvalidAllowanceId(t *testing.T) { + e := startServer(t) + e.POST("/user/1/allowance/999/complete").Expect().Status(404) +} + func getDelta(base time.Time, delta float64) (time.Time, time.Time) { start := base.Add(-time.Duration(delta) * time.Second) end := base.Add(time.Duration(delta) * time.Second) diff --git a/backend/db.go b/backend/db.go index 937be11..100040c 100644 --- a/backend/db.go +++ b/backend/db.go @@ -389,24 +389,26 @@ func (db *Db) CompleteTask(taskId int) error { remainingReward := reward - // Distribute the reward to the allowances - for allowanceRow := range tx.Query("select id, weight from allowances where user_id = ? and weight > 0").Bind(userId).Range(&err) { - var allowanceId int - var allowanceWeight float64 - err = allowanceRow.Scan(&allowanceId, &allowanceWeight) - if err != nil { - return err - } + if sumOfWeights > 0 { + // Distribute the reward to the allowances + for allowanceRow := range tx.Query("select id, weight from allowances where user_id = ? and weight > 0").Bind(userId).Range(&err) { + var allowanceId int + var allowanceWeight float64 + err = allowanceRow.Scan(&allowanceId, &allowanceWeight) + if err != nil { + return err + } - // Calculate the amount to add to the allowance - amount := int((allowanceWeight / sumOfWeights) * float64(remainingReward)) - sumOfWeights -= allowanceWeight - err = tx.Query("update allowances set balance = balance + ? where id = ? and user_id = ?"). - Bind(amount, allowanceId, userId).Exec() - if err != nil { - return err + // Calculate the amount to add to the allowance + amount := int((allowanceWeight / sumOfWeights) * float64(remainingReward)) + sumOfWeights -= allowanceWeight + err = tx.Query("update allowances set balance = balance + ? where id = ? and user_id = ?"). + Bind(amount, allowanceId, userId).Exec() + if err != nil { + return err + } + remainingReward -= amount } - remainingReward -= amount } // Add the remaining reward to the user