Files
softplayer-backend/internal/repository/projects_test.go
2026-05-22 11:23:04 +02:00

247 lines
8.1 KiB
Go

package repository_test
import (
"context"
"database/sql"
"fmt"
"testing"
"time"
"gitea.badhouseplants.net/softplayer/softplayer-backend/internal/repository"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
)
func newTestUniqueEmail(prefix string) string {
if prefix == "" {
prefix = "test"
}
return fmt.Sprintf(
"%s-%d-%s@example.com",
prefix,
time.Now().UnixMilli(),
uuid.NewString(),
)
}
func accountForProject(ctx context.Context) (string, error) {
account := &repository.AccountData{
UUID: uuid.NewString(),
Email: newTestUniqueEmail("projects"),
PasswordHash: "dummy",
Name: "John",
Surname: "Doe",
}
if err := repository.CreateAccount(ctx, newTestDBConnection(ctx), account); err != nil {
return "", err
}
return account.UUID, nil
}
func TestIntegrationProjectsCreate_Success(t *testing.T) {
createdBy, err := accountForProject(t.Context())
assert.NoError(t, err)
project := &repository.ProjectData{
UUID: uuid.NewString(),
Name: "test-1",
Slug: uuid.NewString(),
Description: "Test Project Number 1",
CreatedBy: createdBy,
CreatedAt: time.Now(),
ClosedAt: sql.NullTime{Time: time.Now()},
Blocked: false,
UpdatedAt: time.Now(),
UpdatedBy: createdBy,
}
assert.NoError(t, repository.CreateProject(t.Context(), newTestDBConnection(t.Context()), project))
}
func TestIntegrationProjectsCreate_CheckFailed(t *testing.T) {
createdBy, err := accountForProject(t.Context())
assert.NoError(t, err)
project := &repository.ProjectData{
UUID: uuid.NewString(),
Name: "test-2",
Slug: "test_2",
Description: "Test Project Number 1",
CreatedBy: createdBy,
CreatedAt: time.Now(),
ClosedAt: sql.NullTime{Time: time.Now()},
Blocked: false,
UpdatedAt: time.Now(),
UpdatedBy: createdBy,
}
assert.Error(t, repository.CreateProject(t.Context(), newTestDBConnection(t.Context()), project), repository.ErrCheckNotPassed)
}
func TestIntegrationProjectsCreate_AlreadyExistsFail(t *testing.T) {
createdBy, err := accountForProject(t.Context())
assert.NoError(t, err)
project := &repository.ProjectData{
UUID: uuid.NewString(),
Name: "test-3",
Slug: uuid.NewString(),
Description: "Test Project Number 1",
CreatedBy: createdBy,
CreatedAt: time.Now(),
ClosedAt: sql.NullTime{Time: time.Now()},
Blocked: false,
UpdatedAt: time.Now(),
UpdatedBy: createdBy,
}
assert.NoError(t, repository.CreateProject(t.Context(), newTestDBConnection(t.Context()), project))
assert.Error(t, repository.CreateProject(t.Context(), newTestDBConnection(t.Context()), project), repository.ErrAlreadyExists)
}
func TestIntegrationProjectsCreateAndGet_Success(t *testing.T) {
createdBy, err := accountForProject(t.Context())
assert.NoError(t, err)
project := &repository.ProjectData{
UUID: uuid.NewString(),
Name: "test-4",
Slug: uuid.NewString(),
Description: "Test Project Number 1",
CreatedBy: createdBy,
CreatedAt: time.Now(),
Blocked: false,
UpdatedAt: time.Now(),
UpdatedBy: createdBy,
}
assert.NoError(t, repository.CreateProject(t.Context(), newTestDBConnection(t.Context()), project))
data, err := repository.GetProjectByID(t.Context(), newTestDBConnection(t.Context()), project.UUID)
assert.NoError(t, err)
assert.Equal(t, project.Name, data.Name)
assert.Equal(t, project.Slug, data.Slug)
assert.Equal(t, project.Description, data.Description)
assert.Equal(t, project.CreatedBy, data.CreatedBy)
assert.Equal(t, project.ClosedAt.Time.Truncate(time.Second), data.ClosedAt.Time.Truncate(time.Second))
assert.Equal(t, project.CreatedAt.Truncate(time.Second), data.CreatedAt.Truncate(time.Second))
}
func TestIntegrationProjectsCreateAndGet_NotFound(t *testing.T) {
data, err := repository.GetProjectByID(t.Context(), newTestDBConnection(t.Context()), uuid.NewString())
assert.ErrorIs(t, err, repository.ErrNotFound)
assert.Nil(t, data)
}
func TestIntegrationProjectsCreateUpdateAndGet_Success(t *testing.T) {
createdBy, err := accountForProject(t.Context())
assert.NoError(t, err)
project := &repository.ProjectData{
UUID: uuid.NewString(),
Name: "test-5",
Slug: uuid.NewString(),
Description: "Test Project Number 1",
CreatedBy: createdBy,
CreatedAt: time.Now(),
Blocked: false,
UpdatedAt: time.Now(),
UpdatedBy: createdBy,
}
assert.NoError(t, repository.CreateProject(t.Context(), newTestDBConnection(t.Context()), project))
data, err := repository.GetProjectByID(t.Context(), newTestDBConnection(t.Context()), project.UUID)
assert.NoError(t, err)
assert.Equal(t, project.Name, data.Name)
assert.Equal(t, project.Slug, data.Slug)
assert.Equal(t, project.Description, data.Description)
assert.Equal(t, project.CreatedBy, data.CreatedBy)
assert.Equal(t, project.ClosedAt.Time.Truncate(time.Second), data.ClosedAt.Time.Truncate(time.Second))
assert.Equal(t, project.CreatedAt.Truncate(time.Second), data.CreatedAt.Truncate(time.Second))
project.UpdatedBy = uuid.NewString()
project.UpdatedAt = time.Now()
project.Description = "Updated description"
project.Name = "update name"
assert.NoError(t, repository.UpdateProject(t.Context(), newTestDBConnection(t.Context()), project))
data, err = repository.GetProjectByID(t.Context(), newTestDBConnection(t.Context()), project.UUID)
assert.NoError(t, err)
assert.Equal(t, project.Name, data.Name)
assert.Equal(t, project.Slug, data.Slug)
assert.Equal(t, project.Description, data.Description)
}
func TestIntegrationProjectsCreateAndGetOwner_Success(t *testing.T) {
createdBy, err := accountForProject(t.Context())
assert.NoError(t, err)
project := &repository.ProjectData{
UUID: uuid.NewString(),
Name: "test-6",
Slug: uuid.NewString(),
Description: "Test Project Number 1",
CreatedBy: createdBy,
CreatedAt: time.Now(),
ClosedAt: sql.NullTime{Time: time.Now()},
Blocked: false,
UpdatedAt: time.Now(),
UpdatedBy: createdBy,
}
assert.NoError(t, repository.CreateProject(t.Context(), newTestDBConnection(t.Context()), project))
userID, err := repository.GetProjectOwner(t.Context(), newTestDBConnection(t.Context()), project.UUID)
assert.NoError(t, err)
assert.Equal(t, project.CreatedBy, userID)
}
func TestIntegrationListProjectsWorkflow(t *testing.T) {
createdBy1, err := accountForProject(t.Context())
assert.NoError(t, err)
project1 := &repository.ProjectData{
UUID: uuid.NewString(),
Name: "List 1",
Slug: uuid.NewString(),
Description: "Test Project Number 1",
CreatedBy: createdBy1,
CreatedAt: time.Now(),
ClosedAt: sql.NullTime{Time: time.Now()},
Blocked: false,
UpdatedAt: time.Now(),
UpdatedBy: createdBy1,
}
assert.NoError(t, repository.CreateProject(t.Context(), newTestDBConnection(t.Context()), project1))
project2 := &repository.ProjectData{
UUID: uuid.NewString(),
Name: "List 2",
Slug: uuid.NewString(),
Description: "Test Project Number 1",
CreatedBy: createdBy1,
CreatedAt: time.Now(),
ClosedAt: sql.NullTime{Time: time.Now()},
Blocked: false,
UpdatedAt: time.Now(),
UpdatedBy: createdBy1,
}
assert.NoError(t, repository.CreateProject(t.Context(), newTestDBConnection(t.Context()), project2))
createdBy2, err := accountForProject(t.Context())
assert.NoError(t, err)
project3 := &repository.ProjectData{
UUID: uuid.NewString(),
Name: "List 3",
Slug: uuid.NewString(),
Description: "Test Project Number 1",
CreatedBy: createdBy2,
CreatedAt: time.Now(),
ClosedAt: sql.NullTime{Time: time.Now()},
Blocked: false,
UpdatedAt: time.Now(),
UpdatedBy: createdBy2,
}
assert.NoError(t, repository.CreateProject(t.Context(), newTestDBConnection(t.Context()), project3))
projects, err := repository.ListProjects(t.Context(), newTestDBConnection(t.Context()), createdBy1)
assert.NoError(t, err)
assert.Len(t, projects, 2)
projects, err = repository.ListProjects(t.Context(), newTestDBConnection(t.Context()), createdBy2)
assert.NoError(t, err)
assert.Len(t, projects, 1)
}