github.com/kotalco/kotal@v0.3.0/apis/bitcoin/v1alpha1/node_validation_webhook_test.go (about) 1 package v1alpha1 2 3 import ( 4 "fmt" 5 6 "github.com/kotalco/kotal/apis/shared" 7 . "github.com/onsi/ginkgo/v2" 8 . "github.com/onsi/gomega" 9 "k8s.io/apimachinery/pkg/api/errors" 10 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 11 "k8s.io/apimachinery/pkg/util/validation/field" 12 ) 13 14 var _ = Describe("Bitcoin node validation", func() { 15 createCases := []struct { 16 Title string 17 Node *Node 18 Errors field.ErrorList 19 }{ 20 21 { 22 Title: "updated transactionIndex", 23 Node: &Node{ 24 ObjectMeta: metav1.ObjectMeta{ 25 Name: "my-node", 26 }, 27 Spec: NodeSpec{ 28 Network: "mainnet", 29 Pruning: true, 30 TransactionIndex: true, 31 }, 32 }, 33 Errors: field.ErrorList{ 34 { 35 Type: field.ErrorTypeInvalid, 36 Field: "spec.pruning", 37 BadValue: true, 38 Detail: "must be false if transaction index is enabled", 39 }, 40 }, 41 }, 42 } 43 44 updateCases := []struct { 45 Title string 46 OldNode *Node 47 NewNode *Node 48 Errors field.ErrorList 49 }{ 50 { 51 Title: "updated network", 52 OldNode: &Node{ 53 ObjectMeta: metav1.ObjectMeta{ 54 Name: "my-node", 55 }, 56 Spec: NodeSpec{ 57 Network: "mainnet", 58 }, 59 }, 60 NewNode: &Node{ 61 ObjectMeta: metav1.ObjectMeta{ 62 Name: "my-node", 63 }, 64 Spec: NodeSpec{ 65 Network: "testnet", 66 }, 67 }, 68 Errors: field.ErrorList{ 69 { 70 Type: field.ErrorTypeInvalid, 71 Field: "spec.network", 72 BadValue: "testnet", 73 Detail: "field is immutable", 74 }, 75 }, 76 }, 77 { 78 Title: "updated transactionIndex", 79 OldNode: &Node{ 80 ObjectMeta: metav1.ObjectMeta{ 81 Name: "my-node", 82 }, 83 Spec: NodeSpec{ 84 Network: "mainnet", 85 Pruning: true, 86 }, 87 }, 88 NewNode: &Node{ 89 ObjectMeta: metav1.ObjectMeta{ 90 Name: "my-node", 91 }, 92 Spec: NodeSpec{ 93 Network: "mainnet", 94 Pruning: true, 95 TransactionIndex: true, 96 }, 97 }, 98 Errors: field.ErrorList{ 99 { 100 Type: field.ErrorTypeInvalid, 101 Field: "spec.pruning", 102 BadValue: true, 103 Detail: "must be false if transaction index is enabled", 104 }, 105 }, 106 }, 107 } 108 109 Context("While creating node", func() { 110 for _, c := range createCases { 111 func() { 112 cc := c 113 It(fmt.Sprintf("Should validate %s", cc.Title), func() { 114 cc.Node.Default() 115 _, err := cc.Node.ValidateCreate() 116 117 errStatus := err.(*errors.StatusError) 118 119 causes := shared.ErrorsToCauses(cc.Errors) 120 121 Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes)) 122 }) 123 }() 124 } 125 }) 126 127 Context("While updating node", func() { 128 for _, c := range updateCases { 129 func() { 130 cc := c 131 It(fmt.Sprintf("Should validate %s", cc.Title), func() { 132 cc.OldNode.Default() 133 cc.NewNode.Default() 134 _, err := cc.NewNode.ValidateUpdate(cc.OldNode) 135 136 errStatus := err.(*errors.StatusError) 137 138 causes := shared.ErrorsToCauses(cc.Errors) 139 140 Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes)) 141 }) 142 }() 143 } 144 }) 145 146 })