299 lines
7.5 KiB
Go
299 lines
7.5 KiB
Go
package media
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestApiRequest_Success(t *testing.T) {
|
|
// Create a test server that returns a successful response
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
response := map[string]interface{}{
|
|
"code": 0,
|
|
"data": map[string]string{
|
|
"message": "success",
|
|
},
|
|
}
|
|
w.WriteHeader(http.StatusOK)
|
|
json.NewEncoder(w).Encode(response)
|
|
}))
|
|
defer server.Close()
|
|
|
|
ctx := context.Background()
|
|
req := map[string]string{"test": "data"}
|
|
var res map[string]interface{}
|
|
|
|
err := apiRequest(ctx, server.URL, req, &res)
|
|
if err != nil {
|
|
t.Errorf("Expected no error, got %v", err)
|
|
}
|
|
|
|
if res["code"].(float64) != 0 {
|
|
t.Errorf("Expected code 0, got %v", res["code"])
|
|
}
|
|
}
|
|
|
|
func TestApiRequest_GetMethod(t *testing.T) {
|
|
// Create a test server that checks the HTTP method
|
|
methodReceived := ""
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
methodReceived = r.Method
|
|
response := map[string]interface{}{
|
|
"code": 0,
|
|
}
|
|
w.WriteHeader(http.StatusOK)
|
|
json.NewEncoder(w).Encode(response)
|
|
}))
|
|
defer server.Close()
|
|
|
|
ctx := context.Background()
|
|
var res map[string]interface{}
|
|
|
|
// When req is nil, should use GET method
|
|
err := apiRequest(ctx, server.URL, nil, &res)
|
|
if err != nil {
|
|
t.Errorf("Expected no error, got %v", err)
|
|
}
|
|
|
|
if methodReceived != "GET" {
|
|
t.Errorf("Expected GET method, got %s", methodReceived)
|
|
}
|
|
}
|
|
|
|
func TestApiRequest_PostMethod(t *testing.T) {
|
|
// Create a test server that checks the HTTP method
|
|
methodReceived := ""
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
methodReceived = r.Method
|
|
response := map[string]interface{}{
|
|
"code": 0,
|
|
}
|
|
w.WriteHeader(http.StatusOK)
|
|
json.NewEncoder(w).Encode(response)
|
|
}))
|
|
defer server.Close()
|
|
|
|
ctx := context.Background()
|
|
req := map[string]string{"test": "data"}
|
|
var res map[string]interface{}
|
|
|
|
// When req is not nil, should use POST method
|
|
err := apiRequest(ctx, server.URL, req, &res)
|
|
if err != nil {
|
|
t.Errorf("Expected no error, got %v", err)
|
|
}
|
|
|
|
if methodReceived != "POST" {
|
|
t.Errorf("Expected POST method, got %s", methodReceived)
|
|
}
|
|
}
|
|
|
|
func TestApiRequest_ServerError(t *testing.T) {
|
|
// Create a test server that returns an error status code
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
}))
|
|
defer server.Close()
|
|
|
|
ctx := context.Background()
|
|
var res map[string]interface{}
|
|
|
|
err := apiRequest(ctx, server.URL, nil, &res)
|
|
if err == nil {
|
|
t.Error("Expected error for server error status code")
|
|
}
|
|
}
|
|
|
|
func TestApiRequest_NonZeroCode(t *testing.T) {
|
|
// Create a test server that returns a non-zero error code
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
response := map[string]interface{}{
|
|
"code": 100,
|
|
"message": "error message",
|
|
}
|
|
w.WriteHeader(http.StatusOK)
|
|
json.NewEncoder(w).Encode(response)
|
|
}))
|
|
defer server.Close()
|
|
|
|
ctx := context.Background()
|
|
var res map[string]interface{}
|
|
|
|
err := apiRequest(ctx, server.URL, nil, &res)
|
|
if err == nil {
|
|
t.Error("Expected error for non-zero code")
|
|
}
|
|
}
|
|
|
|
func TestApiRequest_InvalidJSON(t *testing.T) {
|
|
// Create a test server that returns invalid JSON
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(http.StatusOK)
|
|
w.Write([]byte("invalid json"))
|
|
}))
|
|
defer server.Close()
|
|
|
|
ctx := context.Background()
|
|
var res map[string]interface{}
|
|
|
|
err := apiRequest(ctx, server.URL, nil, &res)
|
|
if err == nil {
|
|
t.Error("Expected error for invalid JSON")
|
|
}
|
|
}
|
|
|
|
func TestApiRequest_ContextCancellation(t *testing.T) {
|
|
// Create a test server that delays the response
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
time.Sleep(100 * time.Millisecond)
|
|
response := map[string]interface{}{
|
|
"code": 0,
|
|
}
|
|
w.WriteHeader(http.StatusOK)
|
|
json.NewEncoder(w).Encode(response)
|
|
}))
|
|
defer server.Close()
|
|
|
|
// Create a context that is already cancelled
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
cancel()
|
|
|
|
var res map[string]interface{}
|
|
|
|
err := apiRequest(ctx, server.URL, nil, &res)
|
|
if err == nil {
|
|
t.Error("Expected error for cancelled context")
|
|
}
|
|
}
|
|
|
|
func TestApiRequest_InvalidURL(t *testing.T) {
|
|
ctx := context.Background()
|
|
var res map[string]interface{}
|
|
|
|
// Test with invalid URL
|
|
err := apiRequest(ctx, "://invalid-url", nil, &res)
|
|
if err == nil {
|
|
t.Error("Expected error for invalid URL")
|
|
}
|
|
}
|
|
|
|
func TestApiRequest_Timeout(t *testing.T) {
|
|
// Create a test server that never responds
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
time.Sleep(15 * time.Second) // Longer than the 10 second timeout
|
|
}))
|
|
defer server.Close()
|
|
|
|
ctx := context.Background()
|
|
var res map[string]interface{}
|
|
|
|
err := apiRequest(ctx, server.URL, nil, &res)
|
|
if err == nil {
|
|
t.Error("Expected timeout error")
|
|
}
|
|
}
|
|
|
|
func TestApiRequest_ComplexResponse(t *testing.T) {
|
|
// Create a test server that returns a complex response
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
response := map[string]interface{}{
|
|
"code": 0,
|
|
"data": map[string]interface{}{
|
|
"id": "12345",
|
|
"status": "active",
|
|
"items": []string{
|
|
"item1",
|
|
"item2",
|
|
"item3",
|
|
},
|
|
},
|
|
}
|
|
w.WriteHeader(http.StatusOK)
|
|
json.NewEncoder(w).Encode(response)
|
|
}))
|
|
defer server.Close()
|
|
|
|
ctx := context.Background()
|
|
var res map[string]interface{}
|
|
|
|
err := apiRequest(ctx, server.URL, nil, &res)
|
|
if err != nil {
|
|
t.Errorf("Expected no error, got %v", err)
|
|
}
|
|
|
|
// Check that the response was properly unmarshaled
|
|
if res["code"].(float64) != 0 {
|
|
t.Errorf("Expected code 0, got %v", res["code"])
|
|
}
|
|
|
|
data, ok := res["data"].(map[string]interface{})
|
|
if !ok {
|
|
t.Error("Expected data to be a map")
|
|
} else {
|
|
if data["id"].(string) != "12345" {
|
|
t.Errorf("Expected id '12345', got %v", data["id"])
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestApiRequest_EmptyResponse(t *testing.T) {
|
|
// Create a test server that returns minimal response
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
response := map[string]interface{}{
|
|
"code": 0,
|
|
}
|
|
w.WriteHeader(http.StatusOK)
|
|
json.NewEncoder(w).Encode(response)
|
|
}))
|
|
defer server.Close()
|
|
|
|
ctx := context.Background()
|
|
var res map[string]interface{}
|
|
|
|
err := apiRequest(ctx, server.URL, nil, &res)
|
|
if err != nil {
|
|
t.Errorf("Expected no error, got %v", err)
|
|
}
|
|
|
|
if res["code"].(float64) != 0 {
|
|
t.Errorf("Expected code 0, got %v", res["code"])
|
|
}
|
|
}
|
|
|
|
func TestApiRequest_WithRequestBody(t *testing.T) {
|
|
// Create a test server that echoes back the request
|
|
var receivedBody map[string]interface{}
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
json.NewDecoder(r.Body).Decode(&receivedBody)
|
|
response := map[string]interface{}{
|
|
"code": 0,
|
|
"echo": receivedBody,
|
|
}
|
|
w.WriteHeader(http.StatusOK)
|
|
json.NewEncoder(w).Encode(response)
|
|
}))
|
|
defer server.Close()
|
|
|
|
ctx := context.Background()
|
|
req := map[string]interface{}{
|
|
"id": "test-id",
|
|
"ssrc": "test-ssrc",
|
|
}
|
|
var res map[string]interface{}
|
|
|
|
err := apiRequest(ctx, server.URL, req, &res)
|
|
if err != nil {
|
|
t.Errorf("Expected no error, got %v", err)
|
|
}
|
|
|
|
// Check that the server received the request body
|
|
if receivedBody["id"].(string) != "test-id" {
|
|
t.Errorf("Expected id 'test-id', got %v", receivedBody["id"])
|
|
}
|
|
}
|
|
|