mirror of
https://github.com/NginxProxyManager/nginx-proxy-manager.git
synced 2025-06-18 18:16:26 +00:00
Add more unit tests
This commit is contained in:
136
backend/internal/entity/auth/entity_test.go
Normal file
136
backend/internal/entity/auth/entity_test.go
Normal file
@ -0,0 +1,136 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"testing"
|
||||
|
||||
"npm/internal/test"
|
||||
|
||||
"github.com/DATA-DOG/go-sqlmock"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/stretchr/testify/suite"
|
||||
)
|
||||
|
||||
// +------------+
|
||||
// | Setup |
|
||||
// +------------+
|
||||
|
||||
type testsuite struct {
|
||||
suite.Suite
|
||||
mock sqlmock.Sqlmock
|
||||
singleRow *sqlmock.Rows
|
||||
}
|
||||
|
||||
// SetupTest is executed before each test
|
||||
func (s *testsuite) SetupTest() {
|
||||
var err error
|
||||
s.mock, err = test.Setup()
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
// These rows need to be intantiated for each test as they are
|
||||
// read in the db object, and their row position is not resettable
|
||||
// between tests.
|
||||
s.singleRow = sqlmock.NewRows([]string{
|
||||
"id",
|
||||
"user_id",
|
||||
"type",
|
||||
"secret",
|
||||
}).AddRow(
|
||||
10,
|
||||
100,
|
||||
TypePassword,
|
||||
"abc123",
|
||||
)
|
||||
}
|
||||
|
||||
// In order for 'go test' to run this suite, we need to create
|
||||
// a normal test function and pass our suite to suite.Run
|
||||
func TestExampleTestSuite(t *testing.T) {
|
||||
suite.Run(t, new(testsuite))
|
||||
}
|
||||
|
||||
func assertModel(t *testing.T, m Model) {
|
||||
assert.Equal(t, uint(10), m.ID)
|
||||
assert.Equal(t, uint(100), m.UserID)
|
||||
assert.Equal(t, TypePassword, m.Type)
|
||||
assert.Equal(t, "abc123", m.Secret)
|
||||
}
|
||||
|
||||
// +------------+
|
||||
// | Tests |
|
||||
// +------------+
|
||||
|
||||
func (s *testsuite) TestGetByID() {
|
||||
s.mock.
|
||||
ExpectQuery(regexp.QuoteMeta(`SELECT * FROM "auth" WHERE "auth"."id" = $1 AND "auth"."is_deleted" = $2 ORDER BY "auth"."id" LIMIT 1`)).
|
||||
WithArgs(10, 0).
|
||||
WillReturnRows(s.singleRow)
|
||||
|
||||
m, err := GetByID(10)
|
||||
require.NoError(s.T(), err)
|
||||
require.NoError(s.T(), s.mock.ExpectationsWereMet())
|
||||
assertModel(s.T(), m)
|
||||
}
|
||||
|
||||
func (s *testsuite) TestGetByUserIDType() {
|
||||
s.mock.
|
||||
ExpectQuery(regexp.QuoteMeta(`SELECT * FROM "auth" WHERE user_id = $1 AND type = $2 AND "auth"."is_deleted" = $3 ORDER BY "auth"."id" LIMIT 1`)).
|
||||
WithArgs(100, TypePassword, 0).
|
||||
WillReturnRows(s.singleRow)
|
||||
|
||||
m, err := GetByUserIDType(100, TypePassword)
|
||||
require.NoError(s.T(), err)
|
||||
require.NoError(s.T(), s.mock.ExpectationsWereMet())
|
||||
assertModel(s.T(), m)
|
||||
}
|
||||
|
||||
func (s *testsuite) TestSave() {
|
||||
s.mock.ExpectBegin()
|
||||
s.mock.ExpectQuery(regexp.QuoteMeta(`INSERT INTO "auth" ("created_at","updated_at","is_deleted","user_id","type","secret") VALUES ($1,$2,$3,$4,$5,$6) RETURNING "id"`)).
|
||||
WithArgs(
|
||||
sqlmock.AnyArg(),
|
||||
sqlmock.AnyArg(),
|
||||
0,
|
||||
100,
|
||||
TypePassword,
|
||||
"abc123",
|
||||
).
|
||||
WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow("11"))
|
||||
s.mock.ExpectCommit()
|
||||
|
||||
// New model
|
||||
m := Model{
|
||||
UserID: 100,
|
||||
Type: TypePassword,
|
||||
Secret: "abc123",
|
||||
}
|
||||
err := m.Save()
|
||||
require.NoError(s.T(), err)
|
||||
require.NoError(s.T(), s.mock.ExpectationsWereMet())
|
||||
}
|
||||
|
||||
func (s *testsuite) TestSetPassword() {
|
||||
m := Model{UserID: 100}
|
||||
err := m.SetPassword("abc123")
|
||||
require.NoError(s.T(), err)
|
||||
assert.Equal(s.T(), TypePassword, m.Type)
|
||||
assert.Greater(s.T(), len(m.Secret), 15)
|
||||
|
||||
}
|
||||
|
||||
func (s *testsuite) TestValidateSecret() {
|
||||
m := Model{UserID: 100}
|
||||
m.SetPassword("abc123")
|
||||
|
||||
err := m.ValidateSecret("abc123")
|
||||
require.NoError(s.T(), err)
|
||||
err = m.ValidateSecret("this is not the password")
|
||||
assert.NotNil(s.T(), err)
|
||||
assert.Equal(s.T(), "Invalid Password", err.Error())
|
||||
|
||||
m.Type = "not a valid type"
|
||||
err = m.ValidateSecret("abc123")
|
||||
assert.NotNil(s.T(), err)
|
||||
assert.Equal(s.T(), "Could not validate Secret, auth type is not a Password", err.Error())
|
||||
}
|
@ -33,28 +33,6 @@ func (m *Model) LoadByID(id int) error {
|
||||
return result.Error
|
||||
}
|
||||
|
||||
// LoadByUserIDType will load from an ID
|
||||
func (m *Model) LoadByUserIDType(userID int, authType string) error {
|
||||
db := database.GetDB()
|
||||
result := db.
|
||||
Where("user_id = ?", userID).
|
||||
Where("type = ?", authType).
|
||||
First(&m)
|
||||
return result.Error
|
||||
}
|
||||
|
||||
/*
|
||||
// Touch will update model's timestamp(s)
|
||||
func (m *Model) Touch(created bool) {
|
||||
var d types.DBDate
|
||||
d.Time = time.Now()
|
||||
if created {
|
||||
m.CreatedOn = d
|
||||
}
|
||||
m.ModifiedOn = d
|
||||
}
|
||||
*/
|
||||
|
||||
// Save will save this model to the DB
|
||||
func (m *Model) Save() error {
|
||||
db := database.GetDB()
|
||||
|
Reference in New Issue
Block a user