Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions bindings/sftp/sftp.go
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,13 @@ func (sftp *Sftp) create(_ context.Context, req *bindings.InvokeRequest) (*bindi
return nil, fmt.Errorf("sftp binding error: error create file %s: %w", path, err)
}

defer func() {
closeErr := file.Close()
if closeErr != nil {
sftp.logger.Errorf("sftp binding error: error close file: %w", closeErr)
}
}()

_, err = file.Write(req.Data)
if err != nil {
return nil, fmt.Errorf("sftp binding error: error write file: %w", err)
Expand Down
82 changes: 82 additions & 0 deletions bindings/sftp/sftp_integration_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package sftp

import (
"encoding/json"
"os"
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/dapr/components-contrib/bindings"
)

var connectionStringEnvKey = "DAPR_TEST_SFTP_CONNSTRING"

// Run docker from the file location as the upload folder is relative to the test
// docker run -v ./upload:/home/foo/upload -p 2222:22 -d atmoz/sftp foo:pass:1001
func TestIntegrationCases(t *testing.T) {
connectionString := os.Getenv(connectionStringEnvKey)
if connectionString == "" {
t.Skipf(`sftp binding integration tests skipped. To enable this test, define the connection string using environment variable '%[1]s' (example 'export %[1]s="localhost:2222")'`, connectionStringEnvKey)
}

t.Run("List operation", testListOperation)
t.Run("Create operation", testCreateOperation)
}

func testListOperation(t *testing.T) {
c := Sftp{}
m := bindings.Metadata{}
m.Properties = map[string]string{
"rootPath": "/upload",
"address": os.Getenv(connectionStringEnvKey),
"username": "foo",
"password": "pass",
"insecureIgnoreHostKey": "true",
}
err := c.Init(t.Context(), m)
require.NoError(t, err)

r, err := c.Invoke(t.Context(), &bindings.InvokeRequest{Operation: bindings.ListOperation})
require.NoError(t, err)
assert.NotNil(t, r.Data)

var d []listResponse
err = json.Unmarshal(r.Data, &d)
require.NoError(t, err)
}

func testCreateOperation(t *testing.T) {
c := Sftp{}
m := bindings.Metadata{}
m.Properties = map[string]string{
"rootPath": "/upload",
"address": os.Getenv(connectionStringEnvKey),
"username": "foo",
"password": "pass",
"insecureIgnoreHostKey": "true",
}

err := os.Remove("./upload/test.txt")
if err != nil && !os.IsNotExist(err) {
require.NoError(t, err)
}

err = c.Init(t.Context(), m)
require.NoError(t, err)

r, err := c.Invoke(t.Context(), &bindings.InvokeRequest{
Operation: bindings.CreateOperation,
Data: []byte("test data 1"),
Metadata: map[string]string{
"fileName": "test.txt",
},
})
require.NoError(t, err)
assert.NotNil(t, r.Data)

file, err := os.Stat("./upload/test.txt")
require.NoError(t, err)
assert.Equal(t, "test.txt", file.Name())
}