Ctrl K
ComunidadGuías…

internal/handler/import_handler_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package handler

import (
	"net/http"
	"net/http/httptest"
	"testing"
)

func TestImportHandler_PreviewWODImport_Unauthorized(t *testing.T) {
	handler := &ImportHandler{}

	req := createTestRequest(http.MethodPost, "/api/import/wods/preview", "")
	rr := httptest.NewRecorder()

	handler.PreviewWODImport(rr, req)

	assertStatusCode(t, rr, http.StatusUnauthorized)
	assertBodyContains(t, rr, "Unauthorized")
}

func TestImportHandler_PreviewWODImport_NoFile(t *testing.T) {
	handler := &ImportHandler{}

	// Authenticated but no multipart form
	req := createAuthenticatedRequest(http.MethodPost, "/api/import/wods/preview", "", 1, "test@example.com", "admin")
	rr := httptest.NewRecorder()

	handler.PreviewWODImport(rr, req)

	assertStatusCode(t, rr, http.StatusBadRequest)
	assertBodyContains(t, rr, "Failed to parse multipart form")
}

func TestImportHandler_ConfirmWODImport_Unauthorized(t *testing.T) {
	handler := &ImportHandler{}

	req := createTestRequest(http.MethodPost, "/api/import/wods/confirm", "")
	rr := httptest.NewRecorder()

	handler.ConfirmWODImport(rr, req)

	assertStatusCode(t, rr, http.StatusUnauthorized)
	assertBodyContains(t, rr, "Unauthorized")
}

func TestImportHandler_ConfirmWODImport_NoFile(t *testing.T) {
	handler := &ImportHandler{}

	req := createAuthenticatedRequest(http.MethodPost, "/api/import/wods/confirm", "", 1, "test@example.com", "admin")
	rr := httptest.NewRecorder()

	handler.ConfirmWODImport(rr, req)

	assertStatusCode(t, rr, http.StatusBadRequest)
	assertBodyContains(t, rr, "Failed to parse multipart form")
}

func TestImportHandler_PreviewMovementImport_Unauthorized(t *testing.T) {
	handler := &ImportHandler{}

	req := createTestRequest(http.MethodPost, "/api/import/movements/preview", "")
	rr := httptest.NewRecorder()

	handler.PreviewMovementImport(rr, req)

	assertStatusCode(t, rr, http.StatusUnauthorized)
	assertBodyContains(t, rr, "Unauthorized")
}

func TestImportHandler_PreviewMovementImport_NoFile(t *testing.T) {
	handler := &ImportHandler{}

	req := createAuthenticatedRequest(http.MethodPost, "/api/import/movements/preview", "", 1, "test@example.com", "admin")
	rr := httptest.NewRecorder()

	handler.PreviewMovementImport(rr, req)

	assertStatusCode(t, rr, http.StatusBadRequest)
	assertBodyContains(t, rr, "Failed to parse multipart form")
}

func TestImportHandler_ConfirmMovementImport_Unauthorized(t *testing.T) {
	handler := &ImportHandler{}

	req := createTestRequest(http.MethodPost, "/api/import/movements/confirm", "")
	rr := httptest.NewRecorder()

	handler.ConfirmMovementImport(rr, req)

	assertStatusCode(t, rr, http.StatusUnauthorized)
	assertBodyContains(t, rr, "Unauthorized")
}

func TestImportHandler_ConfirmMovementImport_NoFile(t *testing.T) {
	handler := &ImportHandler{}

	req := createAuthenticatedRequest(http.MethodPost, "/api/import/movements/confirm", "", 1, "test@example.com", "admin")
	rr := httptest.NewRecorder()

	handler.ConfirmMovementImport(rr, req)

	assertStatusCode(t, rr, http.StatusBadRequest)
	assertBodyContains(t, rr, "Failed to parse multipart form")
}

func TestImportHandler_PreviewUserWorkoutImport_Unauthorized(t *testing.T) {
	handler := &ImportHandler{}

	req := createTestRequest(http.MethodPost, "/api/import/user-workouts/preview", "")
	rr := httptest.NewRecorder()

	handler.PreviewUserWorkoutImport(rr, req)

	assertStatusCode(t, rr, http.StatusUnauthorized)
	assertBodyContains(t, rr, "Unauthorized")
}

func TestImportHandler_PreviewUserWorkoutImport_NoFile(t *testing.T) {
	handler := &ImportHandler{}

	req := createAuthenticatedRequest(http.MethodPost, "/api/import/user-workouts/preview", "", 1, "test@example.com", "user")
	rr := httptest.NewRecorder()

	handler.PreviewUserWorkoutImport(rr, req)

	assertStatusCode(t, rr, http.StatusBadRequest)
	assertBodyContains(t, rr, "Failed to parse multipart form")
}

func TestImportHandler_ConfirmUserWorkoutImport_Unauthorized(t *testing.T) {
	handler := &ImportHandler{}

	req := createTestRequest(http.MethodPost, "/api/import/user-workouts/confirm", "")
	rr := httptest.NewRecorder()

	handler.ConfirmUserWorkoutImport(rr, req)

	assertStatusCode(t, rr, http.StatusUnauthorized)
	assertBodyContains(t, rr, "Unauthorized")
}

