You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

468 regels
19 KiB

  1. package service
  2. import (
  3. "context"
  4. "errors"
  5. "net/http"
  6. "testing"
  7. "time"
  8. "github.com/QuantumNous/new-api/model"
  9. "github.com/glebarez/sqlite"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/stretchr/testify/require"
  12. cmerrs "gitlab.ecloud.com/ecloud/ecloudsdkcore/errs"
  13. cmmodel "gitlab.ecloud.com/ecloud/ecloudsdkmaas/model"
  14. "gorm.io/gorm"
  15. "gorm.io/gorm/logger"
  16. )
  17. func TestChinaMobileAssetAdapterCreateAssetMapsRequestAndResponse(t *testing.T) {
  18. setChinaMobileAssetTestEnv(t, "")
  19. fake := &fakeChinaMobileAssetSDKClient{}
  20. adapter := &ChinaMobileAssetAdapter{newClient: func(credential chinaMobileAssetCredential) chinaMobileAssetSDKClient {
  21. assert.Equal(t, "ak", credential.AK)
  22. assert.Equal(t, "sk", credential.SK)
  23. assert.Equal(t, defaultChinaMobileAssetPoolID, credential.PoolID)
  24. return fake
  25. }}
  26. spec, ok := ParseAssetAction("CreateAsset")
  27. require.True(t, ok)
  28. resp, assetErr := adapter.DoAssetRequest(context.Background(), &model.Channel{Key: "video-generation-key"}, AssetRequest{
  29. Action: spec,
  30. Version: "2024-01-01",
  31. Body: map[string]any{
  32. "GroupId": "group-1",
  33. "Name": "asset",
  34. "URL": "https://example.com/a.png",
  35. "AssetType": "Image",
  36. },
  37. })
  38. require.Nil(t, assetErr)
  39. require.NotNil(t, resp)
  40. require.NotNil(t, fake.createAssetRequest)
  41. assert.Equal(t, "group-1", *fake.createAssetRequest.CreateAssetBody.GroupId)
  42. assert.Equal(t, "asset", *fake.createAssetRequest.CreateAssetBody.AssetName)
  43. assert.Equal(t, "https://example.com/a.png", *fake.createAssetRequest.CreateAssetBody.AssetUrl)
  44. assert.Equal(t, cmmodel.CreateAssetBodyAssetTypeEnumImage, *fake.createAssetRequest.CreateAssetBody.AssetType)
  45. assert.Contains(t, string(resp.Body), `"RequestId":"req-1"`)
  46. assert.Contains(t, string(resp.Body), `"Result":"asset-1"`)
  47. }
  48. func TestChinaMobileAssetCredentialFromChannelDefaultsCenterPool(t *testing.T) {
  49. setChinaMobileAssetTestEnv(t, "")
  50. credential, err := chinaMobileAssetCredentialFromChannel(&model.Channel{})
  51. require.NoError(t, err)
  52. assert.Equal(t, "ak", credential.AK)
  53. assert.Equal(t, "sk", credential.SK)
  54. assert.Equal(t, defaultChinaMobileAssetPoolID, credential.PoolID)
  55. }
  56. func TestChinaMobileAssetCredentialFromChannelSupportsPoolID(t *testing.T) {
  57. setChinaMobileAssetTestEnv(t, "CIDC-RP-29")
  58. credential, err := chinaMobileAssetCredentialFromChannel(&model.Channel{})
  59. require.NoError(t, err)
  60. assert.Equal(t, "ak", credential.AK)
  61. assert.Equal(t, "sk", credential.SK)
  62. assert.Equal(t, "CIDC-RP-29", credential.PoolID)
  63. }
  64. func TestChinaMobileAssetCredentialFromChannelRequiresCredential(t *testing.T) {
  65. setupChinaMobileAssetTestDB(t)
  66. t.Setenv(chinaMobileAssetAKEnv, "")
  67. t.Setenv(chinaMobileAssetSKEnv, "")
  68. t.Setenv(chinaMobileAssetPoolIDEnv, "")
  69. _, err := chinaMobileAssetCredentialFromChannel(&model.Channel{Id: 99})
  70. require.Error(t, err)
  71. assert.Contains(t, err.Error(), "未配置素材凭证")
  72. }
  73. func TestChinaMobileAssetCredentialFromChannelFallsBackToLegacyEnvironment(t *testing.T) {
  74. setupChinaMobileAssetTestDB(t)
  75. t.Setenv(chinaMobileAssetAKEnv, "legacy-ak")
  76. t.Setenv(chinaMobileAssetSKEnv, "legacy-sk")
  77. t.Setenv(chinaMobileAssetPoolIDEnv, "legacy-pool")
  78. credential, err := chinaMobileAssetCredentialFromChannel(&model.Channel{Id: 99})
  79. require.NoError(t, err)
  80. assert.Equal(t, "legacy-ak", credential.AK)
  81. assert.Equal(t, "legacy-sk", credential.SK)
  82. assert.Equal(t, "legacy-pool", credential.PoolID)
  83. }
  84. func TestChinaMobileAssetCredentialFromChannelPrefersChannelCredentialOverLegacyEnvironment(t *testing.T) {
  85. setupChinaMobileAssetTestDB(t)
  86. require.NoError(t, model.UpsertChannelAssetCredential(&model.ChannelAssetCredential{
  87. ChannelId: 99,
  88. AccessKey: "channel-ak",
  89. SecretKey: "channel-sk",
  90. PoolID: "channel-pool",
  91. }))
  92. t.Setenv(chinaMobileAssetAKEnv, "legacy-ak")
  93. t.Setenv(chinaMobileAssetSKEnv, "legacy-sk")
  94. t.Setenv(chinaMobileAssetPoolIDEnv, "legacy-pool")
  95. credential, err := chinaMobileAssetCredentialFromChannel(&model.Channel{Id: 99})
  96. require.NoError(t, err)
  97. assert.Equal(t, "channel-ak", credential.AK)
  98. assert.Equal(t, "channel-sk", credential.SK)
  99. assert.Equal(t, "channel-pool", credential.PoolID)
  100. }
  101. func TestChinaMobileAssetAdapterReturnsBadRequestWhenCredentialIsMissing(t *testing.T) {
  102. setupChinaMobileAssetTestDB(t)
  103. adapter := &ChinaMobileAssetAdapter{newClient: func(credential chinaMobileAssetCredential) chinaMobileAssetSDKClient {
  104. return &fakeChinaMobileAssetSDKClient{}
  105. }}
  106. spec, ok := ParseAssetAction("CreateAsset")
  107. require.True(t, ok)
  108. _, assetErr := adapter.DoAssetRequest(context.Background(), &model.Channel{Id: 61}, AssetRequest{Action: spec, Body: validChinaMobileCreateAssetBody()})
  109. require.NotNil(t, assetErr)
  110. assert.Equal(t, AssetErrorInvalidRequest, assetErr.Type)
  111. assert.Equal(t, http.StatusBadRequest, assetErr.HTTPStatus)
  112. assert.Contains(t, assetErr.Message, "未配置素材凭证")
  113. }
  114. func TestChinaMobileAssetAdapterAllOfficialActions(t *testing.T) {
  115. cases := []struct {
  116. action string
  117. body map[string]any
  118. assert func(t *testing.T, fake *fakeChinaMobileAssetSDKClient)
  119. }{
  120. {"CreateAssetGroup", map[string]any{"Name": "g", "GroupType": "AIGC"}, func(t *testing.T, fake *fakeChinaMobileAssetSDKClient) {
  121. require.NotNil(t, fake.createAssetGroupRequest)
  122. }},
  123. {"CreateAsset", map[string]any{"GroupId": "g", "Name": "n", "URL": "https://example.com/a.png", "AssetType": "Image"}, func(t *testing.T, fake *fakeChinaMobileAssetSDKClient) { require.NotNil(t, fake.createAssetRequest) }},
  124. {"ListAssetGroups", map[string]any{"Filter": map[string]any{"GroupType": "AIGC"}, "PageNumber": float64(1), "PageSize": float64(10)}, func(t *testing.T, fake *fakeChinaMobileAssetSDKClient) {
  125. require.NotNil(t, fake.listAssetGroupsRequest)
  126. }},
  127. {"ListAssets", map[string]any{"Filter": map[string]any{"GroupType": "AIGC"}, "PageNumber": float64(1), "PageSize": float64(10)}, func(t *testing.T, fake *fakeChinaMobileAssetSDKClient) { require.NotNil(t, fake.listAssetsRequest) }},
  128. {"GetAsset", map[string]any{"Id": "asset-1"}, func(t *testing.T, fake *fakeChinaMobileAssetSDKClient) {
  129. require.NotNil(t, fake.getAssetRequest)
  130. assert.Equal(t, "asset-1", *fake.getAssetRequest.GetAssetPath.AssetId)
  131. }},
  132. {"GetAssetGroup", map[string]any{"Id": "group-1"}, func(t *testing.T, fake *fakeChinaMobileAssetSDKClient) {
  133. require.NotNil(t, fake.getAssetGroupRequest)
  134. assert.Equal(t, "group-1", *fake.getAssetGroupRequest.GetAssetGroupPath.GroupId)
  135. }},
  136. {"UpdateAsset", map[string]any{"Id": "asset-1", "Name": "n"}, func(t *testing.T, fake *fakeChinaMobileAssetSDKClient) { require.NotNil(t, fake.updateAssetRequest) }},
  137. {"UpdateAssetGroup", map[string]any{"Id": "group-1", "Name": "g"}, func(t *testing.T, fake *fakeChinaMobileAssetSDKClient) {
  138. require.NotNil(t, fake.updateAssetGroupRequest)
  139. }},
  140. {"DeleteAsset", map[string]any{"Id": "asset-1"}, func(t *testing.T, fake *fakeChinaMobileAssetSDKClient) { require.NotNil(t, fake.deleteAssetRequest) }},
  141. {"DeleteAssetGroup", map[string]any{"Id": "group-1"}, func(t *testing.T, fake *fakeChinaMobileAssetSDKClient) {
  142. require.NotNil(t, fake.deleteAssetGroupRequest)
  143. }},
  144. }
  145. for _, tc := range cases {
  146. t.Run(tc.action, func(t *testing.T) {
  147. setChinaMobileAssetTestEnv(t, "")
  148. fake := &fakeChinaMobileAssetSDKClient{}
  149. adapter := &ChinaMobileAssetAdapter{newClient: func(credential chinaMobileAssetCredential) chinaMobileAssetSDKClient {
  150. return fake
  151. }}
  152. spec, ok := ParseAssetAction(tc.action)
  153. require.True(t, ok)
  154. resp, assetErr := adapter.DoAssetRequest(context.Background(), &model.Channel{Key: "video-generation-key"}, AssetRequest{
  155. Action: spec,
  156. Version: "2024-01-01",
  157. Body: tc.body,
  158. })
  159. require.Nil(t, assetErr)
  160. require.NotNil(t, resp)
  161. tc.assert(t, fake)
  162. assert.Contains(t, string(resp.Body), `"ResponseMetadata"`)
  163. })
  164. }
  165. }
  166. func TestChinaMobileAssetAdapterRejectsUnsupportedCompatibilityOptions(t *testing.T) {
  167. setChinaMobileAssetTestEnv(t, "")
  168. adapter := &ChinaMobileAssetAdapter{newClient: func(credential chinaMobileAssetCredential) chinaMobileAssetSDKClient {
  169. return &fakeChinaMobileAssetSDKClient{}
  170. }}
  171. spec, ok := ParseAssetAction("ListAssets")
  172. require.True(t, ok)
  173. cases := []map[string]any{
  174. {"ProjectName": "prod"},
  175. {"SortBy": "Name"},
  176. {"SortOrder": "Asc"},
  177. }
  178. for _, body := range cases {
  179. _, assetErr := adapter.DoAssetRequest(context.Background(), &model.Channel{Key: "cm-key"}, AssetRequest{
  180. Action: spec,
  181. Body: body,
  182. })
  183. require.NotNil(t, assetErr)
  184. assert.Equal(t, AssetErrorOperationNotSupported, assetErr.Type)
  185. }
  186. }
  187. func TestChinaMobileAssetAdapterMissingIdReturnsInvalidRequest(t *testing.T) {
  188. setChinaMobileAssetTestEnv(t, "")
  189. adapter := &ChinaMobileAssetAdapter{newClient: func(credential chinaMobileAssetCredential) chinaMobileAssetSDKClient {
  190. return &fakeChinaMobileAssetSDKClient{}
  191. }}
  192. spec, ok := ParseAssetAction("GetAsset")
  193. require.True(t, ok)
  194. _, assetErr := adapter.DoAssetRequest(context.Background(), &model.Channel{Key: "video-generation-key"}, AssetRequest{
  195. Action: spec,
  196. Body: map[string]any{},
  197. })
  198. require.NotNil(t, assetErr)
  199. assert.Equal(t, AssetErrorInvalidRequest, assetErr.Type)
  200. assert.Contains(t, assetErr.Message, "Id is required")
  201. }
  202. func TestChinaMobileAssetAdapterStateErrorMapsToUpstreamError(t *testing.T) {
  203. _, assetErr := normalizeChinaMobileAssetResponse(AssetActionSpec{Action: "CreateAsset", Operation: AssetOperationAssetCreate}, "2024-01-01", []byte(`{"requestId":"req","state":"ERROR","errorCode":"Bad","errorMessage":"bad request"}`))
  204. require.NotNil(t, assetErr)
  205. assert.Equal(t, AssetErrorUpstream, assetErr.Type)
  206. assert.Equal(t, "bad request", assetErr.Message)
  207. }
  208. func TestChinaMobileAssetAdapterRequiresGroupTypeForListAssets(t *testing.T) {
  209. setChinaMobileAssetTestEnv(t, "")
  210. adapter := &ChinaMobileAssetAdapter{newClient: func(credential chinaMobileAssetCredential) chinaMobileAssetSDKClient {
  211. return &fakeChinaMobileAssetSDKClient{}
  212. }}
  213. spec, ok := ParseAssetAction("ListAssets")
  214. require.True(t, ok)
  215. _, assetErr := adapter.DoAssetRequest(context.Background(), &model.Channel{Key: "video-generation-key"}, AssetRequest{
  216. Action: spec,
  217. Body: map[string]any{"PageNumber": 1, "PageSize": 10},
  218. })
  219. require.NotNil(t, assetErr)
  220. assert.Equal(t, AssetErrorInvalidRequest, assetErr.Type)
  221. assert.Equal(t, http.StatusBadRequest, assetErr.HTTPStatus)
  222. }
  223. func TestChinaMobileAssetDeleteFalseMapsToUpstreamError(t *testing.T) {
  224. _, assetErr := normalizeChinaMobileAssetResponse(AssetActionSpec{Action: "DeleteAsset", Operation: AssetOperationAssetDelete, Delete: true}, "2024-01-01", []byte(`{"requestId":"req","state":"OK","body":false}`))
  225. require.NotNil(t, assetErr)
  226. assert.Equal(t, AssetErrorUpstream, assetErr.Type)
  227. }
  228. func TestChinaMobileAssetUnknownStateMapsToUpstreamError(t *testing.T) {
  229. _, assetErr := normalizeChinaMobileAssetResponse(AssetActionSpec{Action: "CreateAsset", Operation: AssetOperationAssetCreate}, "2024-01-01", []byte(`{"requestId":"req","state":"","body":"asset-1"}`))
  230. require.NotNil(t, assetErr)
  231. assert.Equal(t, AssetErrorUpstream, assetErr.Type)
  232. }
  233. func TestChinaMobileAssetSDKBadRequestMapsToInvalidRequest(t *testing.T) {
  234. setChinaMobileAssetTestEnv(t, "")
  235. adapter := &ChinaMobileAssetAdapter{newClient: func(credential chinaMobileAssetCredential) chinaMobileAssetSDKClient {
  236. return &errorChinaMobileAssetSDKClient{
  237. fakeChinaMobileAssetSDKClient: fakeChinaMobileAssetSDKClient{},
  238. err: cmerrs.NewServerResponseError("bad request", nil, http.StatusBadRequest, nil, `{"errorMessage":"invalid asset"}`),
  239. }
  240. }}
  241. spec, ok := ParseAssetAction("CreateAsset")
  242. require.True(t, ok)
  243. _, assetErr := adapter.DoAssetRequest(context.Background(), &model.Channel{Key: "video-generation-key"}, AssetRequest{Action: spec, Body: validChinaMobileCreateAssetBody()})
  244. require.NotNil(t, assetErr)
  245. assert.Equal(t, AssetErrorInvalidRequest, assetErr.Type)
  246. assert.Equal(t, http.StatusBadRequest, assetErr.HTTPStatus)
  247. }
  248. func TestChinaMobileAssetSDKServerErrorRemainsUpstreamError(t *testing.T) {
  249. setChinaMobileAssetTestEnv(t, "")
  250. adapter := &ChinaMobileAssetAdapter{newClient: func(credential chinaMobileAssetCredential) chinaMobileAssetSDKClient {
  251. return &errorChinaMobileAssetSDKClient{
  252. fakeChinaMobileAssetSDKClient: fakeChinaMobileAssetSDKClient{},
  253. err: cmerrs.NewServerResponseError("server error", nil, http.StatusInternalServerError, nil, ""),
  254. }
  255. }}
  256. spec, ok := ParseAssetAction("CreateAsset")
  257. require.True(t, ok)
  258. _, assetErr := adapter.DoAssetRequest(context.Background(), &model.Channel{Key: "video-generation-key"}, AssetRequest{Action: spec, Body: validChinaMobileCreateAssetBody()})
  259. require.NotNil(t, assetErr)
  260. assert.Equal(t, AssetErrorUpstream, assetErr.Type)
  261. assert.Equal(t, http.StatusBadGateway, assetErr.HTTPStatus)
  262. }
  263. func TestCallChinaMobileAssetSDKReturnsWhenContextCancelled(t *testing.T) {
  264. client := &blockingChinaMobileAssetSDKClient{fakeChinaMobileAssetSDKClient: fakeChinaMobileAssetSDKClient{}, release: make(chan struct{})}
  265. ctx, cancel := context.WithCancel(context.Background())
  266. cancel()
  267. spec, ok := ParseAssetAction("CreateAsset")
  268. require.True(t, ok)
  269. started := time.Now()
  270. _, err := callChinaMobileAssetSDK(ctx, client, AssetRequest{Action: spec, Body: validChinaMobileCreateAssetBody()})
  271. require.ErrorIs(t, err, context.Canceled)
  272. assert.Less(t, time.Since(started), 500*time.Millisecond)
  273. close(client.release)
  274. }
  275. func setChinaMobileAssetTestEnv(t *testing.T, poolID string) {
  276. t.Helper()
  277. setupChinaMobileAssetTestDB(t)
  278. require.NoError(t, model.UpsertChannelAssetCredential(&model.ChannelAssetCredential{
  279. ChannelId: 0,
  280. AccessKey: "ak",
  281. SecretKey: "sk",
  282. PoolID: poolID,
  283. }))
  284. }
  285. func setupChinaMobileAssetTestDB(t *testing.T) *gorm.DB {
  286. t.Helper()
  287. db, err := gorm.Open(sqlite.Open("file:service_chinamobile_asset?mode=memory&cache=shared"), &gorm.Config{
  288. Logger: logger.Default.LogMode(logger.Silent),
  289. })
  290. require.NoError(t, err)
  291. sqlDB, err := db.DB()
  292. require.NoError(t, err)
  293. sqlDB.SetMaxOpenConns(1)
  294. originalDB := model.DB
  295. model.DB = db
  296. require.NoError(t, db.AutoMigrate(&model.ChannelAssetCredential{}))
  297. t.Cleanup(func() {
  298. model.DB = originalDB
  299. require.NoError(t, sqlDB.Close())
  300. })
  301. return db
  302. }
  303. type blockingChinaMobileAssetSDKClient struct {
  304. fakeChinaMobileAssetSDKClient
  305. release chan struct{}
  306. }
  307. type errorChinaMobileAssetSDKClient struct {
  308. fakeChinaMobileAssetSDKClient
  309. err error
  310. }
  311. func (f *errorChinaMobileAssetSDKClient) CreateAsset(request *cmmodel.CreateAssetRequest) (*cmmodel.CreateAssetResponse, error) {
  312. if f.err == nil {
  313. return nil, errors.New("missing test error")
  314. }
  315. return nil, f.err
  316. }
  317. func (f *blockingChinaMobileAssetSDKClient) CreateAsset(request *cmmodel.CreateAssetRequest) (*cmmodel.CreateAssetResponse, error) {
  318. <-f.release
  319. return f.fakeChinaMobileAssetSDKClient.CreateAsset(request)
  320. }
  321. func validChinaMobileCreateAssetBody() map[string]any {
  322. return map[string]any{
  323. "GroupId": "group-1",
  324. "Name": "asset",
  325. "URL": "https://example.com/asset.png",
  326. "AssetType": "Image",
  327. }
  328. }
  329. type fakeChinaMobileAssetSDKClient struct {
  330. createAssetRequest *cmmodel.CreateAssetRequest
  331. listAssetsRequest *cmmodel.ListAssetsRequest
  332. getAssetRequest *cmmodel.GetAssetRequest
  333. updateAssetRequest *cmmodel.UpdateAssetRequest
  334. deleteAssetRequest *cmmodel.DeleteAssetRequest
  335. createAssetGroupRequest *cmmodel.CreateAssetGroupRequest
  336. listAssetGroupsRequest *cmmodel.ListAssetGroupsRequest
  337. getAssetGroupRequest *cmmodel.GetAssetGroupRequest
  338. updateAssetGroupRequest *cmmodel.UpdateAssetGroupRequest
  339. deleteAssetGroupRequest *cmmodel.DeleteAssetGroupRequest
  340. }
  341. func (f *fakeChinaMobileAssetSDKClient) CreateAsset(request *cmmodel.CreateAssetRequest) (*cmmodel.CreateAssetResponse, error) {
  342. f.createAssetRequest = request
  343. return (&cmmodel.CreateAssetResponse{}).SetRequestId("req-1").SetState("OK").SetBody("asset-1"), nil
  344. }
  345. func (f *fakeChinaMobileAssetSDKClient) ListAssets(request *cmmodel.ListAssetsRequest) (*cmmodel.ListAssetsResponse, error) {
  346. f.listAssetsRequest = request
  347. item := cmmodel.ListAssetsResponseData{}
  348. item.SetAssetId("asset-1").SetGroupId("group-1").SetAssetName("n").SetStatus(cmmodel.ListAssetsResponseDataStatusEnumActive)
  349. body := (&cmmodel.ListAssetsResponseBody{}).SetData([]cmmodel.ListAssetsResponseData{item}).SetTotal(1)
  350. return (&cmmodel.ListAssetsResponse{}).SetRequestId("req").SetState("OK").SetBody(body), nil
  351. }
  352. func (f *fakeChinaMobileAssetSDKClient) GetAsset(request *cmmodel.GetAssetRequest) (*cmmodel.GetAssetResponse, error) {
  353. f.getAssetRequest = request
  354. body := (&cmmodel.GetAssetResponseBody{}).SetAssetId("asset-1").SetGroupId("group-1").SetAssetName("n").SetStatus(cmmodel.GetAssetResponseBodyStatusEnumActive)
  355. return (&cmmodel.GetAssetResponse{}).SetRequestId("req").SetState("OK").SetBody(body), nil
  356. }
  357. func (f *fakeChinaMobileAssetSDKClient) UpdateAsset(request *cmmodel.UpdateAssetRequest) (*cmmodel.UpdateAssetResponse, error) {
  358. f.updateAssetRequest = request
  359. body := (&cmmodel.UpdateAssetResponseBody{}).SetAssetId("asset-1").SetGroupId("group-1").SetAssetName("n").SetStatus(cmmodel.UpdateAssetResponseBodyStatusEnumActive)
  360. return (&cmmodel.UpdateAssetResponse{}).SetRequestId("req").SetState("OK").SetBody(body), nil
  361. }
  362. func (f *fakeChinaMobileAssetSDKClient) DeleteAsset(request *cmmodel.DeleteAssetRequest) (*cmmodel.DeleteAssetResponse, error) {
  363. f.deleteAssetRequest = request
  364. return (&cmmodel.DeleteAssetResponse{}).SetRequestId("req").SetState("OK").SetBody(true), nil
  365. }
  366. func (f *fakeChinaMobileAssetSDKClient) CreateAssetGroup(request *cmmodel.CreateAssetGroupRequest) (*cmmodel.CreateAssetGroupResponse, error) {
  367. f.createAssetGroupRequest = request
  368. body := (&cmmodel.CreateAssetGroupResponseBody{}).SetGroupId("group-1").SetGroupName("g").SetGroupType(cmmodel.CreateAssetGroupResponseBodyGroupTypeEnumAigc)
  369. return (&cmmodel.CreateAssetGroupResponse{}).SetRequestId("req").SetState("OK").SetBody(body), nil
  370. }
  371. func (f *fakeChinaMobileAssetSDKClient) ListAssetGroups(request *cmmodel.ListAssetGroupsRequest) (*cmmodel.ListAssetGroupsResponse, error) {
  372. f.listAssetGroupsRequest = request
  373. item := cmmodel.ListAssetGroupsResponseData{}
  374. item.SetGroupId("group-1").SetGroupName("g").SetGroupType(cmmodel.ListAssetGroupsResponseDataGroupTypeEnumAigc)
  375. body := (&cmmodel.ListAssetGroupsResponseBody{}).SetData([]cmmodel.ListAssetGroupsResponseData{item}).SetTotal(1)
  376. return (&cmmodel.ListAssetGroupsResponse{}).SetRequestId("req").SetState("OK").SetBody(body), nil
  377. }
  378. func (f *fakeChinaMobileAssetSDKClient) GetAssetGroup(request *cmmodel.GetAssetGroupRequest) (*cmmodel.GetAssetGroupResponse, error) {
  379. f.getAssetGroupRequest = request
  380. body := (&cmmodel.GetAssetGroupResponseBody{}).SetGroupId("group-1").SetGroupName("g").SetGroupType(cmmodel.GetAssetGroupResponseBodyGroupTypeEnumAigc)
  381. return (&cmmodel.GetAssetGroupResponse{}).SetRequestId("req").SetState("OK").SetBody(body), nil
  382. }
  383. func (f *fakeChinaMobileAssetSDKClient) UpdateAssetGroup(request *cmmodel.UpdateAssetGroupRequest) (*cmmodel.UpdateAssetGroupResponse, error) {
  384. f.updateAssetGroupRequest = request
  385. body := (&cmmodel.UpdateAssetGroupResponseBody{}).SetGroupId("group-1").SetGroupName("g").SetGroupType(cmmodel.UpdateAssetGroupResponseBodyGroupTypeEnumAigc)
  386. return (&cmmodel.UpdateAssetGroupResponse{}).SetRequestId("req").SetState("OK").SetBody(body), nil
  387. }
  388. func (f *fakeChinaMobileAssetSDKClient) DeleteAssetGroup(request *cmmodel.DeleteAssetGroupRequest) (*cmmodel.DeleteAssetGroupResponse, error) {
  389. f.deleteAssetGroupRequest = request
  390. return (&cmmodel.DeleteAssetGroupResponse{}).SetRequestId("req").SetState("OK").SetBody(true), nil
  391. }