Skip to content

Commit

Permalink
feat: added display settings
Browse files Browse the repository at this point in the history
  • Loading branch information
jbristowe committed Jun 9, 2022
1 parent 8ea7f64 commit 25e432a
Show file tree
Hide file tree
Showing 3 changed files with 163 additions and 3 deletions.
69 changes: 69 additions & 0 deletions octopusdeploy/display_settings.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package octopusdeploy

import (
"encoding/json"
"strings"
)

type DisplaySettings struct {
ControlType string `json:"Octopus.ControlType"`
SelectOptions map[string]string `json:"Octopus.SelectOptions,omitempty"`
}

func NewDisplaySettings(controlType string, selectOptions map[string]string) *DisplaySettings {
return &DisplaySettings{
ControlType: controlType,
SelectOptions: selectOptions,
}
}

// MarshalJSON returns display settings as its JSON encoding.
func (d *DisplaySettings) MarshalJSON() ([]byte, error) {
displaySettings := struct {
ControlType string `json:"Octopus.ControlType"`
SelectOptions string `json:"Octopus.SelectOptions,omitempty"`
}{
ControlType: d.ControlType,
}

for k, v := range d.SelectOptions {
displaySettings.SelectOptions += k + "|" + v + "\n"
}

displaySettings.SelectOptions = strings.TrimSuffix(displaySettings.SelectOptions, "\n")

return json.Marshal(displaySettings)
}

// UnmarshalJSON sets display settings from its representation in JSON.
func (d *DisplaySettings) UnmarshalJSON(b []byte) error {
var fields struct {
ControlType string `json:"Octopus.ControlType"`
}
if err := json.Unmarshal(b, &fields); err != nil {
return err
}

d.ControlType = fields.ControlType

var displaySettings map[string]*json.RawMessage
if err := json.Unmarshal(b, &displaySettings); err != nil {
return err
}

if displaySettings["Octopus.SelectOptions"] != nil {
d.SelectOptions = map[string]string{}

var selectOptionsDelimitedString *string
if err := json.Unmarshal(*displaySettings["Octopus.SelectOptions"], &selectOptionsDelimitedString); err != nil {
return err
}

for _, kv := range strings.Split(*selectOptionsDelimitedString, "\n") {
pairs := strings.Split(kv, "|")
d.SelectOptions[pairs[0]] = pairs[1]
}
}

return nil
}
90 changes: 90 additions & 0 deletions octopusdeploy/display_settings_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package octopusdeploy

import (
"encoding/json"
"fmt"
"testing"

"github.com/kinbiko/jsonassert"
"github.com/stretchr/testify/require"
)

func TestDisplaySettings(t *testing.T) {
controlType := "Select"
option1 := getRandomName()
value1 := getRandomName()
option2 := getRandomName()
value2 := getRandomName()

selectOptions := map[string]string{}
selectOptions[value1] = option1
selectOptions[value2] = option2

displaySettings := NewDisplaySettings(controlType, selectOptions)
require.NotNil(t, displaySettings)
require.Equal(t, controlType, displaySettings.ControlType)
require.Equal(t, selectOptions, displaySettings.SelectOptions)
}

func TestDisplaySettingsAsJson(t *testing.T) {
controlType := "Select"

displaySettings := NewDisplaySettings(controlType, nil)
require.NotNil(t, displaySettings)

expectedJson := `{
"Octopus.ControlType": "Select"
}`

displaySettingsAsJson, err := json.Marshal(displaySettings)
require.NoError(t, err)
require.NotNil(t, displaySettingsAsJson)

jsonassert.New(t).Assertf(expectedJson, string(displaySettingsAsJson))

option1 := "Option-1"
value1 := "Value-1"
option2 := "Option-2"
value2 := "Value-2"
option3 := "Option-3"
value3 := "Value-3"

selectOptions := map[string]string{}
selectOptions[value1] = option1
selectOptions[value2] = option2
selectOptions[value3] = option3

displaySettings = NewDisplaySettings(controlType, selectOptions)

expectedJson = fmt.Sprintf(`{
"Octopus.ControlType": "%s",
"Octopus.SelectOptions": "Value-1|Option-1\nValue-2|Option-2\nValue-3|Option-3"
}`, controlType)

displaySettingsAsJson, err = json.Marshal(displaySettings)
require.NoError(t, err)
require.NotNil(t, displaySettingsAsJson)

jsonassert.New(t).Assertf(string(displaySettingsAsJson), expectedJson)
}

func TestDisplaySettingsFromJson(t *testing.T) {
controlType := "Select"

displaySettingsAsJson := fmt.Sprintf(`{
"Octopus.ControlType": "%s",
"Octopus.SelectOptions": "Value-1|Option-1\nValue-2|Option-2\nValue-3|Option-3"
}`, controlType)

var displaySettings DisplaySettings
err := json.Unmarshal([]byte(displaySettingsAsJson), &displaySettings)
require.NoError(t, err)
require.NotNil(t, displaySettings)
require.NotNil(t, displaySettings.ControlType)
require.Equal(t, controlType, displaySettings.ControlType)
require.NotNil(t, displaySettings.SelectOptions)
require.Len(t, displaySettings.SelectOptions, 3)
require.Equal(t, "Option-1", displaySettings.SelectOptions["Value-1"])
require.Equal(t, "Option-2", displaySettings.SelectOptions["Value-2"])
require.Equal(t, "Option-3", displaySettings.SelectOptions["Value-3"])
}
7 changes: 4 additions & 3 deletions octopusdeploy/variable_prompt_options.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package octopusdeploy

type VariablePromptOptions struct {
Label string `json:"Label"`
Description string `json:"Description"`
Required bool `json:"Required"`
Description string `json:"Description"`
DisplaySettings *DisplaySettings `json:"DisplaySettings,omitempty"`
IsRequired bool `json:"Required"`
Label string `json:"Label"`
}

0 comments on commit 25e432a

Please sign in to comment.