mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-03 04:26:36 +08:00
80 lines
2.5 KiB
Go
80 lines
2.5 KiB
Go
package repository
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/glebarez/sqlite"
|
|
"gorm.io/gorm"
|
|
|
|
"github.com/truewhile/MeBox/internal/database"
|
|
"github.com/truewhile/MeBox/internal/model"
|
|
)
|
|
|
|
func TestHistoryUpsertSingleRowPerUserMedia(t *testing.T) {
|
|
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := database.AutoMigrate(db); err != nil {
|
|
t.Fatalf("migrate: %v", err)
|
|
}
|
|
repos := New(db)
|
|
ctx := t.Context()
|
|
watched := time.Now()
|
|
|
|
first := &model.PlaybackHistory{UserID: "u-1", MediaID: "m-1", PositionMs: 30_000, DurationMs: 0, WatchedAt: watched, Completed: false}
|
|
if err := repos.History.Upsert(ctx, first); err != nil {
|
|
t.Fatalf("first upsert: %v", err)
|
|
}
|
|
second := &model.PlaybackHistory{UserID: "u-1", MediaID: "m-1", PositionMs: 90_000, DurationMs: 120_000, WatchedAt: watched.Add(time.Minute), Completed: true}
|
|
if err := repos.History.Upsert(ctx, second); err != nil {
|
|
t.Fatalf("second upsert: %v", err)
|
|
}
|
|
|
|
var count int64
|
|
if err := db.Model(&model.PlaybackHistory{}).Where("user_id = ? AND media_id = ?", "u-1", "m-1").Count(&count).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if count != 1 {
|
|
t.Fatalf("expected 1 history row after upserts, got %d", count)
|
|
}
|
|
var got model.PlaybackHistory
|
|
if err := db.Where("user_id = ? AND media_id = ?", "u-1", "m-1").First(&got).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got.PositionMs != 90_000 || !got.Completed {
|
|
t.Fatalf("position/completion not updated: %#v", got)
|
|
}
|
|
if got.DurationMs != 120_000 {
|
|
t.Fatalf("duration should update when known, got %d", got.DurationMs)
|
|
}
|
|
}
|
|
|
|
func TestHistoryUpsertKeepsDurationWhenUnknown(t *testing.T) {
|
|
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := database.AutoMigrate(db); err != nil {
|
|
t.Fatalf("migrate: %v", err)
|
|
}
|
|
repos := New(db)
|
|
ctx := t.Context()
|
|
watched := time.Now()
|
|
|
|
if err := repos.History.Upsert(ctx, &model.PlaybackHistory{UserID: "u-1", MediaID: "m-2", PositionMs: 10, DurationMs: 600_000, WatchedAt: watched}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := repos.History.Upsert(ctx, &model.PlaybackHistory{UserID: "u-1", MediaID: "m-2", PositionMs: 20, DurationMs: 0, WatchedAt: watched.Add(time.Second)}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var got model.PlaybackHistory
|
|
if err := db.Where("user_id = ? AND media_id = ?", "u-1", "m-2").First(&got).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got.DurationMs != 600_000 {
|
|
t.Fatalf("duration_ms=0 upsert must not clear stored duration, got %d", got.DurationMs)
|
|
}
|
|
}
|