package repository import ( "encoding/json" "regexp" "testing" "time" "github.com/DATA-DOG/go-sqlmock" "github.com/wmms/wmms/internal/model" "github.com/wmms/wmms/pkg/database" ) func TestMaterialRepoGetByIDReturnsOnlyMasterData(t *testing.T) { db, mock, err := sqlmock.New() if err != nil { t.Fatalf("open sql mock: %v", err) } t.Cleanup(func() { database.DB = nil db.Close() }) database.DB = db query := `SELECT id, material_code, name, material_image, spec, category, unit, created_at, updated_at FROM materials WHERE id = ?` now := time.Date(2026, 9, 15, 9, 0, 0, 0, time.UTC) mock.ExpectQuery(regexp.QuoteMeta(query)).WithArgs(int64(7)).WillReturnRows( sqlmock.NewRows([]string{"id", "material_code", "name", "material_image", "spec", "category", "unit", "created_at", "updated_at"}). AddRow(7, "MAT-007", "轴承", nil, "6205", "A02", "件", now, now), ) var material model.Material if err := NewMaterialRepo().GetByID(7, &material); err != nil { t.Fatalf("get material: %v", err) } payload, err := json.Marshal(material) if err != nil { t.Fatalf("marshal material: %v", err) } if regexp.MustCompile(`current_stock|warning_stock`).Match(payload) { t.Fatalf("material payload leaks inventory fields: %s", payload) } if err := mock.ExpectationsWereMet(); err != nil { t.Fatal(err) } }