feat(backend): add domain store, learning services, and seed data
Persist LMS entities and implement hearts/watch rules plus curriculum bootstrap.
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"pargar/backend/internal/models"
|
||||
)
|
||||
|
||||
func TestHeartbeatCapsDelta(t *testing.T) {
|
||||
lesson := &models.Lesson{ID: 1, DurationSeconds: 100, CompletionThresholdPct: 85}
|
||||
delta := 999.0
|
||||
if delta > maxHeartbeatDelta {
|
||||
delta = maxHeartbeatDelta
|
||||
}
|
||||
if delta > float64(lesson.DurationSeconds) {
|
||||
delta = float64(lesson.DurationSeconds)
|
||||
}
|
||||
if delta != maxHeartbeatDelta {
|
||||
t.Fatalf("expected cap %v, got %v", maxHeartbeatDelta, delta)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHeartbeatCapsDeltaByWallClock(t *testing.T) {
|
||||
last := time.Now().Add(-2 * time.Second)
|
||||
elapsed := time.Since(last).Seconds()
|
||||
wallCap := elapsed + wallClockSlack
|
||||
delta := 15.0
|
||||
if delta > wallCap {
|
||||
delta = wallCap
|
||||
}
|
||||
if delta > maxHeartbeatDelta {
|
||||
delta = maxHeartbeatDelta
|
||||
}
|
||||
if delta > 5 {
|
||||
t.Fatalf("wall-clock cap should keep delta near ~3.5s, got %v", delta)
|
||||
}
|
||||
if delta < 2 {
|
||||
t.Fatalf("wall-clock cap too aggressive: %v", delta)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMaxHeartbeatDeltaConstant(t *testing.T) {
|
||||
if maxHeartbeatDelta != 15.0 {
|
||||
t.Fatalf("maxHeartbeatDelta changed unexpectedly: %v", maxHeartbeatDelta)
|
||||
}
|
||||
if wallClockSlack < 1 {
|
||||
t.Fatalf("wallClockSlack too small: %v", wallClockSlack)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user