technician-mini-app.spec.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { expect, test } from '@playwright/test';
  2. const packageTemplate = {
  3. package_id: 'template-package',
  4. name: '标准到店服务',
  5. category: '通用服务',
  6. description: '顾客到店完成一次标准服务。',
  7. tags: ['到店', '标准服务'],
  8. service_modes: ['at_store'],
  9. price_mode: 'fixed',
  10. currency: 'CNY',
  11. price_unit: 'per_service',
  12. min_price: '200.00',
  13. max_price: '200.00',
  14. duration_minutes: 60,
  15. included_items: '一次标准服务',
  16. excluded_items: '额外耗材',
  17. preparation: '请提前说明需求',
  18. addons: [],
  19. travel_fee: {
  20. mode: 'included',
  21. amount: '0',
  22. per_km: '0',
  23. description: '无额外费用',
  24. },
  25. service_radius_km: null,
  26. out_of_range_policy: '',
  27. source_type: 'template',
  28. };
  29. test.beforeEach(async ({ page }) => {
  30. await page.route('https://telegram.org/js/telegram-web-app.js', (route) =>
  31. route.fulfill({
  32. contentType: 'application/javascript',
  33. body: `
  34. window.Telegram = {
  35. WebApp: {
  36. initData: 'signed-test-init-data',
  37. ready() {},
  38. expand() {},
  39. close() {},
  40. setHeaderColor() {},
  41. setBackgroundColor() {}
  42. }
  43. };
  44. `,
  45. }),
  46. );
  47. await page.route('**/api/technician/v1/**', async (route) => {
  48. const headers = route.request().headers();
  49. expect(headers['x-telegram-bot-id']).toBe('primary');
  50. expect(headers['x-telegram-init-data']).toBe('signed-test-init-data');
  51. const path = new URL(route.request().url()).pathname;
  52. if (path.endsWith('/bootstrap')) {
  53. return route.fulfill({
  54. contentType: 'application/json',
  55. body: JSON.stringify({
  56. data: {
  57. technician: {
  58. user_id: '700',
  59. display_name: '测试技师',
  60. username: 'technician700',
  61. eligibility: { ready: true, issues: [] },
  62. service_profile: null,
  63. },
  64. templates: [
  65. {
  66. template_id: 'builtin_quick_at_store',
  67. version: 1,
  68. name: '快速到店服务',
  69. builtin: true,
  70. package: packageTemplate,
  71. },
  72. ],
  73. limits: { max_packages: 5 },
  74. },
  75. }),
  76. });
  77. }
  78. return route.fulfill({
  79. contentType: 'application/json',
  80. body: JSON.stringify({ data: {} }),
  81. });
  82. });
  83. });
  84. test('技师可从模板快速进入五项发布表单', async ({ page }) => {
  85. await page.goto('/admin/technician?bot_id=primary');
  86. await expect(page.getByRole('heading', { name: '你好,测试技师' })).toBeVisible();
  87. await expect(page.getByRole('button', { name: /快速到店服务/ })).toBeVisible();
  88. await page.getByRole('button', { name: /快速到店服务/ }).click();
  89. await expect(page.getByRole('heading', { name: '发布服务' })).toBeVisible();
  90. await expect(page.getByText('约 30 秒')).toBeVisible();
  91. await expect(page.getByLabel('服务名称')).toHaveValue('标准到店服务');
  92. await expect(page.getByLabel('服务价格')).toHaveValue('CNY 200.00/次');
  93. await expect(page.getByLabel('服务内容')).toHaveValue('顾客到店完成一次标准服务。');
  94. await expect(page.getByLabel('额外费用说明')).toHaveValue('无额外费用');
  95. await expect(page.getByLabel('大概服务区域')).toBeVisible();
  96. await expect(page.getByText('per_service')).toHaveCount(0);
  97. await expect(page.getByRole('button', { name: /直接发布/ })).toBeVisible();
  98. });