github.com/kubeshop/testkube@v1.17.23/pkg/storage/minio/artifacts_storage_integration_test.go (about)

     1  package minio
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"io"
     7  	"os"
     8  	"testing"
     9  
    10  	"github.com/kubeshop/testkube/pkg/utils/test"
    11  
    12  	"github.com/minio/minio-go/v7"
    13  	"github.com/minio/minio-go/v7/pkg/credentials"
    14  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  func TestArtifactClient(t *testing.T) {
    18  	test.IntegrationTest(t)
    19  	t.Parallel()
    20  
    21  	directMinioClient, err := minio.New("localhost:9000", &minio.Options{
    22  		Creds:  credentials.NewStaticV4("minio99", "minio123", ""),
    23  		Secure: false,
    24  	})
    25  	if err != nil {
    26  		t.Fatalf("unable to create direct minio client: %v", err)
    27  	}
    28  	// Prepare MinIO client
    29  	minioClient := NewClient("localhost:9000", "minio99", "minio123", "us-east-1", "", "test-bucket-fsdf")
    30  	if err := minioClient.Connect(); err != nil {
    31  		t.Fatalf("unable to connect to minio: %v", err)
    32  	}
    33  
    34  	// Create the ArtifactClient
    35  	artifactClient := NewMinIOArtifactClient(minioClient)
    36  
    37  	// Create a context
    38  	ctx := context.Background()
    39  
    40  	// Test ListFiles
    41  	t.Run("ListFiles", func(t *testing.T) {
    42  		t.Parallel()
    43  		// Upload a test file
    44  		_, err = directMinioClient.PutObject(ctx, "test-bucket-fsdf", "test-execution-id-1/test-file", bytes.NewReader([]byte("test-content")), 12, minio.PutObjectOptions{})
    45  		if err != nil {
    46  			t.Fatalf("unable to upload file: %v", err)
    47  		}
    48  		// Call ListFiles
    49  		files, err := artifactClient.ListFiles(ctx, "test-execution-id-1", "", "", "")
    50  		assert.NoError(t, err)
    51  
    52  		assert.Lenf(t, files, 1, "expected 1 file to be returned")
    53  		assert.Equal(t, "test-file", files[0].Name, "expected file name to be test-file")
    54  		assert.Equal(t, int32(12), files[0].Size, "expected file size to be 11")
    55  	})
    56  
    57  	// Test DownloadFile
    58  	t.Run("DownloadFile", func(t *testing.T) {
    59  		t.Parallel()
    60  		// Upload a test file
    61  		_, err = directMinioClient.PutObject(ctx, "test-bucket-fsdf", "test-execution-id-2/test-file", bytes.NewReader([]byte("test-content")), 12, minio.PutObjectOptions{})
    62  		if err != nil {
    63  			t.Fatalf("unable to upload file: %v", err)
    64  		}
    65  
    66  		reader, err := artifactClient.DownloadFile(ctx, "test-file", "test-execution-id-2", "", "", "")
    67  		if err != nil {
    68  			t.Fatalf("unable to download file: %v", err)
    69  		}
    70  
    71  		content, err := io.ReadAll(reader)
    72  		assert.NoError(t, err)
    73  
    74  		assert.Equalf(t, "test-content", string(content), "downloaded file content does not match expected content")
    75  	})
    76  
    77  	t.Run("UploadFile", func(t *testing.T) {
    78  		t.Parallel()
    79  
    80  		err = artifactClient.UploadFile(ctx, "test-execution-id-3", "test-file", bytes.NewReader([]byte("test-content")), 12)
    81  		if err != nil {
    82  			t.Fatalf("error uploading artifact file: %v", err)
    83  		}
    84  
    85  		// Check if the file is uploaded
    86  		obj, err := directMinioClient.GetObject(ctx, "test-bucket-fsdf", "test-execution-id-3/test-file", minio.GetObjectOptions{})
    87  		if err != nil {
    88  			t.Fatalf("unable to get object from minio: %v", err)
    89  		}
    90  		stat, err := obj.Stat()
    91  		if err != nil {
    92  			t.Fatalf("unable to get object stat from minio: %v", err)
    93  		}
    94  		assert.Equal(t, int64(12), stat.Size, "expected file size to be 12")
    95  	})
    96  
    97  	t.Run("PlaceFiles", func(t *testing.T) {
    98  		t.Parallel()
    99  		// Create a temporary directory to place files
   100  		tempDir, err := os.MkdirTemp("", "test-artifactclient")
   101  		if err != nil {
   102  			t.Fatalf("unable to create temporary directory: %v", err)
   103  		}
   104  		defer os.RemoveAll(tempDir)
   105  		// Upload test files
   106  		_, err = directMinioClient.PutObject(ctx, "test-bucket-fsdf", "test-execution-id-4/test-file1", bytes.NewReader([]byte("test-content")), 12, minio.PutObjectOptions{})
   107  		if err != nil {
   108  			t.Fatalf("unable to upload file: %v", err)
   109  		}
   110  		_, err = directMinioClient.PutObject(ctx, "test-bucket-fsdf", "test-execution-id-4/test-file2", bytes.NewReader([]byte("test-content")), 12, minio.PutObjectOptions{})
   111  		if err != nil {
   112  			t.Fatalf("unable to upload file: %v", err)
   113  		}
   114  
   115  		err = artifactClient.PlaceFiles(ctx, []string{"test-execution-id-4"}, tempDir)
   116  		if err != nil {
   117  			t.Fatalf("error placing files: %v", err)
   118  		}
   119  
   120  		// Check if the files are placed in the temporary directory
   121  		content, err := os.ReadFile(tempDir + "/" + "test-file1")
   122  		if err != nil {
   123  			t.Fatalf("unable to read file: %v", err)
   124  		}
   125  		assert.Equal(t, "test-content", string(content), "placed file content does not match expected content")
   126  		content, err = os.ReadFile(tempDir + "/" + "test-file2")
   127  		if err != nil {
   128  			t.Fatalf("unable to read file: %v", err)
   129  		}
   130  		assert.Equal(t, "test-content", string(content), "placed file content does not match expected content")
   131  	})
   132  }