technician-mini-app.spec.ts 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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: { mode: 'included', amount: '0', per_km: '0' },
  20. service_radius_km: null,
  21. out_of_range_policy: '',
  22. source_type: 'template',
  23. };
  24. test.beforeEach(async ({ page }) => {
  25. await page.route('https://telegram.org/js/telegram-web-app.js', (route) =>
  26. route.fulfill({
  27. contentType: 'application/javascript',
  28. body: `
  29. window.Telegram = {
  30. WebApp: {
  31. initData: 'signed-test-init-data',
  32. ready() {},
  33. expand() {},
  34. close() {},
  35. setHeaderColor() {},
  36. setBackgroundColor() {}
  37. }
  38. };
  39. `,
  40. }),
  41. );
  42. await page.route('**/api/technician/v1/**', async (route) => {
  43. const headers = route.request().headers();
  44. expect(headers['x-telegram-bot-id']).toBe('primary');
  45. expect(headers['x-telegram-init-data']).toBe('signed-test-init-data');
  46. const path = new URL(route.request().url()).pathname;
  47. if (path.endsWith('/bootstrap')) {
  48. return route.fulfill({
  49. contentType: 'application/json',
  50. body: JSON.stringify({
  51. data: {
  52. technician: {
  53. user_id: '700',
  54. display_name: '测试技师',
  55. username: 'technician700',
  56. eligibility: { ready: true, issues: [] },
  57. service_profile: null,
  58. },
  59. templates: [
  60. {
  61. template_id: 'builtin_quick_at_store',
  62. version: 1,
  63. name: '快速到店服务',
  64. builtin: true,
  65. package: packageTemplate,
  66. },
  67. ],
  68. limits: { max_packages: 5 },
  69. },
  70. }),
  71. });
  72. }
  73. return route.fulfill({
  74. contentType: 'application/json',
  75. body: JSON.stringify({ data: {} }),
  76. });
  77. });
  78. });
  79. test('技师可从模板快速进入一分钟发布表单', async ({ page }) => {
  80. await page.goto('/admin/technician?bot_id=primary');
  81. await expect(page.getByRole('heading', { name: '你好,测试技师' })).toBeVisible();
  82. await expect(page.getByRole('button', { name: /快速到店服务/ })).toBeVisible();
  83. await page.getByRole('button', { name: /快速到店服务/ }).click();
  84. await expect(page.getByRole('heading', { name: '发布新套餐' })).toBeVisible();
  85. await expect(page.getByText('约 1 分钟')).toBeVisible();
  86. await expect(page.getByLabel('套餐名称')).toHaveValue('标准到店服务');
  87. await expect(page.getByRole('radio', { name: '固定价' })).toBeChecked();
  88. await expect(page.getByText('per_service')).toHaveCount(0);
  89. await expect(page.getByRole('button', { name: /确认并发布套餐/ })).toBeVisible();
  90. });