package onvif import ( "context" "net/http" "net/http/httptest" "strings" "testing" ) func newMockDeviceStorageServer() *httptest.Server { return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/soap+xml") // Parse request to determine which operation buf := make([]byte, r.ContentLength) _, _ = r.Body.Read(buf) requestBody := string(buf) var response string switch { case strings.Contains(requestBody, "GetStorageConfigurations"): response = ` storage-001 /var/media/storage1 file:///var/media/storage1 NFS storage-002 /var/media/storage2 cifs://nas.local/recordings CIFS ` case strings.Contains(requestBody, "GetStorageConfiguration"): response = ` storage-001 /var/media/storage1 file:///var/media/storage1 NFS ` case strings.Contains(requestBody, "CreateStorageConfiguration"): response = ` storage-new ` case strings.Contains(requestBody, "SetStorageConfiguration"): response = ` ` case strings.Contains(requestBody, "DeleteStorageConfiguration"): response = ` ` case strings.Contains(requestBody, "SetHashingAlgorithm"): response = ` ` default: response = ` SOAP-ENV:Receiver Unknown operation ` } _, _ = w.Write([]byte(response)) })) } func TestGetStorageConfigurations(t *testing.T) { server := newMockDeviceStorageServer() defer server.Close() client, err := NewClient(server.URL) if err != nil { t.Fatalf("NewClient failed: %v", err) } ctx := context.Background() configs, err := client.GetStorageConfigurations(ctx) if err != nil { t.Fatalf("GetStorageConfigurations failed: %v", err) } if len(configs) != 2 { t.Fatalf("Expected 2 storage configurations, got %d", len(configs)) } if configs[0].Token != "storage-001" { t.Errorf("Expected first config token 'storage-001', got '%s'", configs[0].Token) } if configs[0].Data.LocalPath != "/var/media/storage1" { t.Errorf("Expected first config path '/var/media/storage1', got '%s'", configs[0].Data.LocalPath) } if configs[0].Data.Type != "NFS" { t.Errorf("Expected first config type 'NFS', got '%s'", configs[0].Data.Type) } if configs[1].Token != "storage-002" { t.Errorf("Expected second config token 'storage-002', got '%s'", configs[1].Token) } if configs[1].Data.StorageUri != "cifs://nas.local/recordings" { t.Errorf("Expected second config URI 'cifs://nas.local/recordings', got '%s'", configs[1].Data.StorageUri) } } func TestGetStorageConfiguration(t *testing.T) { server := newMockDeviceStorageServer() defer server.Close() client, err := NewClient(server.URL) if err != nil { t.Fatalf("NewClient failed: %v", err) } ctx := context.Background() config, err := client.GetStorageConfiguration(ctx, "storage-001") if err != nil { t.Fatalf("GetStorageConfiguration failed: %v", err) } if config.Token != "storage-001" { t.Errorf("Expected config token 'storage-001', got '%s'", config.Token) } if config.Data.LocalPath != "/var/media/storage1" { t.Errorf("Expected config path '/var/media/storage1', got '%s'", config.Data.LocalPath) } if config.Data.StorageUri != "file:///var/media/storage1" { t.Errorf("Expected config URI 'file:///var/media/storage1', got '%s'", config.Data.StorageUri) } if config.Data.Type != "NFS" { t.Errorf("Expected config type 'NFS', got '%s'", config.Data.Type) } } func TestCreateStorageConfiguration(t *testing.T) { server := newMockDeviceStorageServer() defer server.Close() client, err := NewClient(server.URL) if err != nil { t.Fatalf("NewClient failed: %v", err) } ctx := context.Background() config := &StorageConfiguration{ Token: "storage-new", Data: StorageConfigurationData{ LocalPath: "/var/media/storage3", StorageUri: "file:///var/media/storage3", Type: "Local", }, } token, err := client.CreateStorageConfiguration(ctx, config) if err != nil { t.Fatalf("CreateStorageConfiguration failed: %v", err) } if token != "storage-new" { t.Errorf("Expected token 'storage-new', got '%s'", token) } } func TestSetStorageConfiguration(t *testing.T) { server := newMockDeviceStorageServer() defer server.Close() client, err := NewClient(server.URL) if err != nil { t.Fatalf("NewClient failed: %v", err) } ctx := context.Background() config := &StorageConfiguration{ Token: "storage-001", Data: StorageConfigurationData{ LocalPath: "/var/media/updated", StorageUri: "file:///var/media/updated", Type: "NFS", }, } err = client.SetStorageConfiguration(ctx, config) if err != nil { t.Fatalf("SetStorageConfiguration failed: %v", err) } } func TestDeleteStorageConfiguration(t *testing.T) { server := newMockDeviceStorageServer() defer server.Close() client, err := NewClient(server.URL) if err != nil { t.Fatalf("NewClient failed: %v", err) } ctx := context.Background() err = client.DeleteStorageConfiguration(ctx, "storage-old") if err != nil { t.Fatalf("DeleteStorageConfiguration failed: %v", err) } } func TestSetHashingAlgorithm(t *testing.T) { server := newMockDeviceStorageServer() defer server.Close() client, err := NewClient(server.URL) if err != nil { t.Fatalf("NewClient failed: %v", err) } ctx := context.Background() err = client.SetHashingAlgorithm(ctx, "SHA-256") if err != nil { t.Fatalf("SetHashingAlgorithm failed: %v", err) } }