Files
wehub-resource-sync 75f3dd141c
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CI and Release / lint-frontend (push) Has been cancelled
CI and Release / dockerfile-scan (push) Has been cancelled
CI and Release / test-frontend (push) Has been cancelled
CI and Release / lint-verification-agent (push) Has been cancelled
CI and Release / test-verification-agent (push) Has been cancelled
CI and Release / e2e-verification-agent (push) Has been cancelled
CI and Release / test-backend (push) Has been cancelled
CI and Release / build-dev-image (push) Has been cancelled
CI and Release / push-dev-image (push) Has been cancelled
CI and Release / build-image (push) Has been cancelled
CI and Release / build-verification-image (push) Has been cancelled
CI and Release / determine-version (push) Has been cancelled
CI and Release / push-image (push) Has been cancelled
CI and Release / push-verification-image (12) (push) Has been cancelled
CI and Release / lint-backend (push) Has been cancelled
CI and Release / push-verification-image (17) (push) Has been cancelled
CI and Release / push-verification-image (18) (push) Has been cancelled
CI and Release / release (push) Has been cancelled
CI and Release / publish-helm-chart (push) Has been cancelled
CI and Release / push-verification-image (13) (push) Has been cancelled
CI and Release / push-verification-image (14) (push) Has been cancelled
CI and Release / push-verification-image (15) (push) Has been cancelled
CI and Release / push-verification-image (16) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:11:07 +08:00

566 lines
22 KiB
Go

