1// +build e2e 2 3// Copyright 2020-2021 InfluxData, Inc. All rights reserved. 4// Use of this source code is governed by MIT 5// license that can be found in the LICENSE file. 6 7package api_test 8 9import ( 10 "context" 11 "strconv" 12 "strings" 13 "testing" 14 "time" 15 16 influxdb2 "github.com/influxdata/influxdb-client-go/v2" 17 "github.com/influxdata/influxdb-client-go/v2/api/write" 18 "github.com/influxdata/influxdb-client-go/v2/domain" 19 "github.com/stretchr/testify/assert" 20 "github.com/stretchr/testify/require" 21) 22 23func TestDeleteAPI(t *testing.T) { 24 ctx := context.Background() 25 client := influxdb2.NewClient(serverURL, authToken) 26 writeAPI := client.WriteAPIBlocking("my-org", "my-bucket") 27 queryAPI := client.QueryAPI("my-org") 28 tmStart := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC) 29 writeF := func(start time.Time, count int64) time.Time { 30 tm := start 31 for i, f := int64(0), 0.0; i < count; i++ { 32 p := write.NewPoint("test", 33 map[string]string{"a": strconv.FormatInt(i%2, 10), "b": "static"}, 34 map[string]interface{}{"f": f, "i": i}, 35 tm) 36 err := writeAPI.WritePoint(ctx, p) 37 require.NoError(t, err) 38 f += 1.2 39 tm = tm.Add(time.Minute) 40 } 41 return tm 42 } 43 countF := func(start, stop time.Time) int64 { 44 result, err := queryAPI.Query(ctx, `from(bucket:"my-bucket")|> range(start: `+start.Format(time.RFC3339)+`, stop:`+stop.Format(time.RFC3339)+`) 45 |> filter(fn: (r) => r._measurement == "test" and r._field == "f") 46 |> drop(columns: ["a", "b"]) 47 |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") 48 |> count(column: "f")`) 49 50 require.Nil(t, err, err) 51 count := int64(0) 52 if result.Next() { 53 require.NotNil(t, result.Record().ValueByKey("f")) 54 count = result.Record().ValueByKey("f").(int64) 55 } 56 return count 57 } 58 tmEnd := writeF(tmStart, 100) 59 assert.Equal(t, int64(100), countF(tmStart, tmEnd)) 60 deleteAPI := client.DeleteAPI() 61 62 org, err := client.OrganizationsAPI().FindOrganizationByName(ctx, "my-org") 63 require.Nil(t, err, err) 64 require.NotNil(t, org) 65 66 bucket, err := client.BucketsAPI().FindBucketByName(ctx, "my-bucket") 67 require.Nil(t, err, err) 68 require.NotNil(t, bucket) 69 70 err = deleteAPI.DeleteWithName(ctx, "my-org", "my-bucket", tmStart, tmEnd, "") 71 require.Nil(t, err, err) 72 assert.Equal(t, int64(0), countF(tmStart, tmEnd)) 73 74 tmEnd = writeF(tmStart, 100) 75 assert.Equal(t, int64(100), countF(tmStart, tmEnd)) 76 77 err = deleteAPI.DeleteWithID(ctx, *org.Id, *bucket.Id, tmStart, tmEnd, "a=1") 78 require.Nil(t, err, err) 79 assert.Equal(t, int64(50), countF(tmStart, tmEnd)) 80 81 err = deleteAPI.Delete(ctx, org, bucket, tmStart.Add(50*time.Minute), tmEnd, "b=static") 82 require.Nil(t, err, err) 83 assert.Equal(t, int64(25), countF(tmStart, tmEnd)) 84 85 err = deleteAPI.DeleteWithName(ctx, "org", "my-bucket", tmStart.Add(50*time.Minute), tmEnd, "b=static") 86 require.NotNil(t, err, err) 87 assert.True(t, strings.Contains(err.Error(), "not found")) 88 89 err = deleteAPI.DeleteWithName(ctx, "my-org", "bucket", tmStart.Add(50*time.Minute), tmEnd, "b=static") 90 require.NotNil(t, err, err) 91 assert.True(t, strings.Contains(err.Error(), "not found")) 92} 93 94func TestDeleteAPI_failing(t *testing.T) { 95 ctx := context.Background() 96 client := influxdb2.NewClient(serverURL, authToken) 97 deleteAPI := client.DeleteAPI() 98 99 invalidID := "xcv" 100 notExistentID := "1000000000000000" 101 102 tmStart := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC) 103 tmEnd := tmStart.Add(time.Second) 104 err := deleteAPI.DeleteWithID(ctx, notExistentID, invalidID, tmStart, tmEnd, "a=1") 105 assert.NotNil(t, err) 106 107 err = deleteAPI.DeleteWithID(ctx, notExistentID, notExistentID, tmStart, tmEnd, "a=1") 108 assert.NotNil(t, err) 109 110 org, err := client.OrganizationsAPI().FindOrganizationByName(ctx, "my-org") 111 assert.Nil(t, err, err) 112 assert.NotNil(t, org) 113 114 bucket, err := client.BucketsAPI().FindBucketByName(ctx, "my-bucket") 115 assert.Nil(t, err, err) 116 assert.NotNil(t, bucket) 117 118 org, err = client.OrganizationsAPI().CreateOrganizationWithName(ctx, "org1") 119 require.Nil(t, err) 120 require.NotNil(t, org) 121 122 permission := &domain.Permission{ 123 Action: domain.PermissionActionWrite, 124 Resource: domain.Resource{ 125 Type: domain.ResourceTypeOrgs, 126 }, 127 } 128 permissions := []domain.Permission{*permission} 129 130 //create authorization for new org 131 auth, err := client.AuthorizationsAPI().CreateAuthorizationWithOrgID(context.Background(), *org.Id, permissions) 132 require.Nil(t, err) 133 require.NotNil(t, auth) 134 135 // create client with new auth token without permission for buckets 136 clientOrg2 := influxdb2.NewClient(serverURL, *auth.Token) 137 // test 403 138 err = clientOrg2.DeleteAPI().Delete(ctx, org, bucket, tmStart, tmStart.Add(50*time.Minute), "b=static") 139 assert.NotNil(t, err) 140 141 err = client.AuthorizationsAPI().DeleteAuthorization(ctx, auth) 142 assert.Nil(t, err) 143 144 err = client.OrganizationsAPI().DeleteOrganization(ctx, org) 145 assert.Nil(t, err) 146} 147 148func TestDeleteAPI_requestFailing(t *testing.T) { 149 ctx := context.Background() 150 client := influxdb2.NewClient("serverURL", authToken) 151 deleteAPI := client.DeleteAPI() 152 153 anID := "1000000000000000" 154 155 err := deleteAPI.DeleteWithName(ctx, anID, anID, time.Now(), time.Now(), "") 156 assert.NotNil(t, err) 157} 158