154 lines
4.4 KiB
Go
154 lines
4.4 KiB
Go
package handler
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/arnab-afk/monaco/model"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestSubmitHandler(t *testing.T) {
|
|
h := NewHandler()
|
|
|
|
// Test valid Python submission
|
|
body := map[string]string{
|
|
"language": "python",
|
|
"code": "print('Hello, World!')",
|
|
}
|
|
bodyBytes, _ := json.Marshal(body)
|
|
req := httptest.NewRequest("POST", "/submit", bytes.NewReader(bodyBytes))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
w := httptest.NewRecorder()
|
|
|
|
h.SubmitHandler(w, req)
|
|
|
|
assert.Equal(t, http.StatusAccepted, w.Code)
|
|
var response map[string]string
|
|
err := json.Unmarshal(w.Body.Bytes(), &response)
|
|
assert.NoError(t, err)
|
|
assert.NotEmpty(t, response["id"])
|
|
|
|
// Test invalid language
|
|
body["language"] = "invalid"
|
|
bodyBytes, _ = json.Marshal(body)
|
|
req = httptest.NewRequest("POST", "/submit", bytes.NewReader(bodyBytes))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
w = httptest.NewRecorder()
|
|
|
|
h.SubmitHandler(w, req)
|
|
|
|
assert.Equal(t, http.StatusBadRequest, w.Code)
|
|
assert.Contains(t, w.Body.String(), "Unsupported language")
|
|
}
|
|
|
|
func TestStatusHandler(t *testing.T) {
|
|
h := NewHandler()
|
|
|
|
// Create a test submission
|
|
submission := &model.CodeSubmission{
|
|
ID: "test-id",
|
|
Language: "python",
|
|
Code: "print('Hello')",
|
|
Status: "completed",
|
|
QueuedAt: time.Now().Add(-2 * time.Second),
|
|
StartedAt: time.Now().Add(-1 * time.Second),
|
|
CompletedAt: time.Now(),
|
|
Output: "Hello",
|
|
}
|
|
|
|
h.submissions["test-id"] = submission
|
|
|
|
// Test valid status request
|
|
req := httptest.NewRequest("GET", "/status?id=test-id", nil)
|
|
w := httptest.NewRecorder()
|
|
|
|
h.StatusHandler(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
var response map[string]interface{}
|
|
err := json.Unmarshal(w.Body.Bytes(), &response)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "test-id", response["id"])
|
|
assert.Equal(t, "completed", response["status"])
|
|
|
|
// Test missing ID
|
|
req = httptest.NewRequest("GET", "/status", nil)
|
|
w = httptest.NewRecorder()
|
|
|
|
h.StatusHandler(w, req)
|
|
|
|
assert.Equal(t, http.StatusBadRequest, w.Code)
|
|
assert.Contains(t, w.Body.String(), "ID is required")
|
|
|
|
// Test non-existent ID
|
|
req = httptest.NewRequest("GET", "/status?id=nonexistent", nil)
|
|
w = httptest.NewRecorder()
|
|
|
|
h.StatusHandler(w, req)
|
|
|
|
assert.Equal(t, http.StatusNotFound, w.Code)
|
|
assert.Contains(t, w.Body.String(), "Submission not found")
|
|
}
|
|
|
|
func TestResultHandler(t *testing.T) {
|
|
h := NewHandler()
|
|
|
|
// Create a test submission
|
|
submission := &model.CodeSubmission{
|
|
ID: "test-id",
|
|
Language: "python",
|
|
Code: "print('Hello')",
|
|
Status: "completed",
|
|
QueuedAt: time.Now().Add(-2 * time.Second),
|
|
StartedAt: time.Now().Add(-1 * time.Second),
|
|
CompletedAt: time.Now(),
|
|
Output: "Hello",
|
|
}
|
|
|
|
h.submissions["test-id"] = submission
|
|
|
|
// Test valid result request
|
|
req := httptest.NewRequest("GET", "/result?id=test-id", nil)
|
|
w := httptest.NewRecorder()
|
|
|
|
h.ResultHandler(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
var response map[string]interface{}
|
|
err := json.Unmarshal(w.Body.Bytes(), &response)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "test-id", response["id"])
|
|
assert.Equal(t, "completed", response["status"])
|
|
assert.Equal(t, "Hello", response["output"])
|
|
}
|
|
|
|
func TestQueueStatsHandler(t *testing.T) {
|
|
h := NewHandler()
|
|
|
|
// Add some test submissions
|
|
h.submissions["test-id1"] = &model.CodeSubmission{ID: "test-id1"}
|
|
h.submissions["test-id2"] = &model.CodeSubmission{ID: "test-id2"}
|
|
|
|
req := httptest.NewRequest("GET", "/queue-stats", nil)
|
|
w := httptest.NewRecorder()
|
|
|
|
h.QueueStatsHandler(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
var response map[string]interface{}
|
|
err := json.Unmarshal(w.Body.Bytes(), &response)
|
|
assert.NoError(t, err)
|
|
|
|
stats, ok := response["queue_stats"].(map[string]interface{})
|
|
assert.True(t, ok)
|
|
assert.Contains(t, stats, "queue_length")
|
|
assert.Contains(t, stats, "max_workers")
|
|
assert.Contains(t, stats, "running_jobs")
|
|
|
|
assert.Equal(t, float64(2), response["submissions"])
|
|
} |