You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

100 line
2.8 KiB

  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "testing"
  6. "github.com/AFASystems/presence/internal/pkg/model"
  7. "github.com/AFASystems/presence/internal/pkg/service"
  8. "github.com/segmentio/kafka-go"
  9. "gorm.io/driver/sqlite"
  10. "gorm.io/gorm"
  11. )
  12. func setupTestDB(t *testing.T) *gorm.DB {
  13. db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
  14. if err != nil {
  15. t.Fatalf("Failed to open test DB: %v", err)
  16. }
  17. if err := db.AutoMigrate(&model.Gateway{}, &model.Zone{}, &model.Tracker{}, &model.TrackerZones{}, &model.Tracks{}); err != nil {
  18. t.Fatalf("Failed to migrate: %v", err)
  19. }
  20. return db
  21. }
  22. func TestSendParserConfig(t *testing.T) {
  23. mockWriter := &mockKafkaWriter{}
  24. kp := model.KafkaParser{
  25. ID: "add",
  26. Name: "test-parser",
  27. Config: model.Config{
  28. Name: "test-parser",
  29. Min: 4,
  30. Max: 20,
  31. Pattern: []string{"0x02", "0x01"},
  32. Configs: map[string]model.ParserConfig{},
  33. },
  34. }
  35. ctx := context.Background()
  36. err := service.SendParserConfig(kp, mockWriter, ctx)
  37. if err != nil {
  38. t.Fatalf("SendParserConfig failed: %v", err)
  39. }
  40. if len(mockWriter.messages) != 1 {
  41. t.Errorf("Expected 1 Kafka message, got %d", len(mockWriter.messages))
  42. }
  43. var decoded model.KafkaParser
  44. if err := json.Unmarshal(mockWriter.messages[0].Value, &decoded); err != nil {
  45. t.Fatalf("Failed to unmarshal: %v", err)
  46. }
  47. if decoded.ID != "add" || decoded.Config.Name != "test-parser" {
  48. t.Errorf("Expected add/test-parser, got %s/%s", decoded.ID, decoded.Config.Name)
  49. }
  50. }
  51. func TestLocationToBeaconService_EmptyID(t *testing.T) {
  52. db := setupTestDB(t)
  53. mockWriter := &mockKafkaWriter{}
  54. ctx := context.Background()
  55. msg := model.HTTPLocation{ID: "", Location: "gateway1"}
  56. service.LocationToBeaconService(msg, db, mockWriter, ctx)
  57. // Should return early, no panic
  58. }
  59. func TestLocationToBeaconService_WithValidData(t *testing.T) {
  60. db := setupTestDB(t)
  61. // Create prerequisite data (formatMac converts AABBCCDDEEFF -> AA:BB:CC:DD:EE:FF)
  62. db.Create(&model.Gateway{ID: "gw-1", MAC: "AA:BB:CC:DD:EE:FF", Floor: "1", Building: "B1", X: 10, Y: 20})
  63. db.Create(&model.Tracker{ID: "tr-1", MAC: "112233445566"})
  64. db.Create(&model.TrackerZones{ID: "tz-1", Tracker: "tr-1", ZoneList: []string{"gw-1"}})
  65. mockWriter := &mockKafkaWriter{}
  66. ctx := context.Background()
  67. msg := model.HTTPLocation{
  68. ID: "tr-1",
  69. Location: "AABBCCDDEEFF",
  70. Distance: 2.5,
  71. RSSI: -65,
  72. }
  73. service.LocationToBeaconService(msg, db, mockWriter, ctx)
  74. var tracker model.Tracker
  75. db.Where("id = ?", "tr-1").First(&tracker)
  76. if tracker.Location != "gw-1" {
  77. t.Errorf("Expected tracker location gw-1, got %s", tracker.Location)
  78. }
  79. }
  80. type mockKafkaWriter struct {
  81. messages []kafka.Message
  82. }
  83. func (m *mockKafkaWriter) WriteMessages(ctx context.Context, msgs ...kafka.Message) error {
  84. m.messages = append(m.messages, msgs...)
  85. return nil
  86. }