omx(team): auto-checkpoint worker-5 [5]
This commit is contained in:
@@ -1,10 +1,18 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strconv"
|
||||
"testing"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/glebarez/sqlite"
|
||||
"github.com/heicode/manager/common"
|
||||
"github.com/heicode/manager/model"
|
||||
"github.com/stretchr/testify/require"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func TestNormalizeResourcePayloadAcceptsP1ResourceModel(t *testing.T) {
|
||||
@@ -63,3 +71,73 @@ func TestNormalizeResourceGrantPayloadRequiresAgnetRoleBinding(t *testing.T) {
|
||||
require.Equal(t, []string{"read", "write"}, payload.Scopes)
|
||||
require.Equal(t, "active", payload.Status)
|
||||
}
|
||||
|
||||
func TestResourceHandlersCreateResourceAndGrant(t *testing.T) {
|
||||
originalDB := model.DB
|
||||
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, db.AutoMigrate(&model.Resource{}, &model.ResourceGrant{}))
|
||||
model.DB = db
|
||||
t.Cleanup(func() { model.DB = originalDB })
|
||||
|
||||
resourceBody := []byte(`{
|
||||
"tenant_id":"tenant-a",
|
||||
"project_id":"project-a",
|
||||
"name":"repo",
|
||||
"type":"git",
|
||||
"target":"https://github.com/example/repo",
|
||||
"metadata":{"repo_url":"https://github.com/example/repo","ref":"main"},
|
||||
"scopes":["read","write"],
|
||||
"constraints":{"allowed_paths":["."]},
|
||||
"secret_ref":"vault://tenant-a/git/repo"
|
||||
}`)
|
||||
resourceRecorder := callResourceHandler(t, http.MethodPost, "/api/resources/", resourceBody, CreateResource)
|
||||
var resourceEnvelope struct {
|
||||
Success bool `json:"success"`
|
||||
Data struct {
|
||||
Id int `json:"id"`
|
||||
SecretRef string `json:"secret_ref"`
|
||||
Scopes []string `json:"scopes"`
|
||||
} `json:"data"`
|
||||
}
|
||||
require.NoError(t, common.Unmarshal(resourceRecorder.Body.Bytes(), &resourceEnvelope))
|
||||
require.True(t, resourceEnvelope.Success)
|
||||
require.NotZero(t, resourceEnvelope.Data.Id)
|
||||
require.Equal(t, "vault://tenant-a/git/repo", resourceEnvelope.Data.SecretRef)
|
||||
require.Equal(t, []string{"read", "write"}, resourceEnvelope.Data.Scopes)
|
||||
|
||||
grantBody := []byte(`{
|
||||
"tenant_id":"tenant-a",
|
||||
"project_id":"project-a",
|
||||
"resource_id":` + strconv.Itoa(resourceEnvelope.Data.Id) + `,
|
||||
"agnet_id":"builder-1",
|
||||
"role":"developer",
|
||||
"scopes":["read"]
|
||||
}`)
|
||||
grantRecorder := callResourceHandler(t, http.MethodPost, "/api/resource-grants/", grantBody, CreateResourceGrant)
|
||||
var grantEnvelope struct {
|
||||
Success bool `json:"success"`
|
||||
Data struct {
|
||||
ResourceId int `json:"resource_id"`
|
||||
AgnetId string `json:"agnet_id"`
|
||||
Role string `json:"role"`
|
||||
} `json:"data"`
|
||||
}
|
||||
require.NoError(t, common.Unmarshal(grantRecorder.Body.Bytes(), &grantEnvelope))
|
||||
require.True(t, grantEnvelope.Success)
|
||||
require.Equal(t, resourceEnvelope.Data.Id, grantEnvelope.Data.ResourceId)
|
||||
require.Equal(t, "builder-1", grantEnvelope.Data.AgnetId)
|
||||
require.Equal(t, "developer", grantEnvelope.Data.Role)
|
||||
}
|
||||
|
||||
func callResourceHandler(t *testing.T, method string, target string, body []byte, handler gin.HandlerFunc) *httptest.ResponseRecorder {
|
||||
t.Helper()
|
||||
gin.SetMode(gin.TestMode)
|
||||
recorder := httptest.NewRecorder()
|
||||
ctx, _ := gin.CreateTestContext(recorder)
|
||||
ctx.Request = httptest.NewRequest(method, target, bytes.NewReader(body))
|
||||
ctx.Request.Header.Set("Content-Type", "application/json")
|
||||
ctx.Set("id", 7)
|
||||
handler(ctx)
|
||||
return recorder
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user