package app import ( "os" "path/filepath" "strings" "testing" "douyu_go/internal/seckill" "douyu_go/internal/types" ) func TestParseAccountImport(t *testing.T) { entries, err := parseAccountImport("# 注释\r\nfoo----pass----cookie-a\nbar----pass----cookie-b\n") if err != nil { t.Fatalf("解析账号失败: %v", err) } if len(entries) != 2 || entries[0].Raw != "foo----pass----cookie-a" { t.Fatalf("解析结果异常: %#v", entries) } if _, err := parseAccountImport("bad-line"); err == nil { t.Fatal("格式错误的账号行应该被拒绝") } if _, err := parseAccountImport("foo----pass----cookie\nfoo----pass----cookie2"); err == nil { t.Fatal("重复账号应该被拒绝") } } func TestAccountMutations(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "user.txt") if err := os.WriteFile(path, []byte("# 账号\r\nfoo----pass----cookie-a\r\n"), 0644); err != nil { t.Fatal(err) } scheduler := seckill.New(nil, types.AppPaths{AccountFile: path}, nil, 1, 1, nil, types.SeckillModeNormal) scheduler.LoadAccounts() a := &App{scheduler: scheduler} result := a.ImportAccounts("bar----pass----cookie-b") if !result.Success || result.Count != 1 { t.Fatalf("导入失败: %#v", result) } result = a.UpdateAccount("bar", "baz", "") if !result.Success { t.Fatalf("编辑失败: %#v", result) } result = a.DeleteAccounts([]string{"foo"}) if !result.Success || result.Count != 1 { t.Fatalf("删除失败: %#v", result) } data, err := os.ReadFile(path) if err != nil { t.Fatal(err) } content := string(data) if strings.Contains(content, "foo----") || !strings.Contains(content, "baz----pass----cookie-b") { t.Fatalf("账号文件内容异常: %q", content) } if len(content) == 0 || !strings.HasSuffix(content, "\r\n") { t.Fatalf("账号文件未使用规范换行: %q", content) } }