company-create.spec.ts 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. import { TIMEOUTS } from '../../utils/timeouts';
  2. import { test, expect } from '../../utils/test-setup';
  3. test.describe('公司创建功能', () => {
  4. test.beforeEach(async ({ adminLoginPage, companyManagementPage }) => {
  5. // 以管理员身份登录后台
  6. await adminLoginPage.goto();
  7. await adminLoginPage.login('admin', 'admin123');
  8. await adminLoginPage.expectLoginSuccess();
  9. await companyManagementPage.goto();
  10. });
  11. test.describe('基本创建流程测试', () => {
  12. test('应该成功创建公司(不选择平台)', async ({ companyManagementPage }) => {
  13. // 生成唯一公司名称
  14. const timestamp = Date.now();
  15. const companyName = `测试公司_${timestamp}`;
  16. // 创建公司(不选择平台)
  17. const result = await companyManagementPage.createCompany({
  18. companyName,
  19. });
  20. // 验证 API 响应成功
  21. expect(result.responses).toBeDefined();
  22. expect(result.responses?.length).toBeGreaterThan(0);
  23. const createResponse = result.responses?.find(r => r.url.includes('createCompany'));
  24. expect(createResponse?.ok).toBe(true);
  25. // 验证公司出现在列表中
  26. await expect(async () => {
  27. const exists = await companyManagementPage.companyExists(companyName);
  28. expect(exists).toBe(true);
  29. }).toPass({ timeout: TIMEOUTS.DIALOG });
  30. // 清理测试数据
  31. const deleteResult = await companyManagementPage.deleteCompany(companyName);
  32. expect(deleteResult).toBe(true);
  33. // 验证公司已被删除
  34. const existsAfterDelete = await companyManagementPage.companyExists(companyName);
  35. expect(existsAfterDelete).toBe(false);
  36. });
  37. test('创建后公司应该出现在列表中', async ({ companyManagementPage }) => {
  38. const timestamp = Date.now();
  39. const companyName = `测试公司_消息_${timestamp}`;
  40. // 创建公司
  41. await companyManagementPage.createCompany({
  42. companyName,
  43. });
  44. // 验证公司出现在列表中
  45. const exists = await companyManagementPage.companyExists(companyName);
  46. expect(exists).toBe(true);
  47. // 清理
  48. await companyManagementPage.deleteCompany(companyName);
  49. });
  50. });
  51. test.describe('完整表单字段测试', () => {
  52. test('应该成功创建公司(选择平台并填写所有字段)', async ({ platformManagementPage, companyManagementPage }) => {
  53. const timestamp = Date.now();
  54. // 首先创建测试平台
  55. const platformName = `测试平台_${timestamp}`;
  56. await platformManagementPage.goto();
  57. await platformManagementPage.createPlatform({
  58. platformName,
  59. contactPerson: '测试联系人',
  60. contactPhone: '13800138000',
  61. contactEmail: `test_${timestamp}@example.com`,
  62. });
  63. // 验证平台创建成功
  64. expect(await platformManagementPage.platformExists(platformName)).toBe(true);
  65. // 返回公司管理页面
  66. await companyManagementPage.goto();
  67. // 创建公司(选择平台并填写所有字段)
  68. const companyName = `测试公司_${timestamp}`;
  69. const result = await companyManagementPage.createCompany({
  70. companyName,
  71. contactPerson: '张三',
  72. contactPhone: '13900139000',
  73. contactEmail: `company_${timestamp}@example.com`,
  74. address: '北京市朝阳区',
  75. }, platformName);
  76. // 验证 API 响应成功
  77. const createResponse = result.responses?.find(r => r.url.includes('createCompany'));
  78. expect(createResponse?.ok).toBe(true);
  79. // 验证公司出现在列表中
  80. await expect(async () => {
  81. const exists = await companyManagementPage.companyExists(companyName);
  82. expect(exists).toBe(true);
  83. }).toPass({ timeout: TIMEOUTS.DIALOG });
  84. // 清理测试数据(先删除公司,再删除平台)
  85. await companyManagementPage.deleteCompany(companyName);
  86. await platformManagementPage.goto();
  87. await platformManagementPage.deletePlatform(platformName);
  88. });
  89. test('应该保存所有填写的字段数据', async ({ platformManagementPage, companyManagementPage }) => {
  90. const timestamp = Date.now();
  91. // 创建测试平台
  92. const platformName = `完整测试平台_${timestamp}`;
  93. await platformManagementPage.goto();
  94. await platformManagementPage.createPlatform({
  95. platformName,
  96. contactPerson: `平台联系人_${timestamp}`,
  97. contactPhone: '13800138000',
  98. contactEmail: `platform_${timestamp}@example.com`,
  99. });
  100. // 返回公司管理页面
  101. await companyManagementPage.goto();
  102. // 创建公司(填写所有字段)
  103. const companyName = `完整测试公司_${timestamp}`;
  104. const result = await companyManagementPage.createCompany({
  105. companyName,
  106. contactPerson: `测试联系人_${timestamp}`,
  107. contactPhone: '13800138000',
  108. contactEmail: `test_${timestamp}@example.com`,
  109. address: '上海市浦东新区',
  110. }, platformName);
  111. // 验证创建成功
  112. const createResponse = result.responses?.find(r => r.url.includes('createCompany'));
  113. expect(createResponse?.ok).toBe(true);
  114. // 验证公司出现在列表中
  115. const exists = await companyManagementPage.companyExists(companyName);
  116. expect(exists).toBe(true);
  117. // 清理
  118. await companyManagementPage.deleteCompany(companyName);
  119. await platformManagementPage.goto();
  120. await platformManagementPage.deletePlatform(platformName);
  121. });
  122. test('应该支持不同的联系人信息', async ({ platformManagementPage, companyManagementPage }) => {
  123. const timestamp = Date.now();
  124. // 创建测试平台
  125. const platformName = `联系人测试平台_${timestamp}`;
  126. await platformManagementPage.goto();
  127. await platformManagementPage.createPlatform({
  128. platformName,
  129. contactPerson: '平台联系人',
  130. contactPhone: '15011112222',
  131. contactEmail: `platform_${timestamp}@company.com`,
  132. });
  133. // 返回公司管理页面
  134. await companyManagementPage.goto();
  135. // 创建公司(不同的联系人信息)
  136. const companyName = `联系人测试公司_${timestamp}`;
  137. const result = await companyManagementPage.createCompany({
  138. companyName,
  139. contactPerson: `李四_${timestamp}`,
  140. contactPhone: '15011112222',
  141. contactEmail: `lisi_${timestamp}@company.com`,
  142. address: '深圳市南山区',
  143. }, platformName);
  144. // 验证 API 响应成功
  145. const createResponse = result.responses?.find(r => r.url.includes('createCompany'));
  146. expect(createResponse?.ok).toBe(true);
  147. // 验证公司存在于列表中
  148. const exists = await companyManagementPage.companyExists(companyName);
  149. expect(exists).toBe(true);
  150. // 清理
  151. await companyManagementPage.deleteCompany(companyName);
  152. await platformManagementPage.goto();
  153. await platformManagementPage.deletePlatform(platformName);
  154. });
  155. });
  156. test.describe('表单验证测试', () => {
  157. test('未填写公司名称时应显示内联验证错误', async ({ companyManagementPage }) => {
  158. // 打开创建对话框
  159. await companyManagementPage.openCreateDialog();
  160. // 不填写任何字段,直接尝试提交
  161. const submitButton = companyManagementPage.page.locator('[data-testid="submit-create-company-button"]');
  162. await submitButton.click();
  163. // 验证对话框仍然打开(表单验证阻止了提交)
  164. const dialog = companyManagementPage.page.locator('[role="dialog"]');
  165. await expect(dialog).toBeVisible();
  166. // 关闭对话框
  167. await companyManagementPage.cancelDialog();
  168. });
  169. test('表单应该正确验证邮箱格式', async ({ companyManagementPage }) => {
  170. const timestamp = Date.now();
  171. const companyName = `邮箱测试公司_${timestamp}`;
  172. // 打开创建对话框
  173. await companyManagementPage.openCreateDialog();
  174. // 填写公司名称
  175. await companyManagementPage.companyNameInput.fill(companyName);
  176. // 填写无效邮箱格式
  177. await companyManagementPage.contactEmailInput.fill('invalid-email-format');
  178. // 尝试提交
  179. const submitButton = companyManagementPage.page.locator('[data-testid="submit-create-company-button"]');
  180. await submitButton.click();
  181. // 验证对话框仍然打开(表单验证阻止了提交)
  182. const dialog = companyManagementPage.page.locator('[role="dialog"]');
  183. await expect(dialog).toBeVisible();
  184. // 关闭对话框
  185. await companyManagementPage.cancelDialog();
  186. });
  187. });
  188. test.describe('取消和关闭操作测试', () => {
  189. test('应该能取消创建公司操作', async ({ companyManagementPage }) => {
  190. const timestamp = Date.now();
  191. const companyName = `取消测试公司_${timestamp}`;
  192. // 打开创建对话框并填写表单
  193. await companyManagementPage.openCreateDialog();
  194. await companyManagementPage.companyNameInput.fill(companyName);
  195. // 点击取消按钮
  196. await companyManagementPage.cancelDialog();
  197. // 验证对话框关闭
  198. const dialog = companyManagementPage.page.locator('[role="dialog"]');
  199. await expect(dialog).not.toBeVisible();
  200. // 验证公司没有被创建
  201. const exists = await companyManagementPage.companyExists(companyName);
  202. expect(exists).toBe(false);
  203. });
  204. test('应该能通过关闭对话框取消创建', async ({ companyManagementPage }) => {
  205. const timestamp = Date.now();
  206. const companyName = `关闭测试公司_${timestamp}`;
  207. // 打开创建对话框并填写表单
  208. await companyManagementPage.openCreateDialog();
  209. await companyManagementPage.companyNameInput.fill(companyName);
  210. // 按 ESC 键关闭对话框
  211. await companyManagementPage.page.keyboard.press('Escape');
  212. // 等待对话框关闭
  213. await companyManagementPage.waitForDialogClosed();
  214. // 验证公司没有出现在列表中
  215. const exists = await companyManagementPage.companyExists(companyName);
  216. expect(exists).toBe(false);
  217. });
  218. test('应该能通过点击对话框外部取消创建', async ({ companyManagementPage }) => {
  219. const timestamp = Date.now();
  220. const companyName = `外部点击测试公司_${timestamp}`;
  221. // 打开创建对话框并填写表单
  222. await companyManagementPage.openCreateDialog();
  223. await companyManagementPage.companyNameInput.fill(companyName);
  224. // 点击对话框外部区域(使用 Radix UI Dialog overlay)
  225. // Radix Dialog 使用 data-radix-dialog-overlay 或 [data-state="open"] 作为 backdrop
  226. const backdrop = companyManagementPage.page.locator('[data-radix-dialog-overlay]').or(
  227. companyManagementPage.page.locator('[data-state="open"][role="presentation"]')
  228. );
  229. // 验证 backdrop 存在
  230. const backdropCount = await backdrop.count();
  231. if (backdropCount > 0) {
  232. // 点击 backdrop 关闭对话框
  233. await backdrop.first().click();
  234. await companyManagementPage.waitForDialogClosed();
  235. } else {
  236. // 如果找不到 backdrop(某些浏览器行为),使用 ESC 键作为备选
  237. await companyManagementPage.page.keyboard.press('Escape');
  238. await companyManagementPage.waitForDialogClosed();
  239. }
  240. // 验证公司没有出现在列表中
  241. const exists = await companyManagementPage.companyExists(companyName);
  242. expect(exists).toBe(false);
  243. });
  244. });
  245. test.describe('对话框元素验证', () => {
  246. test('应该显示创建公司对话框的所有字段', async ({ companyManagementPage }) => {
  247. // 打开创建对话框
  248. await companyManagementPage.openCreateDialog();
  249. // 验证对话框存在
  250. const dialog = companyManagementPage.page.locator('[role="dialog"]');
  251. await expect(dialog).toBeVisible();
  252. // 验证平台选择器存在(可选字段)
  253. await expect(companyManagementPage.platformSelector).toBeVisible();
  254. // 验证公司名称输入框存在(必填字段)
  255. await expect(companyManagementPage.companyNameInput).toBeVisible();
  256. // 验证可选字段输入框存在
  257. await expect(companyManagementPage.contactPersonInput).toBeVisible();
  258. await expect(companyManagementPage.contactPhoneInput).toBeVisible();
  259. await expect(companyManagementPage.contactEmailInput).toBeVisible();
  260. await expect(companyManagementPage.addressInput).toBeVisible();
  261. // 验证按钮存在(使用 role 选择器,因为 data-testid 可能不存在)
  262. await expect(companyManagementPage.page.getByRole('button', { name: '创建' })).toBeVisible();
  263. await expect(companyManagementPage.cancelButton).toBeVisible();
  264. // 关闭对话框
  265. await companyManagementPage.cancelDialog();
  266. });
  267. });
  268. test.describe('数据唯一性测试', () => {
  269. test('不同测试应该使用不同的公司名称', async ({ companyManagementPage }) => {
  270. // 生成两个不同的公司名称
  271. const timestamp = Date.now();
  272. const companyName1 = `唯一性测试公司_A_${timestamp}`;
  273. const companyName2 = `唯一性测试公司_B_${timestamp}`;
  274. // 创建第一个公司
  275. await companyManagementPage.createCompany({
  276. companyName: companyName1,
  277. });
  278. expect(await companyManagementPage.companyExists(companyName1)).toBe(true);
  279. // 创建第二个公司
  280. await companyManagementPage.createCompany({
  281. companyName: companyName2,
  282. });
  283. expect(await companyManagementPage.companyExists(companyName2)).toBe(true);
  284. // 清理两个公司
  285. await companyManagementPage.deleteCompany(companyName1);
  286. await companyManagementPage.deleteCompany(companyName2);
  287. // 验证清理成功
  288. expect(await companyManagementPage.companyExists(companyName1)).toBe(false);
  289. expect(await companyManagementPage.companyExists(companyName2)).toBe(false);
  290. });
  291. test('同一平台下公司名称应该唯一', async ({ platformManagementPage, companyManagementPage }) => {
  292. const timestamp = Date.now();
  293. // 创建测试平台
  294. const platformName = `唯一性测试平台_${timestamp}`;
  295. await platformManagementPage.goto();
  296. await platformManagementPage.createPlatform({
  297. platformName,
  298. contactPerson: '测试联系人',
  299. contactPhone: '13800138000',
  300. contactEmail: `test_${timestamp}@example.com`,
  301. });
  302. // 返回公司管理页面
  303. await companyManagementPage.goto();
  304. // 创建第一个公司
  305. const companyName = `同平台公司_${timestamp}`;
  306. await companyManagementPage.createCompany({
  307. companyName,
  308. }, platformName);
  309. expect(await companyManagementPage.companyExists(companyName)).toBe(true);
  310. // 尝试创建同名公司(同一平台)
  311. const result = await companyManagementPage.createCompany({
  312. companyName,
  313. }, platformName);
  314. // 验证创建失败或显示错误
  315. // 根据后端行为,可能返回错误或显示验证消息
  316. if (result.hasError || !result.success) {
  317. // 预期行为:创建失败
  318. expect(result.hasError || !result.success).toBe(true);
  319. }
  320. // 验证列表中只有一个同名公司(没有重复创建)
  321. const companyRow = companyManagementPage.companyTable.locator('tbody tr').filter({ hasText: companyName });
  322. const count = await companyRow.count();
  323. expect(count).toBe(1);
  324. // 清理
  325. await companyManagementPage.deleteCompany(companyName);
  326. await platformManagementPage.goto();
  327. await platformManagementPage.deletePlatform(platformName);
  328. });
  329. });
  330. test.describe('测试后清理验证', () => {
  331. test('应该能成功删除测试创建的公司', async ({ companyManagementPage }) => {
  332. const timestamp = Date.now();
  333. const companyName = `清理测试公司_${timestamp}`;
  334. // 创建公司
  335. await companyManagementPage.createCompany({
  336. companyName,
  337. contactPerson: `清理联系人_${timestamp}`,
  338. contactPhone: '13800003333',
  339. contactEmail: `cleanup_${timestamp}@test.com`,
  340. });
  341. // 验证公司存在
  342. expect(await companyManagementPage.companyExists(companyName)).toBe(true);
  343. // 删除公司
  344. const deleteResult = await companyManagementPage.deleteCompany(companyName);
  345. expect(deleteResult).toBe(true);
  346. // 验证公司已被删除
  347. await expect(async () => {
  348. const exists = await companyManagementPage.companyExists(companyName);
  349. expect(exists).toBe(false);
  350. }).toPass({ timeout: TIMEOUTS.DIALOG });
  351. });
  352. test('应该能成功删除测试创建的平台和公司', async ({ platformManagementPage, companyManagementPage }) => {
  353. const timestamp = Date.now();
  354. // 创建测试平台
  355. const platformName = `清理测试平台_${timestamp}`;
  356. await platformManagementPage.goto();
  357. await platformManagementPage.createPlatform({
  358. platformName,
  359. contactPerson: '测试联系人',
  360. contactPhone: '13800138000',
  361. contactEmail: `test_${timestamp}@example.com`,
  362. });
  363. // 返回公司管理页面
  364. await companyManagementPage.goto();
  365. // 创建公司
  366. const companyName = `清理测试公司_${timestamp}`;
  367. await companyManagementPage.createCompany({
  368. companyName,
  369. }, platformName);
  370. // 验证公司存在
  371. expect(await companyManagementPage.companyExists(companyName)).toBe(true);
  372. // 清理(先删除公司,再删除平台)
  373. await companyManagementPage.deleteCompany(companyName);
  374. await platformManagementPage.goto();
  375. await platformManagementPage.deletePlatform(platformName);
  376. // 验证清理成功
  377. await companyManagementPage.goto();
  378. expect(await companyManagementPage.companyExists(companyName)).toBe(false);
  379. });
  380. });
  381. test.describe('PlatformSelector 集成测试', () => {
  382. test('应该能异步加载平台选项', async ({ platformManagementPage, companyManagementPage }) => {
  383. const timestamp = Date.now();
  384. // 创建多个测试平台
  385. const platformNames = [
  386. `异步平台_A_${timestamp}`,
  387. `异步平台_B_${timestamp}`,
  388. `异步平台_C_${timestamp}`,
  389. ];
  390. await platformManagementPage.goto();
  391. for (const platformName of platformNames) {
  392. await platformManagementPage.createPlatform({
  393. platformName,
  394. contactPerson: '测试联系人',
  395. contactPhone: '13800138000',
  396. contactEmail: `test_${timestamp}@example.com`,
  397. });
  398. }
  399. // 返回公司管理页面
  400. await companyManagementPage.goto();
  401. // 打开创建对话框
  402. await companyManagementPage.openCreateDialog();
  403. // 验证平台选择器可见
  404. await expect(companyManagementPage.platformSelector).toBeVisible();
  405. // 关闭对话框
  406. await companyManagementPage.cancelDialog();
  407. // 清理平台
  408. await platformManagementPage.goto();
  409. for (const platformName of platformNames) {
  410. await platformManagementPage.deletePlatform(platformName);
  411. }
  412. });
  413. test('应该能使用 selectRadixOptionAsync 选择平台', async ({ platformManagementPage, companyManagementPage }) => {
  414. const timestamp = Date.now();
  415. // 创建测试平台
  416. const platformName = `Radix测试平台_${timestamp}`;
  417. await platformManagementPage.goto();
  418. await platformManagementPage.createPlatform({
  419. platformName,
  420. contactPerson: '测试联系人',
  421. contactPhone: '13800138000',
  422. contactEmail: `test_${timestamp}@example.com`,
  423. });
  424. // 返回公司管理页面
  425. await companyManagementPage.goto();
  426. // 创建公司并选择平台
  427. const companyName = `Radix测试公司_${timestamp}`;
  428. const result = await companyManagementPage.createCompany({
  429. companyName,
  430. }, platformName);
  431. // 验证创建成功
  432. const createResponse = result.responses?.find(r => r.url.includes('createCompany'));
  433. expect(createResponse?.ok).toBe(true);
  434. // 验证公司出现在列表中
  435. const exists = await companyManagementPage.companyExists(companyName);
  436. expect(exists).toBe(true);
  437. // 清理
  438. await companyManagementPage.deleteCompany(companyName);
  439. await platformManagementPage.goto();
  440. await platformManagementPage.deletePlatform(platformName);
  441. });
  442. });
  443. });