110 lines
3.1 KiB
Go
110 lines
3.1 KiB
Go
package importer
|
|
|
|
import (
|
|
"bamort/database"
|
|
"bamort/router"
|
|
"bamort/user"
|
|
"bytes"
|
|
"encoding/json"
|
|
"io"
|
|
"mime/multipart"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func getAuthToken() string {
|
|
u := user.User{}
|
|
u.FirstId(1)
|
|
token := user.GenerateToken(&u)
|
|
return token
|
|
}
|
|
|
|
func TestUploadFiles(t *testing.T) {
|
|
database.SetupTestDB(true)
|
|
defer database.ResetTestDB()
|
|
|
|
// Initialize a Gin router
|
|
r := gin.Default()
|
|
router.SetupGin(r)
|
|
|
|
// Routes
|
|
protected := router.BaseRouterGrp(r)
|
|
RegisterRoutes(protected)
|
|
|
|
token := getAuthToken()
|
|
|
|
// Create uploads directory if it doesn't exist
|
|
err := os.MkdirAll("./uploads", 0755)
|
|
assert.NoError(t, err)
|
|
defer os.RemoveAll("./uploads") // Cleanup after test
|
|
|
|
// Read test files from testdata
|
|
vttFilePath := filepath.Join("..", "testdata", "TestImportChar.json")
|
|
csvFilePath := filepath.Join("..", "testdata", "TestImportChar.csv")
|
|
|
|
vttContent, err := os.ReadFile(vttFilePath)
|
|
assert.NoError(t, err, "Should be able to read TestImportChar.json from testdata")
|
|
|
|
csvContent, err := os.ReadFile(csvFilePath)
|
|
assert.NoError(t, err, "Should be able to read TestImportChar.csv from testdata")
|
|
|
|
// Create multipart form
|
|
body := &bytes.Buffer{}
|
|
writer := multipart.NewWriter(body)
|
|
|
|
// Add file_vtt (JSON file)
|
|
vttPart, err := writer.CreateFormFile("file_vtt", "TestImportChar.json")
|
|
assert.NoError(t, err)
|
|
_, err = io.Copy(vttPart, bytes.NewReader(vttContent))
|
|
assert.NoError(t, err)
|
|
|
|
// Add file_csv (CSV file)
|
|
csvPart, err := writer.CreateFormFile("file_csv", "TestImportChar.csv")
|
|
assert.NoError(t, err)
|
|
_, err = io.Copy(csvPart, bytes.NewReader(csvContent))
|
|
assert.NoError(t, err)
|
|
|
|
err = writer.Close()
|
|
assert.NoError(t, err)
|
|
|
|
// Create a test HTTP request
|
|
req, _ := http.NewRequest("POST", "/api/importer/upload", body)
|
|
req.Header.Set("Content-Type", writer.FormDataContentType())
|
|
req.Header.Set("Authorization", "Bearer "+token)
|
|
|
|
// Create a response recorder to capture the handler's response
|
|
respRecorder := httptest.NewRecorder()
|
|
|
|
// Perform the test request
|
|
r.ServeHTTP(respRecorder, req)
|
|
|
|
// Parse response
|
|
var response map[string]interface{}
|
|
err = json.Unmarshal(respRecorder.Body.Bytes(), &response)
|
|
assert.NoError(t, err, "Response should be valid JSON")
|
|
|
|
// Check the response
|
|
if respRecorder.Code == http.StatusOK {
|
|
_, hasMessage := response["message"]
|
|
_, hasCharacter := response["character"]
|
|
assert.True(t, hasMessage, "Response should contain message field")
|
|
assert.True(t, hasCharacter, "Response should contain character field")
|
|
|
|
t.Log("Character successfully imported from Vincente.json and Vincente.csv")
|
|
} else {
|
|
// If failed, log the error for debugging
|
|
if errorMsg, hasError := response["error"]; hasError {
|
|
t.Logf("Import failed with error: %v", errorMsg)
|
|
}
|
|
// The test accepts both success and error responses since VTT format may vary
|
|
assert.Contains(t, []int{http.StatusOK, http.StatusInternalServerError, http.StatusBadRequest},
|
|
respRecorder.Code, "Upload endpoint should process the request")
|
|
}
|
|
}
|