package lang import ( "testing" ) func TestServerWithEnvironmentVariables(t *testing.T) { input := ` server MyApp { host env "HOST" default "localhost" port env "PORT" default "8080" database_url env "DATABASE_URL" required api_key env "API_SECRET_KEY" required } ` ast, err := ParseInput(input) if err != nil { t.Fatalf("Parse error: %v", err) } if len(ast.Definitions) != 1 { t.Fatalf("Expected 1 definition, got %d", len(ast.Definitions)) } server := ast.Definitions[0].Server if server == nil { t.Fatalf("Expected server definition") } if server.Name != "MyApp" { t.Errorf("Expected server name 'MyApp', got '%s'", server.Name) } if len(server.Settings) != 4 { t.Fatalf("Expected 4 settings, got %d", len(server.Settings)) } // Test host setting hostSetting := server.Settings[0] if hostSetting.Host == nil { t.Fatalf("Expected host setting") } if hostSetting.Host.EnvVar == nil { t.Fatalf("Expected host to be environment variable") } if hostSetting.Host.EnvVar.Name != "HOST" { t.Errorf("Expected env var name 'HOST', got '%s'", hostSetting.Host.EnvVar.Name) } if hostSetting.Host.EnvVar.Default == nil || *hostSetting.Host.EnvVar.Default != "localhost" { t.Errorf("Expected default 'localhost'") } // Test port setting portSetting := server.Settings[1] if portSetting.Port == nil { t.Fatalf("Expected port setting") } if portSetting.Port.EnvVar == nil { t.Fatalf("Expected port to be environment variable") } if portSetting.Port.EnvVar.Name != "PORT" { t.Errorf("Expected env var name 'PORT', got '%s'", portSetting.Port.EnvVar.Name) } if portSetting.Port.EnvVar.Default == nil || *portSetting.Port.EnvVar.Default != "8080" { t.Errorf("Expected default '8080'") } // Test required database_url dbSetting := server.Settings[2] if dbSetting.DatabaseURL == nil { t.Fatalf("Expected database_url setting") } if dbSetting.DatabaseURL.EnvVar == nil { t.Fatalf("Expected database_url to be environment variable") } if !dbSetting.DatabaseURL.EnvVar.Required { t.Errorf("Expected database_url to be required") } // Test required api_key apiSetting := server.Settings[3] if apiSetting.APIKey == nil { t.Fatalf("Expected api_key setting") } if apiSetting.APIKey.EnvVar == nil { t.Fatalf("Expected api_key to be environment variable") } if !apiSetting.APIKey.EnvVar.Required { t.Errorf("Expected api_key to be required") } } func TestServerWithMixedValues(t *testing.T) { input := ` server MyApp { host "localhost" port env "PORT" default "8080" database_url env "DATABASE_URL" required } ` ast, err := ParseInput(input) if err != nil { t.Fatalf("Parse error: %v", err) } server := ast.Definitions[0].Server if server == nil { t.Fatalf("Expected server definition") } // Test literal host hostSetting := server.Settings[0] if hostSetting.Host == nil { t.Fatalf("Expected host setting") } if hostSetting.Host.Literal == nil { t.Fatalf("Expected host to be literal value") } if *hostSetting.Host.Literal != "localhost" { t.Errorf("Expected literal value 'localhost', got '%s'", *hostSetting.Host.Literal) } // Test env port portSetting := server.Settings[1] if portSetting.Port == nil { t.Fatalf("Expected port setting") } if portSetting.Port.EnvVar == nil { t.Fatalf("Expected port to be environment variable") } } func TestServerWithLiteralPort(t *testing.T) { input := ` server MyApp { host "localhost" port 8080 } ` ast, err := ParseInput(input) if err != nil { t.Fatalf("Parse error: %v", err) } server := ast.Definitions[0].Server portSetting := server.Settings[1] if portSetting.Port == nil { t.Fatalf("Expected port setting") } if portSetting.Port.Literal == nil { t.Fatalf("Expected port to be literal value") } if *portSetting.Port.Literal != 8080 { t.Errorf("Expected literal port 8080, got %d", *portSetting.Port.Literal) } } func TestServerConfigurationsInAnyOrder(t *testing.T) { // Test that server settings can be defined in any order tests := []struct { name string input string }{ { name: "host first, then port", input: ` server MyApp { host "localhost" port 8080 }`, }, { name: "port first, then host", input: ` server MyApp { port 8080 host "localhost" }`, }, { name: "mixed literal and env vars in random order", input: ` server MyApp { api_key env "API_KEY" required host "localhost" database_url env "DATABASE_URL" default "postgres://localhost:5432/myapp" port 8080 ssl_cert env "SSL_CERT" required }`, }, { name: "all env vars in different order", input: ` server MyApp { ssl_key env "SSL_KEY" required port env "PORT" default "8080" database_url env "DATABASE_URL" required host env "HOST" default "localhost" api_key env "API_KEY" required ssl_cert env "SSL_CERT" required }`, }, { name: "all literal values in different order", input: ` server MyApp { database_url "postgres://localhost:5432/myapp" port 3000 ssl_key "/path/to/ssl.key" host "0.0.0.0" api_key "secret123" ssl_cert "/path/to/ssl.crt" }`, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ast, err := ParseInput(tt.input) if err != nil { t.Fatalf("Parse error for %s: %v", tt.name, err) } if len(ast.Definitions) != 1 { t.Fatalf("Expected 1 definition, got %d", len(ast.Definitions)) } server := ast.Definitions[0].Server if server == nil { t.Fatalf("Expected server definition") } if server.Name != "MyApp" { t.Errorf("Expected server name 'MyApp', got '%s'", server.Name) } // Verify that we can parse any number of settings in any order if len(server.Settings) < 1 { t.Fatalf("Expected at least 1 setting, got %d", len(server.Settings)) } // Test that we can access specific settings regardless of order var hasHost, hasPort bool for _, setting := range server.Settings { if setting.Host != nil { hasHost = true } if setting.Port != nil { hasPort = true } } // For the first two tests, verify both host and port are present if tt.name == "host first, then port" || tt.name == "port first, then host" { if !hasHost { t.Errorf("Expected to find host setting") } if !hasPort { t.Errorf("Expected to find port setting") } } t.Logf("Successfully parsed %d settings for test '%s'", len(server.Settings), tt.name) }) } } func TestServerConfigurationValidation(t *testing.T) { // Test that we can properly validate different configurations input := ` server ProductionApp { ssl_cert env "SSL_CERT_PATH" required database_url env "DATABASE_URL" required host env "HOST" default "0.0.0.0" api_key env "SECRET_API_KEY" required port env "PORT" default "443" ssl_key env "SSL_KEY_PATH" required } ` ast, err := ParseInput(input) if err != nil { t.Fatalf("Parse error: %v", err) } server := ast.Definitions[0].Server if server.Name != "ProductionApp" { t.Errorf("Expected server name 'ProductionApp', got '%s'", server.Name) } // Create a map to easily check for specific settings settingsMap := make(map[string]interface{}) for _, setting := range server.Settings { if setting.Host != nil { settingsMap["host"] = setting.Host } if setting.Port != nil { settingsMap["port"] = setting.Port } if setting.DatabaseURL != nil { settingsMap["database_url"] = setting.DatabaseURL } if setting.APIKey != nil { settingsMap["api_key"] = setting.APIKey } if setting.SSLCert != nil { settingsMap["ssl_cert"] = setting.SSLCert } if setting.SSLKey != nil { settingsMap["ssl_key"] = setting.SSLKey } } // Verify all expected settings are present expectedSettings := []string{"host", "port", "database_url", "api_key", "ssl_cert", "ssl_key"} for _, expected := range expectedSettings { if _, exists := settingsMap[expected]; !exists { t.Errorf("Expected to find setting '%s'", expected) } } // Verify host has default value if hostSetting, ok := settingsMap["host"].(*ConfigValue); ok { if hostSetting.EnvVar == nil { t.Errorf("Expected host to be environment variable") } else if hostSetting.EnvVar.Default == nil || *hostSetting.EnvVar.Default != "0.0.0.0" { t.Errorf("Expected host default to be '0.0.0.0'") } } // Verify ssl_cert is required if sslCertSetting, ok := settingsMap["ssl_cert"].(*ConfigValue); ok { if sslCertSetting.EnvVar == nil { t.Errorf("Expected ssl_cert to be environment variable") } else if !sslCertSetting.EnvVar.Required { t.Errorf("Expected ssl_cert to be required") } } }