github.com/newrelic/newrelic-client-go@v1.1.0/pkg/plugins/components_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package plugins 5 6 import ( 7 "fmt" 8 "net/http" 9 "testing" 10 "time" 11 12 "github.com/stretchr/testify/require" 13 ) 14 15 var ( 16 testTimestamp, _ = time.Parse(time.RFC3339, time.RFC3339) 17 18 testComponent = Component{ 19 ID: 212222915, 20 Name: "Redis", 21 SummaryMetrics: []SummaryMetric{ 22 { 23 ID: 190174, 24 Name: "Connected Clients", 25 Metric: "Component/Connection/Clients[connections]", 26 ValueFunction: "average_value", 27 Thresholds: MetricThreshold{ 28 Caution: 3, 29 Critical: 0, 30 }, 31 }, 32 }, 33 } 34 35 testComponentJSON = `{ 36 "id": 212222915, 37 "name": "Redis", 38 "summary_metrics": [ 39 { 40 "id": 190174, 41 "name": "Connected Clients", 42 "metric": "Component/Connection/Clients[connections]", 43 "value_function": "average_value", 44 "thresholds": { 45 "caution": 3, 46 "critical": 0 47 } 48 } 49 ] 50 }` 51 52 testComponentMetric = ComponentMetric{ 53 Name: "Component/Memory/RSS[bytes]", 54 Values: []string{ 55 "average_value", 56 "total_value", 57 "max_value", 58 "min_value", 59 "standard_deviation", 60 "rate", 61 "count", 62 }, 63 } 64 65 testComponentMetricJSON = `{ 66 "name": "Component/Memory/RSS[bytes]", 67 "values": [ 68 "average_value", 69 "total_value", 70 "max_value", 71 "min_value", 72 "standard_deviation", 73 "rate", 74 "count" 75 ] 76 }` 77 78 testMetricData = Metric{ 79 Name: "Component/Memory/RSS[bytes]", 80 Timeslices: []MetricTimeslice{ 81 { 82 From: &testTimestamp, 83 To: &testTimestamp, 84 Values: map[string]float64{ 85 "average_value": 10, 86 "total_value": 10, 87 "max_value": 10, 88 "min_value": 10, 89 "standard_deviation": 10, 90 "rate": 10, 91 "count": 10, 92 }, 93 }, 94 }, 95 } 96 97 testMetricDataJSON = fmt.Sprintf(`{ 98 "name": "Component/Memory/RSS[bytes]", 99 "timeslices": [ 100 { 101 "from": "%[1]s", 102 "to": "%[1]s", 103 "values": { 104 "average_value": 10, 105 "total_value": 10, 106 "max_value": 10, 107 "min_value": 10, 108 "standard_deviation": 10, 109 "rate": 10, 110 "count": 10 111 } 112 } 113 ] 114 }`, testTimestamp.Format(time.RFC3339)) 115 ) 116 117 func TestListComponents(t *testing.T) { 118 t.Parallel() 119 responseJSON := fmt.Sprintf(`{"components": [%s]}`, testComponentJSON) 120 plugins := newMockResponse(t, responseJSON, http.StatusOK) 121 122 c, err := plugins.ListComponents(nil) 123 124 require.NoError(t, err) 125 require.NotNil(t, c) 126 require.Equal(t, &testComponent, c[0]) 127 } 128 129 func TestListComponentsWithParams(t *testing.T) { 130 t.Parallel() 131 expectedName := "componentName" 132 expectedIDs := "123,456" 133 expectedPluginID := "1234" 134 expectedHealthStatus := "true" 135 136 plugins := newTestClient(t, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 137 values := r.URL.Query() 138 139 name := values.Get("filter[name]") 140 if name != expectedName { 141 t.Errorf(`expected name filter "%s", received: "%s"`, expectedName, name) 142 } 143 144 ids := values.Get("filter[ids]") 145 if ids != expectedIDs { 146 t.Errorf(`expected ID filter "%s", received: "%s"`, expectedIDs, ids) 147 } 148 149 pluginID := values.Get("filter[plugin_id]") 150 if pluginID != expectedPluginID { 151 t.Errorf(`expected plugin ID filter "%s", received: "%s"`, expectedPluginID, pluginID) 152 } 153 154 healthStatus := values.Get("health_status") 155 if healthStatus != expectedHealthStatus { 156 t.Errorf(`expected health status filter "%s", received: "%s"`, expectedHealthStatus, healthStatus) 157 } 158 159 w.Header().Set("Content-Type", "application/json") 160 _, err := w.Write([]byte(`{"applications":[]}`)) 161 162 require.NoError(t, err) 163 })) 164 165 params := ListComponentsParams{ 166 IDs: []int{123, 456}, 167 PluginID: 1234, 168 Name: expectedName, 169 HealthStatus: true, 170 } 171 172 c, err := plugins.ListComponents(¶ms) 173 174 require.NoError(t, err) 175 require.NotNil(t, c) 176 } 177 178 func TestGetComponent(t *testing.T) { 179 t.Parallel() 180 responseJSON := fmt.Sprintf(`{"component": %s}`, testComponentJSON) 181 plugins := newMockResponse(t, responseJSON, http.StatusOK) 182 183 c, err := plugins.GetComponent(testComponent.ID) 184 185 require.NoError(t, err) 186 require.NotNil(t, c) 187 require.Equal(t, testComponent, *c) 188 } 189 190 func TestListComponentMetrics(t *testing.T) { 191 t.Parallel() 192 responseJSON := fmt.Sprintf(`{"metrics": [%s]}`, testComponentMetricJSON) 193 plugins := newMockResponse(t, responseJSON, http.StatusOK) 194 195 m, err := plugins.ListComponentMetrics(testComponent.ID, nil) 196 197 require.NoError(t, err) 198 require.NotNil(t, m) 199 require.Equal(t, &testComponentMetric, m[0]) 200 } 201 202 func TestGetComponentMetricData(t *testing.T) { 203 t.Parallel() 204 responseJSON := fmt.Sprintf(`{ 205 "metric_data": { 206 "metrics": [%s] 207 } 208 }`, testMetricDataJSON) 209 plugins := newMockResponse(t, responseJSON, http.StatusOK) 210 211 m, err := plugins.GetComponentMetricData(testComponent.ID, nil) 212 213 require.NoError(t, err) 214 require.NotNil(t, m) 215 require.Equal(t, &testMetricData, m[0]) 216 } 217 218 func TestGetComponentMetricDataWithParams(t *testing.T) { 219 t.Parallel() 220 expectedNames := "componentName" 221 expectedValues := "123" 222 expectedTo := testTimestamp.Format(time.RFC3339) 223 expectedFrom := testTimestamp.Format(time.RFC3339) 224 expectedPeriod := "30" 225 expectedSummarize := "true" 226 expectedRaw := "true" 227 228 plugins := newTestClient(t, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 229 values := r.URL.Query() 230 231 names := values.Get("names[]") 232 if names != expectedNames { 233 t.Errorf(`expected names filter "%s", received: "%s"`, expectedNames, names) 234 } 235 236 v := values.Get("values[]") 237 if v != expectedValues { 238 t.Errorf(`expected values filter "%s", received: "%s"`, expectedValues, v) 239 } 240 241 from := values.Get("from") 242 if from != expectedFrom { 243 t.Errorf(`expected from param "%s", received: "%s"`, expectedFrom, from) 244 } 245 246 to := values.Get("to") 247 if to != expectedTo { 248 t.Errorf(`expected to param "%s", received: "%s"`, expectedTo, to) 249 } 250 251 period := values.Get("period") 252 if period != expectedPeriod { 253 t.Errorf(`expected period param "%s", received: "%s"`, expectedPeriod, period) 254 } 255 256 raw := values.Get("raw") 257 if raw != expectedRaw { 258 t.Errorf(`expected raw param "%s", received: "%s"`, expectedRaw, raw) 259 } 260 261 summarize := values.Get("summarize") 262 if summarize != expectedSummarize { 263 t.Errorf(`expected summarize param "%s", received: "%s"`, expectedSummarize, summarize) 264 } 265 266 w.Header().Set("Content-Type", "application/json") 267 _, err := w.Write([]byte(`{"applications":[]}`)) 268 269 require.NoError(t, err) 270 })) 271 272 params := GetComponentMetricDataParams{ 273 Names: []string{"componentName"}, 274 Values: []string{"123"}, 275 From: &testTimestamp, 276 To: &testTimestamp, 277 Period: 30, 278 Summarize: true, 279 Raw: true, 280 } 281 _, err := plugins.GetComponentMetricData(testComponent.ID, ¶ms) 282 283 require.NoError(t, err) 284 }