Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

108 linhas
3.8 KiB

  1. import type { APIRequestContext, Locator, Page } from '@playwright/test';
  2. import { expect, rootStorageStatePath, test } from './fixtures/cluster';
  3. type ModelPricingConfig = {
  4. success: boolean;
  5. data: {
  6. schema_version: number;
  7. scope: string;
  8. dimensions: Array<{ key: string }>;
  9. table: unknown[];
  10. };
  11. };
  12. const modelName = () =>
  13. `e2e-video-pricing-model-${Date.now()}-${Math.floor(Math.random() * 1000)}`;
  14. async function fillControl(locator: Locator, value: string) {
  15. const input = locator.locator('input');
  16. if ((await input.count()) > 0) {
  17. await input.first().fill(value);
  18. return;
  19. }
  20. await locator.fill(value);
  21. }
  22. async function fillByTestId(page: Page, testId: string, value: string) {
  23. await fillControl(page.getByTestId(testId), value);
  24. }
  25. async function fetchModelPricing(
  26. request: APIRequestContext,
  27. model: string,
  28. ): Promise<ModelPricingConfig> {
  29. const response = await request.get(
  30. `/api/option/model_pricing/${encodeURIComponent(model)}`,
  31. );
  32. expect(response.ok()).toBeTruthy();
  33. return (await response.json()) as ModelPricingConfig;
  34. }
  35. test.describe.serial('Model Pricing E2E', () => {
  36. test.use({ storageState: rootStorageStatePath });
  37. test('root can save and reload a generated model pricing config', async ({
  38. page,
  39. request,
  40. }) => {
  41. const model = modelName();
  42. await page.goto('/console/setting?tab=ratio');
  43. await page.getByTestId('model-pricing-tab').click();
  44. await expect(page.getByTestId('model-pricing-page')).toBeVisible();
  45. await page.getByTestId('model-pricing-add-model').click();
  46. await expect(page.getByTestId('model-pricing-editor')).toBeVisible();
  47. await fillByTestId(page, 'model-pricing-model-name', model);
  48. await fillByTestId(page, 'dimension-key-0', 'duration');
  49. await fillByTestId(page, 'dimension-source-path-0', 'duration');
  50. await page.getByTestId('dimension-add').click();
  51. await fillByTestId(page, 'dimension-key-1', 'quality');
  52. await fillByTestId(page, 'dimension-source-path-1', 'quality');
  53. await page.getByTestId('model-pricing-open-generator').click();
  54. await expect(page.getByTestId('model-pricing-generator')).toBeVisible();
  55. await fillByTestId(page, 'generator-base-price', '0.2');
  56. const generator = page.getByTestId('model-pricing-generator');
  57. await generator.locator('input[value="replace_all"]').check({ force: true });
  58. await fillByTestId(page, 'generator-ratio-value-2', '1');
  59. await fillByTestId(page, 'generator-ratio-ratio-2', '1.5');
  60. await expect(page.getByTestId('generator-apply')).toBeEnabled();
  61. await page.getByTestId('generator-apply').click();
  62. const saveResponsePromise = page.waitForResponse(
  63. (response) =>
  64. response.request().method() === 'PUT' &&
  65. response
  66. .url()
  67. .includes(`/api/option/model_pricing/${encodeURIComponent(model)}`),
  68. );
  69. await page.getByTestId('model-pricing-save').click();
  70. const saveResponse = await saveResponsePromise;
  71. expect(saveResponse.ok()).toBeTruthy();
  72. const saveBody = await saveResponse.json();
  73. expect(saveBody.success).toBe(true);
  74. await page.reload();
  75. await page.getByTestId('model-pricing-tab').click();
  76. await expect(page.getByTestId('model-pricing-page')).toBeVisible();
  77. await fillByTestId(page, 'model-pricing-search', model);
  78. await expect(page.getByTestId('model-pricing-table')).toContainText(model);
  79. await page.getByTestId(`model-pricing-edit-${model}`).click();
  80. await expect(page.getByTestId('model-pricing-editor')).toBeVisible();
  81. const data = await fetchModelPricing(request, model);
  82. expect(data.success).toBe(true);
  83. expect(data.data.schema_version).toBe(1);
  84. expect(data.data.scope).toBe('model');
  85. expect(data.data.dimensions.map((dimension) => dimension.key)).toEqual([
  86. 'duration',
  87. 'quality',
  88. ]);
  89. expect(data.data.table.length).toBeGreaterThan(0);
  90. });
  91. });