Files
seaweedFS/weed/server/volume_server_ui/volume_test.go
Chris Lu 63b2fe0d76 fix: EC UI template error when viewing shard details (#7955)
* fix: EC UI template error when viewing shard details

Fixed field name mismatch in volume.html where it was using .ShardDetails
instead of .Shards. Added a robust type conversion wrapper in templates.go
to handle int64 to uint64 conversion for bytesToHumanReadable.
Added regression test to ensure future stability.

* refactor: improve bytesToHumanReadable and test robustness

- Handled more integer types (uint32, int32, uint) in bytesToHumanReadable.
- Improved volume_test.go to verify both shards are formatted correctly.

* refactor: add bounds checking to bytesToHumanReadable

Added checks for negative values in signed integer types to avoid incorrect
formatting when converting to uint64.
Addressed feedback from coderabbitai.
2026-01-03 22:45:48 -08:00

77 lines
1.7 KiB
Go

package volume_server_ui
import (
"bytes"
"testing"
"time"
"github.com/seaweedfs/seaweedfs/weed/stats"
)
func TestStatusTpl(t *testing.T) {
args := struct {
Version string
Masters []string
Volumes interface{}
EcVolumes interface{}
RemoteVolumes interface{}
DiskStatuses interface{}
Stats interface{}
Counters *stats.ServerStats
}{
Version: "3.59",
Masters: []string{"localhost:9333"},
EcVolumes: []interface{}{
struct {
VolumeId uint32
Collection string
Size uint64
Shards []interface{}
CreatedAt time.Time
}{
VolumeId: 1,
Collection: "ectest",
Size: 8 * 1024 * 1024,
Shards: []interface{}{
struct {
ShardId uint8
Size int64
}{
ShardId: 4,
Size: 1024 * 1024,
},
struct {
ShardId uint8
Size uint32
}{
ShardId: 6,
Size: 1024 * 1024,
},
},
CreatedAt: time.Now(),
},
},
Counters: stats.NewServerStats(),
}
var buf bytes.Buffer
if err := StatusTpl.Execute(&buf, args); err != nil {
t.Logf("output: %s", buf.String())
t.Fatalf("template execution error: %v", err)
}
if !bytes.Contains(buf.Bytes(), []byte("8.00 MiB")) {
t.Errorf("output does not contain formatted volume size '8.00 MiB'")
}
if bytes.Count(buf.Bytes(), []byte("1.00 MiB")) != 2 {
t.Errorf("expected two shards of size '1.00 MiB', but they were not found or not formatted correctly")
}
if !bytes.Contains(buf.Bytes(), []byte("Erasure Coding Shards")) {
t.Errorf("output does not contain 'Erasure Coding Shards'")
}
if !bytes.Contains(buf.Bytes(), []byte("ectest")) {
t.Errorf("output does not contain 'ectest'")
}
}