Skip to content

Commit

Permalink
more routing tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mbretter committed Jun 1, 2024
1 parent db471c3 commit a24ef61
Show file tree
Hide file tree
Showing 6 changed files with 323 additions and 47 deletions.
4 changes: 3 additions & 1 deletion .mockery.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ inpackage: True
packages:
github.com/mbretter/go-mmcli-svr:
interfaces:
SmsHandlersInterface:
smsHandlersInterface:
locationHandlersInterface:
modemHandlersInterface:
github.com/mbretter/go-mmcli-svr/backend:
config:
filename: "{{.InterfaceNameLower}}_mock.go"
Expand Down
70 changes: 70 additions & 0 deletions locationhandlersinterface_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 18 additions & 12 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"github.com/go-chi/cors"
"github.com/joho/godotenv"
"github.com/mbretter/go-mmcli-svr/api"
be "github.com/mbretter/go-mmcli-svr/backend"
"github.com/mbretter/go-mmcli-svr/backend/mmcli"
_ "github.com/mbretter/go-mmcli-svr/docs"
"github.com/mbretter/go-mmcli-svr/middleware"
Expand Down Expand Up @@ -72,8 +71,8 @@ func main() {

r.With(middleware.LogRoute).Route("/", func(r chi.Router) {
handlers := api.Provide(backend)
registerModemRoutes(r, backend)
registerLocationRoutes(r, backend)
registerModemRoutes(r, handlers)
registerLocationRoutes(r, handlers)
registerSmsRoutes(r, handlers)

utilsApi := api.ProvideUtilsApi()
Expand All @@ -89,24 +88,31 @@ func main() {
http.ListenAndServe(commandLine.Listen, r)
}

func registerModemRoutes(r chi.Router, backend be.Backend) {
a := api.Provide(backend)
r.Get("/modem/", a.ModemList)
r.Get("/modem/{id:[a-zA-Z0-9%/]+}", a.ModemDetail)
type modemHandlersInterface interface {
ModemList(w http.ResponseWriter, r *http.Request)
ModemDetail(w http.ResponseWriter, r *http.Request)
}

func registerLocationRoutes(r chi.Router, backend be.Backend) {
a := api.Provide(backend)
r.Get("/location", a.LocationGet)
func registerModemRoutes(r chi.Router, handlers modemHandlersInterface) {
r.Get("/modem/", handlers.ModemList)
r.Get("/modem/{id:[a-zA-Z0-9%/]+}", handlers.ModemDetail)
}

type SmsHandlersInterface interface {
type locationHandlersInterface interface {
LocationGet(w http.ResponseWriter, r *http.Request)
}

func registerLocationRoutes(r chi.Router, handlers locationHandlersInterface) {
r.Get("/location", handlers.LocationGet)
}

type smsHandlersInterface interface {
SmsGet(w http.ResponseWriter, r *http.Request)
SmsSend(w http.ResponseWriter, r *http.Request)
SmsDelete(w http.ResponseWriter, r *http.Request)
}

func registerSmsRoutes(r chi.Router, handlers SmsHandlersInterface) {
func registerSmsRoutes(r chi.Router, handlers smsHandlersInterface) {
r.Get("/sms/", handlers.SmsGet)
r.Get("/sms/{id:[a-zA-Z0-9%/]+}", handlers.SmsGet)
r.Post("/sms", handlers.SmsSend)
Expand Down
96 changes: 95 additions & 1 deletion main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,100 @@ import (
"github.com/stretchr/testify/assert"
)

func TestRegisterModemRoutes(t *testing.T) {
tests := []struct {
name string
route string
method string
expectedStatusCode int
}{
{
name: "ModemList",
route: "/modem/",
method: http.MethodGet,
expectedStatusCode: http.StatusOK,
},
{
name: "ModemDetail",
route: "/modem/1",
method: http.MethodGet,
expectedStatusCode: http.StatusOK,
},
{
name: "ModemDetail invalid modem id",
route: "/modem/:;-ZZZ",
method: http.MethodGet,
expectedStatusCode: http.StatusNotFound,
},
}

handlersMock := newModemHandlersInterfaceMock(t)
r := chi.NewRouter()
registerModemRoutes(r, handlersMock)
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
req, err := http.NewRequest(tt.method, tt.route, nil)
if err != nil {
t.Fatal(err)
}

rr := httptest.NewRecorder()
if tt.expectedStatusCode != http.StatusNotFound {
if tt.method == http.MethodGet && tt.name == "ModemDetail" {
handlersMock.EXPECT().ModemDetail(rr, mock.Anything)
}

if tt.method == http.MethodGet && tt.name == "ModemList" {
handlersMock.EXPECT().ModemList(rr, mock.Anything)
}
}

r.ServeHTTP(rr, req)

assert.Equal(t, tt.expectedStatusCode, rr.Code)
})
}
}

func TestRegisterLocationRoutes(t *testing.T) {
tests := []struct {
name string
route string
method string
expectedStatusCode int
}{
{
name: "LocationGet",
route: "/location",
method: http.MethodGet,
expectedStatusCode: http.StatusOK,
},
}

handlersMock := newLocationHandlersInterfaceMock(t)
r := chi.NewRouter()
registerLocationRoutes(r, handlersMock)
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
req, err := http.NewRequest(tt.method, tt.route, nil)
if err != nil {
t.Fatal(err)
}

rr := httptest.NewRecorder()
if tt.expectedStatusCode != http.StatusNotFound {
if tt.method == http.MethodGet {
handlersMock.EXPECT().LocationGet(rr, mock.Anything)
}
}

r.ServeHTTP(rr, req)

assert.Equal(t, tt.expectedStatusCode, rr.Code)
})
}
}

func TestRegisterSmsRoutes(t *testing.T) {
tests := []struct {
name string
Expand Down Expand Up @@ -49,7 +143,7 @@ func TestRegisterSmsRoutes(t *testing.T) {
},
}

handlersMock := NewSmsHandlersInterfaceMock(t)
handlersMock := newSmsHandlersInterfaceMock(t)
r := chi.NewRouter()
registerSmsRoutes(r, handlersMock)
for _, tt := range tests {
Expand Down
104 changes: 104 additions & 0 deletions modemhandlersinterface_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit a24ef61

Please sign in to comment.