| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 | package nginx_logimport (	"sync/atomic"	"testing"	"time"	"github.com/0xJacky/Nginx-UI/internal/nginx_log/indexer")// TestTaskRecoveryGlobalStatusManagement tests the global status management in task recoveryfunc TestTaskRecoveryGlobalStatusManagement(t *testing.T) {	// Create a mock task recovery instance	tr := &TaskRecovery{		activeTasks: 0,	}	// Test initial state	if atomic.LoadInt32(&tr.activeTasks) != 0 {		t.Errorf("Expected initial active tasks to be 0, got %d", atomic.LoadInt32(&tr.activeTasks))	}	// Test incrementing active tasks	firstTask := atomic.AddInt32(&tr.activeTasks, 1)	if firstTask != 1 {		t.Errorf("Expected first task counter to be 1, got %d", firstTask)	}	// Test adding more tasks	secondTask := atomic.AddInt32(&tr.activeTasks, 1)	if secondTask != 2 {		t.Errorf("Expected second task counter to be 2, got %d", secondTask)	}	// Test decrementing tasks	afterFirst := atomic.AddInt32(&tr.activeTasks, -1)	if afterFirst != 1 {		t.Errorf("Expected counter after completing first task to be 1, got %d", afterFirst)	}	// Test final task completion	afterLast := atomic.AddInt32(&tr.activeTasks, -1)	if afterLast != 0 {		t.Errorf("Expected counter after completing last task to be 0, got %d", afterLast)	}}// TestNeedsRecovery tests the logic for determining if a task needs recoveryfunc TestNeedsRecovery(t *testing.T) {	tr := &TaskRecovery{}	testCases := []struct {		name      string		log       *NginxLogWithIndex		expected  bool	}{		{			name: "Indexing status needs recovery",			log: &NginxLogWithIndex{				Path:        "/test/access.log",				IndexStatus: string(indexer.IndexStatusIndexing),			},			expected: true,		},		{			name: "Queued status needs recovery",			log: &NginxLogWithIndex{				Path:        "/test/access.log",				IndexStatus: string(indexer.IndexStatusQueued),			},			expected: true,		},		{			name: "Recent error needs recovery",			log: &NginxLogWithIndex{				Path:        "/test/access.log",				IndexStatus: string(indexer.IndexStatusError),				LastIndexed: time.Now().Add(-30 * time.Minute).Unix(), // 30 minutes ago			},			expected: true,		},		{			name: "Old error does not need recovery",			log: &NginxLogWithIndex{				Path:        "/test/access.log",				IndexStatus: string(indexer.IndexStatusError),				LastIndexed: time.Now().Add(-2 * time.Hour).Unix(), // 2 hours ago			},			expected: false,		},		{			name: "Indexed status does not need recovery",			log: &NginxLogWithIndex{				Path:        "/test/access.log",				IndexStatus: string(indexer.IndexStatusIndexed),			},			expected: false,		},		{			name: "Not indexed status does not need recovery",			log: &NginxLogWithIndex{				Path:        "/test/access.log",				IndexStatus: string(indexer.IndexStatusNotIndexed),			},			expected: false,		},	}	for _, tc := range testCases {		t.Run(tc.name, func(t *testing.T) {			result := tr.needsRecovery(tc.log)			if result != tc.expected {				t.Errorf("Expected needsRecovery to return %t, got %t for %s", tc.expected, result, tc.name)			}		})	}}// TestTaskRecoveryProgressConfig tests that progress configuration is properly createdfunc TestTaskRecoveryProgressConfig(t *testing.T) {	// This test ensures that the progress config created in executeRecoveredTask	// has the proper structure and callbacks		progressCallbackCalled := false	completionCallbackCalled := false		// Create a mock progress config similar to what's created in executeRecoveredTask	progressConfig := &indexer.ProgressConfig{		NotifyInterval: 1 * time.Second,		OnProgress: func(progress indexer.ProgressNotification) {			progressCallbackCalled = true		},		OnCompletion: func(completion indexer.CompletionNotification) {			completionCallbackCalled = true		},	}	// Test that config is properly initialized	if progressConfig.NotifyInterval != 1*time.Second {		t.Errorf("Expected notify interval to be 1 second, got %v", progressConfig.NotifyInterval)	}	if progressConfig.OnProgress == nil {		t.Error("Expected OnProgress callback to be set")	}	if progressConfig.OnCompletion == nil {		t.Error("Expected OnCompletion callback to be set")	}	// Test callback execution	if progressConfig.OnProgress != nil {		progressConfig.OnProgress(indexer.ProgressNotification{})	}	if progressConfig.OnCompletion != nil {		progressConfig.OnCompletion(indexer.CompletionNotification{})	}	if !progressCallbackCalled {		t.Error("Progress callback was not called")	}	if !completionCallbackCalled {		t.Error("Completion callback was not called")	}}
 |