github.com/kubeshop/testkube@v1.17.23/pkg/tcl/testworkflowstcl/testworkflowprocessor/signature.go (about)

     1  // Copyright 2024 Testkube.
     2  //
     3  // Licensed as a Testkube Pro file under the Testkube Community
     4  // License (the "License"); you may not use this file except in compliance with
     5  // the License. You may obtain a copy of the License at
     6  //
     7  //	https://github.com/kubeshop/testkube/blob/main/licenses/TCL.txt
     8  
     9  package testworkflowprocessor
    10  
    11  import (
    12  	"encoding/json"
    13  	"maps"
    14  
    15  	"github.com/kubeshop/testkube/internal/common"
    16  	"github.com/kubeshop/testkube/pkg/api/v1/testkube"
    17  )
    18  
    19  type Signature interface {
    20  	Ref() string
    21  	Name() string
    22  	Category() string
    23  	Optional() bool
    24  	Negative() bool
    25  	Children() []Signature
    26  	ToInternal() testkube.TestWorkflowSignature
    27  }
    28  
    29  type signature struct {
    30  	RefValue      string      `json:"ref"`
    31  	NameValue     string      `json:"name,omitempty"`
    32  	CategoryValue string      `json:"category,omitempty"`
    33  	OptionalValue bool        `json:"optional,omitempty"`
    34  	NegativeValue bool        `json:"negative,omitempty"`
    35  	ChildrenValue []Signature `json:"children,omitempty"`
    36  }
    37  
    38  func (s *signature) Ref() string {
    39  	return s.RefValue
    40  }
    41  
    42  func (s *signature) Name() string {
    43  	return s.NameValue
    44  }
    45  
    46  func (s *signature) Category() string {
    47  	return s.CategoryValue
    48  }
    49  
    50  func (s *signature) Optional() bool {
    51  	return s.OptionalValue
    52  }
    53  
    54  func (s *signature) Negative() bool {
    55  	return s.NegativeValue
    56  }
    57  
    58  func (s *signature) Children() []Signature {
    59  	return s.ChildrenValue
    60  }
    61  
    62  func (s *signature) ToInternal() testkube.TestWorkflowSignature {
    63  	return testkube.TestWorkflowSignature{
    64  		Ref:      s.RefValue,
    65  		Name:     s.NameValue,
    66  		Category: s.CategoryValue,
    67  		Optional: s.OptionalValue,
    68  		Negative: s.NegativeValue,
    69  		Children: MapSignatureListToInternal(s.ChildrenValue),
    70  	}
    71  }
    72  
    73  func MapSignatureListToInternal(v []Signature) []testkube.TestWorkflowSignature {
    74  	r := make([]testkube.TestWorkflowSignature, len(v))
    75  	for i := range v {
    76  		r[i] = v[i].ToInternal()
    77  	}
    78  	return r
    79  }
    80  
    81  func MapSignatureListToStepResults(v []Signature) map[string]testkube.TestWorkflowStepResult {
    82  	r := map[string]testkube.TestWorkflowStepResult{}
    83  	for _, s := range v {
    84  		r[s.Ref()] = testkube.TestWorkflowStepResult{
    85  			Status: common.Ptr(testkube.QUEUED_TestWorkflowStepStatus),
    86  		}
    87  		maps.Copy(r, MapSignatureListToStepResults(s.Children()))
    88  	}
    89  	return r
    90  }
    91  
    92  type rawSignature struct {
    93  	RefValue      string         `json:"ref"`
    94  	NameValue     string         `json:"name,omitempty"`
    95  	CategoryValue string         `json:"category,omitempty"`
    96  	OptionalValue bool           `json:"optional,omitempty"`
    97  	NegativeValue bool           `json:"negative,omitempty"`
    98  	ChildrenValue []rawSignature `json:"children,omitempty"`
    99  }
   100  
   101  func rawSignatureToSignature(sig rawSignature) Signature {
   102  	ch := make([]Signature, len(sig.ChildrenValue))
   103  	for i, v := range sig.ChildrenValue {
   104  		ch[i] = rawSignatureToSignature(v)
   105  	}
   106  	return &signature{
   107  		RefValue:      sig.RefValue,
   108  		NameValue:     sig.NameValue,
   109  		CategoryValue: sig.CategoryValue,
   110  		OptionalValue: sig.OptionalValue,
   111  		NegativeValue: sig.NegativeValue,
   112  		ChildrenValue: ch,
   113  	}
   114  }
   115  
   116  func GetSignatureFromJSON(v []byte) ([]Signature, error) {
   117  	var sig []rawSignature
   118  	err := json.Unmarshal(v, &sig)
   119  	if err != nil {
   120  		return nil, err
   121  	}
   122  	res := make([]Signature, len(sig))
   123  	for i := range sig {
   124  		res[i] = rawSignatureToSignature(sig[i])
   125  	}
   126  	return res, err
   127  }
   128  
   129  func GetVirtualSignature(children []Signature) Signature {
   130  	return &signature{ChildrenValue: children}
   131  }