feat(variants): default a registered account to Erudit + Russian Scrabble
CI / changes (pull_request) Successful in 3s
CI / unit (pull_request) Successful in 11s
CI / integration (pull_request) Successful in 22s
CI / ui (pull_request) Successful in 1m16s
CI / conformance (pull_request) Successful in 10s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m53s
CI / changes (pull_request) Successful in 3s
CI / unit (pull_request) Successful in 11s
CI / integration (pull_request) Successful in 22s
CI / ui (pull_request) Successful in 1m16s
CI / conformance (pull_request) Successful in 10s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m53s
New Game opened on a single variant for everyone, which reads poorly on VK where Russian Scrabble is the familiar game. A registered account now starts with both Russian-alphabet games, so the picker offers a real choice with no pre-selection. A guest stays on Erudit alone and is invited to register for the rest: the device-local guest has no profile at all, so the client-side fallback has to keep matching the server. Registering promotes the set, but only while the guest still carries the untouched guest default. Existing accounts are not backfilled — the set they carry may be a deliberate choice. The Telegram promo start-param becomes additive rather than a replacement, with English Scrabble withheld from a Russian-speaking arrival; otherwise the English campaign link would have taken Russian Scrabble away from every account it onboarded.
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"regexp"
|
||||
"slices"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -266,6 +267,81 @@ func TestProvisionSeedsTimeZone(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestVariantPreferenceDefaults covers the variant set an account is born with and how
|
||||
// registration widens it: a registered account starts on both Russian-alphabet games
|
||||
// (the column default), a guest on Эрудит alone, and promoting the guest lifts it to the
|
||||
// registered default — but only while the guest still carries that untouched set, and
|
||||
// never for an account that is already durable.
|
||||
func TestVariantPreferenceDefaults(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
store := account.NewStore(testDB)
|
||||
|
||||
equal := func(t *testing.T, what string, got, want []string) {
|
||||
t.Helper()
|
||||
if !slices.Equal(got, want) {
|
||||
t.Errorf("%s = %v, want %v", what, got, want)
|
||||
}
|
||||
}
|
||||
|
||||
// A registered account (any identity kind) takes the column default.
|
||||
durable, _, err := store.ProvisionTelegram(ctx, "tg-"+uuid.NewString(), "ru", "", "Player", "")
|
||||
if err != nil {
|
||||
t.Fatalf("provision telegram: %v", err)
|
||||
}
|
||||
equal(t, "registered account variants", durable.VariantPreferences, account.DefaultVariantPreferences)
|
||||
|
||||
// A guest is deliberately narrower.
|
||||
guest, err := store.ProvisionGuest(ctx, "", "ru")
|
||||
if err != nil {
|
||||
t.Fatalf("provision guest: %v", err)
|
||||
}
|
||||
equal(t, "guest variants", guest.VariantPreferences, account.GuestVariantPreferences)
|
||||
|
||||
// Registering the guest promotes it to a durable account on the registered default.
|
||||
if err := store.ClearGuest(ctx, guest.ID); err != nil {
|
||||
t.Fatalf("clear guest: %v", err)
|
||||
}
|
||||
promoted, err := store.GetByID(ctx, guest.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("reload promoted guest: %v", err)
|
||||
}
|
||||
if promoted.IsGuest {
|
||||
t.Error("promoted guest is still flagged is_guest")
|
||||
}
|
||||
equal(t, "promoted guest variants", promoted.VariantPreferences, account.DefaultVariantPreferences)
|
||||
|
||||
// A guest who picked their own set keeps it through the promotion.
|
||||
picky, err := store.ProvisionGuest(ctx, "", "en")
|
||||
if err != nil {
|
||||
t.Fatalf("provision picky guest: %v", err)
|
||||
}
|
||||
if _, err := store.SetVariantPreferences(ctx, picky.ID, []string{"scrabble_en"}); err != nil {
|
||||
t.Fatalf("set picky guest variants: %v", err)
|
||||
}
|
||||
if err := store.ClearGuest(ctx, picky.ID); err != nil {
|
||||
t.Fatalf("clear picky guest: %v", err)
|
||||
}
|
||||
reloaded, err := store.GetByID(ctx, picky.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("reload picky guest: %v", err)
|
||||
}
|
||||
equal(t, "picky guest variants", reloaded.VariantPreferences, []string{"scrabble_en"})
|
||||
|
||||
// An account that is already durable is never rewritten — an established player who
|
||||
// settled on Эрудит alone stays there.
|
||||
if _, err := store.SetVariantPreferences(ctx, durable.ID, []string{"erudit_ru"}); err != nil {
|
||||
t.Fatalf("narrow durable variants: %v", err)
|
||||
}
|
||||
if err := store.ClearGuest(ctx, durable.ID); err != nil {
|
||||
t.Fatalf("clear guest on a durable account: %v", err)
|
||||
}
|
||||
established, err := store.GetByID(ctx, durable.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("reload durable account: %v", err)
|
||||
}
|
||||
equal(t, "established account variants", established.VariantPreferences, []string{"erudit_ru"})
|
||||
}
|
||||
|
||||
// TestProvisionTelegramUnknownLanguageDefaults checks an unsupported Telegram
|
||||
// client language falls back to the account default rather than failing the
|
||||
// language CHECK.
|
||||
|
||||
Reference in New Issue
Block a user