Skip to content

Commit

Permalink
Merge pull request #248 from qor/optimize-test-env
Browse files Browse the repository at this point in the history
Extract test env from group permission branch.
  • Loading branch information
raven-chen authored Mar 5, 2021
2 parents a49ef55 + d1a42d3 commit 2c1a657
Show file tree
Hide file tree
Showing 7 changed files with 184 additions and 44 deletions.
19 changes: 8 additions & 11 deletions edit_page_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,18 @@ import (
"testing"

. "github.com/qor/admin/tests/dummy"
qorTestUtils "github.com/qor/qor/test/utils"
"github.com/theplant/htmltestingutils"
)

func TestEditPage(t *testing.T) {
h, _, _ := NewTestHandler()
qorTestUtils.ResetDBTables(db, &Language{}, &User{})
user := createLoggedInUser()

var err error
user := User{Name: "my record", Role: "admin"}
err = db.Save(&user).Error
if err != nil {
t.Fatal(err)
}
h := adminHandler

var req *http.Request
req, err = http.NewRequest("GET", fmt.Sprintf("/admin/users/%d/edit", user.ID), nil)
req, err := http.NewRequest("GET", fmt.Sprintf("/admin/users/%d/edit", user.ID), nil)
if err != nil {
t.Fatal(err)
}
Expand All @@ -31,7 +28,7 @@ func TestEditPage(t *testing.T) {
h.ServeHTTP(rr, req)

// assert only form so that other sections won't break the tests
diff := htmltestingutils.PrettyHtmlDiff(rr.Body, "form", expectedBody)
diff := htmltestingutils.PrettyHtmlDiff(rr.Body, "form.qor-form", expectedBody)
if len(diff) > 0 {
t.Error(diff)
}
Expand Down Expand Up @@ -65,10 +62,10 @@ var expectedBody = `
Name
</label>
<div class="qor-field__show">my record</div>
<div class="qor-field__show">QOR</div>
<div class="qor-field__edit">
<input class="mdl-textfield__input" type="text" id="user_1_name" name="QorResource.Name" value="my record" >
<input class="mdl-textfield__input" type="text" id="user_1_name" name="QorResource.Name" value="QOR" >
</div>
</div>
</div>
Expand Down
36 changes: 25 additions & 11 deletions setup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,41 @@ package admin_test
import (
"net/http"
"net/http/httptest"
"os"
"testing"

"github.com/jinzhu/gorm"
"github.com/qor/admin"
. "github.com/qor/admin/tests/dummy"
)

var (
server *httptest.Server
db *gorm.DB
Admin *admin.Admin
server *httptest.Server
db *gorm.DB
Admin *admin.Admin
adminHandler http.Handler
)

func init() {
var mux http.Handler
mux, Admin, db = NewTestHandler()
server = httptest.NewServer(mux)
Admin = NewDummyAdmin()
adminHandler = Admin.NewServeMux("/admin")
db = Admin.DB
server = httptest.NewServer(adminHandler)
}

func NewTestHandler() (h http.Handler, adm *admin.Admin, d *gorm.DB) {
adm = NewDummyAdmin()
d = adm.DB
h = adm.NewServeMux("/admin")
return
func TestMain(m *testing.M) {
// Create universal logged-in user for test.
createLoggedInUser()
retCode := m.Run()

os.Exit(retCode)
}

func createLoggedInUser() *User {
user := User{Name: LoggedInUserName, Role: Role_system_administrator}
if err := db.Save(&user).Error; err != nil {
panic(err)
}

return &user
}
66 changes: 63 additions & 3 deletions tests/dummy/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,64 @@ import (
"github.com/qor/media"
"github.com/qor/qor"
"github.com/qor/qor/test/utils"
"github.com/qor/roles"
)

// NewDummyAdmin generate admin for dummy app
func NewDummyAdmin(keepData ...bool) *admin.Admin {
var (
db = utils.TestDB()
models = []interface{}{&User{}, &CreditCard{}, &Address{}, &Language{}, &Profile{}, &Phone{}, &Company{}}
Admin = admin.New(&qor.Config{DB: db})
Admin = admin.New(&admin.AdminConfig{Auth: DummyAuth{}, DB: db})
)

media.RegisterCallbacks(db)

InitRoles()

for _, value := range models {
if len(keepData) == 0 {
db.DropTableIfExists(value)
}
db.AutoMigrate(value)
}

Admin.AddResource(&Company{})
c := Admin.AddResource(&Company{})
c.Action(&admin.Action{
Name: "Publish",
Handler: func(argument *admin.ActionArgument) (err error) {
fmt.Println("Publish company")
return
},
Method: "GET",
Resource: c,
Modes: []string{"edit"},
})
c.Action(&admin.Action{
Name: "Preview",
Permission: roles.Deny(roles.CRUD, Role_system_administrator),
Handler: func(argument *admin.ActionArgument) (err error) {
fmt.Println("Preview company")
return
},
Method: "GET",
Resource: c,
Modes: []string{"edit"},
})
c.Action(&admin.Action{
Name: "Approve",
Permission: roles.Allow(roles.Read, Role_system_administrator),
Handler: func(argument *admin.ActionArgument) (err error) {
fmt.Println("Approve company")
return
},
Method: "GET",
Modes: []string{"edit"},
})
Admin.AddResource(&CreditCard{})

Admin.AddResource(&Language{}, &admin.Config{Name: "语种 & 语言", Priority: -1})
user := Admin.AddResource(&User{})
user := Admin.AddResource(&User{}, &admin.Config{Permission: roles.Allow(roles.CRUD, Role_system_administrator)})
user.Meta(&admin.Meta{
Name: "CreditCard",
Type: "single_edit",
Expand All @@ -48,3 +84,27 @@ func NewDummyAdmin(keepData ...bool) *admin.Admin {

return Admin
}

const LoggedInUserName = "QOR"

type DummyAuth struct {
}

func (DummyAuth) LoginURL(ctx *admin.Context) string {
return "/auth/login"
}

func (DummyAuth) LogoutURL(ctx *admin.Context) string {
return "/auth/logout"
}

func (DummyAuth) GetCurrentUser(ctx *admin.Context) qor.CurrentUser {
u := User{}

if err := ctx.Admin.DB.Where("name = ?", LoggedInUserName).First(&u).Error; err != nil {
fmt.Println("Cannot load logged in user", err.Error())
return nil
}

return u
}
12 changes: 12 additions & 0 deletions tests/dummy/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,15 @@ type Phone struct {
ProfileID uint64
Num string
}

func (u User) DisplayName() string {
return u.Name
}

func (u User) GetID() uint {
return u.ID
}

func (u User) GetUsersByIDs(db *gorm.DB, ids []string) interface{} {
return u
}
30 changes: 30 additions & 0 deletions tests/dummy/roles.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package dummy

import (
"net/http"

"github.com/qor/roles"
)

const (
Role_editor = "Editor"
Role_supervisor = "Supervisor"
Role_system_administrator = "admin"
Role_developer = "Developer"
)

// InitRoles initialize roles of the system.
func InitRoles() {
roles.Register(Role_editor, func(req *http.Request, currentUser interface{}) bool {
return currentUser != nil && currentUser.(User).Role == Role_editor
})
roles.Register(Role_supervisor, func(req *http.Request, currentUser interface{}) bool {
return currentUser != nil && currentUser.(User).Role == Role_supervisor
})
roles.Register(Role_system_administrator, func(req *http.Request, currentUser interface{}) bool {
return currentUser != nil && currentUser.(User).Role == Role_system_administrator
})
roles.Register(Role_developer, func(req *http.Request, currentUser interface{}) bool {
return currentUser != nil && currentUser.(User).Role == Role_developer
})
}
10 changes: 8 additions & 2 deletions transformer_json_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,24 @@ import (
"github.com/jinzhu/now"
"github.com/qor/admin"
. "github.com/qor/admin/tests/dummy"
qorTestUtils "github.com/qor/qor/test/utils"
"github.com/theplant/testingutils"
)

func TestJSONTransformerEncode(t *testing.T) {
qorTestUtils.ResetDBTables(db, &Language{}, &Profile{}, &CreditCard{}, &User{})

ctx := Admin.NewContext(nil, nil)
ctx.Context.Roles = []string{Role_system_administrator}

var (
buffer bytes.Buffer
registeredAt = now.MustParse("2017-01-01")
jsonTransformer = &admin.JSONTransformer{}
encoder = admin.Encoder{
Action: "show",
Resource: Admin.GetResource("User"),
Context: Admin.NewContext(nil, nil),
Context: ctx,
Result: &User{
Active: true,
Model: gorm.Model{ID: 1},
Expand Down Expand Up @@ -81,7 +87,7 @@ func TestJSONTransformerEncode(t *testing.T) {

diff := testingutils.PrettyJsonDiff(expect, response)
if len(diff) > 0 {
t.Errorf("Got %v\n%v", string(buffer.Bytes()), diff)
t.Errorf("Got %v\n\n\n\n%v", string(buffer.Bytes()), diff)
}
}

Expand Down
Loading

0 comments on commit 2c1a657

Please sign in to comment.