add job queue and code submission tests; remove unused main executable
This commit is contained in:
154
backend/handler/handler_test.go
Normal file
154
backend/handler/handler_test.go
Normal file
@@ -0,0 +1,154 @@
|
||||
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"])
|
||||
}
|
||||
Reference in New Issue
Block a user