diff --git a/sqlanalytics/api/dashboard_test.go b/sqlanalytics/api/dashboard_test.go new file mode 100644 index 0000000000..01f5409cde --- /dev/null +++ b/sqlanalytics/api/dashboard_test.go @@ -0,0 +1,28 @@ +package api + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestDashboardMarshalUnmarshal(t *testing.T) { + d := Dashboard{ + ID: "id", + Name: "name", + Tags: []string{"tag1", "tag2"}, + } + + out, err := json.Marshal(d) + if err != nil { + t.Fatal(err) + } + + var dp Dashboard + if err := json.Unmarshal(out, &dp); err != nil { + t.Fatal(err) + } + + assert.Equal(t, d, dp) +} diff --git a/sqlanalytics/api/query.go b/sqlanalytics/api/query.go index 8bada0ac98..98a5741920 100644 --- a/sqlanalytics/api/query.go +++ b/sqlanalytics/api/query.go @@ -137,6 +137,16 @@ func (p QueryParameterText) MarshalJSON() ([]byte, error) { return json.Marshal((localQueryParameter)(p)) } +// UnmarshalJSON clears the type after marshaling. +func (p *QueryParameterText) UnmarshalJSON(b []byte) error { + type localQueryParameter QueryParameterText + if err := json.Unmarshal(b, (*localQueryParameter)(p)); err != nil { + return err + } + p.Type = "" + return nil +} + // QueryParameterNumber ... type QueryParameterNumber struct { QueryParameter @@ -151,6 +161,16 @@ func (p QueryParameterNumber) MarshalJSON() ([]byte, error) { return json.Marshal((localQueryParameter)(p)) } +// UnmarshalJSON clears the type after marshaling. +func (p *QueryParameterNumber) UnmarshalJSON(b []byte) error { + type localQueryParameter QueryParameterNumber + if err := json.Unmarshal(b, (*localQueryParameter)(p)); err != nil { + return err + } + p.Type = "" + return nil +} + // QueryParameterMultipleValuesOptions ... type QueryParameterMultipleValuesOptions struct { Prefix string `json:"prefix"` @@ -219,6 +239,8 @@ func (p *QueryParameterEnum) UnmarshalJSON(b []byte) error { p.Values = vs } + p.Type = "" + p.Value = nil return nil } @@ -283,6 +305,8 @@ func (p *QueryParameterQuery) UnmarshalJSON(b []byte) error { p.Values = vs } + p.Type = "" + p.Value = nil return nil } @@ -300,6 +324,16 @@ func (p QueryParameterDate) MarshalJSON() ([]byte, error) { return json.Marshal((localQueryParameter)(p)) } +// UnmarshalJSON clears the type after marshaling. +func (p *QueryParameterDate) UnmarshalJSON(b []byte) error { + type localQueryParameter QueryParameterDate + if err := json.Unmarshal(b, (*localQueryParameter)(p)); err != nil { + return err + } + p.Type = "" + return nil +} + // QueryParameterDateTime ... type QueryParameterDateTime struct { QueryParameter @@ -314,6 +348,16 @@ func (p QueryParameterDateTime) MarshalJSON() ([]byte, error) { return json.Marshal((localQueryParameter)(p)) } +// UnmarshalJSON clears the type after marshaling. +func (p *QueryParameterDateTime) UnmarshalJSON(b []byte) error { + type localQueryParameter QueryParameterDateTime + if err := json.Unmarshal(b, (*localQueryParameter)(p)); err != nil { + return err + } + p.Type = "" + return nil +} + // QueryParameterDateTimeSec ... type QueryParameterDateTimeSec struct { QueryParameter @@ -328,6 +372,16 @@ func (p QueryParameterDateTimeSec) MarshalJSON() ([]byte, error) { return json.Marshal((localQueryParameter)(p)) } +// UnmarshalJSON clears the type after marshaling. +func (p *QueryParameterDateTimeSec) UnmarshalJSON(b []byte) error { + type localQueryParameter QueryParameterDateTimeSec + if err := json.Unmarshal(b, (*localQueryParameter)(p)); err != nil { + return err + } + p.Type = "" + return nil +} + // QueryParameterDateRange ... type QueryParameterDateRange struct { QueryParameter @@ -342,6 +396,16 @@ func (p QueryParameterDateRange) MarshalJSON() ([]byte, error) { return json.Marshal((localQueryParameter)(p)) } +// UnmarshalJSON clears the type after marshaling. +func (p *QueryParameterDateRange) UnmarshalJSON(b []byte) error { + type localQueryParameter QueryParameterDateRange + if err := json.Unmarshal(b, (*localQueryParameter)(p)); err != nil { + return err + } + p.Type = "" + return nil +} + // QueryParameterDateTimeRange ... type QueryParameterDateTimeRange struct { QueryParameter @@ -356,6 +420,16 @@ func (p QueryParameterDateTimeRange) MarshalJSON() ([]byte, error) { return json.Marshal((localQueryParameter)(p)) } +// UnmarshalJSON clears the type after marshaling. +func (p *QueryParameterDateTimeRange) UnmarshalJSON(b []byte) error { + type localQueryParameter QueryParameterDateTimeRange + if err := json.Unmarshal(b, (*localQueryParameter)(p)); err != nil { + return err + } + p.Type = "" + return nil +} + // QueryParameterDateTimeSecRange ... type QueryParameterDateTimeSecRange struct { QueryParameter @@ -369,3 +443,13 @@ func (p QueryParameterDateTimeSecRange) MarshalJSON() ([]byte, error) { type localQueryParameter QueryParameterDateTimeSecRange return json.Marshal((localQueryParameter)(p)) } + +// UnmarshalJSON clears the type after marshaling. +func (p *QueryParameterDateTimeSecRange) UnmarshalJSON(b []byte) error { + type localQueryParameter QueryParameterDateTimeSecRange + if err := json.Unmarshal(b, (*localQueryParameter)(p)); err != nil { + return err + } + p.Type = "" + return nil +} diff --git a/sqlanalytics/api/query_test.go b/sqlanalytics/api/query_test.go new file mode 100644 index 0000000000..ee77a71759 --- /dev/null +++ b/sqlanalytics/api/query_test.go @@ -0,0 +1,136 @@ +package api + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestQueryMarshalUnmarshal(t *testing.T) { + q := Query{ + ID: "id", + DataSourceID: "data_source_id", + Name: "name", + Description: "description", + Query: "SELECT 1", + Schedule: &QuerySchedule{ + Interval: 1000, + }, + Options: &QueryOptions{ + Parameters: []interface{}{ + &QueryParameterText{ + QueryParameter: QueryParameter{ + Name: "n1", + Title: "t1", + }, + Value: "v1", + }, + &QueryParameterNumber{ + QueryParameter: QueryParameter{ + Name: "n2", + Title: "t2", + }, + Value: 1234.5, + }, + &QueryParameterEnum{ + QueryParameter: QueryParameter{ + Name: "n3", + Title: "t3", + }, + Values: []string{"single"}, + Options: "foo\nbar", + }, + &QueryParameterEnum{ + QueryParameter: QueryParameter{ + Name: "n4", + Title: "t4", + }, + Values: []string{"multiple1", "multiple2"}, + Options: "foo\nbar", + Multi: &QueryParameterMultipleValuesOptions{ + Prefix: "@@@", + Suffix: "###", + Separator: "$$$", + }, + }, + &QueryParameterQuery{ + QueryParameter: QueryParameter{ + Name: "n5", + Title: "t5", + }, + Values: []string{"single"}, + QueryID: "queryID", + }, + &QueryParameterQuery{ + QueryParameter: QueryParameter{ + Name: "n6", + Title: "t6", + }, + Values: []string{"multiple1", "multiple2"}, + QueryID: "queryID", + Multi: &QueryParameterMultipleValuesOptions{ + Prefix: "@@@", + Suffix: "###", + Separator: "$$$", + }, + }, + &QueryParameterDate{ + QueryParameter: QueryParameter{ + Name: "n7", + Title: "t7", + }, + Value: "xyz", + }, + &QueryParameterDateTime{ + QueryParameter: QueryParameter{ + Name: "n8", + Title: "t8", + }, + Value: "xyz", + }, + &QueryParameterDateTimeSec{ + QueryParameter: QueryParameter{ + Name: "n9", + Title: "t9", + }, + Value: "xyz", + }, + &QueryParameterDateRange{ + QueryParameter: QueryParameter{ + Name: "n10", + Title: "t10", + }, + Value: "xyz", + }, + &QueryParameterDateTimeRange{ + QueryParameter: QueryParameter{ + Name: "n11", + Title: "t11", + }, + Value: "xyz", + }, + &QueryParameterDateTimeSecRange{ + QueryParameter: QueryParameter{ + Name: "n12", + Title: "t12", + }, + Value: "xyz", + }, + }, + }, + Tags: []string{"tag1", "tag2"}, + } + + out, err := json.Marshal(q) + if err != nil { + t.Fatal(err) + } + + var qp Query + if err := json.Unmarshal(out, &qp); err != nil { + t.Fatal(err) + } + + assert.Equal(t, q, qp) +} diff --git a/sqlanalytics/api/visualization_test.go b/sqlanalytics/api/visualization_test.go new file mode 100644 index 0000000000..8862ed2a92 --- /dev/null +++ b/sqlanalytics/api/visualization_test.go @@ -0,0 +1,31 @@ +package api + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestVisualizationMarshalUnmarshal(t *testing.T) { + v := Visualization{ + ID: 12345, + QueryID: "queryID", + Type: "type", + Name: "name", + Description: "description", + Options: json.RawMessage("{}"), + } + + out, err := json.Marshal(v) + if err != nil { + t.Fatal(err) + } + + var vp Visualization + if err := json.Unmarshal(out, &vp); err != nil { + t.Fatal(err) + } + + assert.Equal(t, v, vp) +} diff --git a/sqlanalytics/api/widget_test.go b/sqlanalytics/api/widget_test.go new file mode 100644 index 0000000000..b513f0da50 --- /dev/null +++ b/sqlanalytics/api/widget_test.go @@ -0,0 +1,51 @@ +package api + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestWidgetMarshalUnmarshal(t *testing.T) { + i678 := 678 + sAbc := "text" + + w := Widget{ + ID: 12345, + DashboardID: "dashboardID", + + VisualizationID: &i678, + Text: &sAbc, + + Options: WidgetOptions{ + ParameterMapping: map[string]WidgetParameterMapping{ + "p1": { + Name: "p1", + Type: "text", + MapTo: "mapTo", + Title: "title", + }, + }, + Position: &WidgetPosition{ + AutoHeight: false, + SizeX: 1, + SizeY: 2, + PosX: 3, + PosY: 4, + }, + }, + } + + out, err := json.Marshal(w) + if err != nil { + t.Fatal(err) + } + + var wp Widget + if err := json.Unmarshal(out, &wp); err != nil { + t.Fatal(err) + } + + assert.Equal(t, w, wp) +}