package service import ( "bytes" "context" "encoding/json" "github.com/gofiber/fiber/v2" "github.com/stretchr/testify/suite" "github.com/themakers/hlog" "go.uber.org/zap" "heruvym/dal/mongo" "heruvym/internal/utils/middleware" "heruvym/model" "net/http" "testing" ) var mongoUri = "mongodb://localmongo1:30001,localmongo2:30002,localmongo3:30003/?replicaSet=my-rs" type AccountTestSuite struct { svc *Account dal *mongo.DAL app *fiber.App arg *model.Account suite.Suite } func TestAccountTestSuite(t *testing.T) { suite.Run(t, new(AccountTestSuite)) } func (s *AccountTestSuite) SetupSuite() { logger := hlog.New(zap.NewNop()) dal, err := mongo.New(context.Background(), mongoUri, "support", logger) if s.NoError(err) { s.dal = dal } s.svc = NewAccount(dal) app := fiber.New() app.Use( middleware.JwtPlug, ) s.app = app for _, route := range s.svc.GetRoutes() { app.Add(route.Method, route.Path, route.Handler).Name(route.Name) } b, err := json.Marshal(ReqCreateAccount{ Nickname: "SomeNickname", Avatar: "/some/avatar.jpeg", }) s.NoError(err) req, err := http.NewRequest("POST", "/account", bytes.NewBuffer(b)) s.NoError(err) req.Header.Set("Content-Type", "application/json") resp, err := app.Test(req, 10) s.NoError(err) var result model.Account err = json.NewDecoder(resp.Body).Decode(&result) s.NoError(err) s.arg = &result s.Equal(200, resp.StatusCode) } func (s *AccountTestSuite) TearDownSuite() { req, err := http.NewRequest("DELETE", "/account/delete/"+s.arg.UserID, nil) req.Header.Set("Content-Type", "application/json") resp, err := s.app.Test(req, 10) s.NoError(err) s.Equal(200, resp.StatusCode) } func (s *AccountTestSuite) TestAccountPagination() { tests := []struct { name string args *ReqAccountPagination want int }{ { name: "status 200", args: &ReqAccountPagination{ Search: "", Offset: 0, Limit: 10, }, want: fiber.StatusOK, }, { name: "status 400", args: &ReqAccountPagination{ Offset: 0, Limit: 0, }, want: fiber.StatusBadRequest, }, } for _, tt := range tests { s.Run(tt.name, func() { b, err := json.Marshal(tt.args) s.NoError(err) req, err := http.NewRequest("GET", "/account/pagination", bytes.NewBuffer(b)) s.NoError(err) req.Header.Set("Content-Type", "application/json") resp, err := s.app.Test(req, 10) s.NoError(err) s.Equal(tt.want, resp.StatusCode) }) } } func (s *AccountTestSuite) TestGetAccount() { tests := []struct { name string args string want int }{ { name: "status 200", args: s.arg.UserID, want: 200, }, } for _, tt := range tests { s.Run(tt.name, func() { req, err := http.NewRequest("GET", "/account/"+tt.args, nil) s.NoError(err) req.Header.Set("Content-Type", "application/json") resp, err := s.app.Test(req, 10) s.NoError(err) s.Equal(tt.want, resp.StatusCode) }) } } func (s *AccountTestSuite) TestSetAccountDelete() { tests := []struct { name string args string want int }{ { name: "status 200", args: s.arg.UserID, want: 200, }, } for _, tt := range tests { s.Run(tt.name, func() { req, err := http.NewRequest("DELETE", "/account/"+tt.args, nil) s.NoError(err) req.Header.Set("Content-Type", "application/json") resp, err := s.app.Test(req, 10) s.NoError(err) s.Equal(tt.want, resp.StatusCode) }) } } func (s *AccountTestSuite) TestAccountRestore() { tests := []struct { name string args string want int }{ { name: "status 200", args: s.arg.UserID, want: 200, }, } for _, tt := range tests { s.Run(tt.name, func() { req, err := http.NewRequest("POST", "/account/restore/"+tt.args, nil) s.NoError(err) req.Header.Set("Content-Type", "application/json") resp, err := s.app.Test(req, 10) s.NoError(err) s.Equal(tt.want, resp.StatusCode) }) } } func (s *AccountTestSuite) TestSetAccountRole() { tests := []struct { name string args *ReqSetAccountRole want int }{ { name: "status 200", args: &ReqSetAccountRole{ UserID: s.arg.UserID, Role: "test", }, want: fiber.StatusOK, }, { name: "status 400", args: &ReqSetAccountRole{}, want: fiber.StatusBadRequest, }, } for _, tt := range tests { s.Run(tt.name, func() { b, err := json.Marshal(tt.args) s.NoError(err) req, err := http.NewRequest("PATCH", "/account/role", bytes.NewBuffer(b)) s.NoError(err) req.Header.Set("Content-Type", "application/json") resp, err := s.app.Test(req, 10) s.NoError(err) s.Equal(tt.want, resp.StatusCode) }) } } func (s *AccountTestSuite) TestSetAccountNickname() { tests := []struct { name string args *ReqSetAccountNickname want int }{ { name: "status 200", args: &ReqSetAccountNickname{ UserID: s.arg.UserID, Nickname: "test", }, want: fiber.StatusOK, }, { name: "status 400", args: &ReqSetAccountNickname{}, want: fiber.StatusBadRequest, }, } for _, tt := range tests { s.Run(tt.name, func() { b, err := json.Marshal(tt.args) s.NoError(err) req, err := http.NewRequest("PATCH", "/account/nickname", bytes.NewBuffer(b)) s.NoError(err) req.Header.Set("Content-Type", "application/json") resp, err := s.app.Test(req, 10) s.NoError(err) s.Equal(tt.want, resp.StatusCode) }) } } func (s *AccountTestSuite) TestSetAccountAvatar() { tests := []struct { name string args *ReqSetAccountAvatar want int }{ { name: "status 200", args: &ReqSetAccountAvatar{ UserID: s.arg.UserID, Avatar: "/test.jpeg", }, want: fiber.StatusOK, }, { name: "status 400", args: &ReqSetAccountAvatar{}, want: fiber.StatusBadRequest, }, } for _, tt := range tests { s.Run(tt.name, func() { b, err := json.Marshal(tt.args) s.NoError(err) req, err := http.NewRequest("PATCH", "/account/avatar", bytes.NewBuffer(b)) s.NoError(err) req.Header.Set("Content-Type", "application/json") resp, err := s.app.Test(req, 10) s.NoError(err) s.Equal(tt.want, resp.StatusCode) }) } }