package userstore

import (
	"context"
	"testing"
)

func TestRandomUsernameUnique(t *testing.T) {
	seen := map[string]struct{}{}
	for i := 0; i < 20; i++ {
		u, err := RandomUsername()
		if err != nil || len(u) != 10 {
			t.Fatalf("got %q %v", u, err)
		}
		if u[0] < 'a' || u[0] > 'z' {
			t.Fatalf("must start with letter: %q", u)
		}
		seen[u] = struct{}{}
	}
	if len(seen) < 15 {
		t.Fatalf("expected diverse usernames, got %d", len(seen))
	}
}

func TestCreateMemberAndChangePassword(t *testing.T) {
	s := NewMemoryStore()
	ten, err := s.CreateTenant(context.Background(), "测试公司", "acme")
	if err != nil {
		t.Fatal(err)
	}
	uname, err := AllocUniqueUsername(context.Background(), s.UsernameExists)
	if err != nil {
		t.Fatal(err)
	}
	u, plain, err := s.CreateMember(context.Background(), ten.TenantID, uname, "", "管理员", "管理员", 0)
	if err != nil || plain == "" {
		t.Fatalf("u=%v plain=%q err=%v", u, plain, err)
	}
	if _, err := s.Login(context.Background(), uname, plain); err != nil {
		t.Fatal(err)
	}
	if err := s.ChangePassword(context.Background(), u.UserID, plain, "newpass99"); err != nil {
		t.Fatal(err)
	}
	if _, err := s.Login(context.Background(), uname, "newpass99"); err != nil {
		t.Fatal(err)
	}
	if err := s.ChangePassword(context.Background(), u.UserID, "wrong", "x"); err == nil {
		t.Fatal("expected old password check")
	}
}
