cozystack/internal/backupcontroller/factory/backupjob_test.go
Andrei Kvapil bce5300116
refactor: rename mysql application to mariadb
The mysql chart actually deploys MariaDB via mariadb-operator, but was
incorrectly named "mysql". Rename all references to use the correct
"mariadb" name across the codebase.

Changes:
- Rename packages/apps/mysql -> packages/apps/mariadb
- Rename packages/system/mysql-rd -> packages/system/mariadb-rd
- Rename platform source and bundle references
- Update CRD kind from MySQL to MariaDB
- Update RBAC, e2e tests, backup controller tests
- Keep real MySQL CLI/config tool names unchanged (mysqldump, [mysqld], etc.)

Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Andrei Kvapil <kvapss@gmail.com>
2026-02-12 15:15:20 +01:00

167 lines
4.9 KiB
Go

package factory
import (
"testing"
"time"
backupsv1alpha1 "github.com/cozystack/cozystack/api/backups/v1alpha1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func TestBackupJob(t *testing.T) {
tests := []struct {
name string
plan *backupsv1alpha1.Plan
scheduled time.Time
validate func(*testing.T, *backupsv1alpha1.BackupJob)
}{
{
name: "creates BackupJob with BackupClassName",
plan: &backupsv1alpha1.Plan{
ObjectMeta: metav1.ObjectMeta{
Name: "test-plan",
Namespace: "default",
},
Spec: backupsv1alpha1.PlanSpec{
ApplicationRef: corev1.TypedLocalObjectReference{
Kind: "VirtualMachine",
Name: "vm1",
},
BackupClassName: "velero",
Schedule: backupsv1alpha1.PlanSchedule{
Type: backupsv1alpha1.PlanScheduleTypeCron,
Cron: "0 2 * * *",
},
},
},
scheduled: time.Date(2024, 1, 1, 2, 0, 0, 0, time.UTC),
validate: func(t *testing.T, job *backupsv1alpha1.BackupJob) {
if job.Name == "" {
t.Error("BackupJob name should be set")
}
if job.Namespace != "default" {
t.Errorf("BackupJob namespace = %v, want default", job.Namespace)
}
if job.Spec.BackupClassName != "velero" {
t.Errorf("BackupJob BackupClassName = %v, want velero", job.Spec.BackupClassName)
}
if job.Spec.ApplicationRef.Kind != "VirtualMachine" {
t.Errorf("BackupJob ApplicationRef.Kind = %v, want VirtualMachine", job.Spec.ApplicationRef.Kind)
}
if job.Spec.ApplicationRef.Name != "vm1" {
t.Errorf("BackupJob ApplicationRef.Name = %v, want vm1", job.Spec.ApplicationRef.Name)
}
if job.Spec.PlanRef == nil || job.Spec.PlanRef.Name != "test-plan" {
t.Errorf("BackupJob PlanRef = %v, want {Name: test-plan}", job.Spec.PlanRef)
}
},
},
{
name: "normalizes ApplicationRef apiGroup",
plan: &backupsv1alpha1.Plan{
ObjectMeta: metav1.ObjectMeta{
Name: "test-plan",
Namespace: "default",
},
Spec: backupsv1alpha1.PlanSpec{
ApplicationRef: corev1.TypedLocalObjectReference{
// No APIGroup specified
Kind: "MariaDB",
Name: "mariadb1",
},
BackupClassName: "velero",
Schedule: backupsv1alpha1.PlanSchedule{
Type: backupsv1alpha1.PlanScheduleTypeCron,
Cron: "0 2 * * *",
},
},
},
scheduled: time.Date(2024, 1, 1, 2, 0, 0, 0, time.UTC),
validate: func(t *testing.T, job *backupsv1alpha1.BackupJob) {
if job.Spec.ApplicationRef.APIGroup == nil {
t.Error("BackupJob ApplicationRef.APIGroup should be set (normalized)")
return
}
if *job.Spec.ApplicationRef.APIGroup != "apps.cozystack.io" {
t.Errorf("BackupJob ApplicationRef.APIGroup = %v, want apps.cozystack.io", *job.Spec.ApplicationRef.APIGroup)
}
},
},
{
name: "preserves explicit ApplicationRef apiGroup",
plan: &backupsv1alpha1.Plan{
ObjectMeta: metav1.ObjectMeta{
Name: "test-plan",
Namespace: "default",
},
Spec: backupsv1alpha1.PlanSpec{
ApplicationRef: corev1.TypedLocalObjectReference{
APIGroup: stringPtr("custom.api.group.io"),
Kind: "CustomApp",
Name: "custom1",
},
BackupClassName: "velero",
Schedule: backupsv1alpha1.PlanSchedule{
Type: backupsv1alpha1.PlanScheduleTypeCron,
Cron: "0 2 * * *",
},
},
},
scheduled: time.Date(2024, 1, 1, 2, 0, 0, 0, time.UTC),
validate: func(t *testing.T, job *backupsv1alpha1.BackupJob) {
if job.Spec.ApplicationRef.APIGroup == nil {
t.Error("BackupJob ApplicationRef.APIGroup should be preserved")
return
}
if *job.Spec.ApplicationRef.APIGroup != "custom.api.group.io" {
t.Errorf("BackupJob ApplicationRef.APIGroup = %v, want custom.api.group.io", *job.Spec.ApplicationRef.APIGroup)
}
},
},
{
name: "generates unique job name based on timestamp",
plan: &backupsv1alpha1.Plan{
ObjectMeta: metav1.ObjectMeta{
Name: "test-plan",
Namespace: "default",
},
Spec: backupsv1alpha1.PlanSpec{
ApplicationRef: corev1.TypedLocalObjectReference{
Kind: "VirtualMachine",
Name: "vm1",
},
BackupClassName: "velero",
Schedule: backupsv1alpha1.PlanSchedule{
Type: backupsv1alpha1.PlanScheduleTypeCron,
Cron: "0 2 * * *",
},
},
},
scheduled: time.Date(2024, 1, 1, 2, 0, 0, 0, time.UTC),
validate: func(t *testing.T, job *backupsv1alpha1.BackupJob) {
if job.Name == "" {
t.Error("BackupJob name should be generated")
}
// Name should start with plan name
if len(job.Name) < len("test-plan") {
t.Errorf("BackupJob name = %v, should start with test-plan", job.Name)
}
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
job := BackupJob(tt.plan, tt.scheduled)
if job == nil {
t.Fatal("BackupJob() returned nil")
}
tt.validate(t, job)
})
}
}
func stringPtr(s string) *string {
return &s
}