package storage_test import ( "testing" "github.com/jfraeys/fetch_ml/internal/storage" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) // TestTaskIsSharedWithUser tests the task sharing check func TestTaskIsSharedWithUser(t *testing.T) { t.Parallel() db := setupTestDB(t) // Create a job job := &storage.Job{ ID: "share-task-job", Status: "pending", Datasets: []string{}, Metadata: map[string]string{}, } require.NoError(t, db.CreateJob(job)) // Test without share - should return false result := db.TaskIsSharedWithUser("share-task-job", "user-1") assert.False(t, result, "Task should not be shared initially") } // TestUserSharesGroupWithTask tests group-based task access func TestUserSharesGroupWithTask(t *testing.T) { t.Parallel() db := setupTestDB(t) // Create a job job := &storage.Job{ ID: "group-task-job", Status: "pending", Datasets: []string{}, Metadata: map[string]string{}, } require.NoError(t, db.CreateJob(job)) // Without group association - should return false result := db.UserSharesGroupWithTask("user-1", "group-task-job") assert.False(t, result, "User should not share group without association") } // TestTaskAllowsPublicClone tests public clone permission check func TestTaskAllowsPublicClone(t *testing.T) { t.Parallel() db := setupTestDB(t) // For nonexistent tasks, should return false result := db.TaskAllowsPublicClone("nonexistent-task") assert.False(t, result, "Nonexistent task should not allow public clone") } // TestAssociateTaskWithGroup tests task group association func TestAssociateTaskWithGroup(t *testing.T) { t.Parallel() db := setupTestDB(t) // Create a job job := &storage.Job{ ID: "assoc-task-job", Status: "pending", Datasets: []string{}, Metadata: map[string]string{}, } require.NoError(t, db.CreateJob(job)) // Test association - may fail if table doesn't exist in test schema err := db.AssociateTaskWithGroup("assoc-task-job", "group-1") if err != nil { t.Logf("Association failed (expected if task_group_access table not in schema): %v", err) } } // TestCountOpenTasksForUserToday tests the daily task count func TestCountOpenTasksForUserToday(t *testing.T) { t.Parallel() db := setupTestDB(t) // May error if user_id column not in schema count, err := db.CountOpenTasksForUserToday("test-user") if err != nil { t.Logf("Count failed (expected if user_id column not in schema): %v", err) return } t.Logf("Open tasks count: %d", count) } // TestListTasksForUser tests task listing for a user func TestListTasksForUser(t *testing.T) { t.Parallel() db := setupTestDB(t) // Create test jobs with user_id jobs := []*storage.Job{ {ID: "user-task-1", Status: "pending"}, {ID: "user-task-2", Status: "running"}, } for _, job := range jobs { err := db.CreateJob(job) require.NoError(t, err) } // List tasks for user tasks, cursor, err := db.ListTasksForUser("test-user", false, storage.ListTasksOptions{Limit: 10}) if err != nil { t.Logf("List failed (expected if schema missing tables): %v", err) return } assert.NotNil(t, tasks) assert.Empty(t, cursor) } // TestListTasksForUserAdmin tests admin task listing func TestListTasksForUserAdmin(t *testing.T) { t.Parallel() db := setupTestDB(t) // Create test jobs for i := 0; i < 5; i++ { job := &storage.Job{ID: "admin-task-" + string(rune('a'+i)), Status: "pending"} err := db.CreateJob(job) require.NoError(t, err) } // List as admin tasks, cursor, err := db.ListTasksForUser("admin", true, storage.ListTasksOptions{Limit: 10}) if err != nil { t.Logf("List failed: %v", err) return } assert.NotNil(t, tasks) _ = cursor } // TestListTasksForGroup tests group task listing func TestListTasksForGroup(t *testing.T) { t.Parallel() db := setupTestDB(t) // Create test jobs job := &storage.Job{ID: "group-task-1", Status: "pending"} err := db.CreateJob(job) require.NoError(t, err) // List tasks for group (may error if task_group_access table doesn't exist) tasks, cursor, err := db.ListTasksForGroup("group-1", storage.ListTasksOptions{Limit: 10}) if err != nil { t.Logf("List failed (expected if task_group_access table not in schema): %v", err) return } assert.NotNil(t, tasks) _ = cursor } // TestListTasksForGroupWithPagination tests group task pagination func TestListTasksForGroupWithPagination(t *testing.T) { t.Parallel() db := setupTestDB(t) // Create test jobs for i := 0; i < 3; i++ { job := &storage.Job{ID: "group-pg-task-" + string(rune('a'+i)), Status: "pending"} err := db.CreateJob(job) require.NoError(t, err) } // List with small limit tasks, cursor, err := db.ListTasksForGroup("group-pg", storage.ListTasksOptions{Limit: 2}) if err != nil { t.Logf("List failed: %v", err) return } assert.NotNil(t, tasks) _ = cursor }