github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/integration/integration_influx_test.go (about)

     1  //go:build integration
     2  // +build integration
     3  
     4  // can be executed with
     5  // go test -v -tags integration -run TestInfluxIntegration ./integration/...
     6  
     7  package main
     8  
     9  import (
    10  	"context"
    11  	"fmt"
    12  	"testing"
    13  
    14  	"github.com/SAP/jenkins-library/pkg/influx"
    15  	influxdb2 "github.com/influxdata/influxdb-client-go/v2"
    16  	"github.com/stretchr/testify/assert"
    17  	"github.com/testcontainers/testcontainers-go"
    18  	"github.com/testcontainers/testcontainers-go/wait"
    19  )
    20  
    21  func TestInfluxIntegrationWriteMetrics(t *testing.T) {
    22  	t.Parallel()
    23  	ctx := context.Background()
    24  	const authToken = "influx-token"
    25  	const username = "username"
    26  	const password = "password"
    27  	const bucket = "piper"
    28  	const organization = "org"
    29  
    30  	req := testcontainers.GenericContainerRequest{
    31  		ContainerRequest: testcontainers.ContainerRequest{
    32  			AlwaysPullImage: true,
    33  			Image:           "influxdb:2.0",
    34  			ExposedPorts:    []string{"8086/tcp"},
    35  			Env: map[string]string{
    36  				"DOCKER_INFLUXDB_INIT_MODE":        "setup",
    37  				"DOCKER_INFLUXDB_INIT_USERNAME":    username,
    38  				"DOCKER_INFLUXDB_INIT_PASSWORD":    password,
    39  				"DOCKER_INFLUXDB_INIT_ORG":         organization,
    40  				"DOCKER_INFLUXDB_INIT_BUCKET":      bucket,
    41  				"DOCKER_INFLUXDB_INIT_ADMIN_TOKEN": authToken,
    42  			},
    43  			WaitingFor: wait.ForListeningPort("8086/tcp"),
    44  		},
    45  		Started: true,
    46  	}
    47  
    48  	influxContainer, err := testcontainers.GenericContainer(ctx, req)
    49  	assert.NoError(t, err)
    50  	defer influxContainer.Terminate(ctx)
    51  
    52  	ip, err := influxContainer.Host(ctx)
    53  	assert.NoError(t, err)
    54  	port, err := influxContainer.MappedPort(ctx, "8086")
    55  	host := fmt.Sprintf("http://%s:%s", ip, port.Port())
    56  	dataMap := map[string]map[string]interface{}{
    57  		"series_1": {"field_a": 11, "field_b": 12},
    58  		"series_2": {"field_c": 21, "field_d": 22},
    59  	}
    60  	dataMapTags := map[string]map[string]string{
    61  		"series_1": {"tag_a": "a", "tag_b": "b"},
    62  		"series_2": {"tag_c": "c", "tag_d": "d"},
    63  	}
    64  	influxClient := influxdb2.NewClient(host, authToken)
    65  	defer influxClient.Close()
    66  	client := influx.NewClient(influxClient, organization, bucket)
    67  	err = client.WriteMetrics(dataMap, dataMapTags)
    68  	assert.NoError(t, err)
    69  
    70  	queryAPI := influxClient.QueryAPI(organization)
    71  	result, err := queryAPI.Query(context.Background(),
    72  		`from(bucket:"piper")|> range(start: -1h) |> filter(fn: (r) => r._measurement == "series_1" or r._measurement == "series_2")`)
    73  	assert.NoError(t, err)
    74  	valuesMap := map[string]map[string]interface{}{}
    75  	expectedValuesMap := map[string]map[string]interface{}{
    76  		"series_1_field_a": {"_field": "field_a", "_measurement": "series_1", "_value": int64(11), "tag_a": "a", "tag_b": "b"},
    77  		"series_1_field_b": {"_field": "field_b", "_measurement": "series_1", "_value": int64(12), "tag_a": "a", "tag_b": "b"},
    78  		"series_2_field_c": {"_field": "field_c", "_measurement": "series_2", "_value": int64(21), "tag_c": "c", "tag_d": "d"},
    79  		"series_2_field_d": {"_field": "field_d", "_measurement": "series_2", "_value": int64(22), "tag_c": "c", "tag_d": "d"},
    80  	}
    81  	for result.Next() {
    82  		values := result.Record().Values()
    83  		measurement := values["_measurement"]
    84  		field := values["_field"]
    85  		delete(values, "_start")
    86  		delete(values, "_stop")
    87  		delete(values, "_time")
    88  		delete(values, "result")
    89  		delete(values, "table")
    90  		valuesMap[fmt.Sprintf("%v_%v", measurement, field)] = values
    91  	}
    92  	assert.NoError(t, result.Err())
    93  	assert.Equal(t, len(expectedValuesMap), len(valuesMap))
    94  	assert.Equal(t, expectedValuesMap, valuesMap)
    95  }