//go:build unit package handler import ( "encoding/json" "net/http" "net/http/httptest" "testing" "github.com/Wei-Shaw/sub2api/internal/config" "github.com/Wei-Shaw/sub2api/internal/handler/dto" "github.com/Wei-Shaw/sub2api/internal/service" "github.com/gin-gonic/gin" "github.com/stretchr/testify/require" ) func TestSettingHandler_GetPublicSettings_CustomMenuConvergesUntrustedOutput(t *testing.T) { gin.SetMode(gin.TestMode) h := NewSettingHandler(service.NewSettingService(&settingHandlerPublicRepoStub{ values: map[string]string{ service.SettingKeyCustomMenuItems: `[ {"id":"legacy","label":"Legacy","url":"https://shop.example.com/pay","visibility":"user"}, {"id":"unsafe","label":"Unsafe","url":"https://shop.example.com/pay","visibility":"user","omit_auth_context":false}, {"id":"trusted","label":"Trusted","url":"https://app.example.com/internal","visibility":"user"} ]`, }, }, &config.Config{ Server: config.ServerConfig{FrontendURL: "https://app.example.com"}, }), "test-version") recorder := httptest.NewRecorder() c, _ := gin.CreateTestContext(recorder) c.Request = httptest.NewRequest(http.MethodGet, "/api/v1/settings/public", nil) h.GetPublicSettings(c) require.Equal(t, http.StatusOK, recorder.Code) var resp struct { Code int `json:"code"` Data struct { CustomMenuItems []dto.CustomMenuItem `json:"custom_menu_items"` } `json:"data"` } require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &resp)) require.Equal(t, 0, resp.Code) require.Len(t, resp.Data.CustomMenuItems, 3) require.NotNil(t, resp.Data.CustomMenuItems[0].OmitAuthContext) require.True(t, *resp.Data.CustomMenuItems[0].OmitAuthContext) require.NotNil(t, resp.Data.CustomMenuItems[1].OmitAuthContext) require.True(t, *resp.Data.CustomMenuItems[1].OmitAuthContext) require.Nil(t, resp.Data.CustomMenuItems[2].OmitAuthContext) }