From 417a7cf982f08d7c380b6a549549152baedf10b1 Mon Sep 17 00:00:00 2001 From: Deepak Date: Tue, 12 Jan 2021 16:15:28 -0600 Subject: [PATCH] Decouples routers and adds auth for plans and actions call --- routes/actions.go | 3 ++- routes/actions_test.go | 45 +++++++++++++++++++------------------- routes/plans.go | 3 ++- routes/plans_test.go | 37 +++++++++++++++---------------- routes/post_action_test.go | 29 ++++++++++++------------ routes/post_plan_test.go | 33 ++++++++++++++-------------- routes/put_action_test.go | 33 ++++++++++++++-------------- routes/routes.go | 13 +++++++++-- tokens/tokens.go | 6 +++++ 9 files changed, 107 insertions(+), 95 deletions(-) diff --git a/routes/actions.go b/routes/actions.go index d63d294..3526803 100644 --- a/routes/actions.go +++ b/routes/actions.go @@ -9,7 +9,8 @@ import ( "strconv" ) -func newActionRouter(m *models.Model) http.Handler { +// NewActionRouter returns a new action router +func NewActionRouter(m *models.Model) http.Handler { router := chi.NewRouter() router.Get("/", getActionsFunc(m)) router.Post("/", postActionFunc(m)) diff --git a/routes/actions_test.go b/routes/actions_test.go index fd2b325..5fc3e16 100644 --- a/routes/actions_test.go +++ b/routes/actions_test.go @@ -3,7 +3,6 @@ package routes_test import ( "gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/routes" - "gitea.deepak.science/deepak/gogmagog/tokens" "github.com/stretchr/testify/assert" "net/http" "net/http/httptest" @@ -16,8 +15,8 @@ func TestEmptyActions(t *testing.T) { // set up assert := assert.New(t) m := getEmptyModel() - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/actions", nil) + router := routes.NewActionRouter(m) + req, _ := http.NewRequest("GET", "/", nil) rr := httptest.NewRecorder() @@ -42,8 +41,8 @@ func TestOneAction(t *testing.T) { completedDate, _ := time.Parse("2006-01-02", "2021-01-03") a1 := &models.Action{ActionID: 3, ActionDescription: "testing", CompletedChunks: 1, CompletedOn: &completedDate, CreatedAt: &createdDate, UpdatedAt: &updatedDate, EstimatedChunks: 3, PlanID: 0} m := getModel([]*models.Plan{}, []*models.Action{a1}) - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/actions", nil) + router := routes.NewActionRouter(m) + req, _ := http.NewRequest("GET", "/", nil) rr := httptest.NewRecorder() @@ -77,8 +76,8 @@ func TestErrorAction(t *testing.T) { m := getErrorModel("Model always errors") - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/actions", nil) + router := routes.NewActionRouter(m) + req, _ := http.NewRequest("GET", "/", nil) rr := httptest.NewRecorder() @@ -99,8 +98,8 @@ func TestEmptyActionErrorWriter(t *testing.T) { m := getEmptyModel() - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/actions", nil) + router := routes.NewActionRouter(m) + req, _ := http.NewRequest("GET", "/", nil) rr := NewBadWriter() @@ -120,8 +119,8 @@ func TestOneActionByID(t *testing.T) { updatedDate, _ := time.Parse("2006-01-02", "2021-01-02") a := &models.Action{ActionID: 6, ActionDescription: "howdy", CompletedOn: nil, CreatedAt: &createdDate, UpdatedAt: &updatedDate, CompletedChunks: 0, EstimatedChunks: 54, PlanID: 3} m := getModel([]*models.Plan{}, []*models.Action{a}) - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/actions/6", nil) + router := routes.NewActionRouter(m) + req, _ := http.NewRequest("GET", "/6", nil) rr := httptest.NewRecorder() @@ -152,8 +151,8 @@ func TestErrorActionByID(t *testing.T) { m := getErrorModel("Model always errors") - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/actions/5", nil) + router := routes.NewActionRouter(m) + req, _ := http.NewRequest("GET", "/5", nil) rr := httptest.NewRecorder() @@ -175,8 +174,8 @@ func TestEmptyActionErrorWriterByID(t *testing.T) { a := &models.Action{ActionID: 6} m := getModel([]*models.Plan{}, []*models.Action{a}) - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/actions/6", nil) + router := routes.NewActionRouter(m) + req, _ := http.NewRequest("GET", "/6", nil) rr := NewBadWriter() @@ -195,8 +194,8 @@ func TestNotFoundActionByIDText(t *testing.T) { m := getEmptyModel() - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/actions/wo", nil) + router := routes.NewActionRouter(m) + req, _ := http.NewRequest("GET", "/wo", nil) rr := httptest.NewRecorder() @@ -214,8 +213,8 @@ func TestNotFoundActionByIDEmpty(t *testing.T) { m := getEmptyModel() - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/actions/1", nil) + router := routes.NewActionRouter(m) + req, _ := http.NewRequest("GET", "/1", nil) rr := httptest.NewRecorder() @@ -235,8 +234,8 @@ func TestActionsByPlanID(t *testing.T) { updatedDate, _ := time.Parse("2006-01-02", "2021-01-02") a := &models.Action{ActionID: 6, ActionDescription: "howdy", CompletedOn: nil, CreatedAt: &createdDate, UpdatedAt: &updatedDate, CompletedChunks: 0, EstimatedChunks: 54, PlanID: 3} m := getModel([]*models.Plan{}, []*models.Action{a}) - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/actions?plan_id=6", nil) + router := routes.NewActionRouter(m) + req, _ := http.NewRequest("GET", "/?plan_id=6", nil) rr := httptest.NewRecorder() @@ -270,8 +269,8 @@ func TestActionsByPlanIDInvalidID(t *testing.T) { updatedDate, _ := time.Parse("2006-01-02", "2021-01-02") a := &models.Action{ActionID: 6, ActionDescription: "howdy", CompletedOn: nil, CreatedAt: &createdDate, UpdatedAt: &updatedDate, CompletedChunks: 0, EstimatedChunks: 54, PlanID: 3} m := getModel([]*models.Plan{}, []*models.Action{a}) - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/actions?plan_id=aoeu", nil) + router := routes.NewActionRouter(m) + req, _ := http.NewRequest("GET", "/?plan_id=aoeu", nil) rr := httptest.NewRecorder() diff --git a/routes/plans.go b/routes/plans.go index 6d2921c..edcab49 100644 --- a/routes/plans.go +++ b/routes/plans.go @@ -9,7 +9,8 @@ import ( "strconv" ) -func newPlanRouter(m *models.Model) http.Handler { +// NewPlanRouter returns the http.Handler for the passed in model to route plan methods. +func NewPlanRouter(m *models.Model) http.Handler { router := chi.NewRouter() router.Get("/", getAllPlansFunc(m)) router.Post("/", postPlanFunc(m)) diff --git a/routes/plans_test.go b/routes/plans_test.go index 3a800ce..e6fd9f1 100644 --- a/routes/plans_test.go +++ b/routes/plans_test.go @@ -3,7 +3,6 @@ package routes_test import ( "gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/routes" - "gitea.deepak.science/deepak/gogmagog/tokens" "github.com/stretchr/testify/assert" "net/http" "net/http/httptest" @@ -16,8 +15,8 @@ func TestEmptyPlans(t *testing.T) { // set up assert := assert.New(t) m := getEmptyModel() - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/plans", nil) + router := routes.NewPlanRouter(m) + req, _ := http.NewRequest("GET", "/", nil) rr := httptest.NewRecorder() @@ -40,8 +39,8 @@ func TestOnePlan(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/plans", nil) + router := routes.NewPlanRouter(m) + req, _ := http.NewRequest("GET", "/", nil) rr := httptest.NewRecorder() @@ -69,8 +68,8 @@ func TestErrorPlan(t *testing.T) { m := getErrorModel("Model always errors") - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/plans", nil) + router := routes.NewPlanRouter(m) + req, _ := http.NewRequest("GET", "/", nil) rr := httptest.NewRecorder() @@ -91,8 +90,8 @@ func TestEmptyPlanErrorWriter(t *testing.T) { m := getEmptyModel() - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/plans", nil) + router := routes.NewPlanRouter(m) + req, _ := http.NewRequest("GET", "/", nil) rr := NewBadWriter() @@ -111,8 +110,8 @@ func TestOnePlanByID(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/plans/6", nil) + router := routes.NewPlanRouter(m) + req, _ := http.NewRequest("GET", "/6", nil) rr := httptest.NewRecorder() @@ -138,8 +137,8 @@ func TestErrorPlanByID(t *testing.T) { m := getErrorModel("Model always errors") - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/plans/5", nil) + router := routes.NewPlanRouter(m) + req, _ := http.NewRequest("GET", "/5", nil) rr := httptest.NewRecorder() @@ -162,8 +161,8 @@ func TestEmptyPlanErrorWriterByID(t *testing.T) { p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/plans/6", nil) + router := routes.NewPlanRouter(m) + req, _ := http.NewRequest("GET", "/6", nil) rr := NewBadWriter() @@ -182,8 +181,8 @@ func TestNotFoundPlanByIDText(t *testing.T) { m := getEmptyModel() - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/plans/wo", nil) + router := routes.NewPlanRouter(m) + req, _ := http.NewRequest("GET", "/wo", nil) rr := httptest.NewRecorder() @@ -201,8 +200,8 @@ func TestNotFoundPlanByIDEmpty(t *testing.T) { m := getEmptyModel() - router := routes.NewRouter(m, tokens.New("whatever")) - req, _ := http.NewRequest("GET", "/plans/1", nil) + router := routes.NewPlanRouter(m) + req, _ := http.NewRequest("GET", "/1", nil) rr := httptest.NewRecorder() diff --git a/routes/post_action_test.go b/routes/post_action_test.go index 5516335..2140611 100644 --- a/routes/post_action_test.go +++ b/routes/post_action_test.go @@ -5,7 +5,6 @@ import ( "encoding/json" "gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/routes" - "gitea.deepak.science/deepak/gogmagog/tokens" "github.com/stretchr/testify/assert" "net/http" "net/http/httptest" @@ -26,7 +25,7 @@ func TestPureJSONPostAction(t *testing.T) { ActionDescription: "here's an action", } m := getModel([]*models.Plan{}, []*models.Action{a}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) data := []byte(`{ "action_description": "here's an action", "estimated_chunks": 3, @@ -34,7 +33,7 @@ func TestPureJSONPostAction(t *testing.T) { "completed_on": "2021-01-01T00:00:00Z", "plan_id": 5 }`) - req, _ := http.NewRequest("POST", "/actions", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -67,13 +66,13 @@ func TestExtraFieldActionPostJSON(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) data := []byte(`{ "completed_on": "2021-01-01T00:00:00Z", "plan_id": 5, "sabotage": "omg" }`) - req, _ := http.NewRequest("POST", "/actions", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -93,9 +92,9 @@ func TestEmptyBodyActionPost(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) data := []byte(``) - req, _ := http.NewRequest("POST", "/actions", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -116,13 +115,13 @@ func TestTwoBodyActionPost(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) data := []byte(`{ "plan_id": 5 }, { "plan_id": 6 }`) - req, _ := http.NewRequest("POST", "/actions", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -143,10 +142,10 @@ func TestErrorCreateAction(t *testing.T) { m := getErrorModel("Model always errors") - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) a := &models.Action{PlanID: 6} data, _ := json.Marshal(a) - req, _ := http.NewRequest("POST", "/actions", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -168,10 +167,10 @@ func TestErrorOnRetrieveCreateAction(t *testing.T) { m := getErrorOnGetModel("Model always errors") - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) a := &models.Action{PlanID: 6} data, _ := json.Marshal(a) - req, _ := http.NewRequest("POST", "/actions", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -193,9 +192,9 @@ func TestErrorWriterCreateAction(t *testing.T) { a := &models.Action{PlanID: 6} m := getModel([]*models.Plan{}, []*models.Action{a}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) data, _ := json.Marshal(a) - req, _ := http.NewRequest("POST", "/actions", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := NewBadWriter() diff --git a/routes/post_plan_test.go b/routes/post_plan_test.go index 7827db6..7a4f4e5 100644 --- a/routes/post_plan_test.go +++ b/routes/post_plan_test.go @@ -5,7 +5,6 @@ import ( "encoding/json" "gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/routes" - "gitea.deepak.science/deepak/gogmagog/tokens" "github.com/stretchr/testify/assert" "net/http" "net/http/httptest" @@ -20,9 +19,9 @@ func TestCreatePlanRoute(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewPlanRouter(m) data, _ := json.Marshal(p) - req, _ := http.NewRequest("POST", "/plans", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -51,12 +50,12 @@ func TestPureJSON(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewPlanRouter(m) data := []byte(`{ "plan_date": "2021-01-01T00:00:00Z", "plan_id": 5 }`) - req, _ := http.NewRequest("POST", "/plans", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -85,13 +84,13 @@ func TestExtraFieldJSON(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewPlanRouter(m) data := []byte(`{ "plan_date": "2021-01-01T00:00:00Z", "plan_id": 5, "plan_sabotage": "omg" }`) - req, _ := http.NewRequest("POST", "/plans", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -111,9 +110,9 @@ func TestEmptyBody(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewPlanRouter(m) data := []byte(``) - req, _ := http.NewRequest("POST", "/plans", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -134,7 +133,7 @@ func TestTwoBody(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewPlanRouter(m) data := []byte(`{ "plan_date": "2021-01-01T00:00:00Z", "plan_id": 5 @@ -142,7 +141,7 @@ func TestTwoBody(t *testing.T) { "plan_date": "2021-01-01T00:00:00Z", "plan_id": 6 }`) - req, _ := http.NewRequest("POST", "/plans", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -163,11 +162,11 @@ func TestErrorCreatePlan(t *testing.T) { m := getErrorModel("Model always errors") - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewPlanRouter(m) planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} data, _ := json.Marshal(p) - req, _ := http.NewRequest("POST", "/plans", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -189,11 +188,11 @@ func TestErrorOnRetrieveCreatePlan(t *testing.T) { m := getErrorOnGetModel("Model always errors") - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewPlanRouter(m) planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} data, _ := json.Marshal(p) - req, _ := http.NewRequest("POST", "/plans", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -216,9 +215,9 @@ func TestErrorWriterCreatePlan(t *testing.T) { p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewPlanRouter(m) data, _ := json.Marshal(p) - req, _ := http.NewRequest("POST", "/plans", bytes.NewBuffer(data)) + req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := NewBadWriter() diff --git a/routes/put_action_test.go b/routes/put_action_test.go index 8dc8d94..7aecc56 100644 --- a/routes/put_action_test.go +++ b/routes/put_action_test.go @@ -5,7 +5,6 @@ import ( "encoding/json" "gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/routes" - "gitea.deepak.science/deepak/gogmagog/tokens" "github.com/stretchr/testify/assert" "net/http" "net/http/httptest" @@ -26,7 +25,7 @@ func TestPureJSONPutAction(t *testing.T) { ActionDescription: "here's an action", } m := getModel([]*models.Plan{}, []*models.Action{a}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) data := []byte(`{ "action_description": "here's an action", "estimated_chunks": 3, @@ -34,7 +33,7 @@ func TestPureJSONPutAction(t *testing.T) { "completed_on": "2021-01-01T00:00:00Z", "plan_id": 5 }`) - req, _ := http.NewRequest("PUT", "/actions/0", bytes.NewBuffer(data)) + req, _ := http.NewRequest("PUT", "/0", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -67,13 +66,13 @@ func TestExtraFieldActionPutJSON(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) data := []byte(`{ "completed_on": "2021-01-01T00:00:00Z", "plan_id": 5, "sabotage": "omg" }`) - req, _ := http.NewRequest("PUT", "/actions/1", bytes.NewBuffer(data)) + req, _ := http.NewRequest("PUT", "/1", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -93,9 +92,9 @@ func TestEmptyBodyActionPut(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) data := []byte(``) - req, _ := http.NewRequest("PUT", "/actions/1", bytes.NewBuffer(data)) + req, _ := http.NewRequest("PUT", "/1", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -116,13 +115,13 @@ func TestTwoBodyActionPut(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) data := []byte(`{ "plan_id": 5 }, { "plan_id": 6 }`) - req, _ := http.NewRequest("PUT", "/actions/1", bytes.NewBuffer(data)) + req, _ := http.NewRequest("PUT", "/1", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -143,13 +142,13 @@ func TestBadActionIDPut(t *testing.T) { planDate, _ := time.Parse("2006-01-02", "2021-01-01") p := &models.Plan{PlanID: 6, PlanDate: &planDate} m := getModel([]*models.Plan{p}, []*models.Action{}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) data := []byte(`{ "plan_id": 5 }, { "plan_id": 6 }`) - req, _ := http.NewRequest("PUT", "/actions/text", bytes.NewBuffer(data)) + req, _ := http.NewRequest("PUT", "/text", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -170,10 +169,10 @@ func TestErrorUpdateAction(t *testing.T) { m := getErrorModel("Model always errors") - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) a := &models.Action{PlanID: 6} data, _ := json.Marshal(a) - req, _ := http.NewRequest("PUT", "/actions/1", bytes.NewBuffer(data)) + req, _ := http.NewRequest("PUT", "/1", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -195,10 +194,10 @@ func TestErrorOnRetrieveUpdateAction(t *testing.T) { m := getErrorOnGetModel("Model always errors") - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) a := &models.Action{PlanID: 6} data, _ := json.Marshal(a) - req, _ := http.NewRequest("PUT", "/actions/1", bytes.NewBuffer(data)) + req, _ := http.NewRequest("PUT", "/1", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := httptest.NewRecorder() @@ -220,9 +219,9 @@ func TestErrorWriterUpdateAction(t *testing.T) { a := &models.Action{PlanID: 6} m := getModel([]*models.Plan{}, []*models.Action{a}) - router := routes.NewRouter(m, tokens.New("whatever")) + router := routes.NewActionRouter(m) data, _ := json.Marshal(a) - req, _ := http.NewRequest("PUT", "/actions/1", bytes.NewBuffer(data)) + req, _ := http.NewRequest("PUT", "/1", bytes.NewBuffer(data)) req.Header.Set("Content-Type", "application/json") rr := NewBadWriter() diff --git a/routes/routes.go b/routes/routes.go index ddd38d3..b5501b3 100644 --- a/routes/routes.go +++ b/routes/routes.go @@ -5,6 +5,7 @@ import ( "gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/tokens" "github.com/go-chi/chi" + "github.com/go-chi/jwtauth" "net/http" ) @@ -13,8 +14,16 @@ func NewRouter(m *models.Model, tok tokens.Toker) http.Handler { router := chi.NewRouter() router.MethodNotAllowed(methodNotAllowedHandler) router.NotFound(notFoundHandler) - router.Mount("/plans", newPlanRouter(m)) - router.Mount("/actions", newActionRouter(m)) + router.Group(func(r chi.Router) { + r.Use(tok.Verifier()) + // Handle valid / invalid tokens. In this example, we use + // the provided authenticator middleware, but you can write your + // own very easily, look at the Authenticator method in jwtauth.go + // and tweak it, its not scary. + r.Use(jwtauth.Authenticator) + r.Mount("/actions", NewActionRouter(m)) + r.Mount("/plans", NewPlanRouter(m)) + }) router.Mount("/auth", newAuthRouter(m, tok)) router.Mount("/health", newHealthRouter(m)) router.Get("/ping", ping) diff --git a/tokens/tokens.go b/tokens/tokens.go index a983181..6ee2e69 100644 --- a/tokens/tokens.go +++ b/tokens/tokens.go @@ -3,6 +3,7 @@ package tokens import ( "gitea.deepak.science/deepak/gogmagog/models" "github.com/go-chi/jwtauth" + "net/http" "time" ) @@ -10,6 +11,7 @@ import ( type Toker interface { EncodeUser(user *models.UserNoPassword) string VerifyTokenString(tokenString string) error + Verifier() func(http.Handler) http.Handler } type jwtToker struct { @@ -39,3 +41,7 @@ func (tok *jwtToker) VerifyTokenString(tokenString string) error { _, err := jwtauth.VerifyToken(tok.tokenAuth, tokenString) return err } + +func (tok *jwtToker) Verifier() func(http.Handler) http.Handler { + return jwtauth.Verifier(tok.tokenAuth) +}