diff --git a/backend/controller/controller_suite_test.go b/backend/controller/controller_suite_test.go new file mode 100644 index 0000000..ff9b1c1 --- /dev/null +++ b/backend/controller/controller_suite_test.go @@ -0,0 +1,13 @@ +package controller_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestController(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Controller Suite") +} diff --git a/backend/controller/controller_test.go b/backend/controller/controller_test.go new file mode 100644 index 0000000..029fd9f --- /dev/null +++ b/backend/controller/controller_test.go @@ -0,0 +1,46 @@ +package controller_test + +import ( + "database/sql" + "fmt" + + "github.com/gin-gonic/gin" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + _ "github.com/mattn/go-sqlite3" + "github.com/rg-km/final-project-engineering-12/backend/controller" + "github.com/rg-km/final-project-engineering-12/backend/repository" + "github.com/rg-km/final-project-engineering-12/backend/service" +) + +var _ = Describe("Controller", func() { + + var ( + userController controller.UserController + userService service.UserServiceImplement + userRepository repository.UserRepository + ctx *gin.Context + ) + + BeforeEach(func() { + database, err := sql.Open("sqlite3", "../teenager.db") + + if err != nil { + fmt.Println(err) + } + + userRepository = repository.NewUserRepository() + userService = service.NewUserService(&userRepository, database) + userController = controller.NewUserController(&userService) + }) + + Describe("NewController", func() { + It("should not be nil", func() { + result, err := userController.UserService.ListUser(ctx) + fmt.Println(result) + Expect(err).To(BeNil()) + Expect(result).To(BeNil()) + }) + }) +}) diff --git a/backend/middleware/middleware.go b/backend/middleware/middleware.go index 3409aee..fc7a03c 100644 --- a/backend/middleware/middleware.go +++ b/backend/middleware/middleware.go @@ -1,6 +1,7 @@ package middleware import ( + "context" "net/http" "github.com/dgrijalva/jwt-go" @@ -31,6 +32,36 @@ func UserHandler(handler func(ctx *gin.Context)) gin.HandlerFunc { return } + tokenClaims := jwt.MapClaims{} + tkn, err := jwt.ParseWithClaims(token, tokenClaims, func(token *jwt.Token) (interface{}, error) { + return []byte("your secret api key"), nil + }, + ) + if err != nil { + ctx.JSON(http.StatusUnauthorized, model.WebResponse{ + Code: 401, + Status: "Cannot parse token", + }) + return + } + + if !tkn.Valid { + ctx.JSON(http.StatusUnauthorized, model.WebResponse{ + Code: 401, + Status: "Invalid token", + }) + return + } + + if tokenClaims["role"] != "1" || tokenClaims["role"] != "2" { + ctx.JSON(http.StatusUnauthorized, model.WebResponse{ + Code: 401, + Status: "Unauthorized", + }) + } + + context := context.WithValue(ctx.Request.Context(), "user", tokenClaims["id"]) + gin.Default().ServeHTTP(ctx.Writer, ctx.Request.WithContext(context)) handler(ctx) } } @@ -58,7 +89,7 @@ func AdminHandler(handler func(ctx *gin.Context)) gin.HandlerFunc { } tokenClaims := jwt.MapClaims{} - _, err = jwt.ParseWithClaims(token, tokenClaims, func(token *jwt.Token) (interface{}, error) { + tkn, err := jwt.ParseWithClaims(token, tokenClaims, func(token *jwt.Token) (interface{}, error) { return []byte("your secret api key"), nil }, ) @@ -70,6 +101,14 @@ func AdminHandler(handler func(ctx *gin.Context)) gin.HandlerFunc { return } + if !tkn.Valid { + ctx.JSON(http.StatusUnauthorized, model.WebResponse{ + Code: 401, + Status: "Invalid token", + }) + return + } + if tokenClaims["role"] != "1" { ctx.JSON(http.StatusUnauthorized, model.WebResponse{ Code: 401, @@ -78,6 +117,8 @@ func AdminHandler(handler func(ctx *gin.Context)) gin.HandlerFunc { return } + context := context.WithValue(ctx.Request.Context(), "user", tokenClaims["id"]) + gin.Default().ServeHTTP(ctx.Writer, ctx.Request.WithContext(context)) handler(ctx) } } diff --git a/backend/test/user_test.go b/backend/test/user_test.go new file mode 100644 index 0000000..97586e1 --- /dev/null +++ b/backend/test/user_test.go @@ -0,0 +1,49 @@ +package test_test + +import ( + "database/sql" + + "github.com/gin-gonic/gin" + _ "github.com/mattn/go-sqlite3" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/rg-km/final-project-engineering-12/backend/controller" + "github.com/rg-km/final-project-engineering-12/backend/repository" + "github.com/rg-km/final-project-engineering-12/backend/service" +) + +var _ = Describe("Test", func() { + + var ( + userController controller.UserController + userService service.UserServiceImplement + userRepository repository.UserRepository + database *sql.DB + err error + ctx *gin.Context + ) + + BeforeEach(func() { + database, err = sql.Open("sqlite3", "../teenager.db") + + if err != nil { + panic(err) + } + + userRepository = repository.NewUserRepository() + userService = service.NewUserService(&userRepository, database) + userController = controller.NewUserController(&userService) + }) + + Describe("User Login Register", func() { + When("Data is Correct", func() { + It("Should return list User", func() { + + userLoginResponse, err := userController.UserService.ListUser(ctx) + + Expect(err).To(BeNil()) + Expect(userLoginResponse).To(HaveLen(2)) + }) + }) + }) +})