Decouples routers and adds auth for plans and actions call
All checks were successful
gitea-deepak/gogmagog/pipeline/head This commit looks good

This commit is contained in:
Deepak Mallubhotla 2021-01-12 16:15:28 -06:00
parent ab1dab6619
commit 417a7cf982
Signed by: deepak
GPG Key ID: 64BF53A3369104E7
9 changed files with 107 additions and 95 deletions

View File

@ -9,7 +9,8 @@ import (
"strconv" "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 := chi.NewRouter()
router.Get("/", getActionsFunc(m)) router.Get("/", getActionsFunc(m))
router.Post("/", postActionFunc(m)) router.Post("/", postActionFunc(m))

View File

@ -3,7 +3,6 @@ package routes_test
import ( import (
"gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/models"
"gitea.deepak.science/deepak/gogmagog/routes" "gitea.deepak.science/deepak/gogmagog/routes"
"gitea.deepak.science/deepak/gogmagog/tokens"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@ -16,8 +15,8 @@ func TestEmptyActions(t *testing.T) {
// set up // set up
assert := assert.New(t) assert := assert.New(t)
m := getEmptyModel() m := getEmptyModel()
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
req, _ := http.NewRequest("GET", "/actions", nil) req, _ := http.NewRequest("GET", "/", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -42,8 +41,8 @@ func TestOneAction(t *testing.T) {
completedDate, _ := time.Parse("2006-01-02", "2021-01-03") 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} 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}) m := getModel([]*models.Plan{}, []*models.Action{a1})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
req, _ := http.NewRequest("GET", "/actions", nil) req, _ := http.NewRequest("GET", "/", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -77,8 +76,8 @@ func TestErrorAction(t *testing.T) {
m := getErrorModel("Model always errors") m := getErrorModel("Model always errors")
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
req, _ := http.NewRequest("GET", "/actions", nil) req, _ := http.NewRequest("GET", "/", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -99,8 +98,8 @@ func TestEmptyActionErrorWriter(t *testing.T) {
m := getEmptyModel() m := getEmptyModel()
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
req, _ := http.NewRequest("GET", "/actions", nil) req, _ := http.NewRequest("GET", "/", nil)
rr := NewBadWriter() rr := NewBadWriter()
@ -120,8 +119,8 @@ func TestOneActionByID(t *testing.T) {
updatedDate, _ := time.Parse("2006-01-02", "2021-01-02") 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} 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}) m := getModel([]*models.Plan{}, []*models.Action{a})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
req, _ := http.NewRequest("GET", "/actions/6", nil) req, _ := http.NewRequest("GET", "/6", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -152,8 +151,8 @@ func TestErrorActionByID(t *testing.T) {
m := getErrorModel("Model always errors") m := getErrorModel("Model always errors")
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
req, _ := http.NewRequest("GET", "/actions/5", nil) req, _ := http.NewRequest("GET", "/5", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -175,8 +174,8 @@ func TestEmptyActionErrorWriterByID(t *testing.T) {
a := &models.Action{ActionID: 6} a := &models.Action{ActionID: 6}
m := getModel([]*models.Plan{}, []*models.Action{a}) m := getModel([]*models.Plan{}, []*models.Action{a})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
req, _ := http.NewRequest("GET", "/actions/6", nil) req, _ := http.NewRequest("GET", "/6", nil)
rr := NewBadWriter() rr := NewBadWriter()
@ -195,8 +194,8 @@ func TestNotFoundActionByIDText(t *testing.T) {
m := getEmptyModel() m := getEmptyModel()
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
req, _ := http.NewRequest("GET", "/actions/wo", nil) req, _ := http.NewRequest("GET", "/wo", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -214,8 +213,8 @@ func TestNotFoundActionByIDEmpty(t *testing.T) {
m := getEmptyModel() m := getEmptyModel()
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
req, _ := http.NewRequest("GET", "/actions/1", nil) req, _ := http.NewRequest("GET", "/1", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -235,8 +234,8 @@ func TestActionsByPlanID(t *testing.T) {
updatedDate, _ := time.Parse("2006-01-02", "2021-01-02") 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} 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}) m := getModel([]*models.Plan{}, []*models.Action{a})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
req, _ := http.NewRequest("GET", "/actions?plan_id=6", nil) req, _ := http.NewRequest("GET", "/?plan_id=6", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -270,8 +269,8 @@ func TestActionsByPlanIDInvalidID(t *testing.T) {
updatedDate, _ := time.Parse("2006-01-02", "2021-01-02") 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} 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}) m := getModel([]*models.Plan{}, []*models.Action{a})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
req, _ := http.NewRequest("GET", "/actions?plan_id=aoeu", nil) req, _ := http.NewRequest("GET", "/?plan_id=aoeu", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()

View File

@ -9,7 +9,8 @@ import (
"strconv" "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 := chi.NewRouter()
router.Get("/", getAllPlansFunc(m)) router.Get("/", getAllPlansFunc(m))
router.Post("/", postPlanFunc(m)) router.Post("/", postPlanFunc(m))

View File

@ -3,7 +3,6 @@ package routes_test
import ( import (
"gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/models"
"gitea.deepak.science/deepak/gogmagog/routes" "gitea.deepak.science/deepak/gogmagog/routes"
"gitea.deepak.science/deepak/gogmagog/tokens"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@ -16,8 +15,8 @@ func TestEmptyPlans(t *testing.T) {
// set up // set up
assert := assert.New(t) assert := assert.New(t)
m := getEmptyModel() m := getEmptyModel()
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
req, _ := http.NewRequest("GET", "/plans", nil) req, _ := http.NewRequest("GET", "/", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -40,8 +39,8 @@ func TestOnePlan(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
req, _ := http.NewRequest("GET", "/plans", nil) req, _ := http.NewRequest("GET", "/", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -69,8 +68,8 @@ func TestErrorPlan(t *testing.T) {
m := getErrorModel("Model always errors") m := getErrorModel("Model always errors")
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
req, _ := http.NewRequest("GET", "/plans", nil) req, _ := http.NewRequest("GET", "/", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -91,8 +90,8 @@ func TestEmptyPlanErrorWriter(t *testing.T) {
m := getEmptyModel() m := getEmptyModel()
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
req, _ := http.NewRequest("GET", "/plans", nil) req, _ := http.NewRequest("GET", "/", nil)
rr := NewBadWriter() rr := NewBadWriter()
@ -111,8 +110,8 @@ func TestOnePlanByID(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
req, _ := http.NewRequest("GET", "/plans/6", nil) req, _ := http.NewRequest("GET", "/6", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -138,8 +137,8 @@ func TestErrorPlanByID(t *testing.T) {
m := getErrorModel("Model always errors") m := getErrorModel("Model always errors")
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
req, _ := http.NewRequest("GET", "/plans/5", nil) req, _ := http.NewRequest("GET", "/5", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -162,8 +161,8 @@ func TestEmptyPlanErrorWriterByID(t *testing.T) {
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
req, _ := http.NewRequest("GET", "/plans/6", nil) req, _ := http.NewRequest("GET", "/6", nil)
rr := NewBadWriter() rr := NewBadWriter()
@ -182,8 +181,8 @@ func TestNotFoundPlanByIDText(t *testing.T) {
m := getEmptyModel() m := getEmptyModel()
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
req, _ := http.NewRequest("GET", "/plans/wo", nil) req, _ := http.NewRequest("GET", "/wo", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -201,8 +200,8 @@ func TestNotFoundPlanByIDEmpty(t *testing.T) {
m := getEmptyModel() m := getEmptyModel()
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
req, _ := http.NewRequest("GET", "/plans/1", nil) req, _ := http.NewRequest("GET", "/1", nil)
rr := httptest.NewRecorder() rr := httptest.NewRecorder()

View File

@ -5,7 +5,6 @@ import (
"encoding/json" "encoding/json"
"gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/models"
"gitea.deepak.science/deepak/gogmagog/routes" "gitea.deepak.science/deepak/gogmagog/routes"
"gitea.deepak.science/deepak/gogmagog/tokens"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@ -26,7 +25,7 @@ func TestPureJSONPostAction(t *testing.T) {
ActionDescription: "here's an action", ActionDescription: "here's an action",
} }
m := getModel([]*models.Plan{}, []*models.Action{a}) m := getModel([]*models.Plan{}, []*models.Action{a})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
data := []byte(`{ data := []byte(`{
"action_description": "here's an action", "action_description": "here's an action",
"estimated_chunks": 3, "estimated_chunks": 3,
@ -34,7 +33,7 @@ func TestPureJSONPostAction(t *testing.T) {
"completed_on": "2021-01-01T00:00:00Z", "completed_on": "2021-01-01T00:00:00Z",
"plan_id": 5 "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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -67,13 +66,13 @@ func TestExtraFieldActionPostJSON(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
data := []byte(`{ data := []byte(`{
"completed_on": "2021-01-01T00:00:00Z", "completed_on": "2021-01-01T00:00:00Z",
"plan_id": 5, "plan_id": 5,
"sabotage": "omg" "sabotage": "omg"
}`) }`)
req, _ := http.NewRequest("POST", "/actions", bytes.NewBuffer(data)) req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data))
req.Header.Set("Content-Type", "application/json") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -93,9 +92,9 @@ func TestEmptyBodyActionPost(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
data := []byte(``) data := []byte(``)
req, _ := http.NewRequest("POST", "/actions", bytes.NewBuffer(data)) req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data))
req.Header.Set("Content-Type", "application/json") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -116,13 +115,13 @@ func TestTwoBodyActionPost(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
data := []byte(`{ data := []byte(`{
"plan_id": 5 "plan_id": 5
}, { }, {
"plan_id": 6 "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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -143,10 +142,10 @@ func TestErrorCreateAction(t *testing.T) {
m := getErrorModel("Model always errors") m := getErrorModel("Model always errors")
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
a := &models.Action{PlanID: 6} a := &models.Action{PlanID: 6}
data, _ := json.Marshal(a) 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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -168,10 +167,10 @@ func TestErrorOnRetrieveCreateAction(t *testing.T) {
m := getErrorOnGetModel("Model always errors") m := getErrorOnGetModel("Model always errors")
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
a := &models.Action{PlanID: 6} a := &models.Action{PlanID: 6}
data, _ := json.Marshal(a) 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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -193,9 +192,9 @@ func TestErrorWriterCreateAction(t *testing.T) {
a := &models.Action{PlanID: 6} a := &models.Action{PlanID: 6}
m := getModel([]*models.Plan{}, []*models.Action{a}) m := getModel([]*models.Plan{}, []*models.Action{a})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
data, _ := json.Marshal(a) 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") req.Header.Set("Content-Type", "application/json")
rr := NewBadWriter() rr := NewBadWriter()

View File

@ -5,7 +5,6 @@ import (
"encoding/json" "encoding/json"
"gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/models"
"gitea.deepak.science/deepak/gogmagog/routes" "gitea.deepak.science/deepak/gogmagog/routes"
"gitea.deepak.science/deepak/gogmagog/tokens"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@ -20,9 +19,9 @@ func TestCreatePlanRoute(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
data, _ := json.Marshal(p) 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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -51,12 +50,12 @@ func TestPureJSON(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
data := []byte(`{ data := []byte(`{
"plan_date": "2021-01-01T00:00:00Z", "plan_date": "2021-01-01T00:00:00Z",
"plan_id": 5 "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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -85,13 +84,13 @@ func TestExtraFieldJSON(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
data := []byte(`{ data := []byte(`{
"plan_date": "2021-01-01T00:00:00Z", "plan_date": "2021-01-01T00:00:00Z",
"plan_id": 5, "plan_id": 5,
"plan_sabotage": "omg" "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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -111,9 +110,9 @@ func TestEmptyBody(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
data := []byte(``) data := []byte(``)
req, _ := http.NewRequest("POST", "/plans", bytes.NewBuffer(data)) req, _ := http.NewRequest("POST", "/", bytes.NewBuffer(data))
req.Header.Set("Content-Type", "application/json") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -134,7 +133,7 @@ func TestTwoBody(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
data := []byte(`{ data := []byte(`{
"plan_date": "2021-01-01T00:00:00Z", "plan_date": "2021-01-01T00:00:00Z",
"plan_id": 5 "plan_id": 5
@ -142,7 +141,7 @@ func TestTwoBody(t *testing.T) {
"plan_date": "2021-01-01T00:00:00Z", "plan_date": "2021-01-01T00:00:00Z",
"plan_id": 6 "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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -163,11 +162,11 @@ func TestErrorCreatePlan(t *testing.T) {
m := getErrorModel("Model always errors") 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") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
data, _ := json.Marshal(p) 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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -189,11 +188,11 @@ func TestErrorOnRetrieveCreatePlan(t *testing.T) {
m := getErrorOnGetModel("Model always errors") 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") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
data, _ := json.Marshal(p) 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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -216,9 +215,9 @@ func TestErrorWriterCreatePlan(t *testing.T) {
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewPlanRouter(m)
data, _ := json.Marshal(p) 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") req.Header.Set("Content-Type", "application/json")
rr := NewBadWriter() rr := NewBadWriter()

View File

@ -5,7 +5,6 @@ import (
"encoding/json" "encoding/json"
"gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/models"
"gitea.deepak.science/deepak/gogmagog/routes" "gitea.deepak.science/deepak/gogmagog/routes"
"gitea.deepak.science/deepak/gogmagog/tokens"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@ -26,7 +25,7 @@ func TestPureJSONPutAction(t *testing.T) {
ActionDescription: "here's an action", ActionDescription: "here's an action",
} }
m := getModel([]*models.Plan{}, []*models.Action{a}) m := getModel([]*models.Plan{}, []*models.Action{a})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
data := []byte(`{ data := []byte(`{
"action_description": "here's an action", "action_description": "here's an action",
"estimated_chunks": 3, "estimated_chunks": 3,
@ -34,7 +33,7 @@ func TestPureJSONPutAction(t *testing.T) {
"completed_on": "2021-01-01T00:00:00Z", "completed_on": "2021-01-01T00:00:00Z",
"plan_id": 5 "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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -67,13 +66,13 @@ func TestExtraFieldActionPutJSON(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
data := []byte(`{ data := []byte(`{
"completed_on": "2021-01-01T00:00:00Z", "completed_on": "2021-01-01T00:00:00Z",
"plan_id": 5, "plan_id": 5,
"sabotage": "omg" "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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -93,9 +92,9 @@ func TestEmptyBodyActionPut(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
data := []byte(``) 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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -116,13 +115,13 @@ func TestTwoBodyActionPut(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
data := []byte(`{ data := []byte(`{
"plan_id": 5 "plan_id": 5
}, { }, {
"plan_id": 6 "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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -143,13 +142,13 @@ func TestBadActionIDPut(t *testing.T) {
planDate, _ := time.Parse("2006-01-02", "2021-01-01") planDate, _ := time.Parse("2006-01-02", "2021-01-01")
p := &models.Plan{PlanID: 6, PlanDate: &planDate} p := &models.Plan{PlanID: 6, PlanDate: &planDate}
m := getModel([]*models.Plan{p}, []*models.Action{}) m := getModel([]*models.Plan{p}, []*models.Action{})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
data := []byte(`{ data := []byte(`{
"plan_id": 5 "plan_id": 5
}, { }, {
"plan_id": 6 "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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -170,10 +169,10 @@ func TestErrorUpdateAction(t *testing.T) {
m := getErrorModel("Model always errors") m := getErrorModel("Model always errors")
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
a := &models.Action{PlanID: 6} a := &models.Action{PlanID: 6}
data, _ := json.Marshal(a) 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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -195,10 +194,10 @@ func TestErrorOnRetrieveUpdateAction(t *testing.T) {
m := getErrorOnGetModel("Model always errors") m := getErrorOnGetModel("Model always errors")
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
a := &models.Action{PlanID: 6} a := &models.Action{PlanID: 6}
data, _ := json.Marshal(a) 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") req.Header.Set("Content-Type", "application/json")
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -220,9 +219,9 @@ func TestErrorWriterUpdateAction(t *testing.T) {
a := &models.Action{PlanID: 6} a := &models.Action{PlanID: 6}
m := getModel([]*models.Plan{}, []*models.Action{a}) m := getModel([]*models.Plan{}, []*models.Action{a})
router := routes.NewRouter(m, tokens.New("whatever")) router := routes.NewActionRouter(m)
data, _ := json.Marshal(a) 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") req.Header.Set("Content-Type", "application/json")
rr := NewBadWriter() rr := NewBadWriter()

View File

@ -5,6 +5,7 @@ import (
"gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/models"
"gitea.deepak.science/deepak/gogmagog/tokens" "gitea.deepak.science/deepak/gogmagog/tokens"
"github.com/go-chi/chi" "github.com/go-chi/chi"
"github.com/go-chi/jwtauth"
"net/http" "net/http"
) )
@ -13,8 +14,16 @@ func NewRouter(m *models.Model, tok tokens.Toker) http.Handler {
router := chi.NewRouter() router := chi.NewRouter()
router.MethodNotAllowed(methodNotAllowedHandler) router.MethodNotAllowed(methodNotAllowedHandler)
router.NotFound(notFoundHandler) router.NotFound(notFoundHandler)
router.Mount("/plans", newPlanRouter(m)) router.Group(func(r chi.Router) {
router.Mount("/actions", newActionRouter(m)) 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("/auth", newAuthRouter(m, tok))
router.Mount("/health", newHealthRouter(m)) router.Mount("/health", newHealthRouter(m))
router.Get("/ping", ping) router.Get("/ping", ping)

View File

@ -3,6 +3,7 @@ package tokens
import ( import (
"gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/models"
"github.com/go-chi/jwtauth" "github.com/go-chi/jwtauth"
"net/http"
"time" "time"
) )
@ -10,6 +11,7 @@ import (
type Toker interface { type Toker interface {
EncodeUser(user *models.UserNoPassword) string EncodeUser(user *models.UserNoPassword) string
VerifyTokenString(tokenString string) error VerifyTokenString(tokenString string) error
Verifier() func(http.Handler) http.Handler
} }
type jwtToker struct { type jwtToker struct {
@ -39,3 +41,7 @@ func (tok *jwtToker) VerifyTokenString(tokenString string) error {
_, err := jwtauth.VerifyToken(tok.tokenAuth, tokenString) _, err := jwtauth.VerifyToken(tok.tokenAuth, tokenString)
return err return err
} }
func (tok *jwtToker) Verifier() func(http.Handler) http.Handler {
return jwtauth.Verifier(tok.tokenAuth)
}