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.
		
		
		
		
		
			
		
			
				
					
					
						
							157 lines
						
					
					
						
							4.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							157 lines
						
					
					
						
							4.3 KiB
						
					
					
				
								package engine
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"context"
							 | 
						|
									"testing"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								func TestMockBrokerClient_BasicFunctionality(t *testing.T) {
							 | 
						|
									mockBroker := NewMockBrokerClient()
							 | 
						|
								
							 | 
						|
									// Test ListNamespaces
							 | 
						|
									namespaces, err := mockBroker.ListNamespaces(context.Background())
							 | 
						|
									if err != nil {
							 | 
						|
										t.Fatalf("Expected no error, got %v", err)
							 | 
						|
									}
							 | 
						|
									if len(namespaces) != 2 {
							 | 
						|
										t.Errorf("Expected 2 namespaces, got %d", len(namespaces))
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Test ListTopics
							 | 
						|
									topics, err := mockBroker.ListTopics(context.Background(), "default")
							 | 
						|
									if err != nil {
							 | 
						|
										t.Fatalf("Expected no error, got %v", err)
							 | 
						|
									}
							 | 
						|
									if len(topics) != 2 {
							 | 
						|
										t.Errorf("Expected 2 topics in default namespace, got %d", len(topics))
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Test GetTopicSchema
							 | 
						|
									schema, keyColumns, _, err := mockBroker.GetTopicSchema(context.Background(), "default", "user_events")
							 | 
						|
									if err != nil {
							 | 
						|
										t.Fatalf("Expected no error, got %v", err)
							 | 
						|
									}
							 | 
						|
									if len(schema.Fields) != 3 {
							 | 
						|
										t.Errorf("Expected 3 fields in user_events schema, got %d", len(schema.Fields))
							 | 
						|
									}
							 | 
						|
									if len(keyColumns) == 0 {
							 | 
						|
										t.Error("Expected at least one key column")
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func TestMockBrokerClient_FailureScenarios(t *testing.T) {
							 | 
						|
									mockBroker := NewMockBrokerClient()
							 | 
						|
								
							 | 
						|
									// Configure mock to fail
							 | 
						|
									mockBroker.SetFailure(true, "simulated broker failure")
							 | 
						|
								
							 | 
						|
									// Test that operations fail as expected
							 | 
						|
									_, err := mockBroker.ListNamespaces(context.Background())
							 | 
						|
									if err == nil {
							 | 
						|
										t.Error("Expected error when mock is configured to fail")
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									_, err = mockBroker.ListTopics(context.Background(), "default")
							 | 
						|
									if err == nil {
							 | 
						|
										t.Error("Expected error when mock is configured to fail")
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									_, _, _, err = mockBroker.GetTopicSchema(context.Background(), "default", "user_events")
							 | 
						|
									if err == nil {
							 | 
						|
										t.Error("Expected error when mock is configured to fail")
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Test that filer client also fails
							 | 
						|
									_, err = mockBroker.GetFilerClient()
							 | 
						|
									if err == nil {
							 | 
						|
										t.Error("Expected error when mock is configured to fail")
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Reset mock to working state
							 | 
						|
									mockBroker.SetFailure(false, "")
							 | 
						|
								
							 | 
						|
									// Test that operations work again
							 | 
						|
									namespaces, err := mockBroker.ListNamespaces(context.Background())
							 | 
						|
									if err != nil {
							 | 
						|
										t.Errorf("Expected no error after resetting mock, got %v", err)
							 | 
						|
									}
							 | 
						|
									if len(namespaces) == 0 {
							 | 
						|
										t.Error("Expected namespaces after resetting mock")
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func TestMockBrokerClient_TopicManagement(t *testing.T) {
							 | 
						|
									mockBroker := NewMockBrokerClient()
							 | 
						|
								
							 | 
						|
									// Test ConfigureTopic (add a new topic)
							 | 
						|
									err := mockBroker.ConfigureTopic(context.Background(), "test", "new-topic", 1, nil, []string{})
							 | 
						|
									if err != nil {
							 | 
						|
										t.Fatalf("Expected no error, got %v", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Verify the topic was added
							 | 
						|
									topics, err := mockBroker.ListTopics(context.Background(), "test")
							 | 
						|
									if err != nil {
							 | 
						|
										t.Fatalf("Expected no error, got %v", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									foundNewTopic := false
							 | 
						|
									for _, topic := range topics {
							 | 
						|
										if topic == "new-topic" {
							 | 
						|
											foundNewTopic = true
							 | 
						|
											break
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									if !foundNewTopic {
							 | 
						|
										t.Error("Expected new-topic to be in the topics list")
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Test DeleteTopic
							 | 
						|
									err = mockBroker.DeleteTopic(context.Background(), "test", "new-topic")
							 | 
						|
									if err != nil {
							 | 
						|
										t.Fatalf("Expected no error, got %v", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Verify the topic was removed
							 | 
						|
									topics, err = mockBroker.ListTopics(context.Background(), "test")
							 | 
						|
									if err != nil {
							 | 
						|
										t.Fatalf("Expected no error, got %v", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									for _, topic := range topics {
							 | 
						|
										if topic == "new-topic" {
							 | 
						|
											t.Error("Expected new-topic to be removed from topics list")
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func TestSQLEngineWithMockBrokerClient_ErrorHandling(t *testing.T) {
							 | 
						|
									// Create an engine with a failing mock broker
							 | 
						|
									mockBroker := NewMockBrokerClient()
							 | 
						|
									mockBroker.SetFailure(true, "mock broker unavailable")
							 | 
						|
								
							 | 
						|
									catalog := &SchemaCatalog{
							 | 
						|
										databases:       make(map[string]*DatabaseInfo),
							 | 
						|
										currentDatabase: "default",
							 | 
						|
										brokerClient:    mockBroker,
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									engine := &SQLEngine{catalog: catalog}
							 | 
						|
								
							 | 
						|
									// Test that queries fail gracefully with proper error messages
							 | 
						|
									result, err := engine.ExecuteSQL(context.Background(), "SELECT * FROM nonexistent_topic")
							 | 
						|
								
							 | 
						|
									// ExecuteSQL itself should not return an error, but the result should contain an error
							 | 
						|
									if err != nil {
							 | 
						|
										// If ExecuteSQL returns an error, that's also acceptable for this test
							 | 
						|
										t.Logf("ExecuteSQL returned error (acceptable): %v", err)
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Should have an error in the result when broker is unavailable
							 | 
						|
									if result.Error == nil {
							 | 
						|
										t.Error("Expected error in query result when broker is unavailable")
							 | 
						|
									} else {
							 | 
						|
										t.Logf("Got expected error in result: %v", result.Error)
							 | 
						|
									}
							 | 
						|
								}
							 |