1 package wallet
2 3 import (
4 "strings"
5 "testing"
6 7 "github.com/p9c/p9/pkg/btcjson"
8 "github.com/p9c/p9/pkg/rpchelp"
9 )
10 11 func serverMethods() map[string]struct{} {
12 m := make(map[string]struct{})
13 for method, handlerData := range RPCHandlers {
14 if !handlerData.NoHelp {
15 m[method] = struct{}{}
16 }
17 }
18 return m
19 }
20 21 // TestRPCMethodHelpGeneration ensures that help text can be generated for every method of the RPC server for every
22 // supported locale.
23 func TestRPCMethodHelpGeneration(t *testing.T) {
24 needsGenerate := false
25 defer func() {
26 if needsGenerate && !t.Failed() {
27 t.Error("Generated help texts are out of date: run 'go generate'")
28 return
29 }
30 if t.Failed() {
31 t.Log("Regenerate help texts with 'go generate' after fixing")
32 }
33 }()
34 for i := range rpchelp.HelpDescs {
35 svrMethods := serverMethods()
36 locale := rpchelp.HelpDescs[i].Locale
37 generatedDescs := LocaleHelpDescs[locale]()
38 for _, m := range rpchelp.Methods {
39 delete(svrMethods, m.Method)
40 helpText, e := btcjson.GenerateHelp(m.Method, rpchelp.HelpDescs[i].Descs, m.ResultTypes...)
41 if e != nil {
42 t.Errorf("Cannot generate '%s' help for method '%s': missing description for '%s'",
43 locale, m.Method, e,
44 )
45 continue
46 }
47 if !needsGenerate && helpText != generatedDescs[m.Method] {
48 needsGenerate = true
49 }
50 }
51 for m := range svrMethods {
52 t.Errorf("Missing '%s' help for method '%s'", locale, m)
53 }
54 }
55 }
56 57 // TestRPCMethodUsageGeneration ensures that single line usage text can be generated for every supported request of the
58 // RPC server.
59 func TestRPCMethodUsageGeneration(t *testing.T) {
60 needsGenerate := false
61 defer func() {
62 if needsGenerate && !t.Failed() {
63 t.Error("Generated help usages are out of date: run 'go generate'")
64 return
65 }
66 if t.Failed() {
67 t.Log("Regenerate help usage with 'go generate' after fixing")
68 }
69 }()
70 svrMethods := serverMethods()
71 usageStrs := make([]string, 0, len(rpchelp.Methods))
72 for _, m := range rpchelp.Methods {
73 delete(svrMethods, m.Method)
74 usage, e := btcjson.MethodUsageText(m.Method)
75 if e != nil {
76 t.Errorf("Cannot generate single line usage for method '%s': %v",
77 m.Method, e,
78 )
79 }
80 if !t.Failed() {
81 usageStrs = append(usageStrs, usage)
82 }
83 }
84 if !t.Failed() {
85 usages := strings.Join(usageStrs, "\n")
86 needsGenerate = usages != RequestUsages
87 }
88 }
89