mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-30 06:16:37 +08:00
943818f7d4
将 OpenFlare 与平台业务的数据访问从 model 与 apps 直连迁入 repository, model 仅保留实体与无 IO 规则;补充 code-check 架构守卫与开发规范。
103 lines
3.5 KiB
Go
103 lines
3.5 KiB
Go
// Copyright 2026 Arctel.net
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package pages
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"mime/multipart"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strconv"
|
|
"testing"
|
|
|
|
"github.com/Rain-kl/Wavelet/internal/repository"
|
|
|
|
"github.com/Rain-kl/Wavelet/internal/apps/oauth"
|
|
"github.com/Rain-kl/Wavelet/internal/model"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestUploadDeploymentHandlerRecordsCurrentUserActor(t *testing.T) {
|
|
cleanup := setupPagesTestDB(t)
|
|
defer cleanup()
|
|
_, disableStorage := setupPagesStorageMock(t)
|
|
defer disableStorage()
|
|
|
|
project, err := CreateProject(t.Context(), Input{Name: "Actor Upload", Slug: "actor-upload", Enabled: true})
|
|
require.NoError(t, err)
|
|
packageBytes := testPagesZip(t, map[string]string{"index.html": "ok"})
|
|
|
|
var requestBody bytes.Buffer
|
|
writer := multipart.NewWriter(&requestBody)
|
|
part, err := writer.CreateFormFile("package", "site.zip")
|
|
require.NoError(t, err)
|
|
_, err = part.Write(packageBytes)
|
|
require.NoError(t, err)
|
|
require.NoError(t, writer.Close())
|
|
|
|
req := httptest.NewRequest(http.MethodPost, "/api/v1/d/pages/1/deployments/upload", &requestBody)
|
|
req.Header.Set("Content-Type", writer.FormDataContentType())
|
|
recorder := httptest.NewRecorder()
|
|
c, _ := gin.CreateTestContext(recorder)
|
|
c.Request = req
|
|
c.Params = gin.Params{{Key: "id", Value: strconv.FormatUint(uint64(project.ID), 10)}}
|
|
oauth.SetToContext(c, oauth.UserObjKey, &model.User{ID: 42})
|
|
|
|
UploadDeploymentHandler(c)
|
|
assert.Equal(t, http.StatusOK, recorder.Code)
|
|
deployments, err := repository.ListPagesDeployments(t.Context(), project.ID)
|
|
require.NoError(t, err)
|
|
require.Len(t, deployments, 1)
|
|
assert.Equal(t, "user:42", deployments[0].CreatedBy)
|
|
}
|
|
|
|
func TestUploadDeploymentFromURLHandlerRecordsCurrentUserActor(t *testing.T) {
|
|
cleanup := setupPagesTestDB(t)
|
|
defer cleanup()
|
|
_, disableStorage := setupPagesStorageMock(t)
|
|
defer disableStorage()
|
|
|
|
project, err := CreateProject(t.Context(), Input{Name: "Actor URL", Slug: "actor-url", Enabled: true})
|
|
require.NoError(t, err)
|
|
packageBytes := testPagesZip(t, map[string]string{"index.html": "ok"})
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
|
|
w.Header().Set("Content-Type", "application/zip")
|
|
w.Header().Set("Content-Disposition", `attachment; filename="site.zip"`)
|
|
w.WriteHeader(http.StatusOK)
|
|
_, _ = w.Write(packageBytes)
|
|
}))
|
|
defer server.Close()
|
|
|
|
body, err := json.Marshal(UploadFromURLInput{URL: server.URL + "/site.zip"})
|
|
require.NoError(t, err)
|
|
req := httptest.NewRequest(http.MethodPost, "/api/v1/d/pages/1/deployments/upload-from-url", bytes.NewReader(body))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
recorder := httptest.NewRecorder()
|
|
c, _ := gin.CreateTestContext(recorder)
|
|
c.Request = req
|
|
c.Params = gin.Params{{Key: "id", Value: fmt.Sprint(project.ID)}}
|
|
oauth.SetToContext(c, oauth.UserObjKey, &model.User{ID: 77})
|
|
|
|
UploadDeploymentFromURLHandler(c)
|
|
assert.Equal(t, http.StatusOK, recorder.Code, recorder.Body.String())
|
|
deployments, err := repository.ListPagesDeployments(t.Context(), project.ID)
|
|
require.NoError(t, err)
|
|
require.Len(t, deployments, 1)
|
|
assert.Equal(t, "user:77", deployments[0].CreatedBy)
|
|
}
|
|
|
|
func TestCurrentPagesActorRejectsMissingUser(t *testing.T) {
|
|
recorder := httptest.NewRecorder()
|
|
c, _ := gin.CreateTestContext(recorder)
|
|
|
|
actor, ok := currentPagesActor(c)
|
|
assert.False(t, ok)
|
|
assert.Empty(t, actor)
|
|
assert.True(t, c.IsAborted())
|
|
}
|