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