Files

150 lines
4.1 KiB
Go

package handlers
import (
"encoding/json"
"net/http"
"net/http/httptest"
"strconv"
"strings"
"testing"
"time"
"git.nwaifu.su/sergey/MyGoServer/internal/apiserver/models"
)
func TestTimeHandler_ServeHTTP(t *testing.T) {
// Create a new time handler
handler := NewTimeHandler()
// Create a test request
req := httptest.NewRequest("GET", "/time", nil)
// Create a test response recorder
rr := httptest.NewRecorder()
// Call the handler
handler.ServeHTTP(rr, req)
// Check status code
if status := rr.Code; status != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
status, http.StatusOK)
}
// Check content type
if ct := rr.Header().Get("Content-Type"); ct != "application/json" {
t.Errorf("handler returned wrong content type: got %v want %v",
ct, "application/json")
}
// Check response body contains expected structure
var response models.Response
if err := json.Unmarshal(rr.Body.Bytes(), &response); err != nil {
t.Errorf("handler returned invalid JSON: %v", err)
return
}
// Check success field
if !response.Success {
t.Errorf("handler returned success=false, want success=true")
}
// Check that data exists and is a map
if response.Data == nil {
t.Errorf("handler returned nil data")
return
}
// Type assert to map[string]interface{}
dataMap, ok := response.Data.(map[string]interface{})
if !ok {
t.Errorf("handler returned data of unexpected type")
return
}
// Check required fields exist
requiredFields := []string{"server_time", "unix_timestamp", "timezone"}
for _, field := range requiredFields {
if _, exists := dataMap[field]; !exists {
t.Errorf("handler response missing required field: %s", field)
}
}
// Check timezone is UTC
if timezone, ok := dataMap["timezone"].(string); ok {
if timezone != "UTC" {
t.Errorf("handler returned wrong timezone: got %v want %v",
timezone, "UTC")
}
} else {
t.Errorf("handler returned timezone of unexpected type")
}
// Check server_time format (should be RFC3339)
if serverTime, ok := dataMap["server_time"].(string); ok {
if _, err := time.Parse(time.RFC3339, serverTime); err != nil {
t.Errorf("handler returned invalid server_time format: got %v, error: %v",
serverTime, err)
}
} else {
t.Errorf("handler returned server_time of unexpected type")
}
// Check unix_timestamp is a number
if unixTimestamp, ok := dataMap["unix_timestamp"].(float64); ok {
// Verify it's a reasonable timestamp (should be close to current time)
now := time.Now().UTC().Unix()
// Allow 10 seconds difference for test execution time
if diff := now - int64(unixTimestamp); diff > 10 || diff < -10 {
t.Errorf("handler returned unreasonable unix_timestamp: got %v, current time: %v",
int64(unixTimestamp), now)
}
} else {
// Try as string and convert
if unixTimestampStr, ok := dataMap["unix_timestamp"].(string); ok {
if _, err := strconv.ParseInt(unixTimestampStr, 10, 64); err != nil {
t.Errorf("handler returned unix_timestamp of unexpected format: %v", err)
}
} else {
t.Errorf("handler returned unix_timestamp of unexpected type")
}
}
}
func TestTimeHandler_ResponseStructure(t *testing.T) {
handler := NewTimeHandler()
req := httptest.NewRequest("GET", "/time", nil)
rr := httptest.NewRecorder()
handler.ServeHTTP(rr, req)
// Test that response is valid JSON and contains all expected top-level fields
var response models.Response
if err := json.Unmarshal(rr.Body.Bytes(), &response); err != nil {
t.Fatalf("Response is not valid JSON: %v", err)
}
// Test response structure
if response.Success != true {
t.Errorf("Expected success=true, got success=%v", response.Success)
}
if response.Error != "" {
t.Errorf("Expected no error, got error=%v", response.Error)
}
if response.Data == nil {
t.Errorf("Expected data to be present, got nil")
}
// Test that response body contains JSON structure
body := rr.Body.String()
if !strings.Contains(body, `"success":true`) {
t.Errorf("Response body missing success field: %s", body)
}
if !strings.Contains(body, `"data"`) {
t.Errorf("Response body missing data field: %s", body)
}
}