package repository import ( "context" "testing" "time" "gitlab.com/mbugroup/lti-api.git/internal/common/exportprogress" "github.com/glebarez/sqlite" "gorm.io/gorm" ) func TestExpenseRepositoryGetProgressRows(t *testing.T) { db := openExpenseProgressTestDB(t) repo := NewExpenseRepository(db) mustExec(t, db, `CREATE TABLE locations (id INTEGER PRIMARY KEY, name TEXT)`) mustExec(t, db, `CREATE TABLE project_flocks (id INTEGER PRIMARY KEY, flock_name TEXT)`) mustExec(t, db, `CREATE TABLE kandangs (id INTEGER PRIMARY KEY, name TEXT, location_id INTEGER)`) mustExec(t, db, `CREATE TABLE project_flock_kandangs (id INTEGER PRIMARY KEY, project_flock_id INTEGER, kandang_id INTEGER)`) mustExec(t, db, `CREATE TABLE expenses (id INTEGER PRIMARY KEY, location_id INTEGER, transaction_date DATE, deleted_at DATETIME)`) mustExec(t, db, `CREATE TABLE expense_nonstocks (id INTEGER PRIMARY KEY, expense_id INTEGER, project_flock_kandang_id INTEGER, kandang_id INTEGER)`) mustExec(t, db, `INSERT INTO locations (id, name) VALUES (1, 'Farm Location')`) mustExec(t, db, `INSERT INTO project_flocks (id, flock_name) VALUES (1, 'Farm A')`) mustExec(t, db, `INSERT INTO kandangs (id, name, location_id) VALUES (1, 'Kandang 1', 1), (2, 'Kandang 2', 1)`) mustExec(t, db, `INSERT INTO project_flock_kandangs (id, project_flock_id, kandang_id) VALUES (1, 1, 1), (2, 1, 2)`) mustExec(t, db, `INSERT INTO expenses (id, location_id, transaction_date, deleted_at) VALUES (1, 1, '2026-06-10', NULL), (2, 1, '2026-06-10', NULL)`) mustExec(t, db, `INSERT INTO expense_nonstocks (id, expense_id, project_flock_kandang_id, kandang_id) VALUES (1, 1, 1, NULL), (2, 1, 1, NULL), (3, 1, 2, NULL)`) rows, err := repo.GetProgressRows(context.Background(), time.Date(2026, 6, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 6, 30, 0, 0, 0, 0, time.UTC), nil, false) if err != nil { t.Fatalf("GetProgressRows failed: %v", err) } if len(rows) != 3 { t.Fatalf("expected 3 grouped rows, got %d", len(rows)) } assertProgressRow(t, rows, "Farm A", "Kandang 1", "2026-06-10", 1) assertProgressRow(t, rows, "Farm A", "Kandang 2", "2026-06-10", 1) assertProgressRow(t, rows, "Farm Location", "Farm-level / Unassigned", "2026-06-10", 1) } func openExpenseProgressTestDB(t *testing.T) *gorm.DB { t.Helper() db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=private"), &gorm.Config{}) if err != nil { t.Fatalf("failed opening sqlite db: %v", err) } return db } func mustExec(t *testing.T, db *gorm.DB, query string, args ...any) { t.Helper() if err := db.Exec(query, args...).Error; err != nil { t.Fatalf("exec failed for %q: %v", query, err) } } func assertProgressRow(t *testing.T, rows []exportprogress.Row, farm, kandang, date string, count int) { t.Helper() for _, row := range rows { if row.FarmName == farm && row.KandangName == kandang && row.ActivityDate.Format("2006-01-02") == date && row.Count == count { return } } t.Fatalf("expected row farm=%s kandang=%s date=%s count=%d, got %+v", farm, kandang, date, count, rows) }