To gitea and beyond, let's go(-yco)
This commit is contained in:
69
internal/dto/post.go
Normal file
69
internal/dto/post.go
Normal file
@@ -0,0 +1,69 @@
|
||||
package dto
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"goyco/internal/database"
|
||||
)
|
||||
|
||||
type PostDTO struct {
|
||||
ID uint `json:"id"`
|
||||
Title string `json:"title"`
|
||||
URL string `json:"url"`
|
||||
Content string `json:"content,omitempty"`
|
||||
AuthorID *uint `json:"author_id,omitempty"`
|
||||
AuthorName string `json:"author_name,omitempty"`
|
||||
Author *UserDTO `json:"author,omitempty"`
|
||||
UpVotes int `json:"up_votes"`
|
||||
DownVotes int `json:"down_votes"`
|
||||
Score int `json:"score"`
|
||||
CurrentVote string `json:"current_vote,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
type PostListDTO struct {
|
||||
Posts []PostDTO `json:"posts"`
|
||||
Count int `json:"count"`
|
||||
Limit int `json:"limit"`
|
||||
Offset int `json:"offset"`
|
||||
}
|
||||
|
||||
func ToPostDTO(post *database.Post) PostDTO {
|
||||
if post == nil {
|
||||
return PostDTO{}
|
||||
}
|
||||
|
||||
dto := PostDTO{
|
||||
ID: post.ID,
|
||||
Title: post.Title,
|
||||
URL: post.URL,
|
||||
Content: post.Content,
|
||||
AuthorID: post.AuthorID,
|
||||
AuthorName: post.AuthorName,
|
||||
UpVotes: post.UpVotes,
|
||||
DownVotes: post.DownVotes,
|
||||
Score: post.Score,
|
||||
CreatedAt: post.CreatedAt,
|
||||
UpdatedAt: post.UpdatedAt,
|
||||
}
|
||||
|
||||
if post.CurrentVote != "" {
|
||||
dto.CurrentVote = string(post.CurrentVote)
|
||||
}
|
||||
|
||||
if post.Author.ID != 0 {
|
||||
authorDTO := ToUserDTO(&post.Author)
|
||||
dto.Author = &authorDTO
|
||||
}
|
||||
|
||||
return dto
|
||||
}
|
||||
|
||||
func ToPostDTOs(posts []database.Post) []PostDTO {
|
||||
dtos := make([]PostDTO, len(posts))
|
||||
for i := range posts {
|
||||
dtos[i] = ToPostDTO(&posts[i])
|
||||
}
|
||||
return dtos
|
||||
}
|
||||
183
internal/dto/post_test.go
Normal file
183
internal/dto/post_test.go
Normal file
@@ -0,0 +1,183 @@
|
||||
package dto
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"goyco/internal/database"
|
||||
)
|
||||
|
||||
func TestToPostDTO(t *testing.T) {
|
||||
t.Run("nil post", func(t *testing.T) {
|
||||
dto := ToPostDTO(nil)
|
||||
if dto.ID != 0 {
|
||||
t.Errorf("Expected zero value for nil post, got ID %d", dto.ID)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("valid post without author", func(t *testing.T) {
|
||||
post := &database.Post{
|
||||
ID: 1,
|
||||
Title: "Test Post",
|
||||
URL: "https://example.com",
|
||||
Content: "Test content",
|
||||
AuthorID: nil,
|
||||
AuthorName: "",
|
||||
UpVotes: 5,
|
||||
DownVotes: 2,
|
||||
Score: 3,
|
||||
CurrentVote: database.VoteUp,
|
||||
CreatedAt: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
UpdatedAt: time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||
}
|
||||
|
||||
dto := ToPostDTO(post)
|
||||
|
||||
if dto.ID != post.ID {
|
||||
t.Errorf("Expected ID %d, got %d", post.ID, dto.ID)
|
||||
}
|
||||
if dto.Title != post.Title {
|
||||
t.Errorf("Expected Title %q, got %q", post.Title, dto.Title)
|
||||
}
|
||||
if dto.URL != post.URL {
|
||||
t.Errorf("Expected URL %q, got %q", post.URL, dto.URL)
|
||||
}
|
||||
if dto.Content != post.Content {
|
||||
t.Errorf("Expected Content %q, got %q", post.Content, dto.Content)
|
||||
}
|
||||
if dto.UpVotes != post.UpVotes {
|
||||
t.Errorf("Expected UpVotes %d, got %d", post.UpVotes, dto.UpVotes)
|
||||
}
|
||||
if dto.DownVotes != post.DownVotes {
|
||||
t.Errorf("Expected DownVotes %d, got %d", post.DownVotes, dto.DownVotes)
|
||||
}
|
||||
if dto.Score != post.Score {
|
||||
t.Errorf("Expected Score %d, got %d", post.Score, dto.Score)
|
||||
}
|
||||
if dto.CurrentVote != string(post.CurrentVote) {
|
||||
t.Errorf("Expected CurrentVote %q, got %q", post.CurrentVote, dto.CurrentVote)
|
||||
}
|
||||
if !dto.CreatedAt.Equal(post.CreatedAt) {
|
||||
t.Errorf("Expected CreatedAt %v, got %v", post.CreatedAt, dto.CreatedAt)
|
||||
}
|
||||
if !dto.UpdatedAt.Equal(post.UpdatedAt) {
|
||||
t.Errorf("Expected UpdatedAt %v, got %v", post.UpdatedAt, dto.UpdatedAt)
|
||||
}
|
||||
if dto.Author != nil {
|
||||
t.Error("Expected Author to be nil when post.Author.ID is 0")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("post with author", func(t *testing.T) {
|
||||
authorID := uint(42)
|
||||
post := &database.Post{
|
||||
ID: 1,
|
||||
Title: "Test Post",
|
||||
URL: "https://example.com",
|
||||
AuthorID: &authorID,
|
||||
AuthorName: "Test Author",
|
||||
Author: database.User{
|
||||
ID: authorID,
|
||||
Username: "testuser",
|
||||
Email: "test@example.com",
|
||||
},
|
||||
CreatedAt: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
UpdatedAt: time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||
}
|
||||
|
||||
dto := ToPostDTO(post)
|
||||
|
||||
if dto.AuthorID == nil || *dto.AuthorID != authorID {
|
||||
t.Errorf("Expected AuthorID %d, got %v", authorID, dto.AuthorID)
|
||||
}
|
||||
if dto.AuthorName != post.AuthorName {
|
||||
t.Errorf("Expected AuthorName %q, got %q", post.AuthorName, dto.AuthorName)
|
||||
}
|
||||
if dto.Author == nil {
|
||||
t.Fatal("Expected Author to be set")
|
||||
}
|
||||
if dto.Author.ID != authorID {
|
||||
t.Errorf("Expected Author.ID %d, got %d", authorID, dto.Author.ID)
|
||||
}
|
||||
if dto.Author.Username != post.Author.Username {
|
||||
t.Errorf("Expected Author.Username %q, got %q", post.Author.Username, dto.Author.Username)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("post with VoteNone", func(t *testing.T) {
|
||||
post := &database.Post{
|
||||
ID: 1,
|
||||
Title: "Test Post",
|
||||
CurrentVote: database.VoteNone,
|
||||
CreatedAt: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
UpdatedAt: time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||
}
|
||||
|
||||
dto := ToPostDTO(post)
|
||||
|
||||
if dto.CurrentVote != "none" {
|
||||
t.Errorf("Expected CurrentVote %q, got %q", "none", dto.CurrentVote)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("post without CurrentVote set", func(t *testing.T) {
|
||||
post := &database.Post{
|
||||
ID: 1,
|
||||
Title: "Test Post",
|
||||
CurrentVote: "",
|
||||
CreatedAt: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
UpdatedAt: time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||
}
|
||||
|
||||
dto := ToPostDTO(post)
|
||||
|
||||
if dto.CurrentVote != "" {
|
||||
t.Errorf("Expected empty CurrentVote, got %q", dto.CurrentVote)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestToPostDTOs(t *testing.T) {
|
||||
t.Run("empty slice", func(t *testing.T) {
|
||||
posts := []database.Post{}
|
||||
dtos := ToPostDTOs(posts)
|
||||
if len(dtos) != 0 {
|
||||
t.Errorf("Expected empty slice, got %d items", len(dtos))
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("multiple posts", func(t *testing.T) {
|
||||
posts := []database.Post{
|
||||
{
|
||||
ID: 1,
|
||||
Title: "Post 1",
|
||||
URL: "https://example.com/1",
|
||||
},
|
||||
{
|
||||
ID: 2,
|
||||
Title: "Post 2",
|
||||
URL: "https://example.com/2",
|
||||
},
|
||||
{
|
||||
ID: 3,
|
||||
Title: "Post 3",
|
||||
URL: "https://example.com/3",
|
||||
},
|
||||
}
|
||||
|
||||
dtos := ToPostDTOs(posts)
|
||||
|
||||
if len(dtos) != len(posts) {
|
||||
t.Fatalf("Expected %d DTOs, got %d", len(posts), len(dtos))
|
||||
}
|
||||
|
||||
for i := range posts {
|
||||
if dtos[i].ID != posts[i].ID {
|
||||
t.Errorf("Post %d: Expected ID %d, got %d", i, posts[i].ID, dtos[i].ID)
|
||||
}
|
||||
if dtos[i].Title != posts[i].Title {
|
||||
t.Errorf("Post %d: Expected Title %q, got %q", i, posts[i].Title, dtos[i].Title)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
76
internal/dto/user.go
Normal file
76
internal/dto/user.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package dto
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"goyco/internal/database"
|
||||
)
|
||||
|
||||
type UserDTO struct {
|
||||
ID uint `json:"id"`
|
||||
Username string `json:"username"`
|
||||
Email string `json:"email,omitempty"`
|
||||
EmailVerified bool `json:"email_verified,omitempty"`
|
||||
EmailVerifiedAt *time.Time `json:"email_verified_at,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
type UserListDTO struct {
|
||||
Users []UserDTO `json:"users"`
|
||||
Count int `json:"count"`
|
||||
Limit int `json:"limit"`
|
||||
Offset int `json:"offset"`
|
||||
}
|
||||
|
||||
func ToUserDTO(user *database.User) UserDTO {
|
||||
if user == nil {
|
||||
return UserDTO{}
|
||||
}
|
||||
|
||||
return UserDTO{
|
||||
ID: user.ID,
|
||||
Username: user.Username,
|
||||
Email: user.Email,
|
||||
EmailVerified: user.EmailVerified,
|
||||
EmailVerifiedAt: user.EmailVerifiedAt,
|
||||
CreatedAt: user.CreatedAt,
|
||||
UpdatedAt: user.UpdatedAt,
|
||||
}
|
||||
}
|
||||
|
||||
func ToUserDTOs(users []database.User) []UserDTO {
|
||||
dtos := make([]UserDTO, len(users))
|
||||
for i := range users {
|
||||
dtos[i] = ToUserDTO(&users[i])
|
||||
}
|
||||
return dtos
|
||||
}
|
||||
|
||||
type SanitizedUserDTO struct {
|
||||
ID uint `json:"id"`
|
||||
Username string `json:"username"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
func ToSanitizedUserDTO(user *database.User) SanitizedUserDTO {
|
||||
if user == nil {
|
||||
return SanitizedUserDTO{}
|
||||
}
|
||||
|
||||
return SanitizedUserDTO{
|
||||
ID: user.ID,
|
||||
Username: user.Username,
|
||||
CreatedAt: user.CreatedAt,
|
||||
UpdatedAt: user.UpdatedAt,
|
||||
}
|
||||
}
|
||||
|
||||
func ToSanitizedUserDTOs(users []database.User) []SanitizedUserDTO {
|
||||
dtos := make([]SanitizedUserDTO, len(users))
|
||||
for i := range users {
|
||||
dtos[i] = ToSanitizedUserDTO(&users[i])
|
||||
}
|
||||
return dtos
|
||||
}
|
||||
187
internal/dto/user_test.go
Normal file
187
internal/dto/user_test.go
Normal file
@@ -0,0 +1,187 @@
|
||||
package dto
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"goyco/internal/database"
|
||||
)
|
||||
|
||||
func TestToUserDTO(t *testing.T) {
|
||||
t.Run("nil user", func(t *testing.T) {
|
||||
dto := ToUserDTO(nil)
|
||||
if dto.ID != 0 {
|
||||
t.Errorf("Expected zero value for nil user, got ID %d", dto.ID)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("valid user", func(t *testing.T) {
|
||||
verifiedAt := time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)
|
||||
user := &database.User{
|
||||
ID: 42,
|
||||
Username: "testuser",
|
||||
Email: "test@example.com",
|
||||
EmailVerified: true,
|
||||
EmailVerifiedAt: &verifiedAt,
|
||||
CreatedAt: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
UpdatedAt: time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||
}
|
||||
|
||||
dto := ToUserDTO(user)
|
||||
|
||||
if dto.ID != user.ID {
|
||||
t.Errorf("Expected ID %d, got %d", user.ID, dto.ID)
|
||||
}
|
||||
if dto.Username != user.Username {
|
||||
t.Errorf("Expected Username %q, got %q", user.Username, dto.Username)
|
||||
}
|
||||
if dto.Email != user.Email {
|
||||
t.Errorf("Expected Email %q, got %q", user.Email, dto.Email)
|
||||
}
|
||||
if dto.EmailVerified != user.EmailVerified {
|
||||
t.Errorf("Expected EmailVerified %v, got %v", user.EmailVerified, dto.EmailVerified)
|
||||
}
|
||||
if dto.EmailVerifiedAt == nil || !dto.EmailVerifiedAt.Equal(*user.EmailVerifiedAt) {
|
||||
t.Errorf("Expected EmailVerifiedAt %v, got %v", user.EmailVerifiedAt, dto.EmailVerifiedAt)
|
||||
}
|
||||
if !dto.CreatedAt.Equal(user.CreatedAt) {
|
||||
t.Errorf("Expected CreatedAt %v, got %v", user.CreatedAt, dto.CreatedAt)
|
||||
}
|
||||
if !dto.UpdatedAt.Equal(user.UpdatedAt) {
|
||||
t.Errorf("Expected UpdatedAt %v, got %v", user.UpdatedAt, dto.UpdatedAt)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("user without email verified at", func(t *testing.T) {
|
||||
user := &database.User{
|
||||
ID: 1,
|
||||
Username: "testuser",
|
||||
Email: "test@example.com",
|
||||
EmailVerified: false,
|
||||
EmailVerifiedAt: nil,
|
||||
CreatedAt: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
UpdatedAt: time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||
}
|
||||
|
||||
dto := ToUserDTO(user)
|
||||
|
||||
if dto.EmailVerifiedAt != nil {
|
||||
t.Error("Expected EmailVerifiedAt to be nil")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestToUserDTOs(t *testing.T) {
|
||||
t.Run("empty slice", func(t *testing.T) {
|
||||
users := []database.User{}
|
||||
dtos := ToUserDTOs(users)
|
||||
if len(dtos) != 0 {
|
||||
t.Errorf("Expected empty slice, got %d items", len(dtos))
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("multiple users", func(t *testing.T) {
|
||||
users := []database.User{
|
||||
{
|
||||
ID: 1,
|
||||
Username: "user1",
|
||||
Email: "user1@example.com",
|
||||
},
|
||||
{
|
||||
ID: 2,
|
||||
Username: "user2",
|
||||
Email: "user2@example.com",
|
||||
},
|
||||
}
|
||||
|
||||
dtos := ToUserDTOs(users)
|
||||
|
||||
if len(dtos) != len(users) {
|
||||
t.Fatalf("Expected %d DTOs, got %d", len(users), len(dtos))
|
||||
}
|
||||
|
||||
for i := range users {
|
||||
if dtos[i].ID != users[i].ID {
|
||||
t.Errorf("User %d: Expected ID %d, got %d", i, users[i].ID, dtos[i].ID)
|
||||
}
|
||||
if dtos[i].Username != users[i].Username {
|
||||
t.Errorf("User %d: Expected Username %q, got %q", i, users[i].Username, dtos[i].Username)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestToSanitizedUserDTO(t *testing.T) {
|
||||
t.Run("nil user", func(t *testing.T) {
|
||||
dto := ToSanitizedUserDTO(nil)
|
||||
if dto.ID != 0 {
|
||||
t.Errorf("Expected zero value for nil user, got ID %d", dto.ID)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("valid user", func(t *testing.T) {
|
||||
user := &database.User{
|
||||
ID: 42,
|
||||
Username: "testuser",
|
||||
Email: "test@example.com",
|
||||
EmailVerified: true,
|
||||
CreatedAt: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
UpdatedAt: time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||
}
|
||||
|
||||
dto := ToSanitizedUserDTO(user)
|
||||
|
||||
if dto.ID != user.ID {
|
||||
t.Errorf("Expected ID %d, got %d", user.ID, dto.ID)
|
||||
}
|
||||
if dto.Username != user.Username {
|
||||
t.Errorf("Expected Username %q, got %q", user.Username, dto.Username)
|
||||
}
|
||||
if !dto.CreatedAt.Equal(user.CreatedAt) {
|
||||
t.Errorf("Expected CreatedAt %v, got %v", user.CreatedAt, dto.CreatedAt)
|
||||
}
|
||||
if !dto.UpdatedAt.Equal(user.UpdatedAt) {
|
||||
t.Errorf("Expected UpdatedAt %v, got %v", user.UpdatedAt, dto.UpdatedAt)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestToSanitizedUserDTOs(t *testing.T) {
|
||||
t.Run("empty slice", func(t *testing.T) {
|
||||
users := []database.User{}
|
||||
dtos := ToSanitizedUserDTOs(users)
|
||||
if len(dtos) != 0 {
|
||||
t.Errorf("Expected empty slice, got %d items", len(dtos))
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("multiple users", func(t *testing.T) {
|
||||
users := []database.User{
|
||||
{
|
||||
ID: 1,
|
||||
Username: "user1",
|
||||
Email: "user1@example.com",
|
||||
},
|
||||
{
|
||||
ID: 2,
|
||||
Username: "user2",
|
||||
Email: "user2@example.com",
|
||||
},
|
||||
}
|
||||
|
||||
dtos := ToSanitizedUserDTOs(users)
|
||||
|
||||
if len(dtos) != len(users) {
|
||||
t.Fatalf("Expected %d DTOs, got %d", len(users), len(dtos))
|
||||
}
|
||||
|
||||
for i := range users {
|
||||
if dtos[i].ID != users[i].ID {
|
||||
t.Errorf("User %d: Expected ID %d, got %d", i, users[i].ID, dtos[i].ID)
|
||||
}
|
||||
if dtos[i].Username != users[i].Username {
|
||||
t.Errorf("User %d: Expected Username %q, got %q", i, users[i].Username, dtos[i].Username)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
39
internal/dto/vote.go
Normal file
39
internal/dto/vote.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package dto
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"goyco/internal/database"
|
||||
)
|
||||
|
||||
type VoteDTO struct {
|
||||
ID uint `json:"id"`
|
||||
UserID *uint `json:"user_id,omitempty"`
|
||||
PostID uint `json:"post_id"`
|
||||
Type string `json:"type"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
func ToVoteDTO(vote *database.Vote) VoteDTO {
|
||||
if vote == nil {
|
||||
return VoteDTO{}
|
||||
}
|
||||
|
||||
return VoteDTO{
|
||||
ID: vote.ID,
|
||||
UserID: vote.UserID,
|
||||
PostID: vote.PostID,
|
||||
Type: string(vote.Type),
|
||||
CreatedAt: vote.CreatedAt,
|
||||
UpdatedAt: vote.UpdatedAt,
|
||||
}
|
||||
}
|
||||
|
||||
func ToVoteDTOs(votes []database.Vote) []VoteDTO {
|
||||
dtos := make([]VoteDTO, len(votes))
|
||||
for i := range votes {
|
||||
dtos[i] = ToVoteDTO(&votes[i])
|
||||
}
|
||||
return dtos
|
||||
}
|
||||
149
internal/dto/vote_test.go
Normal file
149
internal/dto/vote_test.go
Normal file
@@ -0,0 +1,149 @@
|
||||
package dto
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"goyco/internal/database"
|
||||
)
|
||||
|
||||
func TestToVoteDTO(t *testing.T) {
|
||||
t.Run("nil vote", func(t *testing.T) {
|
||||
dto := ToVoteDTO(nil)
|
||||
if dto.ID != 0 {
|
||||
t.Errorf("Expected zero value for nil vote, got ID %d", dto.ID)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("vote with user ID", func(t *testing.T) {
|
||||
userID := uint(42)
|
||||
vote := &database.Vote{
|
||||
ID: 1,
|
||||
UserID: &userID,
|
||||
PostID: 10,
|
||||
Type: database.VoteUp,
|
||||
CreatedAt: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
UpdatedAt: time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||
}
|
||||
|
||||
dto := ToVoteDTO(vote)
|
||||
|
||||
if dto.ID != vote.ID {
|
||||
t.Errorf("Expected ID %d, got %d", vote.ID, dto.ID)
|
||||
}
|
||||
if dto.UserID == nil || *dto.UserID != userID {
|
||||
t.Errorf("Expected UserID %d, got %v", userID, dto.UserID)
|
||||
}
|
||||
if dto.PostID != vote.PostID {
|
||||
t.Errorf("Expected PostID %d, got %d", vote.PostID, dto.PostID)
|
||||
}
|
||||
if dto.Type != string(vote.Type) {
|
||||
t.Errorf("Expected Type %q, got %q", vote.Type, dto.Type)
|
||||
}
|
||||
if !dto.CreatedAt.Equal(vote.CreatedAt) {
|
||||
t.Errorf("Expected CreatedAt %v, got %v", vote.CreatedAt, dto.CreatedAt)
|
||||
}
|
||||
if !dto.UpdatedAt.Equal(vote.UpdatedAt) {
|
||||
t.Errorf("Expected UpdatedAt %v, got %v", vote.UpdatedAt, dto.UpdatedAt)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("vote without user ID", func(t *testing.T) {
|
||||
vote := &database.Vote{
|
||||
ID: 2,
|
||||
UserID: nil,
|
||||
PostID: 20,
|
||||
Type: database.VoteDown,
|
||||
CreatedAt: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
UpdatedAt: time.Date(2024, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||
}
|
||||
|
||||
dto := ToVoteDTO(vote)
|
||||
|
||||
if dto.UserID != nil {
|
||||
t.Errorf("Expected UserID to be nil, got %v", dto.UserID)
|
||||
}
|
||||
if dto.Type != string(database.VoteDown) {
|
||||
t.Errorf("Expected Type %q, got %q", database.VoteDown, dto.Type)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("all vote types", func(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
voteType database.VoteType
|
||||
expected string
|
||||
}{
|
||||
{"VoteUp", database.VoteUp, "up"},
|
||||
{"VoteDown", database.VoteDown, "down"},
|
||||
{"VoteNone", database.VoteNone, "none"},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
vote := &database.Vote{
|
||||
ID: 1,
|
||||
Type: tt.voteType,
|
||||
}
|
||||
|
||||
dto := ToVoteDTO(vote)
|
||||
|
||||
if dto.Type != tt.expected {
|
||||
t.Errorf("Expected Type %q, got %q", tt.expected, dto.Type)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestToVoteDTOs(t *testing.T) {
|
||||
t.Run("empty slice", func(t *testing.T) {
|
||||
votes := []database.Vote{}
|
||||
dtos := ToVoteDTOs(votes)
|
||||
if len(dtos) != 0 {
|
||||
t.Errorf("Expected empty slice, got %d items", len(dtos))
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("multiple votes", func(t *testing.T) {
|
||||
userID1 := uint(1)
|
||||
votes := []database.Vote{
|
||||
{
|
||||
ID: 1,
|
||||
UserID: &userID1,
|
||||
PostID: 10,
|
||||
Type: database.VoteUp,
|
||||
},
|
||||
{
|
||||
ID: 2,
|
||||
UserID: nil,
|
||||
PostID: 10,
|
||||
Type: database.VoteDown,
|
||||
},
|
||||
{
|
||||
ID: 3,
|
||||
UserID: &userID1,
|
||||
PostID: 20,
|
||||
Type: database.VoteUp,
|
||||
},
|
||||
}
|
||||
|
||||
dtos := ToVoteDTOs(votes)
|
||||
|
||||
if len(dtos) != len(votes) {
|
||||
t.Fatalf("Expected %d DTOs, got %d", len(votes), len(dtos))
|
||||
}
|
||||
|
||||
for i := range votes {
|
||||
if dtos[i].ID != votes[i].ID {
|
||||
t.Errorf("Vote %d: Expected ID %d, got %d", i, votes[i].ID, dtos[i].ID)
|
||||
}
|
||||
if dtos[i].PostID != votes[i].PostID {
|
||||
t.Errorf("Vote %d: Expected PostID %d, got %d", i, votes[i].PostID, dtos[i].PostID)
|
||||
}
|
||||
if dtos[i].Type != string(votes[i].Type) {
|
||||
t.Errorf("Vote %d: Expected Type %q, got %q", i, votes[i].Type, dtos[i].Type)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user