package s3_test import ( "bytes" "context" "io" "testing" "git.eeqj.de/sneak/vaultik/internal/s3" ) func TestClient(t *testing.T) { ts := NewTestServer(t) defer func() { if err := ts.Cleanup(); err != nil { t.Errorf("cleanup failed: %v", err) } }() ctx := context.Background() // Create client client, err := s3.NewClient(ctx, s3.Config{ Endpoint: testEndpoint, Bucket: testBucket, Prefix: "test-prefix/", AccessKeyID: testAccessKey, SecretAccessKey: testSecretKey, Region: testRegion, }) if err != nil { t.Fatalf("failed to create client: %v", err) } // Test PutObject testKey := "foo/bar.txt" testData := []byte("test data") err = client.PutObject(ctx, testKey, bytes.NewReader(testData)) if err != nil { t.Fatalf("failed to put object: %v", err) } // Test GetObject reader, err := client.GetObject(ctx, testKey) if err != nil { t.Fatalf("failed to get object: %v", err) } defer func() { if err := reader.Close(); err != nil { t.Errorf("failed to close reader: %v", err) } }() data, err := io.ReadAll(reader) if err != nil { t.Fatalf("failed to read data: %v", err) } if !bytes.Equal(data, testData) { t.Errorf("data mismatch: got %q, want %q", data, testData) } // Test HeadObject exists, err := client.HeadObject(ctx, testKey) if err != nil { t.Fatalf("failed to head object: %v", err) } if !exists { t.Error("expected object to exist") } // Test ListObjects keys, err := client.ListObjects(ctx, "foo/") if err != nil { t.Fatalf("failed to list objects: %v", err) } if len(keys) != 1 { t.Errorf("expected 1 key, got %d", len(keys)) } if keys[0] != testKey { t.Errorf("unexpected key: got %s, want %s", keys[0], testKey) } // Test DeleteObject err = client.DeleteObject(ctx, testKey) if err != nil { t.Fatalf("failed to delete object: %v", err) } // Verify deletion exists, err = client.HeadObject(ctx, testKey) if err != nil { t.Fatalf("failed to head object after deletion: %v", err) } if exists { t.Error("expected object to not exist after deletion") } }