func TestImportHandler_ConfirmUserWorkoutImport_NoFile(t *testing.T) {
	handler := &ImportHandler{}

	req := createAuthenticatedRequest(http.MethodPost, "/api/import/user-workouts/confirm", "", 1, "test@example.com", "user")
	rr := httptest.NewRecorder()

	handler.ConfirmUserWorkoutImport(rr, req)

	assertStatusCode(t, rr, http.StatusBadRequest)
	assertBodyContains(t, rr, "Failed to parse multipart form")
}

func TestNewImportHandler(t *testing.T) {
	handler := NewImportHandler(nil)
	if handler == nil {
		t.Error("NewImportHandler should return a non-nil handler")
	}
}

// Tests with multipart file upload but missing file field

func TestImportHandler_PreviewWODImport_MissingFileField(t *testing.T) {
	handler := &ImportHandler{}

	// Create multipart request with wrong field name
	csvContent := []byte("name,type,score_type,description\nFran,For Time,time,21-15-9")
	req := createMultipartRequest(http.MethodPost, "/api/import/wods/preview",
		"wrongfield", "wods.csv", "text/csv", csvContent, 1, "admin@example.com", "admin")
	rr := httptest.NewRecorder()

	handler.PreviewWODImport(rr, req)

	assertStatusCode(t, rr, http.StatusBadRequest)
	assertBodyContains(t, rr, "No file uploaded")
}

func TestImportHandler_ConfirmWODImport_MissingFileField(t *testing.T) {
	handler := &ImportHandler{}

	csvContent := []byte("name,type,score_type,description\nFran,For Time,time,21-15-9")
	req := createMultipartRequest(http.MethodPost, "/api/import/wods/confirm",
		"wrongfield", "wods.csv", "text/csv", csvContent, 1, "admin@example.com", "admin")
	rr := httptest.NewRecorder()

	handler.ConfirmWODImport(rr, req)

	assertStatusCode(t, rr, http.StatusBadRequest)
	assertBodyContains(t, rr, "No file uploaded")
}

func TestImportHandler_PreviewMovementImport_MissingFileField(t *testing.T) {
	handler := &ImportHandler{}

	csvContent := []byte("name,type,description\nBack Squat,weightlifting,Barbell back squat")
	req := createMultipartRequest(http.MethodPost, "/api/import/movements/preview",
		"wrongfield", "movements.csv", "text/csv", csvContent, 1, "admin@example.com", "admin")
	rr := httptest.NewRecorder()

	handler.PreviewMovementImport(rr, req)

	assertStatusCode(t, rr, http.StatusBadRequest)
	assertBodyContains(t, rr, "No file uploaded")
}

func TestImportHandler_ConfirmMovementImport_MissingFileField(t *testing.T) {
	handler := &ImportHandler{}

	csvContent := []byte("name,type,description\nBack Squat,weightlifting,Barbell back squat")
	req := createMultipartRequest(http.MethodPost, "/api/import/movements/confirm",
		"wrongfield", "movements.csv", "text/csv", csvContent, 1, "admin@example.com", "admin")
	rr := httptest.NewRecorder()

	handler.ConfirmMovementImport(rr, req)

	assertStatusCode(t, rr, http.StatusBadRequest)
	assertBodyContains(t, rr, "No file uploaded")
}

func TestImportHandler_PreviewUserWorkoutImport_MissingFileField(t *testing.T) {
	handler := &ImportHandler{}

	jsonContent := []byte(`{"workouts": []}`)
	req := createMultipartRequest(http.MethodPost, "/api/import/user-workouts/preview",
		"wrongfield", "workouts.json", "application/json", jsonContent, 1, "user@example.com", "user")
	rr := httptest.NewRecorder()

	handler.PreviewUserWorkoutImport(rr, req)

	assertStatusCode(t, rr, http.StatusBadRequest)
	assertBodyContains(t, rr, "No file uploaded")
}

func TestImportHandler_ConfirmUserWorkoutImport_MissingFileField(t *testing.T) {
	handler := &ImportHandler{}

	jsonContent := []byte(`{"workouts": []}`)
	req := createMultipartRequest(http.MethodPost, "/api/import/user-workouts/confirm",
		"wrongfield", "workouts.json", "application/json", jsonContent, 1, "user@example.com", "user")
	rr := httptest.NewRecorder()

	handler.ConfirmUserWorkoutImport(rr, req)

	assertStatusCode(t, rr, http.StatusBadRequest)
	assertBodyContains(t, rr, "No file uploaded")
}

// Removed 8 panic-expectation tests:
// - TestImportHandler_PreviewWODImport_WithFileNilService
// - TestImportHandler_ConfirmWODImport_WithFileNilService
// - TestImportHandler_PreviewMovementImport_WithFileNilService
// - TestImportHandler_ConfirmMovementImport_WithFileNilService
// - TestImportHandler_PreviewUserWorkoutImport_WithFileNilService
// - TestImportHandler_ConfirmUserWorkoutImport_WithFileNilService
// - TestImportHandler_PreviewWODImport_AsNonAdmin
// - TestImportHandler_PreviewMovementImport_AsNonAdmin
// These tests verified nil pointer panics, not business logic.