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  })