您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

97 行
3.5 KiB

  1. package controller
  2. import (
  3. "net/http"
  4. "testing"
  5. "github.com/QuantumNous/new-api/common"
  6. "github.com/QuantumNous/new-api/model"
  7. "github.com/QuantumNous/new-api/setting/ratio_setting"
  8. "github.com/QuantumNous/new-api/types"
  9. "github.com/gin-gonic/gin"
  10. "github.com/glebarez/sqlite"
  11. "github.com/stretchr/testify/require"
  12. "gorm.io/gorm"
  13. )
  14. func setupModelDisplayPricingControllerTest(t *testing.T) *gin.Engine {
  15. t.Helper()
  16. gin.SetMode(gin.TestMode)
  17. db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
  18. require.NoError(t, err)
  19. require.NoError(t, db.AutoMigrate(&model.Option{}))
  20. sqlDB, err := db.DB()
  21. require.NoError(t, err)
  22. sqlDB.SetMaxOpenConns(1)
  23. origDB := model.DB
  24. origUsingSQLite := common.UsingSQLite
  25. origRedisEnabled := common.RedisEnabled
  26. model.DB = db
  27. common.UsingSQLite = true
  28. common.RedisEnabled = false
  29. model.InitOptionMap()
  30. require.NoError(t, ratio_setting.UpdateModelDisplayPricingByJSONString(`{}`))
  31. t.Cleanup(func() {
  32. model.DB = origDB
  33. common.UsingSQLite = origUsingSQLite
  34. common.RedisEnabled = origRedisEnabled
  35. require.NoError(t, ratio_setting.UpdateModelDisplayPricingByJSONString(`{}`))
  36. require.NoError(t, sqlDB.Close())
  37. })
  38. r := gin.New()
  39. r.GET("/api/option/model_display_pricing", GetModelDisplayPricingRules)
  40. r.GET("/api/option/model_display_pricing/*model", GetModelDisplayPricingRule)
  41. r.PUT("/api/option/model_display_pricing/*model", UpdateModelDisplayPricingRule)
  42. r.DELETE("/api/option/model_display_pricing/*model", DeleteModelDisplayPricingRule)
  43. return r
  44. }
  45. func TestModelDisplayPricingControllerCRUDAndWildcard(t *testing.T) {
  46. r := setupModelDisplayPricingControllerTest(t)
  47. items := []types.ModelDisplayPricingItem{
  48. {Specification: "768p-6s", OfficialSupplierTip: "768P 6s", Price: 0.33333, Unit: "second", SortOrder: 1},
  49. }
  50. w := performJSONRequest(t, r, http.MethodPut, "/api/option/model_display_pricing/provider/kling-video", items)
  51. require.Equal(t, http.StatusOK, w.Code)
  52. require.Len(t, ratio_setting.GetModelDisplayPricing("provider/kling-video"), 1)
  53. w = performJSONRequest(t, r, http.MethodGet, "/api/option/model_display_pricing/provider/kling-video", nil)
  54. require.Equal(t, http.StatusOK, w.Code)
  55. require.Contains(t, w.Body.String(), "768p-6s")
  56. w = performJSONRequest(t, r, http.MethodGet, "/api/option/model_display_pricing", nil)
  57. require.Equal(t, http.StatusOK, w.Code)
  58. require.Contains(t, w.Body.String(), "provider/kling-video")
  59. w = performJSONRequest(t, r, http.MethodDelete, "/api/option/model_display_pricing/provider/kling-video", nil)
  60. require.Equal(t, http.StatusOK, w.Code)
  61. require.Empty(t, ratio_setting.GetModelDisplayPricing("provider/kling-video"))
  62. }
  63. func TestModelDisplayPricingControllerValidationError(t *testing.T) {
  64. r := setupModelDisplayPricingControllerTest(t)
  65. items := []types.ModelDisplayPricingItem{{Specification: "", Price: 1, Unit: "second"}}
  66. w := performJSONRequest(t, r, http.MethodPut, "/api/option/model_display_pricing/kling-video", items)
  67. require.Equal(t, http.StatusBadRequest, w.Code)
  68. require.Contains(t, w.Body.String(), "specification is required")
  69. }
  70. func TestModelDisplayPricingOptionMapHydratesCache(t *testing.T) {
  71. r := setupModelDisplayPricingControllerTest(t)
  72. require.NotNil(t, r)
  73. require.NoError(t, model.UpdateOption(ratio_setting.ModelDisplayPricingOptionKey, `{
  74. "kling-video":[{"specification":"768p","price":1,"unit":"second"}]
  75. }`))
  76. items := ratio_setting.GetModelDisplayPricing("kling-video")
  77. require.Len(t, items, 1)
  78. require.Equal(t, "768p", items[0].Specification)
  79. }