- Add unit tests for database operations and optimization - Test external data source loading and caching - Add callsign manager functionality tests - Create test helpers for database testing utilities - Ensure database reliability and performance validation 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
268 lines
No EOL
7 KiB
Go
268 lines
No EOL
7 KiB
Go
package database
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestCallsignManager_Creation(t *testing.T) {
|
|
db, cleanup := setupTestDatabase(t)
|
|
defer cleanup()
|
|
|
|
manager := NewCallsignManager(db.GetConnection())
|
|
if manager == nil {
|
|
t.Fatal("NewCallsignManager returned nil")
|
|
}
|
|
}
|
|
|
|
func TestCallsignManager_ParseCallsign(t *testing.T) {
|
|
db, cleanup := setupTestDatabase(t)
|
|
defer cleanup()
|
|
|
|
manager := NewCallsignManager(db.GetConnection())
|
|
|
|
testCases := []struct {
|
|
callsign string
|
|
expectedValid bool
|
|
expectedAirline string
|
|
expectedFlight string
|
|
}{
|
|
{"UAL123", true, "UAL", "123"},
|
|
{"BA4567", true, "BA", "4567"},
|
|
{"AFR89", true, "AFR", "89"},
|
|
{"N123AB", false, "", ""}, // Aircraft registration, not callsign
|
|
{"INVALID", false, "", ""}, // No numbers
|
|
{"123", false, "", ""}, // Only numbers
|
|
{"A", false, "", ""}, // Too short
|
|
{"", false, "", ""}, // Empty
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
result := manager.ParseCallsign(tc.callsign)
|
|
if result.IsValid != tc.expectedValid {
|
|
t.Errorf("ParseCallsign(%s): expected valid=%v, got %v",
|
|
tc.callsign, tc.expectedValid, result.IsValid)
|
|
}
|
|
if result.IsValid && result.AirlineCode != tc.expectedAirline {
|
|
t.Errorf("ParseCallsign(%s): expected airline=%s, got %s",
|
|
tc.callsign, tc.expectedAirline, result.AirlineCode)
|
|
}
|
|
if result.IsValid && result.FlightNumber != tc.expectedFlight {
|
|
t.Errorf("ParseCallsign(%s): expected flight=%s, got %s",
|
|
tc.callsign, tc.expectedFlight, result.FlightNumber)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestCallsignManager_GetCallsignInfo(t *testing.T) {
|
|
db, cleanup := setupTestDatabase(t)
|
|
defer cleanup()
|
|
|
|
manager := NewCallsignManager(db.GetConnection())
|
|
|
|
// Insert test airline data
|
|
conn := db.GetConnection()
|
|
_, err := conn.Exec(`
|
|
INSERT INTO airlines (id, name, alias, iata_code, icao_code, callsign, country, active, data_source)
|
|
VALUES (1, 'Test Airways', 'Test', 'TA', 'TST', 'TESTAIR', 'United States', 1, 'test')
|
|
`)
|
|
if err != nil {
|
|
t.Fatal("Failed to insert test data:", err)
|
|
}
|
|
|
|
// Test valid callsign
|
|
info, err := manager.GetCallsignInfo("TST123")
|
|
if err != nil {
|
|
t.Fatal("GetCallsignInfo failed:", err)
|
|
}
|
|
|
|
if info == nil {
|
|
t.Fatal("Expected callsign info, got nil")
|
|
}
|
|
|
|
if info.OriginalCallsign != "TST123" {
|
|
t.Errorf("Expected callsign TST123, got %s", info.OriginalCallsign)
|
|
}
|
|
if info.AirlineCode != "TST" {
|
|
t.Errorf("Expected airline code TST, got %s", info.AirlineCode)
|
|
}
|
|
if info.FlightNumber != "123" {
|
|
t.Errorf("Expected flight number 123, got %s", info.FlightNumber)
|
|
}
|
|
if info.AirlineName != "Test Airways" {
|
|
t.Errorf("Expected airline name 'Test Airways', got %s", info.AirlineName)
|
|
}
|
|
if info.AirlineCountry != "United States" {
|
|
t.Errorf("Expected airline country 'United States', got %s", info.AirlineCountry)
|
|
}
|
|
}
|
|
|
|
func TestCallsignManager_GetCallsignInfo_InvalidCallsign(t *testing.T) {
|
|
db, cleanup := setupTestDatabase(t)
|
|
defer cleanup()
|
|
|
|
manager := NewCallsignManager(db.GetConnection())
|
|
|
|
// Test with invalid callsign format
|
|
info, err := manager.GetCallsignInfo("INVALID")
|
|
if err != nil {
|
|
t.Error("GetCallsignInfo should not error on invalid format:", err)
|
|
}
|
|
if info == nil {
|
|
t.Fatal("Expected info structure even for invalid callsign")
|
|
}
|
|
if info.IsValid {
|
|
t.Error("Invalid callsign should not be marked as valid")
|
|
}
|
|
|
|
// Test with unknown airline
|
|
info, err = manager.GetCallsignInfo("UNK123")
|
|
if err != nil {
|
|
t.Error("GetCallsignInfo should not error on unknown airline:", err)
|
|
}
|
|
if info == nil {
|
|
t.Fatal("Expected info structure for unknown airline")
|
|
}
|
|
}
|
|
|
|
func TestCallsignManager_GetCallsignInfo_EmptyCallsign(t *testing.T) {
|
|
db, cleanup := setupTestDatabase(t)
|
|
defer cleanup()
|
|
|
|
manager := NewCallsignManager(db.GetConnection())
|
|
|
|
// Test with empty callsign
|
|
info, err := manager.GetCallsignInfo("")
|
|
if err == nil {
|
|
t.Error("GetCallsignInfo should error on empty callsign")
|
|
}
|
|
if info != nil {
|
|
t.Error("Expected nil info for empty callsign")
|
|
}
|
|
}
|
|
|
|
func TestCallsignManager_ClearExpiredCache(t *testing.T) {
|
|
db, cleanup := setupTestDatabase(t)
|
|
defer cleanup()
|
|
|
|
manager := NewCallsignManager(db.GetConnection())
|
|
|
|
err := manager.ClearExpiredCache()
|
|
if err != nil {
|
|
t.Error("ClearExpiredCache should not error:", err)
|
|
}
|
|
}
|
|
|
|
func TestCallsignManager_GetCacheStats(t *testing.T) {
|
|
db, cleanup := setupTestDatabase(t)
|
|
defer cleanup()
|
|
|
|
manager := NewCallsignManager(db.GetConnection())
|
|
|
|
stats, err := manager.GetCacheStats()
|
|
if err != nil {
|
|
t.Error("GetCacheStats should not error:", err)
|
|
}
|
|
|
|
if stats == nil {
|
|
t.Error("Expected cache stats, got nil")
|
|
}
|
|
|
|
t.Logf("Cache stats: %+v", stats)
|
|
}
|
|
|
|
func TestCallsignManager_SearchAirlines(t *testing.T) {
|
|
db, cleanup := setupTestDatabase(t)
|
|
defer cleanup()
|
|
|
|
manager := NewCallsignManager(db.GetConnection())
|
|
|
|
// Insert test airline data
|
|
conn := db.GetConnection()
|
|
_, err := conn.Exec(`
|
|
INSERT INTO airlines (id, name, alias, iata_code, icao_code, callsign, country, active, data_source)
|
|
VALUES (1, 'Test Airways', 'Test', 'TA', 'TST', 'TESTAIR', 'United States', 1, 'test'),
|
|
(2, 'Another Airline', 'Another', 'AA', 'ANO', 'ANOTHER', 'Canada', 1, 'test')
|
|
`)
|
|
if err != nil {
|
|
t.Fatal("Failed to insert test data:", err)
|
|
}
|
|
|
|
// Search for airlines
|
|
airlines, err := manager.SearchAirlines("Test")
|
|
if err != nil {
|
|
t.Fatal("SearchAirlines failed:", err)
|
|
}
|
|
|
|
found := false
|
|
for _, airline := range airlines {
|
|
if airline.Name == "Test Airways" {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
t.Error("Expected to find Test Airways in search results")
|
|
}
|
|
|
|
t.Logf("Found %d airlines matching 'Test'", len(airlines))
|
|
}
|
|
|
|
func TestCallsignManager_GetAirlinesByCountry(t *testing.T) {
|
|
db, cleanup := setupTestDatabase(t)
|
|
defer cleanup()
|
|
|
|
manager := NewCallsignManager(db.GetConnection())
|
|
|
|
// Insert test airline data
|
|
conn := db.GetConnection()
|
|
_, err := conn.Exec(`
|
|
INSERT INTO airlines (id, name, alias, iata_code, icao_code, callsign, country, active, data_source)
|
|
VALUES (1, 'US Airways', 'US', 'US', 'USA', 'USAIR', 'United States', 1, 'test'),
|
|
(2, 'Canada Air', 'CA', 'CA', 'CAN', 'CANAIR', 'Canada', 1, 'test')
|
|
`)
|
|
if err != nil {
|
|
t.Fatal("Failed to insert test data:", err)
|
|
}
|
|
|
|
// Get airlines by country
|
|
airlines, err := manager.GetAirlinesByCountry("United States")
|
|
if err != nil {
|
|
t.Fatal("GetAirlinesByCountry failed:", err)
|
|
}
|
|
|
|
found := false
|
|
for _, airline := range airlines {
|
|
if airline.Name == "US Airways" {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
t.Error("Expected to find US Airways for United States")
|
|
}
|
|
|
|
t.Logf("Found %d airlines in United States", len(airlines))
|
|
}
|
|
|
|
func TestCallsignParseResult_Struct(t *testing.T) {
|
|
result := &CallsignParseResult{
|
|
OriginalCallsign: "UAL123",
|
|
AirlineCode: "UAL",
|
|
FlightNumber: "123",
|
|
IsValid: true,
|
|
}
|
|
|
|
// Test that all fields are accessible
|
|
if result.OriginalCallsign != "UAL123" {
|
|
t.Error("OriginalCallsign field not preserved")
|
|
}
|
|
if result.AirlineCode != "UAL" {
|
|
t.Error("AirlineCode field not preserved")
|
|
}
|
|
if result.FlightNumber != "123" {
|
|
t.Error("FlightNumber field not preserved")
|
|
}
|
|
if !result.IsValid {
|
|
t.Error("IsValid field not preserved")
|
|
}
|
|
} |