aides-repo-api/tests/integration/taskservice_upload_test.go
Maxim Slipenko 904a9f4a63
Some checks failed
Format and Lint / test (push) Waiting to run
Format and Lint / format-check (push) Has been cancelled
add TaskService_Upload test
2024-12-26 16:57:05 +03:00

134 lines
3.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package integration
import (
"bytes"
"io"
"log"
"mime/multipart"
"os"
"path"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"code.alt-gnome.ru/aides-infra/aides-repo-api/internal/config"
"code.alt-gnome.ru/aides-infra/aides-repo-api/internal/models"
"code.alt-gnome.ru/aides-infra/aides-repo-api/internal/services/taskservice"
)
func createMultipartFileHeader(filePath string) *multipart.FileHeader {
// open the file
file, err := os.Open(filePath)
if err != nil {
log.Fatal(err)
return nil
}
defer file.Close()
// create a buffer to hold the file in memory
var buff bytes.Buffer
buffWriter := io.Writer(&buff)
// create a new form and create a new file field
formWriter := multipart.NewWriter(buffWriter)
formPart, err := formWriter.CreateFormFile("file", filepath.Base(file.Name()))
if err != nil {
log.Fatal(err)
return nil
}
// copy the content of the file to the form's file field
if _, err := io.Copy(formPart, file); err != nil {
log.Fatal(err)
return nil
}
// close the form writer after the copying process is finished
// I don't use defer in here to avoid unexpected EOF error
formWriter.Close()
// transform the bytes buffer into a form reader
buffReader := bytes.NewReader(buff.Bytes())
formReader := multipart.NewReader(buffReader, formWriter.Boundary())
// read the form components with max stored memory of 1MB
multipartForm, err := formReader.ReadForm(1 << 20)
if err != nil {
log.Fatal(err)
return nil
}
// return the multipart file header
files, exists := multipartForm.File["file"]
if !exists || len(files) == 0 {
log.Fatal("multipart file not exists")
return nil
}
return files[0]
}
func prepareDb(t *testing.T) *gorm.DB {
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
assert.NoError(t, err)
err = db.AutoMigrate(&models.Task{}, &models.GitRepoAltRepoTask{}, &models.RPMFile{})
assert.NoError(t, err)
return db
}
func TestTaskService_Upload(t *testing.T) {
db := prepareDb(t)
task := &models.Task{
ALTRepoID: 1,
RepoID: 1,
Status: models.StatusPending,
}
task.ID = uint(1)
db.Create(task)
config := &config.Config{
UploadDir: "./test_uploads",
}
os.MkdirAll(config.GetUploadDir(), os.ModePerm)
os.MkdirAll(path.Join(config.GetUploadDir(), "repo/Sisyphus"), os.ModePerm)
service := taskservice.New(db, config)
fileName := "example-foo-1.0.0-alt1.x86_64.rpm"
filePath := path.Join("./test_rpms/", fileName)
fileHeader := createMultipartFileHeader(filePath)
input := &taskservice.TaskUploadInput{
TaskID: "1",
Files: []*multipart.FileHeader{fileHeader},
}
// Вызываем метод Upload
err := service.Upload(input)
assert.NoError(t, err)
// Проверяем, что задача обновлена
var updatedTask models.Task
db.First(&updatedTask, 1)
assert.Equal(t, models.StatusCompleted, updatedTask.Status)
// Проверяем, что файл добавлен в базу
var rpmFiles []models.RPMFile
db.Find(&rpmFiles)
assert.Len(t, rpmFiles, 1)
assert.Equal(t, fileName, rpmFiles[0].Filename)
}
// createTestRPMFile создает тестовый RPM файл с заглушкой
func createTestRPMFile(filePath string) error {
content := []byte("dummy rpm content")
return os.WriteFile(filePath, content, 0644)
}