ResolveSpec/tests/integration_test.go

233 lines
6.0 KiB
Go

package test
import (
"encoding/json"
"net/http"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
// TestMain sets up the test environment
func TestMain(m *testing.M) {
TestSetup(m)
}
func TestDepartmentEmployees(t *testing.T) {
// Create test department
deptPayload := map[string]interface{}{
"operation": "create",
"data": map[string]interface{}{
"id": "dept1",
"name": "Engineering",
"code": "ENG",
"description": "Engineering Department",
},
}
resp := makeRequest(t, "/test/departments", deptPayload)
assert.Equal(t, http.StatusOK, resp.StatusCode)
// Create employees in department
empPayload := map[string]interface{}{
"operation": "create",
"data": []map[string]interface{}{
{
"id": "emp1",
"first_name": "John",
"last_name": "Doe",
"email": "john@example.com",
"department_id": "dept1",
"title": "Senior Engineer",
},
{
"id": "emp2",
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@example.com",
"department_id": "dept1",
"title": "Engineer",
},
},
}
resp = makeRequest(t, "/test/employees", empPayload)
assert.Equal(t, http.StatusOK, resp.StatusCode)
// Read department with employees
readPayload := map[string]interface{}{
"operation": "read",
"options": map[string]interface{}{
"preload": []map[string]interface{}{
{
"relation": "employees",
"columns": []string{"id", "first_name", "last_name", "title"},
},
},
},
}
resp = makeRequest(t, "/test/departments/dept1", readPayload)
assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
data := result["data"].(map[string]interface{})
employees := data["employees"].([]interface{})
assert.Equal(t, 2, len(employees))
}
func TestEmployeeHierarchy(t *testing.T) {
// Create manager
mgrPayload := map[string]interface{}{
"operation": "create",
"data": map[string]interface{}{
"id": "mgr1",
"first_name": "Alice",
"last_name": "Manager",
"email": "alice@example.com",
"title": "Engineering Manager",
"department_id": "dept1",
},
}
resp := makeRequest(t, "/test/employees", mgrPayload)
assert.Equal(t, http.StatusOK, resp.StatusCode)
// Update employees to set manager
updatePayload := map[string]interface{}{
"operation": "update",
"data": map[string]interface{}{
"manager_id": "mgr1",
},
}
resp = makeRequest(t, "/test/employees/emp1", updatePayload)
assert.Equal(t, http.StatusOK, resp.StatusCode)
resp = makeRequest(t, "/test/employees/emp2", updatePayload)
assert.Equal(t, http.StatusOK, resp.StatusCode)
// Read manager with reports
readPayload := map[string]interface{}{
"operation": "read",
"options": map[string]interface{}{
"preload": []map[string]interface{}{
{
"relation": "reports",
"columns": []string{"id", "first_name", "last_name", "title"},
},
},
},
}
resp = makeRequest(t, "/test/employees/mgr1", readPayload)
assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
data := result["data"].(map[string]interface{})
reports := data["reports"].([]interface{})
assert.Equal(t, 2, len(reports))
}
func TestProjectStructure(t *testing.T) {
// Create project
projectPayload := map[string]interface{}{
"operation": "create",
"data": map[string]interface{}{
"id": "proj1",
"name": "New Website",
"code": "WEB",
"description": "Company website redesign",
"status": "active",
"start_date": time.Now().Format(time.RFC3339),
"end_date": time.Now().AddDate(0, 3, 0).Format(time.RFC3339),
"budget": 100000,
},
}
resp := makeRequest(t, "/test/projects", projectPayload)
assert.Equal(t, http.StatusOK, resp.StatusCode)
// Create project tasks
taskPayload := map[string]interface{}{
"operation": "create",
"data": []map[string]interface{}{
{
"id": "task1",
"project_id": "proj1",
"assignee_id": "emp1",
"title": "Design Homepage",
"description": "Create homepage design",
"status": "in_progress",
"priority": 1,
"due_date": time.Now().AddDate(0, 1, 0).Format(time.RFC3339),
},
{
"id": "task2",
"project_id": "proj1",
"assignee_id": "emp2",
"title": "Implement Backend",
"description": "Implement backend APIs",
"status": "planned",
"priority": 2,
"due_date": time.Now().AddDate(0, 2, 0).Format(time.RFC3339),
},
},
}
resp = makeRequest(t, "/test/project_tasks", taskPayload)
assert.Equal(t, http.StatusOK, resp.StatusCode)
// Create task comments
commentPayload := map[string]interface{}{
"operation": "create",
"data": map[string]interface{}{
"id": "comment1",
"task_id": "task1",
"author_id": "mgr1",
"content": "Looking good! Please add more animations.",
},
}
resp = makeRequest(t, "/test/comments", commentPayload)
assert.Equal(t, http.StatusOK, resp.StatusCode)
// Read project with all relations
readPayload := map[string]interface{}{
"operation": "read",
"options": map[string]interface{}{
"preload": []map[string]interface{}{
{
"relation": "tasks",
"columns": []string{"id", "title", "status", "assignee_id"},
"preload": []map[string]interface{}{
{
"relation": "comments",
"columns": []string{"id", "content", "author_id"},
"preload": []map[string]interface{}{
{
"relation": "author",
"columns": []string{"id", "first_name", "last_name"},
},
},
},
{
"relation": "assignee",
"columns": []string{"id", "first_name", "last_name", "title"},
},
},
},
},
},
}
resp = makeRequest(t, "/test/projects/proj1", readPayload)
assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
assert.True(t, result["success"].(bool))
}