rpchelp_test.go raw

   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