diff --git a/go.mod b/go.mod index e320e4fa..9fef77a3 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,10 @@ require ( firebase.google.com/go v3.13.0+incompatible github.com/joho/godotenv v1.5.1 github.com/labstack/echo/v4 v4.11.4 + github.com/lib/pq v1.10.9 github.com/rs/zerolog v1.32.0 github.com/shopspring/decimal v1.2.0 + github.com/stretchr/testify v1.8.4 github.com/swaggo/echo-swagger v1.4.1 github.com/swaggo/swag v1.16.1 google.golang.org/api v0.126.0 @@ -15,6 +17,7 @@ require ( require ( github.com/KyleBanks/depth v1.2.1 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-openapi/jsonpointer v0.20.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -29,10 +32,10 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/labstack/gommon v0.4.2 // indirect github.com/leodido/go-urn v1.2.4 // indirect - github.com/lib/pq v1.10.9 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/swaggo/files/v2 v2.0.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect @@ -45,7 +48,7 @@ require ( ) require ( - cloud.google.com/go v0.110.2 // indirect + cloud.google.com/go v0.110.2 cloud.google.com/go/compute v1.19.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/firestore v1.10.0 // indirect @@ -59,7 +62,7 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.0 + github.com/google/uuid v1.6.0 github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.10.0 // indirect go.opencensus.io v0.24.0 // indirect diff --git a/go.sum b/go.sum index b6d97d47..b632dbf3 100644 --- a/go.sum +++ b/go.sum @@ -121,8 +121,8 @@ github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3 github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.10.0 h1:ebSgKfMxynOdxw8QQuFOKMgomqeLGPqNLQox2bo42zg= diff --git a/internal/datatype/uuid.go b/internal/datatype/uuid.go new file mode 100644 index 00000000..0309a8eb --- /dev/null +++ b/internal/datatype/uuid.go @@ -0,0 +1,15 @@ +package datatype + +import ( + "github.com/google/uuid" + pnd "github.com/pet-sitter/pets-next-door-api/api" +) + +func NewV7() (uuid.UUID, *pnd.AppError) { + id, err := uuid.NewV7() + if err != nil { + return uuid.Nil, pnd.ErrUnknown(err) + } + + return id, nil +} diff --git a/internal/service/tests/sos_post_service_test.go b/internal/service/tests/sos_post_service_test.go index 8bb7b911..70f7bdc4 100644 --- a/internal/service/tests/sos_post_service_test.go +++ b/internal/service/tests/sos_post_service_test.go @@ -2,10 +2,13 @@ package service_test import ( "context" - "reflect" "testing" - "github.com/pet-sitter/pets-next-door-api/internal/domain/soscondition" + "github.com/stretchr/testify/assert" + + "github.com/pet-sitter/pets-next-door-api/internal/tests/asserts" + + "github.com/pet-sitter/pets-next-door-api/internal/domain/commonvo" "github.com/pet-sitter/pets-next-door-api/internal/domain/media" "github.com/pet-sitter/pets-next-door-api/internal/domain/pet" @@ -33,60 +36,43 @@ func TestCreateSOSPost(t *testing.T) { ctx := context.Background() db, tearDown := setUp(ctx, t) defer tearDown(t) + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) + sosPostService := tests.NewMockSOSPostService(db) // given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") - sosPostImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image.jpg") - sosPostImage2, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image2.jpg") - - userService := service.NewUserService(db, mediaService) - userRequest := tests.GenerateDummyRegisterUserRequest(&profileImage.ID) - owner, _ := userService.RegisterUser(ctx, userRequest) - uid := owner.FirebaseUID - addPets := tests.AddDummyPet(t, ctx, userService, uid, &profileImage.ID) + owner, _ := userService.RegisterUser(ctx, tests.NewDummyRegisterUserRequest(&profileImage.ID)) + addPets, _ := userService.AddPetsToOwner( + ctx, + owner.FirebaseUID, + pet.AddPetsToOwnerRequest{Pets: []pet.AddPetRequest{ + *tests.NewDummyAddPetRequest(&profileImage.ID, commonvo.PetTypeDog, pet.GenderMale, "poodle"), + }}, + ) // when - sosPostService := service.NewSOSPostService(db) - imageIDs := []int64{sosPostImage.ID, sosPostImage2.ID} - petIDs := []int64{addPets.ID} - - sosPostData := tests.GenerateDummyWriteSOSPostRequest(imageIDs, petIDs, 0) - sosPost, err := sosPostService.WriteSOSPost(ctx, uid, sosPostData) - if err != nil { - t.Errorf("got %v want %v", err, nil) - } + sosPostImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image.jpg") + sosPostImage2, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image2.jpg") + sosPostData := tests.NewDummyWriteSOSPostRequest( + []int64{sosPostImage.ID, sosPostImage2.ID}, + []int64{addPets.Pets[0].ID}, + 0, + ) + created, _ := sosPostService.WriteSOSPost(ctx, owner.FirebaseUID, tests.NewDummyWriteSOSPostRequest( + []int64{sosPostImage.ID, sosPostImage2.ID}, + []int64{addPets.Pets[0].ID}, + 0, + )) // then - assertConditionEquals(t, sosPost.Conditions, sosPostData.ConditionIDs) - assertPetEquals(t, sosPost.Pets[0], *addPets) - assertMediaEquals(t, sosPost.Media, media.ListView{sosPostImage, sosPostImage2}) - assertDatesEquals(t, sosPost.Dates, sosPostData.Dates) - - if sosPost.Title != sosPostData.Title { - t.Errorf("got %v want %v", sosPost.Title, sosPostData.Title) - } - if sosPost.Content != sosPostData.Content { - t.Errorf("got %v want %v", sosPost.Content, sosPostData.Content) - } - if sosPost.Reward != sosPostData.Reward { - t.Errorf("got %v want %v", sosPost.Reward, sosPostData.Reward) - } - if sosPost.CareType != sosPostData.CareType { - t.Errorf("got %v want %v", sosPost.CareType, sosPostData.CareType) - } - if sosPost.CarerGender != sosPostData.CarerGender { - t.Errorf("got %v want %v", sosPost.CarerGender, sosPostData.CarerGender) - } - if sosPost.RewardType != sosPostData.RewardType { - t.Errorf("got %v want %v", sosPost.RewardType, sosPostData.RewardType) - } - if sosPost.ThumbnailID != sosPostData.ImageIDs[0] { - t.Errorf("got %v want %v", sosPost.ThumbnailID, sosPostData.ImageIDs[0]) - } - if int64(sosPost.AuthorID) != owner.ID { - t.Errorf("got %v want %v", sosPost.AuthorID, owner.ID) - } + found, _ := sosPostService.FindSOSPostByID(ctx, created.ID) + asserts.ConditionIDEquals(t, sosPostData.ConditionIDs, found.Conditions) + assertPetEquals(t, addPets.Pets[0], found.Pets[0]) + asserts.MediaEquals(t, media.ListView{sosPostImage, sosPostImage2}, found.Media) + asserts.DatesEquals(t, sosPostData.Dates, found.Dates) + writtenAndFoundSOSPostEquals(t, *sosPostData, *found) + assert.Equal(t, owner.ID, int64(created.AuthorID)) }) } @@ -95,50 +81,57 @@ func TestFindSOSPosts(t *testing.T) { ctx := context.Background() db, tearDown := setUp(ctx, t) defer tearDown(t) + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) + sosPostService := tests.NewMockSOSPostService(db) // given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") sosPostImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image.jpg") sosPostImage2, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image2.jpg") - userService := service.NewUserService(db, mediaService) - userRequest := tests.GenerateDummyRegisterUserRequest(&profileImage.ID) + userRequest := tests.NewDummyRegisterUserRequest(&profileImage.ID) owner, _ := userService.RegisterUser(ctx, userRequest) - author := &user.WithoutPrivateInfo{ - ID: owner.ID, - ProfileImageURL: owner.ProfileImageURL, - Nickname: owner.Nickname, - } - uid := owner.FirebaseUID - addPets := tests.AddDummyPet(t, ctx, userService, uid, &profileImage.ID) + addPets, _ := userService.AddPetsToOwner( + ctx, + owner.FirebaseUID, + pet.AddPetsToOwnerRequest{ + Pets: []pet.AddPetRequest{ + *tests.NewDummyAddPetRequest(&profileImage.ID, commonvo.PetTypeDog, pet.GenderMale, "poodle"), + }, + }, + ) - sosPostService := service.NewSOSPostService(db) imageIDs := []int64{sosPostImage.ID, sosPostImage2.ID} - petIDs := []int64{addPets.ID} + petIDs := []int64{addPets.Pets[0].ID} conditionIDs := []int{1, 2} + sosPostRequests := make([]sospost.WriteSOSPostRequest, 0) var sosPosts []sospost.WriteSOSPostView for i := 1; i < 4; i++ { - sosPost := tests.WriteDummySOSPosts(t, ctx, sosPostService, uid, imageIDs, petIDs, i) + request := tests.NewDummyWriteSOSPostRequest(imageIDs, petIDs, i) + sosPost, _ := sosPostService.WriteSOSPost( + ctx, owner.FirebaseUID, request, + ) sosPosts = append(sosPosts, *sosPost) + sosPostRequests = append(sosPostRequests, *request) } // when - sosPostList, err := sosPostService.FindSOSPosts(ctx, 1, 3, "newest", "all") + foundList, err := sosPostService.FindSOSPosts(ctx, 1, 3, "newest", "all") if err != nil { t.Errorf("got %v want %v", err, nil) } // then - for i, sosPost := range sosPostList.Items { - idx := len(sosPostList.Items) - i - 1 - assertConditionEquals(t, sosPost.Conditions, conditionIDs) - assertPetEquals(t, sosPost.Pets[0], *addPets) - assertMediaEquals(t, sosPost.Media, media.ListView{sosPostImage, sosPostImage2}) - assertAuthorEquals(t, sosPost.Author, author) - assertDatesEquals(t, sosPost.Dates, sosPosts[idx].Dates) - assertFindSOSPostEquals(t, sosPost, sosPosts[idx]) + for i, found := range foundList.Items { + idx := len(foundList.Items) - i - 1 + asserts.ConditionIDEquals(t, conditionIDs, found.Conditions) + assertPetEquals(t, addPets.Pets[0], found.Pets[0]) + asserts.MediaEquals(t, media.ListView{sosPostImage, sosPostImage2}, found.Media) + assert.Equal(t, owner.ID, found.Author.ID) + asserts.DatesEquals(t, sosPosts[idx].Dates, found.Dates) + writtenAndFoundSOSPostEquals(t, sosPostRequests[idx], found) } }) @@ -146,49 +139,48 @@ func TestFindSOSPosts(t *testing.T) { ctx := context.Background() db, tearDown := setUp(ctx, t) defer tearDown(t) + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) + sosPostService := tests.NewMockSOSPostService(db) // given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") sosPostImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image.jpg") sosPostImage2, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image2.jpg") - userService := service.NewUserService(db, mediaService) - userRequest := tests.GenerateDummyRegisterUserRequest(&profileImage.ID) + userRequest := tests.NewDummyRegisterUserRequest(&profileImage.ID) owner, _ := userService.RegisterUser(ctx, userRequest) - author := &user.WithoutPrivateInfo{ - ID: owner.ID, - ProfileImageURL: owner.ProfileImageURL, - Nickname: owner.Nickname, - } uid := owner.FirebaseUID - addPets := tests.AddDummyPets(t, ctx, userService, uid, &profileImage.ID) + addPetRequest, _ := userService.AddPetsToOwner(ctx, uid, pet.AddPetsToOwnerRequest{ + Pets: []pet.AddPetRequest{ + *tests.NewDummyAddPetRequest(&profileImage.ID, commonvo.PetTypeDog, pet.GenderMale, "poodle"), + *tests.NewDummyAddPetRequest(&profileImage.ID, commonvo.PetTypeDog, pet.GenderMale, "poodle"), + *tests.NewDummyAddPetRequest(&profileImage.ID, commonvo.PetTypeCat, pet.GenderMale, "munchkin"), + }, + }) - sosPostService := service.NewSOSPostService(db) imageIDs := []int64{sosPostImage.ID, sosPostImage2.ID} conditionIDs := []int{1, 2} - var sosPosts []sospost.WriteSOSPostView + sosPostRequests := make([]sospost.WriteSOSPostRequest, 0) for i := 1; i < 4; i++ { - sosPost := tests.WriteDummySOSPosts(t, ctx, sosPostService, uid, imageIDs, []int64{addPets.Pets[i-1].ID}, i) - sosPosts = append(sosPosts, *sosPost) + request := tests.NewDummyWriteSOSPostRequest(imageIDs, []int64{addPetRequest.Pets[i-1].ID}, i) + sosPostService.WriteSOSPost(ctx, uid, request) + sosPostRequests = append(sosPostRequests, *request) } // when - sosPostList, err := sosPostService.FindSOSPosts(ctx, 1, 3, "newest", "all") - if err != nil { - t.Errorf("got %v want %v", err, nil) - } + sosPostList, _ := sosPostService.FindSOSPosts(ctx, 1, 3, "newest", "all") // then for i, sosPost := range sosPostList.Items { idx := len(sosPostList.Items) - i - 1 - assertConditionEquals(t, sosPost.Conditions, conditionIDs) - assertPetEquals(t, sosPost.Pets[i-1], addPets.Pets[i-1]) - assertMediaEquals(t, sosPost.Media, media.ListView{sosPostImage, sosPostImage2}) - assertAuthorEquals(t, sosPost.Author, author) - assertDatesEquals(t, sosPost.Dates, sosPosts[idx].Dates) - assertFindSOSPostEquals(t, sosPost, sosPosts[idx]) + asserts.ConditionIDEquals(t, conditionIDs, sosPost.Conditions) + assertPetEquals(t, addPetRequest.Pets[i-1], sosPost.Pets[i-1]) + asserts.MediaEquals(t, media.ListView{sosPostImage, sosPostImage2}, sosPost.Media) + assert.Equal(t, owner.ID, sosPost.Author.ID) + asserts.DatesEquals(t, sosPostRequests[idx].Dates, sosPost.Dates) + writtenAndFoundSOSPostEquals(t, sosPostRequests[idx], sosPost) } }) @@ -196,62 +188,58 @@ func TestFindSOSPosts(t *testing.T) { ctx := context.Background() db, tearDown := setUp(ctx, t) defer tearDown(t) + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) + sosPostService := tests.NewMockSOSPostService(db) // given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") + owner, _ := userService.RegisterUser(ctx, tests.NewDummyRegisterUserRequest(&profileImage.ID)) + sosPostImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image.jpg") sosPostImage2, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image2.jpg") - - userService := service.NewUserService(db, mediaService) - userRequest := tests.GenerateDummyRegisterUserRequest(&profileImage.ID) - owner, _ := userService.RegisterUser(ctx, userRequest) - author := &user.WithoutPrivateInfo{ - ID: owner.ID, - ProfileImageURL: owner.ProfileImageURL, - Nickname: owner.Nickname, - } uid := owner.FirebaseUID - addPets := tests.AddDummyPets(t, ctx, userService, uid, &profileImage.ID) + petList, _ := userService.AddPetsToOwner(ctx, uid, pet.AddPetsToOwnerRequest{ + Pets: []pet.AddPetRequest{ + *tests.NewDummyAddPetRequest(&profileImage.ID, commonvo.PetTypeDog, pet.GenderMale, "poodle"), + *tests.NewDummyAddPetRequest(&profileImage.ID, commonvo.PetTypeDog, pet.GenderMale, "poodle"), + *tests.NewDummyAddPetRequest(&profileImage.ID, commonvo.PetTypeCat, pet.GenderMale, "munchkin"), + }, + }) - sosPostService := service.NewSOSPostService(db) imageIDs := []int64{sosPostImage.ID, sosPostImage2.ID} conditionIDs := []int{1, 2} - var sosPosts []sospost.WriteSOSPostView + writeRequests := make([]sospost.WriteSOSPostRequest, 0) // 강아지인 경우 for i := 1; i < 3; i++ { - sosPost := tests.WriteDummySOSPosts(t, ctx, sosPostService, uid, imageIDs, []int64{addPets.Pets[i-1].ID}, i) - sosPosts = append(sosPosts, *sosPost) + request := tests.NewDummyWriteSOSPostRequest(imageIDs, []int64{petList.Pets[i-1].ID}, i) + sosPostService.WriteSOSPost(ctx, uid, request) + writeRequests = append(writeRequests, *request) } // 고양이인 경우 - sosPosts = append(sosPosts, - *tests.WriteDummySOSPosts(t, ctx, sosPostService, uid, imageIDs, []int64{addPets.Pets[2].ID}, 3)) + request := tests.NewDummyWriteSOSPostRequest(imageIDs, []int64{petList.Pets[2].ID}, 3) + sosPostService.WriteSOSPost(ctx, uid, request) + writeRequests = append(writeRequests, *request) // 강아지, 고양이인 경우 - sosPosts = append(sosPosts, - *tests.WriteDummySOSPosts(t, ctx, - sosPostService, uid, imageIDs, []int64{addPets.Pets[1].ID, addPets.Pets[2].ID}, - 4, - ), - ) + request = tests.NewDummyWriteSOSPostRequest(imageIDs, []int64{petList.Pets[1].ID, petList.Pets[2].ID}, 4) + sosPostService.WriteSOSPost(ctx, uid, request) + writeRequests = append(writeRequests, *request) // when - sosPostList, err := sosPostService.FindSOSPosts(ctx, 1, 3, "newest", "all") - if err != nil { - t.Errorf("got %v want %v", err, nil) - } + foundList, _ := sosPostService.FindSOSPosts(ctx, 1, 3, "newest", "all") // then - for i, sosPost := range sosPostList.Items { - idx := len(sosPostList.Items) - i - 1 - assertConditionEquals(t, sosPost.Conditions, conditionIDs) - assertPetEquals(t, sosPost.Pets[i-1], addPets.Pets[i-1]) - assertMediaEquals(t, sosPost.Media, media.ListView{sosPostImage, sosPostImage2}) - assertAuthorEquals(t, sosPost.Author, author) - assertDatesEquals(t, sosPost.Dates, sosPosts[idx].Dates) - assertFindSOSPostEquals(t, sosPost, sosPosts[idx]) + for i, sosPost := range foundList.Items { + idx := len(foundList.Items) - i - 1 + asserts.ConditionIDEquals(t, conditionIDs, sosPost.Conditions) + assertPetEquals(t, petList.Pets[i-1], sosPost.Pets[i-1]) + asserts.MediaEquals(t, media.ListView{sosPostImage, sosPostImage2}, sosPost.Media) + assert.Equal(t, owner.ID, sosPost.Author.ID) + asserts.DatesEquals(t, writeRequests[idx].Dates, sosPost.Dates) + writtenAndFoundSOSPostEquals(t, writeRequests[idx], sosPost) } }) @@ -259,48 +247,54 @@ func TestFindSOSPosts(t *testing.T) { ctx := context.Background() db, tearDown := setUp(ctx, t) defer tearDown(t) + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) + sosPostService := tests.NewMockSOSPostService(db) - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) + // given profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") sosPostImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image.jpg") sosPostImage2, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image2.jpg") - userService := service.NewUserService(db, mediaService) - userRequest := tests.GenerateDummyRegisterUserRequest(&profileImage.ID) + userRequest := tests.NewDummyRegisterUserRequest(&profileImage.ID) owner, _ := userService.RegisterUser(ctx, userRequest) author := &user.WithoutPrivateInfo{ ID: owner.ID, ProfileImageURL: owner.ProfileImageURL, Nickname: owner.Nickname, } - uid := owner.FirebaseUID - addPet := tests.AddDummyPet(t, ctx, userService, uid, &profileImage.ID) + petList, _ := userService.AddPetsToOwner( + ctx, + owner.FirebaseUID, + pet.AddPetsToOwnerRequest{ + Pets: []pet.AddPetRequest{ + *tests.NewDummyAddPetRequest(&profileImage.ID, commonvo.PetTypeDog, pet.GenderMale, "poodle"), + }, + }, + ) - sosPostService := service.NewSOSPostService(db) imageIDs := []int64{sosPostImage.ID, sosPostImage2.ID} conditionIDs := []int{1, 2} - sosPosts := make([]sospost.WriteSOSPostView, 0) + writeRequests := make([]sospost.WriteSOSPostRequest, 0) for i := 1; i < 4; i++ { - sosPost := tests.WriteDummySOSPosts(t, ctx, sosPostService, uid, imageIDs, []int64{addPet.ID}, i) - sosPosts = append(sosPosts, *sosPost) + request := tests.NewDummyWriteSOSPostRequest(imageIDs, []int64{petList.Pets[0].ID}, i) + sosPostService.WriteSOSPost(ctx, owner.FirebaseUID, request) + writeRequests = append(writeRequests, *request) } // when - sosPostListByAuthorID, err := sosPostService.FindSOSPostsByAuthorID(ctx, int(owner.ID), 1, 3, "newest", "all") - if err != nil { - t.Errorf("got %v want %v", err, nil) - } + foundList, _ := sosPostService.FindSOSPostsByAuthorID(ctx, int(owner.ID), 1, 3, "newest", "all") // then - for i, sosPost := range sosPostListByAuthorID.Items { - idx := len(sosPostListByAuthorID.Items) - i - 1 - assertConditionEquals(t, sosPost.Conditions, conditionIDs) - assertPetEquals(t, sosPost.Pets[0], *addPet) - assertMediaEquals(t, sosPost.Media, media.ListView{sosPostImage, sosPostImage2}) - assertAuthorEquals(t, sosPost.Author, author) - assertDatesEquals(t, sosPost.Dates, sosPosts[idx].Dates) - assertFindSOSPostEquals(t, sosPost, sosPosts[idx]) + for i, sosPost := range foundList.Items { + idx := len(foundList.Items) - i - 1 + asserts.ConditionIDEquals(t, conditionIDs, sosPost.Conditions) + assertPetEquals(t, petList.Pets[0], sosPost.Pets[0]) + asserts.MediaEquals(t, media.ListView{sosPostImage, sosPostImage2}, sosPost.Media) + assert.Equal(t, author.ID, sosPost.Author.ID) + asserts.DatesEquals(t, writeRequests[idx].Dates, sosPost.Dates) + writtenAndFoundSOSPostEquals(t, writeRequests[idx], sosPost) } }) } @@ -310,46 +304,52 @@ func TestFindSOSPostByID(t *testing.T) { ctx := context.Background() db, tearDown := setUp(ctx, t) defer tearDown(t) + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) + sosPostService := tests.NewMockSOSPostService(db) - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) + // given profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") sosPostImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image.jpg") sosPostImage2, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image2.jpg") - userService := service.NewUserService(db, mediaService) - userRequest := tests.GenerateDummyRegisterUserRequest(&profileImage.ID) + userRequest := tests.NewDummyRegisterUserRequest(&profileImage.ID) owner, _ := userService.RegisterUser(ctx, userRequest) author := &user.WithoutPrivateInfo{ ID: owner.ID, ProfileImageURL: owner.ProfileImageURL, Nickname: owner.Nickname, } - uid := owner.FirebaseUID - addPet := tests.AddDummyPet(t, ctx, userService, uid, &profileImage.ID) + addPets, _ := userService.AddPetsToOwner( + ctx, + owner.FirebaseUID, + pet.AddPetsToOwnerRequest{Pets: []pet.AddPetRequest{ + *tests.NewDummyAddPetRequest(&profileImage.ID, commonvo.PetTypeDog, pet.GenderMale, "poodle"), + }}, + ) - sosPostService := service.NewSOSPostService(db) imageIDs := []int64{sosPostImage.ID, sosPostImage2.ID} conditionIDs := []int{1, 2} - sosPosts := make([]sospost.WriteSOSPostView, 0) + writeRequests := make([]sospost.WriteSOSPostRequest, 0) + writtenIDs := make([]int64, 0) for i := 1; i < 4; i++ { - sosPost := tests.WriteDummySOSPosts(t, ctx, sosPostService, uid, imageIDs, []int64{addPet.ID}, i) - sosPosts = append(sosPosts, *sosPost) + request := tests.NewDummyWriteSOSPostRequest(imageIDs, []int64{addPets.Pets[0].ID}, i) + sosPost, _ := sosPostService.WriteSOSPost(ctx, owner.FirebaseUID, request) + writeRequests = append(writeRequests, *request) + writtenIDs = append(writtenIDs, int64(sosPost.ID)) } // when - findSOSPostByID, err := sosPostService.FindSOSPostByID(ctx, sosPosts[0].ID) - if err != nil { - t.Errorf("got %v want %v", err, nil) - } + found, _ := sosPostService.FindSOSPostByID(ctx, int(writtenIDs[0])) // then - assertConditionEquals(t, sosPosts[0].Conditions, conditionIDs) - assertPetEquals(t, sosPosts[0].Pets[0], *addPet) - assertMediaEquals(t, findSOSPostByID.Media, media.ListView{sosPostImage, sosPostImage2}) - assertAuthorEquals(t, findSOSPostByID.Author, author) - assertDatesEquals(t, findSOSPostByID.Dates, sosPosts[0].Dates) - assertFindSOSPostEquals(t, *findSOSPostByID, sosPosts[0]) + asserts.ConditionIDEquals(t, conditionIDs, found.Conditions) + assertPetEquals(t, addPets.Pets[0], found.Pets[0]) + asserts.MediaEquals(t, media.ListView{sosPostImage, sosPostImage2}, found.Media) + assert.Equal(t, author.ID, found.Author.ID) + asserts.DatesEquals(t, writeRequests[0].Dates, found.Dates) + writtenAndFoundSOSPostEquals(t, writeRequests[0], *found) }) } @@ -358,26 +358,31 @@ func TestUpdateSOSPost(t *testing.T) { ctx := context.Background() db, tearDown := setUp(ctx, t) defer tearDown(t) + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) + sosPostService := tests.NewMockSOSPostService(db) // given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") sosPostImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image.jpg") sosPostImage2, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "sos_post_image2.jpg") - userService := service.NewUserService(db, mediaService) - userRequest := tests.GenerateDummyRegisterUserRequest(&profileImage.ID) + userRequest := tests.NewDummyRegisterUserRequest(&profileImage.ID) owner, _ := userService.RegisterUser(ctx, userRequest) - uid := owner.FirebaseUID - addPet := tests.AddDummyPet(t, ctx, userService, uid, &profileImage.ID) + addPets, _ := userService.AddPetsToOwner( + ctx, + owner.FirebaseUID, + pet.AddPetsToOwnerRequest{Pets: []pet.AddPetRequest{ + *tests.NewDummyAddPetRequest(&profileImage.ID, commonvo.PetTypeDog, pet.GenderMale, "poodle"), + }}, + ) - sosPostService := service.NewSOSPostService(db) - sosPost := tests.WriteDummySOSPosts(t, ctx, - sosPostService, uid, []int64{sosPostImage.ID}, []int64{addPet.ID}, - 1, + sosPost, _ := sosPostService.WriteSOSPost( + ctx, owner.FirebaseUID, tests.NewDummyWriteSOSPostRequest([]int64{sosPostImage.ID}, []int64{addPets.Pets[0].ID}, 1), ) - updateSOSPostData := &sospost.UpdateSOSPostRequest{ + // when + updateRequest := &sospost.UpdateSOSPostRequest{ ID: sosPost.ID, Title: "Title2", Content: "Content2", @@ -391,160 +396,50 @@ func TestUpdateSOSPost(t *testing.T) { CarerGender: sospost.CarerGenderMale, RewardType: sospost.RewardTypeFee, ConditionIDs: []int{1, 2}, - PetIDs: []int{int(addPet.ID)}, + PetIDs: []int{int(addPets.Pets[0].ID)}, } + updated, _ := sosPostService.UpdateSOSPost(ctx, updateRequest) - // when - updateSOSPost, err := sosPostService.UpdateSOSPost(ctx, updateSOSPostData) - if err != nil { - t.Errorf("got %v want %v", err, nil) - } - - assertConditionEquals(t, sosPost.Conditions, updateSOSPostData.ConditionIDs) - assertPetEquals(t, sosPost.Pets[0], *addPet) - assertMediaEquals(t, updateSOSPost.Media, media.ListView{sosPostImage, sosPostImage2}) - assertDatesEquals(t, updateSOSPost.Dates, updateSOSPostData.Dates) - - if updateSOSPost.Title != updateSOSPostData.Title { - t.Errorf("got %v want %v", updateSOSPost.Title, updateSOSPostData.Title) - } - if updateSOSPost.Content != updateSOSPostData.Content { - t.Errorf("got %v want %v", updateSOSPost.Content, updateSOSPostData.Content) - } - if updateSOSPost.Reward != updateSOSPostData.Reward { - t.Errorf("got %v want %v", updateSOSPost.Reward, updateSOSPostData.Reward) - } - if updateSOSPost.CareType != updateSOSPostData.CareType { - t.Errorf("got %v want %v", updateSOSPost.CareType, updateSOSPostData.CareType) - } - if updateSOSPost.CarerGender != updateSOSPostData.CarerGender { - t.Errorf("got %v want %v", updateSOSPost.CarerGender, updateSOSPostData.CarerGender) - } - if updateSOSPost.RewardType != updateSOSPostData.RewardType { - t.Errorf("got %v want %v", updateSOSPost.RewardType, updateSOSPostData.RewardType) - } - if updateSOSPost.ThumbnailID != sosPostImage.ID { - t.Errorf("got %v want %v", updateSOSPost.ThumbnailID, sosPostImage.ID) - } - if int64(updateSOSPost.AuthorID) != owner.ID { - t.Errorf("got %v want %v", updateSOSPost.AuthorID, owner.ID) - } + // then + found, _ := sosPostService.FindSOSPostByID(ctx, sosPost.ID) + asserts.ConditionIDEquals(t, updateRequest.ConditionIDs, found.Conditions) + assertPetEquals(t, sosPost.Pets[0], found.Pets[0]) + asserts.MediaEquals(t, media.ListView{sosPostImage, sosPostImage2}, found.Media) + asserts.DatesEquals(t, updateRequest.Dates, found.Dates) + assert.Equal(t, updateRequest.Title, found.Title) + assert.Equal(t, updateRequest.Content, found.Content) + assert.Equal(t, updateRequest.Reward, found.Reward) + assert.Equal(t, updateRequest.CareType, found.CareType) + assert.Equal(t, updateRequest.CarerGender, found.CarerGender) + assert.Equal(t, updateRequest.RewardType, found.RewardType) + assert.Equal(t, updateRequest.ImageIDs[0], found.ThumbnailID) + assert.Equal(t, int64(updated.AuthorID), owner.ID) }) } -func assertFindSOSPostEquals(t *testing.T, got sospost.FindSOSPostView, want sospost.WriteSOSPostView) { - t.Helper() - - if got.Title != want.Title { - t.Errorf("got %v want %v", got.Title, want.Title) - } - if got.Content != want.Content { - t.Errorf("got %v want %v", got.Content, want.Content) - } - if got.Reward != want.Reward { - t.Errorf("got %v want %v", got.Reward, want.Reward) - } - if got.CareType != want.CareType { - t.Errorf("got %v want %v", got.CareType, want.CareType) - } - if got.CarerGender != want.CarerGender { - t.Errorf("got %v want %v", got.CarerGender, want.CarerGender) - } - if got.RewardType != want.RewardType { - t.Errorf("got %v want %v", got.RewardType, want.RewardType) - } - if got.ThumbnailID != want.ThumbnailID { - t.Errorf("got %v want %v", got.ThumbnailID, want.ThumbnailID) - } -} - -func assertConditionEquals(t *testing.T, got soscondition.ListView, want []int) { +func assertPetEquals(t *testing.T, want, got pet.DetailView) { t.Helper() - for i := range want { - if int64(i+1) != got[i].ID { - t.Errorf("got %v want %v", got[i].ID, i+1) - } - } + assert.Equal(t, want.ID, got.ID) + assert.Equal(t, want.Name, got.Name) + assert.Equal(t, want.PetType, got.PetType) + assert.Equal(t, want.Sex, got.Sex) + assert.Equal(t, want.Neutered, got.Neutered) + assert.Equal(t, want.Breed, got.Breed) + assert.Equal(t, want.BirthDate, got.BirthDate) + assert.Equal(t, want.WeightInKg.String(), got.WeightInKg.String()) + assert.Equal(t, want.Remarks, got.Remarks) + assert.Equal(t, want.ProfileImageURL, got.ProfileImageURL) } -func assertPetEquals(t *testing.T, got, want pet.DetailView) { +func writtenAndFoundSOSPostEquals(t *testing.T, want sospost.WriteSOSPostRequest, got sospost.FindSOSPostView) { t.Helper() - if got.ID != want.ID { - t.Errorf("got %v want %v", got.ID, want.ID) - } - - if got.Name != want.Name { - t.Errorf("got %v want %v", got.Name, want.Name) - } - - if got.PetType != want.PetType { - t.Errorf("got %v want %v", got.PetType, want.PetType) - } - - if got.Sex != want.Sex { - t.Errorf("got %v want %v", got.Sex, want.Sex) - } - - if got.Neutered != want.Neutered { - t.Errorf("got %v want %v", got.Neutered, want.Neutered) - } - - if got.Breed != want.Breed { - t.Errorf("got %v want %v", got.Breed, want.Breed) - } - - if got.BirthDate != want.BirthDate { - t.Errorf("got %v want %v", got.BirthDate, want.BirthDate) - } - - if got.WeightInKg.String() != want.WeightInKg.String() { - t.Errorf("got %v want %v", got.WeightInKg, want.WeightInKg) - } - - if got.Remarks != want.Remarks { - t.Errorf("got %v want %v", got.Remarks, want.Remarks) - } - - switch { - case got.ProfileImageURL == nil && want.ProfileImageURL != nil: - t.Errorf("got %v want %v", got.ProfileImageURL, want.ProfileImageURL) - case got.ProfileImageURL != nil && want.ProfileImageURL == nil: - t.Errorf("got %v want %v", got.ProfileImageURL, want.ProfileImageURL) - case *got.ProfileImageURL != *want.ProfileImageURL: - t.Errorf("got %v want %v", *got.ProfileImageURL, *want.ProfileImageURL) - } -} - -func assertMediaEquals(t *testing.T, got, want media.ListView) { - t.Helper() - - for i, mediaData := range want { - if got[i].ID != mediaData.ID { - t.Errorf("got %v want %v", got[i].ID, mediaData.ID) - } - if got[i].MediaType != mediaData.MediaType { - t.Errorf("got %v want %v", got[i].MediaType, mediaData.MediaType) - } - if got[i].URL != mediaData.URL { - t.Errorf("got %v want %v", got[i].URL, mediaData.URL) - } - } -} - -func assertAuthorEquals(t *testing.T, got, want *user.WithoutPrivateInfo) { - t.Helper() - - if !reflect.DeepEqual(got, want) { - t.Errorf("got %v want %v", got, want) - } -} - -func assertDatesEquals(t *testing.T, got, want []sospost.SOSDateView) { - t.Helper() - - if !reflect.DeepEqual(got, want) { - t.Errorf("got %v want %v", got, want) - } + assert.Equal(t, want.Title, got.Title) + assert.Equal(t, want.Content, got.Content) + assert.Equal(t, want.Reward, got.Reward) + assert.Equal(t, want.CareType, got.CareType) + assert.Equal(t, want.CarerGender, got.CarerGender) + assert.Equal(t, want.RewardType, got.RewardType) + assert.Equal(t, want.ImageIDs[0], got.ThumbnailID) } diff --git a/internal/service/tests/user_service_test.go b/internal/service/tests/user_service_test.go index a03671dd..abb13e59 100644 --- a/internal/service/tests/user_service_test.go +++ b/internal/service/tests/user_service_test.go @@ -5,14 +5,15 @@ import ( "fmt" "testing" - "github.com/pet-sitter/pets-next-door-api/internal/domain/media" + "github.com/stretchr/testify/assert" + + "github.com/pet-sitter/pets-next-door-api/internal/domain/commonvo" - "github.com/pet-sitter/pets-next-door-api/internal/tests/assert" + "github.com/pet-sitter/pets-next-door-api/internal/domain/media" "github.com/pet-sitter/pets-next-door-api/internal/datatype" "github.com/pet-sitter/pets-next-door-api/internal/domain/pet" "github.com/pet-sitter/pets-next-door-api/internal/domain/user" - "github.com/pet-sitter/pets-next-door-api/internal/service" "github.com/pet-sitter/pets-next-door-api/internal/tests" "github.com/shopspring/decimal" ) @@ -22,30 +23,28 @@ func TestRegisterUser(t *testing.T) { db, tearDown := tests.SetUp(t) defer tearDown(t) ctx := context.Background() + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) // Given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") - userService := service.NewUserService(db, mediaService) - userRequest := tests.GenerateDummyRegisterUserRequest(&profileImage.ID) + userRequest := tests.NewDummyRegisterUserRequest(&profileImage.ID) // When created, _ := userService.RegisterUser(ctx, userRequest) // Then - if created.Email != userRequest.Email { - t.Errorf("got %v want %v", created.Email, userRequest.Email) - } + assert.Equal(t, userRequest.Email, created.Email) }) t.Run("사용자의 프로필 이미지가 존재하지 않아도 생성한다", func(t *testing.T) { db, tearDown := tests.SetUp(t) defer tearDown(t) ctx := context.Background() + userService := tests.NewMockUserService(db) // Given - userService := service.NewUserService(db, nil) userRequest := &user.RegisterUserRequest{ Email: "test@example.com", Nickname: "nickname", @@ -59,29 +58,26 @@ func TestRegisterUser(t *testing.T) { created, _ := userService.RegisterUser(ctx, userRequest) // Then - if created.Email != userRequest.Email { - t.Errorf("got %v want %v", created.Email, userRequest.Email) - } + assert.Equal(t, userRequest.Email, created.Email) }) t.Run("사용자가 이미 존재할 경우 에러를 반환한다", func(t *testing.T) { db, tearDown := tests.SetUp(t) defer tearDown(t) ctx := context.Background() + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) // Given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") - - userService := service.NewUserService(db, mediaService) - userRequest := tests.GenerateDummyRegisterUserRequest(&profileImage.ID) - + userRequest := tests.NewDummyRegisterUserRequest(&profileImage.ID) userService.RegisterUser(ctx, userRequest) - // When & Then - if _, err := userService.RegisterUser(ctx, userRequest); err == nil { - t.Errorf("got %v want %v", err, nil) - } + // When + _, err := userService.RegisterUser(ctx, userRequest) + + // Then + assert.NotNil(t, err) }) } @@ -90,12 +86,12 @@ func TestFindUsers(t *testing.T) { db, tearDown := tests.SetUp(t) defer tearDown(t) ctx := context.Background() + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) // Given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") - userService := service.NewUserService(db, mediaService) targetNickname := "target" targetUserRequest := &user.RegisterUserRequest{ Email: "test@example.com", @@ -122,9 +118,7 @@ func TestFindUsers(t *testing.T) { found, _ := userService.FindUsers(ctx, user.FindUsersParams{Page: 1, Size: 20, Nickname: &targetNickname}) // Then - if len(found.Items) != 1 { - t.Errorf("got %v want %v", len(found.Items), 1) - } + assert.Equal(t, 1, len(found.Items)) }) } @@ -133,62 +127,54 @@ func TestFindUser(t *testing.T) { db, tearDown := tests.SetUp(t) defer tearDown(t) ctx := context.Background() + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) // Given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") - userService := service.NewUserService(db, mediaService) - userRequest := tests.GenerateDummyRegisterUserRequest(&profileImage.ID) + userRequest := tests.NewDummyRegisterUserRequest(&profileImage.ID) created, _ := userService.RegisterUser(ctx, userRequest) // When found, _ := userService.FindUser(ctx, user.FindUserParams{Email: &created.Email}) // Then - if found.Email != userRequest.Email { - t.Errorf("got %v want %v", found.Email, userRequest.Email) - } + assert.Equal(t, created.Email, found.Email) }) t.Run("사용자를 UID로 찾는다", func(t *testing.T) { db, tearDown := tests.SetUp(t) defer tearDown(t) ctx := context.Background() + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) // Given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") - userService := service.NewUserService(db, mediaService) - userRequest := tests.GenerateDummyRegisterUserRequest(&profileImage.ID) + userRequest := tests.NewDummyRegisterUserRequest(&profileImage.ID) created, _ := userService.RegisterUser(ctx, userRequest) // When found, _ := userService.FindUser(ctx, user.FindUserParams{FbUID: &created.FirebaseUID}) // Then - if found.FirebaseUID != userRequest.FirebaseUID { - t.Errorf("got %v want %v", found.FirebaseUID, userRequest.FirebaseUID) - } + assert.Equal(t, created.FirebaseUID, found.FirebaseUID) }) t.Run("사용자가 존재하지 않을 경우 에러를 반환한다", func(t *testing.T) { db, tearDown := tests.SetUp(t) defer tearDown(t) ctx := context.Background() - - // Given - userService := service.NewUserService(db, nil) + userService := tests.NewMockUserService(db) // When email := "non-existent@example.com" _, err := userService.FindUser(ctx, user.FindUserParams{Email: &email}) // Then - if err == nil { - t.Errorf("got %v want %v", err, nil) - } + assert.NotNil(t, err) }) } @@ -197,39 +183,33 @@ func TestExistsByEmail(t *testing.T) { db, tearDown := tests.SetUp(t) defer tearDown(t) ctx := context.Background() - - // Given - userService := service.NewUserService(db, nil) + userService := tests.NewMockUserService(db) // When exists, _ := userService.ExistsByNickname(ctx, "non-existent") // Then - if exists { - t.Errorf("got %v want %v", exists, false) - } + assert.False(t, exists) }) t.Run("사용자의 닉네임이 존재할 경우 true를 반환한다", func(t *testing.T) { db, tearDown := tests.SetUp(t) defer tearDown(t) ctx := context.Background() + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) // Given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") - userService := service.NewUserService(db, mediaService) - userRequest := tests.GenerateDummyRegisterUserRequest(&profileImage.ID) + userRequest := tests.NewDummyRegisterUserRequest(&profileImage.ID) userService.RegisterUser(ctx, userRequest) // When exists, _ := userService.ExistsByNickname(ctx, userRequest.Nickname) // Then - if !exists { - t.Errorf("got %v want %v", exists, true) - } + assert.True(t, exists) }) } @@ -238,27 +218,22 @@ func TestUpdateUserByUID(t *testing.T) { db, tearDown := tests.SetUp(t) defer tearDown(t) ctx := context.Background() + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) // Given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) - - userService := service.NewUserService(db, mediaService) - userRequest := tests.RegisterDummyUser(t, ctx, userService, mediaService) + profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") + targetUser, _ := userService.RegisterUser(ctx, tests.NewDummyRegisterUserRequest(&profileImage.ID)) // When updatedNickname := "updated" updatedProfileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "updated_profile_image.jpg") - userService.UpdateUserByUID(ctx, userRequest.FirebaseUID, updatedNickname, &updatedProfileImage.ID) + userService.UpdateUserByUID(ctx, targetUser.FirebaseUID, updatedNickname, &updatedProfileImage.ID) // Then - found, _ := userService.FindUser(ctx, user.FindUserParams{FbUID: &userRequest.FirebaseUID}) - if found.Nickname != updatedNickname { - t.Errorf("got %v want %v", found.Nickname, updatedNickname) - } - - if *found.ProfileImageURL != updatedProfileImage.URL { - t.Errorf("got %v want %v", *found.ProfileImageURL, updatedProfileImage.URL) - } + found, _ := userService.FindUser(ctx, user.FindUserParams{FbUID: &targetUser.FirebaseUID}) + assert.Equal(t, updatedNickname, found.Nickname) + assert.Equal(t, updatedProfileImage.URL, *found.ProfileImageURL) }) } @@ -267,16 +242,17 @@ func TestAddPetsToOwner(t *testing.T) { db, tearDown := tests.SetUp(t) defer tearDown(t) ctx := context.Background() + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) // Given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) - userService := service.NewUserService(db, mediaService) - - owner := tests.RegisterDummyUser(t, ctx, userService, mediaService) profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") + owner, _ := userService.RegisterUser(ctx, tests.NewDummyRegisterUserRequest(&profileImage.ID)) + + petProfileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "pet_profile_image.jpg") petsToAdd := pet.AddPetsToOwnerRequest{ Pets: []pet.AddPetRequest{ - *tests.GenerateDummyAddPetRequest(&profileImage.ID), + *tests.NewDummyAddPetRequest(&petProfileImage.ID, commonvo.PetTypeDog, pet.GenderMale, "poodle"), }, } @@ -284,13 +260,17 @@ func TestAddPetsToOwner(t *testing.T) { created, _ := userService.AddPetsToOwner(ctx, owner.FirebaseUID, petsToAdd) // Then - if len(created.Pets) != 1 { - t.Errorf("got %v want %v", len(created.Pets), 1) - } - - for _, expected := range petsToAdd.Pets { - for _, found := range created.Pets { - assert.PetRequestAndViewEquals(t, expected, found) + assert.Equal(t, 1, len(created.Pets)) + + for _, want := range petsToAdd.Pets { + for _, got := range created.Pets { + assert.Equal(t, want.Name, got.Name) + assert.Equal(t, want.PetType, got.PetType) + assert.Equal(t, want.Sex, got.Sex) + assert.Equal(t, want.Neutered, got.Neutered) + assert.Equal(t, want.Breed, got.Breed) + assert.Equal(t, want.BirthDate, got.BirthDate) + assert.Equal(t, want.WeightInKg.String(), got.WeightInKg.String()) } } }) @@ -301,16 +281,17 @@ func TestUpdatePet(t *testing.T) { db, tearDown := tests.SetUp(t) defer tearDown(t) ctx := context.Background() + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) // Given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) - userService := service.NewUserService(db, mediaService) - userData := tests.RegisterDummyUser(t, ctx, userService, mediaService) + profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") + registeredUser, _ := userService.RegisterUser(ctx, tests.NewDummyRegisterUserRequest(&profileImage.ID)) petProfileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "pet_profile_image.jpg") - petRequest := tests.GenerateDummyAddPetRequest(&petProfileImage.ID) + petRequest := tests.NewDummyAddPetRequest(&petProfileImage.ID, commonvo.PetTypeDog, pet.GenderMale, "poodle") createdPets, _ := userService.AddPetsToOwner( - ctx, userData.FirebaseUID, pet.AddPetsToOwnerRequest{Pets: []pet.AddPetRequest{*petRequest}}) + ctx, registeredUser.FirebaseUID, pet.AddPetsToOwnerRequest{Pets: []pet.AddPetRequest{*petRequest}}) createdPet := createdPets.Pets[0] // When @@ -326,15 +307,22 @@ func TestUpdatePet(t *testing.T) { ProfileImageID: &updatedPetProfileImage.ID, } - userService.UpdatePet(ctx, userData.FirebaseUID, createdPet.ID, updatedPetRequest) - - // Then - found, _ := userService.FindPets(ctx, pet.FindPetsParams{OwnerID: &userData.ID}) - if len(found.Pets) != 1 { - t.Errorf("got %v want %v", len(found.Pets), 1) + _, err := userService.UpdatePet(ctx, registeredUser.FirebaseUID, createdPet.ID, updatedPetRequest) + if err != nil { + t.Errorf("got %v want %v", err, nil) } - assert.UpdatedPetEquals(t, updatedPetRequest, found.Pets[0]) + // Then + found, _ := userService.FindPets(ctx, pet.FindPetsParams{OwnerID: ®isteredUser.ID}) + assert.Equal(t, 1, len(found.Pets)) + + want := updatedPetRequest + got := found.Pets[0] + assert.Equal(t, want.Name, got.Name) + assert.Equal(t, want.Neutered, got.Neutered) + assert.Equal(t, want.Breed, got.Breed) + assert.Equal(t, want.BirthDate, got.BirthDate) + assert.Equal(t, want.WeightInKg.String(), got.WeightInKg.String()) }) } @@ -343,36 +331,29 @@ func TestDeletePet(t *testing.T) { db, tearDown := tests.SetUp(t) defer tearDown(t) ctx := context.Background() + mediaService := tests.NewMockMediaService(db) + userService := tests.NewMockUserService(db) // Given - mediaService := service.NewMediaService(db, tests.NewDummyFileUploader()) - userService := service.NewUserService(db, mediaService) - userData := tests.RegisterDummyUser(t, ctx, userService, mediaService) + profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") + registeredUser, _ := userService.RegisterUser(ctx, tests.NewDummyRegisterUserRequest(&profileImage.ID)) petProfileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "pet_profile_image.jpg") - petRequest := tests.GenerateDummyAddPetRequest(&petProfileImage.ID) - createdPets, err := userService.AddPetsToOwner( + petRequest := tests.NewDummyAddPetRequest(&petProfileImage.ID, commonvo.PetTypeDog, pet.GenderMale, "poodle") + createdPets, _ := userService.AddPetsToOwner( ctx, - userData.FirebaseUID, + registeredUser.FirebaseUID, pet.AddPetsToOwnerRequest{Pets: []pet.AddPetRequest{*petRequest}}, ) - if err != nil { - t.Fatalf("got %v want %v", err, nil) - } createdPet := createdPets.Pets[0] // When - err = userService.DeletePet(ctx, userData.FirebaseUID, createdPet.ID) - if err != nil { - t.Fatalf("got %v want %v", err, nil) - } + userService.DeletePet(ctx, registeredUser.FirebaseUID, createdPet.ID) // Then found, _ := userService.FindPets(ctx, pet.FindPetsParams{ - OwnerID: &userData.ID, + OwnerID: ®isteredUser.ID, }) - if len(found.Pets) != 0 { - t.Fatalf("got %v want %v", len(found.Pets), 0) - } + assert.Equal(t, 0, len(found.Pets)) }) } diff --git a/internal/tests/assert/pet.go b/internal/tests/assert/pet.go deleted file mode 100644 index c9652cca..00000000 --- a/internal/tests/assert/pet.go +++ /dev/null @@ -1,63 +0,0 @@ -package assert - -import ( - "testing" - - "github.com/pet-sitter/pets-next-door-api/internal/domain/pet" -) - -func PetRequestAndViewEquals(t *testing.T, expected pet.AddPetRequest, found pet.DetailView) { - t.Helper() - - if expected.Name != found.Name { - t.Errorf("got %v want %v", expected.Name, found.Name) - } - - if expected.PetType != found.PetType { - t.Errorf("got %v want %v", expected.PetType, found.PetType) - } - - if expected.Sex != found.Sex { - t.Errorf("got %v want %v", expected.Sex, found.PetType) - } - - if expected.Neutered != found.Neutered { - t.Errorf("got %v want %v", expected.Neutered, found.Neutered) - } - - if expected.Breed != found.Breed { - t.Errorf("got %v want %v", expected.Breed, found.Breed) - } - - if expected.BirthDate != found.BirthDate { - t.Errorf("got %v want %v", expected.BirthDate, found.BirthDate) - } - - if expected.WeightInKg.String() != found.WeightInKg.String() { - t.Errorf("got %v want %v", expected.WeightInKg, found.WeightInKg) - } -} - -func UpdatedPetEquals(t *testing.T, expected pet.UpdatePetRequest, found pet.DetailView) { - t.Helper() - - if expected.Name != found.Name { - t.Errorf("got %v want %v", expected.Name, found.Name) - } - - if expected.Neutered != found.Neutered { - t.Errorf("got %v want %v", expected.Neutered, found.Neutered) - } - - if expected.Breed != found.Breed { - t.Errorf("got %v want %v", expected.Breed, found.Breed) - } - - if expected.BirthDate != found.BirthDate { - t.Errorf("got %v want %v", expected.BirthDate, found.BirthDate) - } - - if expected.WeightInKg.String() != found.WeightInKg.String() { - t.Errorf("got %v want %v", expected.WeightInKg, found.WeightInKg) - } -} diff --git a/internal/tests/asserts/media.go b/internal/tests/asserts/media.go new file mode 100644 index 00000000..08f3b2c9 --- /dev/null +++ b/internal/tests/asserts/media.go @@ -0,0 +1,23 @@ +package asserts + +import ( + "testing" + + "github.com/pet-sitter/pets-next-door-api/internal/domain/media" +) + +func MediaEquals(t *testing.T, got, want media.ListView) { + t.Helper() + + for i, mediaData := range want { + if got[i].ID != mediaData.ID { + t.Errorf("got %v want %v", got[i].ID, mediaData.ID) + } + if got[i].MediaType != mediaData.MediaType { + t.Errorf("got %v want %v", got[i].MediaType, mediaData.MediaType) + } + if got[i].URL != mediaData.URL { + t.Errorf("got %v want %v", got[i].URL, mediaData.URL) + } + } +} diff --git a/internal/tests/asserts/sospost.go b/internal/tests/asserts/sospost.go new file mode 100644 index 00000000..f1502e62 --- /dev/null +++ b/internal/tests/asserts/sospost.go @@ -0,0 +1,28 @@ +package asserts + +import ( + "reflect" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/pet-sitter/pets-next-door-api/internal/domain/soscondition" + "github.com/pet-sitter/pets-next-door-api/internal/domain/sospost" +) + +func DatesEquals(t *testing.T, want, got []sospost.SOSDateView) { + t.Helper() + + if !reflect.DeepEqual(got, want) { + t.Errorf("got %v want %v", got, want) + } +} + +func ConditionIDEquals(t *testing.T, want []int, got soscondition.ListView) { + t.Helper() + + assert.Equal(t, len(want), len(got)) + for i := range got { + assert.Equal(t, int64(want[i]), got[i].ID) + } +} diff --git a/internal/tests/factories.go b/internal/tests/factories.go index e1bf1c43..8ceb353d 100644 --- a/internal/tests/factories.go +++ b/internal/tests/factories.go @@ -3,6 +3,8 @@ package tests import ( "fmt" + "github.com/pet-sitter/pets-next-door-api/internal/domain/commonvo" + "github.com/pet-sitter/pets-next-door-api/internal/datatype" "github.com/pet-sitter/pets-next-door-api/internal/domain/pet" "github.com/pet-sitter/pets-next-door-api/internal/domain/sospost" @@ -10,74 +12,39 @@ import ( "github.com/shopspring/decimal" ) -func GenerateDummyRegisterUserRequest(profileImageID *int64) *user.RegisterUserRequest { +func randomUUID() string { + uuid, _ := datatype.NewV7() + return uuid.String() +} + +func NewDummyRegisterUserRequest(profileImageID *int64) *user.RegisterUserRequest { return &user.RegisterUserRequest{ - Email: "test@example.com", - Nickname: "nickname", - Fullname: "fullname", + Email: randomUUID() + "@example.com", + Nickname: randomUUID()[0:20], + Fullname: randomUUID()[0:20], ProfileImageID: profileImageID, FirebaseProviderType: user.FirebaseProviderTypeKakao, - FirebaseUID: "uid", + FirebaseUID: randomUUID(), } } -func GenerateDummyAddPetRequest(profileImageID *int64) *pet.AddPetRequest { +func NewDummyAddPetRequest( + profileImageID *int64, petType commonvo.PetType, gender pet.Gender, breed string, +) *pet.AddPetRequest { birthDate, _ := datatype.ParseDate("2020-01-01") return &pet.AddPetRequest{ - Name: "name", - PetType: "dog", - Sex: "male", + Name: randomUUID()[0:20], + PetType: petType, + Sex: gender, Neutered: true, - Breed: "poodle", + Breed: breed, BirthDate: birthDate, WeightInKg: decimal.NewFromFloat(10.0), ProfileImageID: profileImageID, } } -func GenerateDummyAddPetsRequest(profileImageID *int64) []pet.AddPetRequest { - birthDate1, _ := datatype.ParseDate("2020-01-01") - birthDate2, _ := datatype.ParseDate("2020-02-01") - birthDate3, _ := datatype.ParseDate("2020-03-01") - - return []pet.AddPetRequest{ - { - Name: "dog_1", - PetType: "dog", - Sex: "male", - Neutered: true, - Breed: "poodle", - BirthDate: birthDate1, - WeightInKg: decimal.NewFromFloat(10.0), - Remarks: "remarks", - ProfileImageID: profileImageID, - }, - { - Name: "dog_2", - PetType: "dog", - Sex: "male", - Neutered: true, - Breed: "poodle", - BirthDate: birthDate2, - WeightInKg: decimal.NewFromFloat(10.0), - Remarks: "remarks", - ProfileImageID: profileImageID, - }, - { - Name: "cat_1", - PetType: "cat", - Sex: "female", - Neutered: true, - Breed: "munchkin", - BirthDate: birthDate3, - WeightInKg: decimal.NewFromFloat(8.0), - Remarks: "remarks", - ProfileImageID: profileImageID, - }, - } -} - -func GenerateDummyWriteSOSPostRequest(imageID, petIDs []int64, sosPostCnt int) *sospost.WriteSOSPostRequest { +func NewDummyWriteSOSPostRequest(imageID, petIDs []int64, sosPostCnt int) *sospost.WriteSOSPostRequest { return &sospost.WriteSOSPostRequest{ Title: fmt.Sprintf("Title%d", sosPostCnt), Content: fmt.Sprintf("Content%d", sosPostCnt), diff --git a/internal/tests/service.go b/internal/tests/service.go index b0e36903..5da877ea 100644 --- a/internal/tests/service.go +++ b/internal/tests/service.go @@ -5,41 +5,37 @@ import ( "io" "testing" + "github.com/pet-sitter/pets-next-door-api/internal/domain/commonvo" + + "github.com/pet-sitter/pets-next-door-api/internal/infra/database" + pnd "github.com/pet-sitter/pets-next-door-api/api" bucketinfra "github.com/pet-sitter/pets-next-door-api/internal/infra/bucket" - "github.com/pet-sitter/pets-next-door-api/internal/domain/media" "github.com/pet-sitter/pets-next-door-api/internal/domain/pet" - "github.com/pet-sitter/pets-next-door-api/internal/domain/sospost" - "github.com/pet-sitter/pets-next-door-api/internal/domain/user" "github.com/pet-sitter/pets-next-door-api/internal/service" ) -type DummyUploader struct{} +type StubUploader struct{} -func (d DummyUploader) UploadFile(_ io.ReadSeeker, fileName string) (url string, appError *pnd.AppError) { +func (u StubUploader) UploadFile(_ io.ReadSeeker, fileName string) (url string, appError *pnd.AppError) { return "https://example.com/files/" + fileName, nil } -func NewDummyFileUploader() bucketinfra.FileUploader { - return DummyUploader{} +func NewStubFileUploader() bucketinfra.FileUploader { + return StubUploader{} } -func RegisterDummyUser( - t *testing.T, - ctx context.Context, - userService *service.UserService, - mediaService *service.MediaService, -) *user.InternalView { - t.Helper() - profileImage, _ := mediaService.UploadMedia(ctx, nil, media.TypeImage, "profile_image.jpg") - userRequest := GenerateDummyRegisterUserRequest(&profileImage.ID) - registeredUser, err := userService.RegisterUser(ctx, userRequest) - if err != nil { - t.Errorf("got %v want %v", err, nil) - } +func NewMockMediaService(db *database.DB) *service.MediaService { + return service.NewMediaService(db, NewStubFileUploader()) +} + +func NewMockUserService(db *database.DB) *service.UserService { + return service.NewUserService(db, NewMockMediaService(db)) +} - return registeredUser +func NewMockSOSPostService(db *database.DB) *service.SOSPostService { + return service.NewSOSPostService(db) } func AddDummyPet( @@ -51,7 +47,7 @@ func AddDummyPet( ) *pet.DetailView { t.Helper() petList, err := userService.AddPetsToOwner(ctx, ownerUID, pet.AddPetsToOwnerRequest{ - Pets: []pet.AddPetRequest{*GenerateDummyAddPetRequest(profileImageID)}, + Pets: []pet.AddPetRequest{*NewDummyAddPetRequest(profileImageID, commonvo.PetTypeDog, pet.GenderMale, "poodle")}, }) if err != nil { t.Errorf("got %v want %v", err, nil) @@ -59,39 +55,3 @@ func AddDummyPet( return &petList.Pets[0] } - -func AddDummyPets( - t *testing.T, - ctx context.Context, - userService *service.UserService, - ownerUID string, - profileImageID *int64, -) pet.ListView { - t.Helper() - petList, err := userService.AddPetsToOwner(ctx, ownerUID, pet.AddPetsToOwnerRequest{ - Pets: GenerateDummyAddPetsRequest(profileImageID), - }) - if err != nil { - t.Errorf("got %v want %v", err, nil) - } - - return *petList -} - -func WriteDummySOSPosts( - t *testing.T, - ctx context.Context, - sosPostService *service.SOSPostService, - uid string, - imageID []int64, - petIDs []int64, - sosPostCnt int, -) *sospost.WriteSOSPostView { - t.Helper() - sosPostRequest := GenerateDummyWriteSOSPostRequest(imageID, petIDs, sosPostCnt) - sosPost, err := sosPostService.WriteSOSPost(ctx, uid, sosPostRequest) - if err != nil { - t.Errorf("got %v want %v", err, nil) - } - return sosPost -}