fixes in template (un)marshaling and tests
This commit is contained in:
parent
99d9784f73
commit
d5a94653da
@ -11,7 +11,7 @@ const TemplateTypeText = "text"
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
// TemplateItemTypeText is a type for text chunk in template
|
// TemplateItemTypeText is a type for text chunk in template
|
||||||
TemplateItemTypeText = iota
|
TemplateItemTypeText uint8 = iota
|
||||||
// TemplateItemTypeVar is a type for variable in template
|
// TemplateItemTypeVar is a type for variable in template
|
||||||
TemplateItemTypeVar
|
TemplateItemTypeVar
|
||||||
)
|
)
|
||||||
@ -52,12 +52,17 @@ type TemplateItem struct {
|
|||||||
VarType string
|
VarType string
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON will correctly marshal TemplateItem
|
// MarshalJSON controls how TemplateItem will be marshaled into JSON
|
||||||
func (t *TemplateItem) MarshalJSON() ([]byte, error) {
|
func (t TemplateItem) MarshalJSON() ([]byte, error) {
|
||||||
switch t.Type {
|
switch t.Type {
|
||||||
case TemplateItemTypeText:
|
case TemplateItemTypeText:
|
||||||
return json.Marshal(t.Text)
|
return json.Marshal(t.Text)
|
||||||
case TemplateItemTypeVar:
|
case TemplateItemTypeVar:
|
||||||
|
// {} case, fast output without marshaling
|
||||||
|
if t.VarType == "" || t.VarType == TemplateVarCustom {
|
||||||
|
return []byte("{}"), nil
|
||||||
|
}
|
||||||
|
|
||||||
return json.Marshal(map[string]interface{}{
|
return json.Marshal(map[string]interface{}{
|
||||||
"var": t.VarType,
|
"var": t.VarType,
|
||||||
})
|
})
|
||||||
@ -87,11 +92,12 @@ func (t *TemplateItem) UnmarshalJSON(b []byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if varTypeCurr, ok := v["var"].(string); ok {
|
if varTypeCurr, ok := v["var"].(string); ok {
|
||||||
if _, ok := templateVarAssoc[t.VarType]; !ok {
|
if _, ok := templateVarAssoc[varTypeCurr]; !ok {
|
||||||
return fmt.Errorf("invalid placeholder var '%s'", varTypeCurr)
|
return fmt.Errorf("invalid placeholder var '%s'", varTypeCurr)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Type = TemplateItemTypeVar
|
t.Type = TemplateItemTypeVar
|
||||||
|
t.VarType = varTypeCurr
|
||||||
} else {
|
} else {
|
||||||
return errors.New("invalid TemplateItem")
|
return errors.New("invalid TemplateItem")
|
||||||
}
|
}
|
||||||
|
65
v1/template_test.go
Normal file
65
v1/template_test.go
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestTemplateItem_MarshalJSON(t *testing.T) {
|
||||||
|
text := TemplateItem{
|
||||||
|
Type: TemplateItemTypeText,
|
||||||
|
Text: "text item",
|
||||||
|
}
|
||||||
|
|
||||||
|
variable := TemplateItem{
|
||||||
|
Type: TemplateItemTypeVar,
|
||||||
|
VarType: TemplateVarFirstName,
|
||||||
|
}
|
||||||
|
|
||||||
|
emptyVariable := TemplateItem{
|
||||||
|
Type: TemplateItemTypeVar,
|
||||||
|
VarType: "",
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := json.Marshal(text)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "\""+text.Text+"\"", string(data))
|
||||||
|
|
||||||
|
data, err = json.Marshal(variable)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, `{"var":"first_name"}`, string(data))
|
||||||
|
|
||||||
|
data, err = json.Marshal(emptyVariable)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "{}", string(data))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTemplateItem_UnmarshalJSON(t *testing.T) {
|
||||||
|
var (
|
||||||
|
textResult TemplateItem
|
||||||
|
variableResult TemplateItem
|
||||||
|
emptyVariableResult TemplateItem
|
||||||
|
)
|
||||||
|
|
||||||
|
text := []byte("\"text block\"")
|
||||||
|
variable := []byte(`{"var":"first_name"}`)
|
||||||
|
emptyVariable := []byte("{}")
|
||||||
|
|
||||||
|
require.NoError(t, json.Unmarshal(text, &textResult))
|
||||||
|
require.NoError(t, json.Unmarshal(variable, &variableResult))
|
||||||
|
require.NoError(t, json.Unmarshal(emptyVariable, &emptyVariableResult))
|
||||||
|
|
||||||
|
assert.Equal(t, TemplateItemTypeText, textResult.Type)
|
||||||
|
assert.Equal(t, string(text)[1:11], textResult.Text)
|
||||||
|
|
||||||
|
assert.Equal(t, TemplateItemTypeVar, variableResult.Type)
|
||||||
|
assert.Equal(t, TemplateVarFirstName, variableResult.VarType)
|
||||||
|
assert.Empty(t, variableResult.Text)
|
||||||
|
|
||||||
|
assert.Equal(t, TemplateItemTypeVar, emptyVariableResult.Type)
|
||||||
|
assert.Equal(t, TemplateVarCustom, emptyVariableResult.VarType)
|
||||||
|
assert.Empty(t, emptyVariableResult.Text)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user