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.
		
		
		
		
		
			
		
			
				
					
					
						
							117 lines
						
					
					
						
							4.1 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							117 lines
						
					
					
						
							4.1 KiB
						
					
					
				
								package engine
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"strings"
							 | 
						|
									"testing"
							 | 
						|
								
							 | 
						|
									"github.com/stretchr/testify/assert"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								// TestPartitionPathHandling tests that partition paths are handled correctly
							 | 
						|
								// whether discoverTopicPartitions returns relative or absolute paths
							 | 
						|
								func TestPartitionPathHandling(t *testing.T) {
							 | 
						|
									engine := NewMockSQLEngine()
							 | 
						|
								
							 | 
						|
									t.Run("Mock discoverTopicPartitions returns correct paths", func(t *testing.T) {
							 | 
						|
										// Test that our mock engine handles absolute paths correctly
							 | 
						|
										engine.mockPartitions["test.user_events"] = []string{
							 | 
						|
											"/topics/test/user_events/v2025-09-03-15-36-29/0000-2520",
							 | 
						|
											"/topics/test/user_events/v2025-09-03-15-36-29/2521-5040",
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										partitions, err := engine.discoverTopicPartitions("test", "user_events")
							 | 
						|
										assert.NoError(t, err, "Should discover partitions without error")
							 | 
						|
										assert.Equal(t, 2, len(partitions), "Should return 2 partitions")
							 | 
						|
										assert.Contains(t, partitions[0], "/topics/test/user_events/", "Should contain absolute path")
							 | 
						|
									})
							 | 
						|
								
							 | 
						|
									t.Run("Mock discoverTopicPartitions handles relative paths", func(t *testing.T) {
							 | 
						|
										// Test relative paths scenario
							 | 
						|
										engine.mockPartitions["test.user_events"] = []string{
							 | 
						|
											"v2025-09-03-15-36-29/0000-2520",
							 | 
						|
											"v2025-09-03-15-36-29/2521-5040",
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										partitions, err := engine.discoverTopicPartitions("test", "user_events")
							 | 
						|
										assert.NoError(t, err, "Should discover partitions without error")
							 | 
						|
										assert.Equal(t, 2, len(partitions), "Should return 2 partitions")
							 | 
						|
										assert.True(t, !strings.HasPrefix(partitions[0], "/topics/"), "Should be relative path")
							 | 
						|
									})
							 | 
						|
								
							 | 
						|
									t.Run("Partition path building logic works correctly", func(t *testing.T) {
							 | 
						|
										topicBasePath := "/topics/test/user_events"
							 | 
						|
								
							 | 
						|
										testCases := []struct {
							 | 
						|
											name              string
							 | 
						|
											relativePartition string
							 | 
						|
											expectedPath      string
							 | 
						|
										}{
							 | 
						|
											{
							 | 
						|
												name:              "Absolute path - use as-is",
							 | 
						|
												relativePartition: "/topics/test/user_events/v2025-09-03-15-36-29/0000-2520",
							 | 
						|
												expectedPath:      "/topics/test/user_events/v2025-09-03-15-36-29/0000-2520",
							 | 
						|
											},
							 | 
						|
											{
							 | 
						|
												name:              "Relative path - build full path",
							 | 
						|
												relativePartition: "v2025-09-03-15-36-29/0000-2520",
							 | 
						|
												expectedPath:      "/topics/test/user_events/v2025-09-03-15-36-29/0000-2520",
							 | 
						|
											},
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										for _, tc := range testCases {
							 | 
						|
											t.Run(tc.name, func(t *testing.T) {
							 | 
						|
												var partitionPath string
							 | 
						|
								
							 | 
						|
												// This is the same logic from our fixed code
							 | 
						|
												if strings.HasPrefix(tc.relativePartition, "/topics/") {
							 | 
						|
													// Already a full path - use as-is
							 | 
						|
													partitionPath = tc.relativePartition
							 | 
						|
												} else {
							 | 
						|
													// Relative path - build full path
							 | 
						|
													partitionPath = topicBasePath + "/" + tc.relativePartition
							 | 
						|
												}
							 | 
						|
								
							 | 
						|
												assert.Equal(t, tc.expectedPath, partitionPath,
							 | 
						|
													"Partition path should be built correctly")
							 | 
						|
								
							 | 
						|
												// Ensure no double slashes
							 | 
						|
												assert.NotContains(t, partitionPath, "//",
							 | 
						|
													"Partition path should not contain double slashes")
							 | 
						|
											})
							 | 
						|
										}
							 | 
						|
									})
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// TestPartitionPathLogic tests the core logic for handling partition paths
							 | 
						|
								func TestPartitionPathLogic(t *testing.T) {
							 | 
						|
									t.Run("Building partition paths from discovered partitions", func(t *testing.T) {
							 | 
						|
										// Test the specific partition path building that was causing issues
							 | 
						|
								
							 | 
						|
										topicBasePath := "/topics/ecommerce/user_events"
							 | 
						|
								
							 | 
						|
										// This simulates the discoverTopicPartitions returning absolute paths (realistic scenario)
							 | 
						|
										relativePartitions := []string{
							 | 
						|
											"/topics/ecommerce/user_events/v2025-09-03-15-36-29/0000-2520",
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										// This is the code from our fix - test it directly
							 | 
						|
										partitions := make([]string, len(relativePartitions))
							 | 
						|
										for i, relPartition := range relativePartitions {
							 | 
						|
											// Handle both relative and absolute partition paths from discoverTopicPartitions
							 | 
						|
											if strings.HasPrefix(relPartition, "/topics/") {
							 | 
						|
												// Already a full path - use as-is
							 | 
						|
												partitions[i] = relPartition
							 | 
						|
											} else {
							 | 
						|
												// Relative path - build full path
							 | 
						|
												partitions[i] = topicBasePath + "/" + relPartition
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										// Verify the path was handled correctly
							 | 
						|
										expectedPath := "/topics/ecommerce/user_events/v2025-09-03-15-36-29/0000-2520"
							 | 
						|
										assert.Equal(t, expectedPath, partitions[0], "Absolute path should be used as-is")
							 | 
						|
								
							 | 
						|
										// Ensure no double slashes (this was the original bug)
							 | 
						|
										assert.NotContains(t, partitions[0], "//", "Path should not contain double slashes")
							 | 
						|
									})
							 | 
						|
								}
							 |