66package test
77
88import (
9+ "encoding/json"
910 "errors"
11+ "fmt"
1012 "strings"
1113 "testing"
1214
@@ -24,7 +26,7 @@ func TestParameterExpand(t *testing.T) {
2426 }
2527 for _ , x := range validExprs {
2628 p := NewParam (x [0 ])
27- res , err := p .Expand (& target.Target {FQDN : x [1 ], ID : x [2 ]})
29+ res , err := p .Expand (& target.Target {FQDN : x [1 ], ID : x [2 ]}, nil )
2830 require .NoError (t , err , x [0 ])
2931 require .Equal (t , x [3 ], res , x [0 ])
3032 }
@@ -46,10 +48,91 @@ func TestParameterExpandUserFunctions(t *testing.T) {
4648 }
4749 for _ , x := range validExprs {
4850 p := NewParam (x [0 ])
49- res , err := p .Expand (& target.Target {FQDN : x [1 ], ID : x [2 ]})
51+ res , err := p .Expand (& target.Target {FQDN : x [1 ], ID : x [2 ]}, nil )
5052 require .NoError (t , err , x [0 ])
5153 require .Equal (t , x [3 ], res , x [0 ])
5254 }
5355 require .NoError (t , UnregisterFunction ("CustomFunc" ))
5456 require .Error (t , UnregisterFunction ("NoSuchFunction" ))
5557}
58+
59+ func TestStepVariablesExpand (t * testing.T ) {
60+ p := NewParam ("{{ StringVar \" step1.string_var\" }}: {{ IntVar \" step1.int_var\" }}" )
61+ svm := newStepsVariablesMock ()
62+
63+ tgt := target.Target {ID : "1" }
64+ require .NoError (t , svm .add (tgt .ID , "step1" , "string_var" , "Hello" ))
65+ require .NoError (t , svm .add (tgt .ID , "step1" , "int_var" , 42 ))
66+
67+ res , err := p .Expand (& tgt , svm )
68+ require .NoError (t , err )
69+ require .Equal (t , "Hello: 42" , res )
70+ }
71+
72+ func TestInvalidStepVariablesExpand (t * testing.T ) {
73+ t .Run ("no_dot" , func (t * testing.T ) {
74+ p := NewParam ("{{ StringVar \" step1string_var\" }}" )
75+ _ , err := p .Expand (& target.Target {ID : "1" }, newStepsVariablesMock ())
76+ require .Error (t , err )
77+ })
78+
79+ t .Run ("just_variable_name" , func (t * testing.T ) {
80+ p := NewParam ("{{ StringVar \" string_var\" }}" )
81+
82+ svm := newStepsVariablesMock ()
83+ tgt := target.Target {ID : "1" }
84+ require .NoError (t , svm .add (tgt .ID , "step1" , "string_var" , "Hello" ))
85+
86+ _ , err := p .Expand (& tgt , svm )
87+ require .Error (t , err )
88+ })
89+
90+ t .Run ("invalid_variable_name" , func (t * testing.T ) {
91+ p := NewParam ("{{ StringVar \" step1.22string_var\" }}" )
92+
93+ svm := newStepsVariablesMock ()
94+ tgt := target.Target {ID : "1" }
95+ // we can add invalid values to our mock
96+ require .NoError (t , svm .add (tgt .ID , "step1" , "22string_var" , "Hello" ))
97+
98+ _ , err := p .Expand (& tgt , svm )
99+ require .Error (t , err )
100+ })
101+ }
102+
103+ type stepsVariablesMock struct {
104+ variables map [string ]map [string ]json.RawMessage
105+ }
106+
107+ func newStepsVariablesMock () * stepsVariablesMock {
108+ return & stepsVariablesMock {
109+ variables : make (map [string ]map [string ]json.RawMessage ),
110+ }
111+ }
112+
113+ func (svm * stepsVariablesMock ) add (tgtID string , label , name string , in interface {}) error {
114+ b , err := json .Marshal (in )
115+ if err != nil {
116+ return err
117+ }
118+
119+ targetVars := svm .variables [tgtID ]
120+ if targetVars == nil {
121+ targetVars = make (map [string ]json.RawMessage )
122+ svm .variables [tgtID ] = targetVars
123+ }
124+ targetVars [label + "." + name ] = b
125+ return nil
126+ }
127+
128+ func (svm * stepsVariablesMock ) Get (tgtID string , stepLabel , name string , out interface {}) error {
129+ targetVars := svm .variables [tgtID ]
130+ if targetVars == nil {
131+ return fmt .Errorf ("no target: %s" , tgtID )
132+ }
133+ b , found := targetVars [stepLabel + "." + name ]
134+ if ! found {
135+ return fmt .Errorf ("no variable %s %s" , stepLabel , name )
136+ }
137+ return json .Unmarshal (b , out )
138+ }
0 commit comments