effect_list_test.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "testing"
  6. )
  7. // Every other JSON command emits an object, so a consumer can add fields
  8. // later without breaking. `effect --list` returned a bare array because the
  9. // EffectList wrapper it built was bypassed in favour of its slice.
  10. func TestEffectListEmitsAnObjectNotABareArray(t *testing.T) {
  11. var out, errOut bytes.Buffer
  12. cmd := NewEffectCmd()
  13. cmd.SetOut(&out)
  14. cmd.SetErr(&errOut)
  15. cmd.SetArgs([]string{"--list"})
  16. if err := cmd.Execute(); err != nil {
  17. t.Fatalf("effect --list returned error: %v", err)
  18. }
  19. var parsed map[string][]struct {
  20. Zone string `json:"zone"`
  21. Effect string `json:"effect"`
  22. ID int `json:"id"`
  23. }
  24. if err := json.Unmarshal(out.Bytes(), &parsed); err != nil {
  25. t.Fatalf("effect --list output is not a JSON object: %v (output %q)", err, out.String()[:min(80, out.Len())])
  26. }
  27. zones, ok := parsed["zones"]
  28. if !ok {
  29. t.Fatalf("output = %q, want a top-level \"zones\" key", out.String()[:min(80, out.Len())])
  30. }
  31. if len(zones) == 0 {
  32. t.Fatal("zones is empty, want the full catalog")
  33. }
  34. // The catalog itself must not have changed shape.
  35. if zones[0].Zone == "" || zones[0].Effect == "" {
  36. t.Errorf("zones[0] = %+v, want zone, effect and id populated", zones[0])
  37. }
  38. }
  39. func min(a, b int) int {
  40. if a < b {
  41. return a
  42. }
  43. return b
  44. }