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)
}
}