Skip to content

Commit be381aa

Browse files
committed
refactor: Serverless bucket creation
1 parent cc9d446 commit be381aa

File tree

2 files changed

+68
-13
lines changed

2 files changed

+68
-13
lines changed

influxdb3/management.go renamed to influxdb3/management_serverless.go

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ import (
99
)
1010

1111
type (
12+
// ServerlessClient represents a client for InfluxDB Serverless administration operations.
13+
ServerlessClient struct {
14+
client *Client
15+
}
16+
1217
Bucket struct {
1318
Name string `json:"name"`
1419
OrgID string `json:"orgID,omitempty"`
@@ -23,25 +28,43 @@ type (
2328
}
2429
)
2530

26-
func (c *Client) CreateBucket(ctx context.Context, bucket *Bucket) error {
27-
u, _ := c.apiURL.Parse("/api/v2/buckets")
31+
// NewServerlessClient creates new ServerlessClient with given InfluxDB client.
32+
func NewServerlessClient(client *Client) *ServerlessClient {
33+
return &ServerlessClient{client: client}
34+
}
35+
36+
// CreateBucket creates a new bucket
37+
func (c *ServerlessClient) CreateBucket(ctx context.Context, bucket *Bucket) error {
38+
if bucket == nil {
39+
return fmt.Errorf("bucket must not be nil")
40+
}
2841

2942
if bucket.OrgID == "" {
30-
bucket.OrgID = c.config.Organization
43+
bucket.OrgID = c.client.config.Organization
3144
}
3245

3346
if bucket.Name == "" {
34-
bucket.Name = c.config.Database
47+
bucket.Name = c.client.config.Database
3548
}
3649

37-
headers := http.Header{}
38-
headers.Set("Content-Type", "application/json")
50+
return c.createBucket(ctx, "/api/v2/buckets", bucket)
51+
}
52+
53+
// createBucket is a helper function for CreateBucket to enhance test coverage.
54+
func (c *ServerlessClient) createBucket(ctx context.Context, path string, bucket any) error {
55+
u, err := c.client.apiURL.Parse(path)
56+
if err != nil {
57+
return fmt.Errorf("failed to parth bucket creation path: %w", err)
58+
}
3959

4060
body, err := json.Marshal(bucket)
4161
if err != nil {
4262
return fmt.Errorf("failed to marshal bucket creation request body: %w", err)
4363
}
4464

65+
headers := http.Header{}
66+
headers.Set("Content-Type", "application/json")
67+
4568
param := httpParams{
4669
endpointURL: u,
4770
queryParams: nil,
@@ -50,6 +73,6 @@ func (c *Client) CreateBucket(ctx context.Context, bucket *Bucket) error {
5073
body: bytes.NewReader(body),
5174
}
5275

53-
_, err = c.makeAPICall(ctx, param)
76+
_, err = c.client.makeAPICall(ctx, param)
5477
return err
5578
}

influxdb3/management_test.go renamed to influxdb3/management_serverless_test.go

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,18 @@ import (
1212
"github.com/stretchr/testify/require"
1313
)
1414

15-
func TestCreateBucket(t *testing.T) {
15+
func TestServerlessClientCreateBucket(t *testing.T) {
1616
correctPath := "/api/v2/buckets"
1717

1818
tests := []struct {
1919
name string
20-
bucket Bucket
20+
bucket *Bucket
2121
wantBody map[string]any
22+
wantErr bool
2223
}{
2324
{
2425
name: "Apply bucket orgID and name",
25-
bucket: Bucket{
26+
bucket: &Bucket{
2627
OrgID: "my-organization",
2728
Name: "my-bucket",
2829
RetentionRules: []BucketRetentionRule{
@@ -42,10 +43,11 @@ func TestCreateBucket(t *testing.T) {
4243
},
4344
},
4445
},
46+
wantErr: false,
4547
},
4648
{
4749
name: "fallback to client config orgID and database name",
48-
bucket: Bucket{
50+
bucket: &Bucket{
4951
RetentionRules: []BucketRetentionRule{
5052
{
5153
Type: "expire",
@@ -63,6 +65,13 @@ func TestCreateBucket(t *testing.T) {
6365
},
6466
},
6567
},
68+
wantErr: false,
69+
},
70+
{
71+
name: "nil bucket",
72+
bucket: nil,
73+
wantBody: nil,
74+
wantErr: true,
6675
},
6776
}
6877

@@ -92,8 +101,31 @@ func TestCreateBucket(t *testing.T) {
92101
})
93102
require.NoError(t, err)
94103

95-
err = c.CreateBucket(context.Background(), &tt.bucket)
96-
require.NoError(t, err)
104+
sc := NewServerlessClient(c)
105+
err = sc.CreateBucket(context.Background(), tt.bucket)
106+
if tt.wantErr {
107+
require.Error(t, err)
108+
} else {
109+
require.NoError(t, err)
110+
}
97111
})
98112
}
113+
114+
t.Run("Internal error cases", func(t *testing.T) {
115+
c, err := New(ClientConfig{
116+
Host: "dummy",
117+
Token: "dummy",
118+
})
119+
require.NoError(t, err)
120+
121+
sc := NewServerlessClient(c)
122+
err = sc.createBucket(context.Background(), "wrong path:", nil)
123+
assert.Error(t, err)
124+
125+
wrongBody := map[string]any{
126+
"funcField": func() {},
127+
}
128+
err = sc.createBucket(context.Background(), correctPath, wrongBody)
129+
assert.Error(t, err)
130+
})
99131
}

0 commit comments

Comments
 (0)