168 lines
4.1 KiB
Go
168 lines
4.1 KiB
Go
package services
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"testing"
|
|
"time"
|
|
|
|
"veza-backend-api/internal/models"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"go.uber.org/zap"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func setupTestDB(t *testing.T) *gorm.DB {
|
|
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
|
require.NoError(t, err)
|
|
|
|
// Migrate tables
|
|
err = db.AutoMigrate(
|
|
&models.User{},
|
|
&models.UserSettings{},
|
|
&models.Track{},
|
|
&models.Playlist{},
|
|
&models.TrackComment{},
|
|
&models.TrackLike{},
|
|
&models.PlaybackAnalytics{},
|
|
&models.FederatedIdentity{},
|
|
&models.UserRole{},
|
|
)
|
|
require.NoError(t, err)
|
|
|
|
return db
|
|
}
|
|
|
|
func TestDataExportService_ExportUserData(t *testing.T) {
|
|
db := setupTestDB(t)
|
|
logger, _ := zap.NewDevelopment()
|
|
service := NewDataExportService(db, logger)
|
|
|
|
// Create test user
|
|
userID := uuid.New()
|
|
user := &models.User{
|
|
ID: userID,
|
|
Username: "testuser",
|
|
Email: "test@example.com",
|
|
FirstName: "Test",
|
|
LastName: "User",
|
|
IsActive: true,
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
}
|
|
require.NoError(t, db.Create(user).Error)
|
|
|
|
// Create user settings
|
|
settings := &models.UserSettings{
|
|
ID: uuid.New(),
|
|
UserID: userID,
|
|
EmailNotifications: true,
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
}
|
|
require.NoError(t, db.Create(settings).Error)
|
|
|
|
// Create test track
|
|
track := &models.Track{
|
|
ID: uuid.New(),
|
|
UserID: userID,
|
|
Title: "Test Track",
|
|
Duration: 180,
|
|
FilePath: "/path/to/track.mp3",
|
|
IsPublic: true,
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
}
|
|
require.NoError(t, db.Create(track).Error)
|
|
|
|
// Export user data
|
|
ctx := context.Background()
|
|
export, err := service.ExportUserData(ctx, userID)
|
|
require.NoError(t, err)
|
|
|
|
// Verify export structure
|
|
assert.Equal(t, userID, export.UserID)
|
|
assert.NotNil(t, export.Profile)
|
|
assert.Equal(t, user.Username, export.Profile.Username)
|
|
assert.Equal(t, user.Email, export.Profile.Email)
|
|
assert.NotNil(t, export.Settings)
|
|
assert.Equal(t, 1, len(export.Tracks))
|
|
assert.Equal(t, track.Title, export.Tracks[0].Title)
|
|
}
|
|
|
|
func TestDataExportService_ExportUserDataAsJSON(t *testing.T) {
|
|
db := setupTestDB(t)
|
|
logger, _ := zap.NewDevelopment()
|
|
service := NewDataExportService(db, logger)
|
|
|
|
// Create test user
|
|
userID := uuid.New()
|
|
user := &models.User{
|
|
ID: userID,
|
|
Username: "testuser",
|
|
Email: "test@example.com",
|
|
IsActive: true,
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
}
|
|
require.NoError(t, db.Create(user).Error)
|
|
|
|
// Export as JSON
|
|
ctx := context.Background()
|
|
jsonData, err := service.ExportUserDataAsJSON(ctx, userID)
|
|
require.NoError(t, err)
|
|
|
|
// Verify JSON is valid
|
|
var export UserDataExport
|
|
err = json.Unmarshal(jsonData, &export)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, userID, export.UserID)
|
|
assert.NotNil(t, export.Profile)
|
|
}
|
|
|
|
func TestDataExportService_ExportUserData_NoData(t *testing.T) {
|
|
db := setupTestDB(t)
|
|
logger, _ := zap.NewDevelopment()
|
|
service := NewDataExportService(db, logger)
|
|
|
|
// Create test user without any related data
|
|
userID := uuid.New()
|
|
user := &models.User{
|
|
ID: userID,
|
|
Username: "testuser",
|
|
Email: "test@example.com",
|
|
IsActive: true,
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
}
|
|
require.NoError(t, db.Create(user).Error)
|
|
|
|
// Export user data
|
|
ctx := context.Background()
|
|
export, err := service.ExportUserData(ctx, userID)
|
|
require.NoError(t, err)
|
|
|
|
// Verify export structure even with no related data
|
|
assert.Equal(t, userID, export.UserID)
|
|
assert.NotNil(t, export.Profile)
|
|
assert.Equal(t, 0, len(export.Tracks))
|
|
assert.Equal(t, 0, len(export.Playlists))
|
|
assert.Equal(t, 0, len(export.Comments))
|
|
assert.Equal(t, 0, len(export.Likes))
|
|
}
|
|
|
|
func TestDataExportService_ExportUserData_UserNotFound(t *testing.T) {
|
|
db := setupTestDB(t)
|
|
logger, _ := zap.NewDevelopment()
|
|
service := NewDataExportService(db, logger)
|
|
|
|
// Try to export non-existent user
|
|
ctx := context.Background()
|
|
nonExistentID := uuid.New()
|
|
_, err := service.ExportUserData(ctx, nonExistentID)
|
|
assert.Error(t, err)
|
|
}
|