oef/handlers/handlers_test.go

246 lines
5.5 KiB
Go
Raw Normal View History

2020-01-11 09:11:49 +01:00
package handlers
import (
2020-01-13 08:14:58 +01:00
"context"
2020-01-11 09:11:49 +01:00
"encoding/json"
"log"
2020-01-11 09:11:49 +01:00
"net/http"
"net/http/httptest"
2020-01-17 12:11:13 +01:00
"strings"
2020-01-11 09:11:49 +01:00
"testing"
"time"
"git.andreafazzi.eu/andrea/oef/config"
"git.andreafazzi.eu/andrea/oef/orm"
"git.andreafazzi.eu/andrea/oef/renderer"
2020-01-15 16:42:35 +01:00
"github.com/PuerkitoBio/goquery"
2020-01-13 08:14:58 +01:00
jwt "github.com/dgrijalva/jwt-go"
2020-01-11 09:11:49 +01:00
"github.com/remogatto/prettytest"
)
var (
2020-01-14 16:28:27 +01:00
token string
handlers *Handlers
conf *config.ConfigT
2020-01-11 09:11:49 +01:00
)
// Start of setup
type testSuite struct {
prettytest.Suite
}
2020-01-17 11:06:28 +01:00
func login(request *http.Request, handlers *Handlers, username string, password string) (*http.Request, error) {
tokenString := requestToken(handlers, username, password)
2020-01-14 16:28:27 +01:00
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
2020-01-17 11:06:28 +01:00
return []byte(handlers.Config.Keys.JWTSigningKey), nil
2020-01-14 16:28:27 +01:00
})
if err != nil {
return nil, err
}
ctx := request.Context()
ctx = context.WithValue(ctx, "user", token)
return request.WithContext(ctx), nil
}
2020-01-17 11:06:28 +01:00
func requestToken(handlers *Handlers, username string, password string) string {
2020-01-14 16:28:27 +01:00
req, err := http.NewRequest("GET", "/get_token", nil)
if err != nil {
panic(err)
}
2020-01-17 11:06:28 +01:00
req.SetBasicAuth(username, password)
2020-01-14 16:28:27 +01:00
rr := httptest.NewRecorder()
2020-01-17 11:06:28 +01:00
handlers.GetToken(handlers.Database, []byte(handlers.Config.Keys.JWTSigningKey)).ServeHTTP(rr, req)
2020-01-14 16:28:27 +01:00
var data struct {
Token string
}
if err := json.Unmarshal(rr.Body.Bytes(), &data); err != nil {
panic(err)
}
return data.Token
}
2020-01-11 09:11:49 +01:00
func TestRunner(t *testing.T) {
prettytest.Run(
t,
new(testSuite),
)
}
func (t *testSuite) BeforeAll() {
var db *orm.Database
conf = new(config.ConfigT)
2020-01-11 09:11:49 +01:00
// Load the configuration
err := config.ReadFile("testdata/config.yaml", conf)
if err != nil {
panic(err)
}
// conf.LogLevel = config.LOG_LEVEL_OFF
2020-01-11 09:11:49 +01:00
// Initialize the ORM
connected := false
for !connected {
var err error
2020-01-17 11:06:28 +01:00
time.Sleep(2 * time.Second)
2020-01-15 16:42:35 +01:00
db, err = orm.NewDatabase(conf, orm.Models)
2020-01-11 09:11:49 +01:00
if err != nil {
log.Print(err)
2020-01-11 09:11:49 +01:00
continue
}
2020-01-11 09:11:49 +01:00
connected = true
}
db.AutoMigrate()
2020-01-13 08:14:58 +01:00
2020-01-11 09:11:49 +01:00
// Initialize the renderers
2020-01-16 12:47:35 +01:00
htmlRenderer, err := renderer.NewHTMLRenderer("../templates/")
2020-01-11 09:11:49 +01:00
if err != nil {
panic(err)
}
renderer := map[string]renderer.Renderer{
"html": htmlRenderer,
2020-01-13 16:33:20 +01:00
}
2020-01-17 07:59:57 +01:00
conf.Handlers.Permissions = map[string]map[string][]int{
2020-01-16 12:47:35 +01:00
"administrator": map[string][]int{
"Contest": []int{PermissionCreate, PermissionRead, PermissionReadAll, PermissionUpdate, PermissionDelete},
"Participant": []int{PermissionCreate, PermissionRead, PermissionReadAll, PermissionUpdate, PermissionDelete},
"School": []int{PermissionCreate, PermissionRead, PermissionReadAll, PermissionUpdate, PermissionDelete},
"Question": []int{PermissionCreate, PermissionRead, PermissionReadAll, PermissionUpdate, PermissionDelete},
"Answer": []int{PermissionCreate, PermissionRead, PermissionReadAll, PermissionUpdate, PermissionDelete},
"Response": []int{PermissionCreate, PermissionRead, PermissionReadAll, PermissionUpdate, PermissionDelete},
},
"school": map[string][]int{
"Participant": []int{PermissionCreate, PermissionRead, PermissionReadAll, PermissionUpdate, PermissionDelete},
"School": []int{PermissionRead, PermissionUpdate},
},
"participant": map[string][]int{
"Participant": []int{PermissionRead},
"Response": []int{PermissionUpdate, PermissionRead},
},
"subscriber": map[string][]int{
"School": []int{PermissionCreate, PermissionRead},
},
}
2020-01-17 07:59:57 +01:00
conf.Handlers.PathPatterns = DefaultPathPatterns
conf.Handlers.APIPathPatterns = DefaultAPIPathPatterns
handlers = NewHandlers(conf, renderer, db, orm.Models)
2020-01-11 09:11:49 +01:00
}
2020-01-13 08:14:58 +01:00
func (t *testSuite) TestReadAllContests() {
2020-01-17 12:53:35 +01:00
req, err := handlers.NewReadAllRequest(&orm.Contest{}, "/contests", "html")
2020-01-17 11:06:28 +01:00
t.Nil(err)
2020-01-13 08:14:58 +01:00
2020-01-17 11:06:28 +01:00
req, err = login(req, handlers, "admin", "admin")
2020-01-14 16:28:27 +01:00
t.Nil(err)
2020-01-13 08:14:58 +01:00
2020-01-17 11:06:28 +01:00
if !t.Failed() {
rr := httptest.NewRecorder()
2020-01-11 09:11:49 +01:00
2020-01-17 11:06:28 +01:00
handlers.ReadAll(&orm.Contest{}).ServeHTTP(rr, req)
2020-01-14 16:28:27 +01:00
t.Equal(http.StatusOK, rr.Code)
2020-01-11 09:11:49 +01:00
2020-01-14 16:28:27 +01:00
if !t.Failed() {
2020-01-17 11:06:28 +01:00
doc, err := goquery.NewDocumentFromReader(rr.Body)
2020-01-15 16:42:35 +01:00
if err != nil {
log.Fatal(err)
}
2020-01-17 12:11:13 +01:00
expected := []string{"JUNIOR Contest", "SENIOR Contest"}
ok := true
doc.Find(".list-group-item").Each(func(i int, s *goquery.Selection) {
if !strings.Contains(s.Text(), expected[i]) {
ok = false
}
})
t.True(ok)
}
}
}
func (t *testSuite) TestReadContest() {
2020-01-17 12:53:35 +01:00
req, err := handlers.NewReadRequest(&orm.Contest{}, "/contests/1", "html")
2020-01-17 12:11:13 +01:00
t.Nil(err)
req, err = login(req, handlers, "admin", "admin")
t.Nil(err)
if !t.Failed() {
rr := httptest.NewRecorder()
handlers.Read(&orm.Contest{}).ServeHTTP(rr, req)
t.Equal(http.StatusOK, rr.Code)
if !t.Failed() {
doc, err := goquery.NewDocumentFromReader(rr.Body)
if err != nil {
log.Fatal(err)
}
expected := "JUNIOR Contest"
ok := true
2020-01-17 12:53:35 +01:00
doc.Find("h1").Each(func(i int, s *goquery.Selection) {
if !strings.Contains(s.Text(), expected) {
ok = false
}
})
t.True(ok)
}
}
}
func (t *testSuite) TestCreateSchoolAsSubscriber() {
req, err := handlers.NewCreateRequest(&orm.School{}, "/create/", "html", "GET")
t.Nil(err)
req, err = login(req, handlers, "admin", "admin")
t.Nil(err)
if !t.Failed() {
rr := httptest.NewRecorder()
handlers.Read(&orm.Contest{}).ServeHTTP(rr, req)
t.Equal(http.StatusOK, rr.Code)
if !t.Failed() {
doc, err := goquery.NewDocumentFromReader(rr.Body)
if err != nil {
log.Fatal(err)
}
expected := "Denominazione Istituto"
ok := true
doc.Find(".control-label").Each(func(i int, s *goquery.Selection) {
2020-01-17 12:11:13 +01:00
if !strings.Contains(s.Text(), expected) {
ok = false
}
})
t.True(ok)
2020-01-14 16:28:27 +01:00
}
2020-01-11 09:11:49 +01:00
}
}