|
- package service
-
- import (
- "context"
- "encoding/json"
- "testing"
-
- "github.com/AFASystems/presence/internal/pkg/model"
- "github.com/AFASystems/presence/internal/pkg/service"
- "github.com/segmentio/kafka-go"
- "gorm.io/driver/sqlite"
- "gorm.io/gorm"
- )
-
- func setupTestDB(t *testing.T) *gorm.DB {
- db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
- if err != nil {
- t.Fatalf("Failed to open test DB: %v", err)
- }
- if err := db.AutoMigrate(&model.Gateway{}, &model.Zone{}, &model.Tracker{}, &model.TrackerZones{}, &model.Tracks{}); err != nil {
- t.Fatalf("Failed to migrate: %v", err)
- }
- return db
- }
-
- func TestSendParserConfig(t *testing.T) {
- mockWriter := &mockKafkaWriter{}
- kp := model.KafkaParser{
- ID: "add",
- Name: "test-parser",
- Config: model.Config{
- Name: "test-parser",
- Min: 4,
- Max: 20,
- Pattern: []string{"0x02", "0x01"},
- Configs: map[string]model.ParserConfig{},
- },
- }
- ctx := context.Background()
-
- err := service.SendParserConfig(kp, mockWriter, ctx)
- if err != nil {
- t.Fatalf("SendParserConfig failed: %v", err)
- }
- if len(mockWriter.messages) != 1 {
- t.Errorf("Expected 1 Kafka message, got %d", len(mockWriter.messages))
- }
- var decoded model.KafkaParser
- if err := json.Unmarshal(mockWriter.messages[0].Value, &decoded); err != nil {
- t.Fatalf("Failed to unmarshal: %v", err)
- }
- if decoded.ID != "add" || decoded.Config.Name != "test-parser" {
- t.Errorf("Expected add/test-parser, got %s/%s", decoded.ID, decoded.Config.Name)
- }
- }
-
- func TestLocationToBeaconService_EmptyID(t *testing.T) {
- db := setupTestDB(t)
- mockWriter := &mockKafkaWriter{}
- ctx := context.Background()
-
- msg := model.HTTPLocation{ID: "", Location: "gateway1"}
- service.LocationToBeaconService(msg, db, mockWriter, ctx)
- // Should return early, no panic
- }
-
- func TestLocationToBeaconService_WithValidData(t *testing.T) {
- db := setupTestDB(t)
- // Create prerequisite data (formatMac converts AABBCCDDEEFF -> AA:BB:CC:DD:EE:FF)
- db.Create(&model.Gateway{ID: "gw-1", MAC: "AA:BB:CC:DD:EE:FF", Floor: "1", Building: "B1", X: 10, Y: 20})
- db.Create(&model.Tracker{ID: "tr-1", MAC: "112233445566"})
- db.Create(&model.TrackerZones{ID: "tz-1", Tracker: "tr-1", ZoneList: []string{"gw-1"}})
-
- mockWriter := &mockKafkaWriter{}
- ctx := context.Background()
-
- msg := model.HTTPLocation{
- ID: "tr-1",
- Location: "AABBCCDDEEFF",
- Distance: 2.5,
- RSSI: -65,
- }
- service.LocationToBeaconService(msg, db, mockWriter, ctx)
-
- var tracker model.Tracker
- db.Where("id = ?", "tr-1").First(&tracker)
- if tracker.Location != "gw-1" {
- t.Errorf("Expected tracker location gw-1, got %s", tracker.Location)
- }
- }
-
- type mockKafkaWriter struct {
- messages []kafka.Message
- }
-
- func (m *mockKafkaWriter) WriteMessages(ctx context.Context, msgs ...kafka.Message) error {
- m.messages = append(m.messages, msgs...)
- return nil
- }
|