company-create.spec.ts 20 KB

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