feat: add stickers delete api
This commit is contained in:
@@ -2,6 +2,7 @@ package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
@@ -138,3 +139,68 @@ func TestGift_ArrivesWrappedAndOpensOnce(t *testing.T) {
|
||||
t.Error("re-gifting re-wrapped an already opened gift")
|
||||
}
|
||||
}
|
||||
|
||||
// Deleting a custom gift must clear it from every gallery it reached, and must
|
||||
// refuse to touch the seeded catalog — a seeded reward would return on the
|
||||
// next Seed run, after having been ripped out of people's galleries.
|
||||
func TestGift_DeleteRemovesItFromEveryGallery(t *testing.T) {
|
||||
rewards, pg := testRewardRepo(t)
|
||||
ctx := context.Background()
|
||||
user := giftUser(t, pg)
|
||||
|
||||
// A custom reward, as the admin panel creates them.
|
||||
key := "custom_probe_" + uuid.NewString()[:8]
|
||||
if _, err := pg.Pool.Exec(ctx, `
|
||||
INSERT INTO sadhna_rewards (key, name, image_url)
|
||||
VALUES ($1, 'Probe Gift', 'https://example.invalid/p.png')`, key); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
reward, err := rewards.ByKey(ctx, key)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := rewards.GrantGiftToEveryone(ctx, reward.ID); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
held := func() int {
|
||||
grants, err := rewards.GrantsByUser(ctx, user)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
n := 0
|
||||
for _, g := range grants {
|
||||
if g.Reward.Key == key {
|
||||
n++
|
||||
}
|
||||
}
|
||||
return n
|
||||
}
|
||||
if held() != 1 {
|
||||
t.Fatalf("setup: the gift did not reach the gallery")
|
||||
}
|
||||
|
||||
if err := rewards.DeleteCustom(ctx, key); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if held() != 0 {
|
||||
t.Error("deleting the reward left it in a devotee's gallery")
|
||||
}
|
||||
if _, err := rewards.ByKey(ctx, key); !errors.Is(err, repository.ErrRewardNotFound) {
|
||||
t.Errorf("reward still in the catalog: %v", err)
|
||||
}
|
||||
|
||||
// Seeded rewards are off limits.
|
||||
var seeded string
|
||||
if err := pg.Pool.QueryRow(ctx,
|
||||
`SELECT key FROM sadhna_rewards WHERE key NOT LIKE 'custom\_%' LIMIT 1`,
|
||||
).Scan(&seeded); err != nil {
|
||||
t.Skip("no seeded rewards to test against")
|
||||
}
|
||||
if err := rewards.DeleteCustom(ctx, seeded); !errors.Is(err, repository.ErrRewardNotFound) {
|
||||
t.Errorf("a seeded reward was deletable: %v", err)
|
||||
}
|
||||
if _, err := rewards.ByKey(ctx, seeded); err != nil {
|
||||
t.Errorf("the seeded reward was removed: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user