package verification_runs
import (
"encoding/json"
"net/http"
"testing"
"time"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"databasus-backend/internal/features/audit_logs"
backuping_logical "databasus-backend/internal/features/backups/backups/backuping/logical"
backups_controllers_logical "databasus-backend/internal/features/backups/backups/controllers/logical"
"databasus-backend/internal/features/databases"
"databasus-backend/internal/features/notifiers"
"databasus-backend/internal/features/storages"
users_enums "databasus-backend/internal/features/users/enums"
users_middleware "databasus-backend/internal/features/users/middleware"
users_services "databasus-backend/internal/features/users/services"
users_testing "databasus-backend/internal/features/users/testing"
verification_agents "databasus-backend/internal/features/verification/agents"
verification_config "databasus-backend/internal/features/verification/config"
workspaces_controllers "databasus-backend/internal/features/workspaces/controllers"
workspaces_testing "databasus-backend/internal/features/workspaces/testing"
"databasus-backend/internal/storage"
test_utils "databasus-backend/internal/util/testing"
)
func createTestRouter() *gin.Engine {
gin.SetMode(gin.TestMode)
router := gin.New()
v1 := router.Group("/api/v1")
protected := v1.Group("").Use(users_middleware.AuthMiddleware(users_services.GetUserService()))
if routerGroup, ok := protected.(*gin.RouterGroup); ok {
workspaces_controllers.GetWorkspaceController().RegisterRoutes(routerGroup)
workspaces_controllers.GetMembershipController().RegisterRoutes(routerGroup)
databases.GetDatabaseController().RegisterRoutes(routerGroup)
backups_controllers_logical.GetBackupController().RegisterRoutes(routerGroup)
GetVerificationController().RegisterRoutes(routerGroup)
verification_agents.GetAgentController().RegisterRoutes(routerGroup)
verification_config.GetVerificationConfigController().RegisterRoutes(routerGroup)
}
verification_agents.GetAgentFacingController().RegisterRoutes(v1)
GetVerificationAgentController().RegisterRoutes(v1)
audit_logs.SetupDependencies()
verification_config.SetupDependencies()
SetupDependencies()
return router
}
func Test_EnqueueManualVerification_AsOwner_CreatesPendingRow(t *testing.T) {
router := createTestRouter()
owner := users_testing.CreateTestUser(users_enums.UserRoleMember)
workspace := workspaces_testing.CreateTestWorkspace("ws "+uuid.New().String(), owner, router)
defer workspaces_testing.RemoveTestWorkspace(workspace, router)
testStorage := storages.CreateTestStorage(workspace.ID)
defer storages.RemoveTestStorage(testStorage.ID)
notifier := notifiers.CreateTestNotifier(workspace.ID)
defer notifiers.RemoveTestNotifier(notifier)
database := databases.CreateTestDatabase(workspace.ID, testStorage, notifier)
defer databases.RemoveTestDatabase(database)
backup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 500)
var verification RestoreVerification
test_utils.MakePostRequestAndUnmarshal(
t, router,
"/api/v1/verifications/enqueue",
"Bearer "+owner.Token,
EnqueueManualRequest{BackupID: backup.ID},
http.StatusOK, &verification,
)
assert.Equal(t, VerificationStatusPending, verification.Status)
assert.Equal(t, VerificationTriggerManual, verification.Trigger)
assert.Equal(t, backup.ID, verification.BackupID)
assert.Equal(t, database.ID, verification.DatabaseID)
assert.Equal(t, 1, verification.AttemptCount)
assert.Nil(t, verification.AgentID)
}
func Test_EnqueueManualVerification_WhenManualPendingExists_Returns400(t *testing.T) {
router := createTestRouter()
owner := users_testing.CreateTestUser(users_enums.UserRoleMember)
workspace := workspaces_testing.CreateTestWorkspace("ws "+uuid.New().String(), owner, router)
defer workspaces_testing.RemoveTestWorkspace(workspace, router)
testStorage := storages.CreateTestStorage(workspace.ID)
defer storages.RemoveTestStorage(testStorage.ID)
notifier := notifiers.CreateTestNotifier(workspace.ID)
defer notifiers.RemoveTestNotifier(notifier)
database := databases.CreateTestDatabase(workspace.ID, testStorage, notifier)
defer databases.RemoveTestDatabase(database)
firstBackup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 100)
secondBackup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 200)
var firstVerification RestoreVerification
test_utils.MakePostRequestAndUnmarshal(
t, router, "/api/v1/verifications/enqueue", "Bearer "+owner.Token,
EnqueueManualRequest{BackupID: firstBackup.ID},
http.StatusOK, &firstVerification,
)
resp := test_utils.MakePostRequest(
t, router, "/api/v1/verifications/enqueue", "Bearer "+owner.Token,
EnqueueManualRequest{BackupID: secondBackup.ID},
http.StatusBadRequest,
)
assert.Contains(t, string(resp.Body), "please cancel it first")
firstAfter := GetVerificationByIDViaAPI(t, router, owner.Token, firstVerification.ID)
assert.Equal(t, VerificationStatusPending, firstAfter.Status,
"first manual verification must remain PENDING — the second enqueue was rejected, not a displacement")
rows := ListVerificationsByDatabaseViaAPI(t, router, owner.Token, database.ID)
assert.Len(t, rows, 1, "rejected enqueue must not create a second row")
}
func Test_EnqueueManualVerification_WhenRunningExists_Returns400(t *testing.T) {
router := createTestRouter()
owner := users_testing.CreateTestUser(users_enums.UserRoleAdmin)
workspace := workspaces_testing.CreateTestWorkspace("ws "+uuid.New().String(), owner, router)
defer workspaces_testing.RemoveTestWorkspace(workspace, router)
testStorage := storages.CreateTestStorage(workspace.ID)
defer storages.RemoveTestStorage(testStorage.ID)
notifier := notifiers.CreateTestNotifier(workspace.ID)
defer notifiers.RemoveTestNotifier(notifier)
database := databases.CreateTestDatabase(workspace.ID, testStorage, notifier)
defer databases.RemoveTestDatabase(database)
backup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 100)
agent := verification_agents.CreateTestVerificationAgent(t, router, owner.Token, "running-"+uuid.New().String())
defer verification_agents.RemoveTestVerificationAgent(t, router, owner.Token, agent.Agent.ID)
EnqueueManualVerificationViaAPI(t, router, owner.Token, backup.ID)
ClaimVerificationViaAPI(
t, router, agent.Agent.ID, agent.Token,
AgentCapacity{MaxCPU: 4, MaxRAMMb: 4096, MaxDiskGb: 50, MaxConcurrentJobs: 2},
)
resp := test_utils.MakePostRequest(
t, router, "/api/v1/verifications/enqueue", "Bearer "+owner.Token,
EnqueueManualRequest{BackupID: backup.ID},
http.StatusBadRequest,
)
assert.Contains(t, string(resp.Body), "please cancel it first")
}
func Test_EnqueueManualVerification_WhenScheduledNonTerminalExists_DoesNotDisplaceIt(t *testing.T) {
router := createTestRouter()
owner := users_testing.CreateTestUser(users_enums.UserRoleMember)
workspace := workspaces_testing.CreateTestWorkspace("ws "+uuid.New().String(), owner, router)
defer workspaces_testing.RemoveTestWorkspace(workspace, router)
testStorage := storages.CreateTestStorage(workspace.ID)
defer storages.RemoveTestStorage(testStorage.ID)
notifier := notifiers.CreateTestNotifier(workspace.ID)
defer notifiers.RemoveTestNotifier(notifier)
database := databases.CreateTestDatabase(workspace.ID, testStorage, notifier)
defer databases.RemoveTestDatabase(database)
backup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 100)
scheduledRow := &RestoreVerification{
ID: uuid.New(),
DatabaseID: database.ID,
BackupID: backup.ID,
Trigger: VerificationTriggerScheduled,
Status: VerificationStatusPending,
AttemptCount: 1,
CreatedAt: time.Now().UTC(),
}
require.NoError(t, storage.GetDb().Create(scheduledRow).Error)
var manualVerification RestoreVerification
test_utils.MakePostRequestAndUnmarshal(
t, router, "/api/v1/verifications/enqueue", "Bearer "+owner.Token,
EnqueueManualRequest{BackupID: backup.ID},
http.StatusOK, &manualVerification,
)
scheduledAfter := GetVerificationByIDViaAPI(t, router, owner.Token, scheduledRow.ID)
assert.Equal(
t,
VerificationStatusPending,
scheduledAfter.Status,
"scheduled row must not be displaced by a manual enqueue",
)
assert.Equal(t, VerificationTriggerScheduled, scheduledAfter.Trigger)
manualAfter := GetVerificationByIDViaAPI(t, router, owner.Token, manualVerification.ID)
assert.Equal(t, VerificationStatusPending, manualAfter.Status)
assert.Equal(t, VerificationTriggerManual, manualAfter.Trigger)
rows := ListVerificationsByDatabaseViaAPI(t, router, owner.Token, database.ID)
require.Len(t, rows, 2, "exactly one scheduled and one manual non-terminal row should coexist")
var manualCount, scheduledCount int
for _, row := range rows {
switch row.Trigger {
case VerificationTriggerManual:
manualCount++
case VerificationTriggerScheduled:
scheduledCount++
}
}
assert.Equal(t, 1, manualCount)
assert.Equal(t, 1, scheduledCount)
}
func Test_EnqueueManualVerification_AsNonWorkspaceMember_ReturnsForbidden(t *testing.T) {
router := createTestRouter()
owner := users_testing.CreateTestUser(users_enums.UserRoleMember)
workspace := workspaces_testing.CreateTestWorkspace("ws "+uuid.New().String(), owner, router)
defer workspaces_testing.RemoveTestWorkspace(workspace, router)
testStorage := storages.CreateTestStorage(workspace.ID)
defer storages.RemoveTestStorage(testStorage.ID)
notifier := notifiers.CreateTestNotifier(workspace.ID)
defer notifiers.RemoveTestNotifier(notifier)
database := databases.CreateTestDatabase(workspace.ID, testStorage, notifier)
defer databases.RemoveTestDatabase(database)
backup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 100)
outsider := users_testing.CreateTestUser(users_enums.UserRoleMember)
resp := test_utils.MakePostRequest(
t, router, "/api/v1/verifications/enqueue", "Bearer "+outsider.Token,
EnqueueManualRequest{BackupID: backup.ID},
http.StatusBadRequest,
)
assert.Contains(t, string(resp.Body), "insufficient permissions")
}
func Test_GetVerificationByID_ReturnsTableStats_WhileListByDatabaseOmitsThem(t *testing.T) {
router := createTestRouter()
owner := users_testing.CreateTestUser(users_enums.UserRoleAdmin)
workspace := workspaces_testing.CreateTestWorkspace("ws "+uuid.New().String(), owner, router)
defer workspaces_testing.RemoveTestWorkspace(workspace, router)
testStorage := storages.CreateTestStorage(workspace.ID)
defer storages.RemoveTestStorage(testStorage.ID)
notifier := notifiers.CreateTestNotifier(workspace.ID)
defer notifiers.RemoveTestNotifier(notifier)
database := databases.CreateTestDatabase(workspace.ID, testStorage, notifier)
defer databases.RemoveTestDatabase(database)
backup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 100)
agent := verification_agents.CreateTestVerificationAgent(t, router, owner.Token, "stats-"+uuid.New().String())
defer verification_agents.RemoveTestVerificationAgent(t, router, owner.Token, agent.Agent.ID)
EnqueueManualVerificationViaAPI(t, router, owner.Token, backup.ID)
assignment := ClaimVerificationViaAPI(
t, router, agent.Agent.ID, agent.Token,
AgentCapacity{MaxCPU: 4, MaxRAMMb: 4096, MaxDiskGb: 50, MaxConcurrentJobs: 2},
)
test_utils.MakePostRequest(
t, router,
"/api/v1/agent/verifications/"+agent.Agent.ID.String()+"/"+assignment.VerificationID.String()+"/report",
"Bearer "+agent.Token,
ReportRequest{
Status: VerificationStatusCompleted,
TableStats: []ReportTableStat{
{SchemaName: "public", Name: "users", RowCount: 42},
},
},
http.StatusNoContent,
)
detail := GetVerificationByIDViaAPI(t, router, owner.Token, assignment.VerificationID)
require.Len(t, detail.TableStats, 1)
assert.Equal(t, "users", detail.TableStats[0].Name)
assert.Equal(t, int64(42), detail.TableStats[0].RowCount)
listResponse := test_utils.MakeGetRequest(
t, router,
"/api/v1/verifications/by-database/"+database.ID.String(),
"Bearer "+owner.Token,
http.StatusOK,
)
var listed struct {
Verifications []map[string]any `json:"verifications"`
}
require.NoError(t, json.Unmarshal(listResponse.Body, &listed))
require.Len(t, listed.Verifications, 1)
_, hasTableStats := listed.Verifications[0]["tableStats"]
assert.False(t, hasTableStats, "list endpoint must not include tableStats")
}
func Test_ListVerificationsByDatabase_WithLimit_CapsRowsAndReturnsTotal(t *testing.T) {
router := createTestRouter()
owner := users_testing.CreateTestUser(users_enums.UserRoleAdmin)
workspace := workspaces_testing.CreateTestWorkspace("ws "+uuid.New().String(), owner, router)
defer workspaces_testing.RemoveTestWorkspace(workspace, router)
testStorage := storages.CreateTestStorage(workspace.ID)
defer storages.RemoveTestStorage(testStorage.ID)
notifier := notifiers.CreateTestNotifier(workspace.ID)
defer notifiers.RemoveTestNotifier(notifier)
database := databases.CreateTestDatabase(workspace.ID, testStorage, notifier)
defer databases.RemoveTestDatabase(database)
backup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 100)
for range 3 {
verification := EnqueueManualVerificationViaAPI(t, router, owner.Token, backup.ID)
CancelVerificationViaAPI(t, router, owner.Token, verification.ID)
}
var page GetVerificationsResponse
test_utils.MakeGetRequestAndUnmarshal(
t, router,
"/api/v1/verifications/by-database/"+database.ID.String()+"?limit=2&offset=0",
"Bearer "+owner.Token,
http.StatusOK,
&page,
)
assert.Len(t, page.Verifications, 2)
assert.Equal(t, int64(3), page.Total)
assert.Equal(t, 2, page.Limit)
assert.Equal(t, 0, page.Offset)
}
func Test_CancelVerification_AsOwner_FlipsToCanceled(t *testing.T) {
router := createTestRouter()
owner := users_testing.CreateTestUser(users_enums.UserRoleMember)
workspace := workspaces_testing.CreateTestWorkspace("ws "+uuid.New().String(), owner, router)
defer workspaces_testing.RemoveTestWorkspace(workspace, router)
testStorage := storages.CreateTestStorage(workspace.ID)
defer storages.RemoveTestStorage(testStorage.ID)
notifier := notifiers.CreateTestNotifier(workspace.ID)
defer notifiers.RemoveTestNotifier(notifier)
database := databases.CreateTestDatabase(workspace.ID, testStorage, notifier)
defer databases.RemoveTestDatabase(database)
backup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 100)
enqueued := EnqueueManualVerificationViaAPI(t, router, owner.Token, backup.ID)
CancelVerificationViaAPI(t, router, owner.Token, enqueued.ID)
canceled := GetVerificationByIDViaAPI(t, router, owner.Token, enqueued.ID)
assert.Equal(t, VerificationStatusCanceled, canceled.Status)
require.NotNil(t, canceled.FinishedAt)
require.NotNil(t, canceled.FailMessage)
assert.Contains(t, *canceled.FailMessage, "by user")
}
func Test_CancelVerification_WhenAlreadyCompleted_Returns400(t *testing.T) {
router := createTestRouter()
owner := users_testing.CreateTestUser(users_enums.UserRoleAdmin)
workspace := workspaces_testing.CreateTestWorkspace("ws "+uuid.New().String(), owner, router)
defer workspaces_testing.RemoveTestWorkspace(workspace, router)
testStorage := storages.CreateTestStorage(workspace.ID)
defer storages.RemoveTestStorage(testStorage.ID)
notifier := notifiers.CreateTestNotifier(workspace.ID)
defer notifiers.RemoveTestNotifier(notifier)
database := databases.CreateTestDatabase(workspace.ID, testStorage, notifier)
defer databases.RemoveTestDatabase(database)
backup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 100)
agent := verification_agents.CreateTestVerificationAgent(
t,
router,
owner.Token,
"cancel-completed-"+uuid.New().String(),
)
defer verification_agents.RemoveTestVerificationAgent(t, router, owner.Token, agent.Agent.ID)
EnqueueManualVerificationViaAPI(t, router, owner.Token, backup.ID)
assignment := ClaimVerificationViaAPI(
t, router, agent.Agent.ID, agent.Token,
AgentCapacity{MaxCPU: 4, MaxRAMMb: 4096, MaxDiskGb: 50, MaxConcurrentJobs: 2},
)
test_utils.MakePostRequest(
t, router,
"/api/v1/agent/verifications/"+agent.Agent.ID.String()+"/"+assignment.VerificationID.String()+"/report",
"Bearer "+agent.Token,
ReportRequest{Status: VerificationStatusCompleted, PgRestoreExitCode: new(int)},
http.StatusNoContent,
)
resp := test_utils.MakePostRequest(
t, router,
"/api/v1/verifications/"+assignment.VerificationID.String()+"/cancel",
"Bearer "+owner.Token,
nil,
http.StatusBadRequest,
)
assert.Contains(t, string(resp.Body), "not cancellable")
final := GetVerificationByIDViaAPI(t, router, owner.Token, assignment.VerificationID)
assert.Equal(t, VerificationStatusCompleted, final.Status)
}
func Test_CancelVerification_AsNonWorkspaceMember_ReturnsForbidden(t *testing.T) {
router := createTestRouter()
owner := users_testing.CreateTestUser(users_enums.UserRoleMember)
workspace := workspaces_testing.CreateTestWorkspace("ws "+uuid.New().String(), owner, router)
defer workspaces_testing.RemoveTestWorkspace(workspace, router)
testStorage := storages.CreateTestStorage(workspace.ID)
defer storages.RemoveTestStorage(testStorage.ID)
notifier := notifiers.CreateTestNotifier(workspace.ID)
defer notifiers.RemoveTestNotifier(notifier)
database := databases.CreateTestDatabase(workspace.ID, testStorage, notifier)
defer databases.RemoveTestDatabase(database)
backup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 100)
enqueued := EnqueueManualVerificationViaAPI(t, router, owner.Token, backup.ID)
outsider := users_testing.CreateTestUser(users_enums.UserRoleMember)
resp := test_utils.MakePostRequest(
t, router,
"/api/v1/verifications/"+enqueued.ID.String()+"/cancel",
"Bearer "+outsider.Token,
nil,
http.StatusBadRequest,
)
assert.Contains(t, string(resp.Body), "insufficient permissions")
stillPending := GetVerificationByIDViaAPI(t, router, owner.Token, enqueued.ID)
assert.Equal(t, VerificationStatusPending, stillPending.Status)
}
func Test_CancelVerification_WithAgentToken_Returns401(t *testing.T) {
router := createTestRouter()
owner := users_testing.CreateTestUser(users_enums.UserRoleAdmin)
workspace := workspaces_testing.CreateTestWorkspace("ws "+uuid.New().String(), owner, router)
defer workspaces_testing.RemoveTestWorkspace(workspace, router)
testStorage := storages.CreateTestStorage(workspace.ID)
defer storages.RemoveTestStorage(testStorage.ID)
notifier := notifiers.CreateTestNotifier(workspace.ID)
defer notifiers.RemoveTestNotifier(notifier)
database := databases.CreateTestDatabase(workspace.ID, testStorage, notifier)
defer databases.RemoveTestDatabase(database)
backup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 100)
enqueued := EnqueueManualVerificationViaAPI(t, router, owner.Token, backup.ID)
agent := verification_agents.CreateTestVerificationAgent(
t, router, owner.Token, "cancel-agent-rejected-"+uuid.New().String(),
)
defer verification_agents.RemoveTestVerificationAgent(t, router, owner.Token, agent.Agent.ID)
test_utils.MakePostRequest(
t, router,
"/api/v1/verifications/"+enqueued.ID.String()+"/cancel",
"Bearer "+agent.Token,
nil,
http.StatusUnauthorized,
)
stillPending := GetVerificationByIDViaAPI(t, router, owner.Token, enqueued.ID)
assert.Equal(t, VerificationStatusPending, stillPending.Status)
}
func Test_DeleteDatabase_RemovesVerifications_ViaCascade(t *testing.T) {
router := createTestRouter()
owner := users_testing.CreateTestUser(users_enums.UserRoleAdmin)
workspace := workspaces_testing.CreateTestWorkspace("ws "+uuid.New().String(), owner, router)
defer workspaces_testing.RemoveTestWorkspace(workspace, router)
testStorage := storages.CreateTestStorage(workspace.ID)
defer storages.RemoveTestStorage(testStorage.ID)
notifier := notifiers.CreateTestNotifier(workspace.ID)
defer notifiers.RemoveTestNotifier(notifier)
database := databases.CreateTestDatabase(workspace.ID, testStorage, notifier)
backup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 100)
enqueued := EnqueueManualVerificationViaAPI(t, router, owner.Token, backup.ID)
test_utils.MakeDeleteRequest(
t, router,
"/api/v1/databases/"+database.ID.String(),
"Bearer "+owner.Token,
http.StatusNoContent,
)
var remainingVerifications int64
require.NoError(t, storage.GetDb().
Model(&RestoreVerification{}).
Where("id = ?", enqueued.ID).
Count(&remainingVerifications).Error)
assert.Zero(t, remainingVerifications, "verification row must be cascade-deleted with its database")
}
func Test_DeleteBackup_RemovesVerifications_ViaCascade(t *testing.T) {
router := createTestRouter()
owner := users_testing.CreateTestUser(users_enums.UserRoleAdmin)
workspace := workspaces_testing.CreateTestWorkspace("ws "+uuid.New().String(), owner, router)
defer workspaces_testing.RemoveTestWorkspace(workspace, router)
testStorage := storages.CreateTestStorage(workspace.ID)
defer storages.RemoveTestStorage(testStorage.ID)
notifier := notifiers.CreateTestNotifier(workspace.ID)
defer notifiers.RemoveTestNotifier(notifier)
database := databases.CreateTestDatabase(workspace.ID, testStorage, notifier)
defer databases.RemoveTestDatabase(database)
backup := backuping_logical.SeedTestBackup(t, database.ID, testStorage.ID, 100)
enqueued := EnqueueManualVerificationViaAPI(t, router, owner.Token, backup.ID)
test_utils.MakeDeleteRequest(
t, router,
"/api/v1/backups/"+backup.ID.String(),
"Bearer "+owner.Token,
http.StatusNoContent,
)
var remainingVerifications int64
require.NoError(t, storage.GetDb().
Model(&RestoreVerification{}).
Where("id = ?", enqueued.ID).
Count(&remainingVerifications).Error)
assert.Zero(t, remainingVerifications, "verification row must be cascade-deleted with its backup")
}