passengers.integration.test.ts 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775
  1. import { describe, it, expect, beforeEach } from 'vitest';
  2. import { testClient } from 'hono/testing';
  3. import {
  4. IntegrationTestDatabase,
  5. setupIntegrationDatabaseHooks,
  6. TestDataFactory
  7. } from '~/utils/server/integration-test-db';
  8. import { IntegrationTestAssertions } from '~/utils/server/integration-test-utils';
  9. import { passengersRoutesExport } from '@d8d/server/api';
  10. import { AuthService } from '@d8d/server/modules/auth/auth.service';
  11. import { UserService } from '@d8d/server/modules/users/user.service';
  12. import { IdType } from '@d8d/server/modules/passengers/passenger.schema';
  13. // 设置集成测试钩子
  14. setupIntegrationDatabaseHooks()
  15. describe('用户端乘客API集成测试', () => {
  16. let client: ReturnType<typeof testClient<typeof passengersRoutesExport>>['api']['v1'];
  17. let testToken: string;
  18. let testUser: any;
  19. beforeEach(async () => {
  20. // 创建测试客户端
  21. client = testClient(passengersRoutesExport).api.v1;
  22. // 创建测试用户并生成token
  23. const dataSource = await IntegrationTestDatabase.getDataSource();
  24. const userService = new UserService(dataSource);
  25. const authService = new AuthService(userService);
  26. // 创建测试用户
  27. testUser = await TestDataFactory.createTestUser(dataSource);
  28. // 生成测试用户的token
  29. testToken = authService.generateToken(testUser);
  30. });
  31. describe('乘客创建测试', () => {
  32. it('应该成功创建乘客', async () => {
  33. const passengerData = {
  34. name: '测试乘客',
  35. idType: IdType.ID_CARD,
  36. idNumber: '110101199001011234',
  37. phone: '13812345678',
  38. isDefault: false
  39. };
  40. const response = await client.passengers.$post({
  41. json: passengerData,
  42. },
  43. {
  44. headers: {
  45. 'Authorization': `Bearer ${testToken}`
  46. }
  47. });
  48. // 断言响应
  49. expect(response.status).toBe(201);
  50. if (response.status === 201) {
  51. const responseData = await response.json();
  52. expect(responseData).toHaveProperty('id');
  53. expect(responseData.name).toBe(passengerData.name);
  54. expect(responseData.idType).toBe(passengerData.idType);
  55. expect(responseData.idNumber).toBe(passengerData.idNumber);
  56. expect(responseData.phone).toBe(passengerData.phone);
  57. expect(responseData.isDefault).toBe(passengerData.isDefault);
  58. expect(responseData.userId).toBe(testUser.id);
  59. // 断言数据库中存在乘客
  60. await IntegrationTestAssertions.expectPassengerToExist(responseData.id);
  61. }
  62. });
  63. it('应该成功创建默认乘客', async () => {
  64. const passengerData = {
  65. name: '默认乘客',
  66. idType: IdType.PASSPORT,
  67. idNumber: 'E12345678',
  68. phone: '13987654321',
  69. isDefault: true
  70. };
  71. const response = await client.passengers.$post({
  72. json: passengerData,
  73. },
  74. {
  75. headers: {
  76. 'Authorization': `Bearer ${testToken}`
  77. }
  78. });
  79. expect(response.status).toBe(201);
  80. if (response.status === 201) {
  81. const responseData = await response.json();
  82. expect(responseData.isDefault).toBe(true);
  83. }
  84. });
  85. it('应该拒绝创建无效证件类型的乘客', async () => {
  86. const passengerData = {
  87. name: '测试乘客',
  88. idType: 'invalid_type' as any, // 无效类型
  89. idNumber: '110101199001011234',
  90. phone: '13812345678',
  91. isDefault: false
  92. };
  93. const response = await client.passengers.$post({
  94. json: passengerData,
  95. },
  96. {
  97. headers: {
  98. 'Authorization': `Bearer ${testToken}`
  99. }
  100. });
  101. // 应该返回验证错误
  102. expect([400, 500]).toContain(response.status);
  103. });
  104. it('应该拒绝创建缺少必填字段的乘客', async () => {
  105. const passengerData = {
  106. name: '', // 空字符串作为无效值
  107. idType: IdType.ID_CARD,
  108. idNumber: '110101199001011234',
  109. phone: '13812345678',
  110. isDefault: false
  111. };
  112. const response = await client.passengers.$post({
  113. json: passengerData,
  114. },
  115. {
  116. headers: {
  117. 'Authorization': `Bearer ${testToken}`
  118. }
  119. });
  120. // 应该返回验证错误
  121. expect([400, 500]).toContain(response.status);
  122. });
  123. });
  124. describe('乘客读取测试', () => {
  125. it('应该成功获取当前用户的乘客列表', async () => {
  126. const dataSource = await IntegrationTestDatabase.getDataSource();
  127. if (!dataSource) throw new Error('Database not initialized');
  128. // 为当前用户创建几个测试乘客
  129. await TestDataFactory.createTestPassenger(dataSource, {
  130. userId: testUser.id,
  131. name: '乘客1'
  132. });
  133. await TestDataFactory.createTestPassenger(dataSource, {
  134. userId: testUser.id,
  135. name: '乘客2'
  136. });
  137. const response = await client.passengers.$get({
  138. query: { page: 1, pageSize: 10 }
  139. },
  140. {
  141. headers: {
  142. 'Authorization': `Bearer ${testToken}`
  143. }
  144. });
  145. if (response.status !== 200) {
  146. const errorData = await response.json() as any;
  147. console.debug('获取乘客列表失败:', errorData);
  148. }
  149. expect(response.status).toBe(200);
  150. if (response.status === 200) {
  151. const responseData = await response.json();
  152. expect(Array.isArray(responseData.data)).toBe(true);
  153. expect(responseData.data.length).toBe(2);
  154. // 验证返回的乘客都属于当前用户
  155. responseData.data.forEach((passenger: any) => {
  156. expect(passenger.userId).toBe(testUser.id);
  157. });
  158. }
  159. });
  160. it('应该成功获取单个乘客详情', async () => {
  161. const dataSource = await IntegrationTestDatabase.getDataSource();
  162. if (!dataSource) throw new Error('Database not initialized');
  163. const testPassenger = await TestDataFactory.createTestPassenger(dataSource, {
  164. userId: testUser.id,
  165. name: '测试乘客详情'
  166. });
  167. const response = await client.passengers[':id'].$get({
  168. param: { id: testPassenger.id }
  169. },
  170. {
  171. headers: {
  172. 'Authorization': `Bearer ${testToken}`
  173. }
  174. });
  175. expect(response.status).toBe(200);
  176. if (response.status === 200) {
  177. const responseData = await response.json();
  178. expect(responseData.id).toBe(testPassenger.id);
  179. expect(responseData.name).toBe(testPassenger.name);
  180. expect(responseData.idType).toBe(testPassenger.idType);
  181. expect(responseData.idNumber).toBe(testPassenger.idNumber);
  182. expect(responseData.phone).toBe(testPassenger.phone);
  183. expect(responseData.userId).toBe(testUser.id);
  184. }
  185. });
  186. it('应该返回404当乘客不存在时', async () => {
  187. const response = await client.passengers[':id'].$get({
  188. param: { id: 999999 }
  189. },
  190. {
  191. headers: {
  192. 'Authorization': `Bearer ${testToken}`
  193. }
  194. });
  195. expect(response.status).toBe(404);
  196. if (response.status === 404) {
  197. const responseData = await response.json();
  198. expect(responseData.message).toContain('乘客不存在');
  199. }
  200. });
  201. it('应该拒绝访问其他用户的乘客', async () => {
  202. const dataSource = await IntegrationTestDatabase.getDataSource();
  203. if (!dataSource) throw new Error('Database not initialized');
  204. // 创建另一个用户
  205. const otherUser = await TestDataFactory.createTestUser(dataSource);
  206. // 为其他用户创建乘客
  207. const otherPassenger = await TestDataFactory.createTestPassenger(dataSource, {
  208. userId: otherUser.id,
  209. name: '其他用户的乘客'
  210. });
  211. // 当前用户尝试访问其他用户的乘客
  212. const response = await client.passengers[':id'].$get({
  213. param: { id: otherPassenger.id }
  214. },
  215. {
  216. headers: {
  217. 'Authorization': `Bearer ${testToken}`
  218. }
  219. });
  220. // 应该返回403权限错误
  221. expect(response.status).toBe(403);
  222. if (response.status === 403) {
  223. const responseData = await response.json();
  224. expect(responseData.message).toContain('无权访问');
  225. }
  226. });
  227. });
  228. describe('乘客更新测试', () => {
  229. it('应该成功更新乘客信息', async () => {
  230. const dataSource = await IntegrationTestDatabase.getDataSource();
  231. if (!dataSource) throw new Error('Database not initialized');
  232. const testPassenger = await TestDataFactory.createTestPassenger(dataSource, {
  233. userId: testUser.id,
  234. name: '测试乘客更新'
  235. });
  236. const updateData = {
  237. name: '更新后的乘客名称',
  238. phone: '13987654321',
  239. isDefault: true
  240. };
  241. const response = await client.passengers[':id'].$put({
  242. param: { id: testPassenger.id },
  243. json: updateData
  244. },
  245. {
  246. headers: {
  247. 'Authorization': `Bearer ${testToken}`
  248. }
  249. });
  250. expect(response.status).toBe(200);
  251. if (response.status === 200) {
  252. const responseData = await response.json();
  253. expect(responseData.name).toBe(updateData.name);
  254. expect(responseData.phone).toBe(updateData.phone);
  255. expect(responseData.isDefault).toBe(updateData.isDefault);
  256. }
  257. // 验证数据库中的更新
  258. const getResponse = await client.passengers[':id'].$get({
  259. param: { id: testPassenger.id }
  260. },
  261. {
  262. headers: {
  263. 'Authorization': `Bearer ${testToken}`
  264. }
  265. });
  266. if (getResponse.status === 200) {
  267. expect(getResponse.status).toBe(200);
  268. const getResponseData = await getResponse.json();
  269. expect(getResponseData.name).toBe(updateData.name);
  270. expect(getResponseData.phone).toBe(updateData.phone);
  271. }
  272. });
  273. it('应该返回404当更新不存在的乘客时', async () => {
  274. const updateData = {
  275. name: '更新后的名称'
  276. };
  277. const response = await client.passengers[':id'].$put({
  278. param: { id: 999999 },
  279. json: updateData
  280. },
  281. {
  282. headers: {
  283. 'Authorization': `Bearer ${testToken}`
  284. }
  285. });
  286. expect(response.status).toBe(404);
  287. if (response.status === 404) {
  288. const responseData = await response.json();
  289. expect(responseData.message).toContain('乘客不存在');
  290. }
  291. });
  292. it('应该拒绝更新其他用户的乘客', async () => {
  293. const dataSource = await IntegrationTestDatabase.getDataSource();
  294. if (!dataSource) throw new Error('Database not initialized');
  295. // 创建另一个用户
  296. const otherUser = await TestDataFactory.createTestUser(dataSource);
  297. // 为其他用户创建乘客
  298. const otherPassenger = await TestDataFactory.createTestPassenger(dataSource, {
  299. userId: otherUser.id,
  300. name: '其他用户的乘客'
  301. });
  302. const updateData = {
  303. name: '尝试修改的名称'
  304. };
  305. // 当前用户尝试更新其他用户的乘客
  306. const response = await client.passengers[':id'].$put({
  307. param: { id: otherPassenger.id },
  308. json: updateData
  309. },
  310. {
  311. headers: {
  312. 'Authorization': `Bearer ${testToken}`
  313. }
  314. });
  315. // 应该返回403权限错误
  316. expect(response.status).toBe(403);
  317. if (response.status === 403) {
  318. const responseData = await response.json();
  319. expect(responseData.message).toContain('无权修改');
  320. }
  321. });
  322. });
  323. describe('乘客删除测试', () => {
  324. it('应该成功删除乘客', async () => {
  325. const dataSource = await IntegrationTestDatabase.getDataSource();
  326. if (!dataSource) throw new Error('Database not initialized');
  327. const testPassenger = await TestDataFactory.createTestPassenger(dataSource, {
  328. userId: testUser.id,
  329. name: '测试乘客删除'
  330. });
  331. const response = await client.passengers[':id'].$delete({
  332. param: { id: testPassenger.id }
  333. },
  334. {
  335. headers: {
  336. 'Authorization': `Bearer ${testToken}`
  337. }
  338. });
  339. IntegrationTestAssertions.expectStatus(response, 204);
  340. // 验证乘客已从数据库中删除
  341. await IntegrationTestAssertions.expectPassengerNotToExist(testPassenger.id);
  342. // 验证再次获取乘客返回404
  343. const getResponse = await client.passengers[':id'].$get({
  344. param: { id: testPassenger.id }
  345. },
  346. {
  347. headers: {
  348. 'Authorization': `Bearer ${testToken}`
  349. }
  350. });
  351. IntegrationTestAssertions.expectStatus(getResponse, 404);
  352. });
  353. it('应该返回404当删除不存在的乘客时', async () => {
  354. const response = await client.passengers[':id'].$delete({
  355. param: { id: 999999 }
  356. },
  357. {
  358. headers: {
  359. 'Authorization': `Bearer ${testToken}`
  360. }
  361. });
  362. IntegrationTestAssertions.expectStatus(response, 404);
  363. if (response.status === 404) {
  364. const responseData = await response.json();
  365. expect(responseData.message).toContain('乘客不存在');
  366. }
  367. });
  368. it('应该拒绝删除其他用户的乘客', async () => {
  369. const dataSource = await IntegrationTestDatabase.getDataSource();
  370. if (!dataSource) throw new Error('Database not initialized');
  371. // 创建另一个用户
  372. const otherUser = await TestDataFactory.createTestUser(dataSource);
  373. // 为其他用户创建乘客
  374. const otherPassenger = await TestDataFactory.createTestPassenger(dataSource, {
  375. userId: otherUser.id,
  376. name: '其他用户的乘客'
  377. });
  378. // 当前用户尝试删除其他用户的乘客
  379. const response = await client.passengers[':id'].$delete({
  380. param: { id: otherPassenger.id }
  381. },
  382. {
  383. headers: {
  384. 'Authorization': `Bearer ${testToken}`
  385. }
  386. });
  387. // 应该返回403权限错误
  388. expect(response.status).toBe(403);
  389. if (response.status === 403) {
  390. const responseData = await response.json();
  391. expect(responseData.message).toContain('无权删除');
  392. }
  393. });
  394. });
  395. describe('默认乘客设置测试', () => {
  396. it('应该成功设置默认乘客', async () => {
  397. const dataSource = await IntegrationTestDatabase.getDataSource();
  398. if (!dataSource) throw new Error('Database not initialized');
  399. const testPassenger = await TestDataFactory.createTestPassenger(dataSource, {
  400. userId: testUser.id,
  401. name: '测试设置默认乘客',
  402. isDefault: false
  403. });
  404. const response = await client.passengers[':id']['set-default'].$post({
  405. param: { id: testPassenger.id }
  406. },
  407. {
  408. headers: {
  409. 'Authorization': `Bearer ${testToken}`
  410. }
  411. });
  412. expect(response.status).toBe(200);
  413. if (response.status === 200) {
  414. const responseData = await response.json();
  415. expect(responseData.isDefault).toBe(true);
  416. }
  417. // 验证数据库中乘客已设置为默认
  418. const getResponse = await client.passengers[':id'].$get({
  419. param: { id: testPassenger.id }
  420. },
  421. {
  422. headers: {
  423. 'Authorization': `Bearer ${testToken}`
  424. }
  425. });
  426. if (getResponse.status === 200) {
  427. const getResponseData = await getResponse.json();
  428. expect(getResponseData.isDefault).toBe(true);
  429. }
  430. });
  431. it('应该返回404当设置不存在的乘客为默认时', async () => {
  432. const response = await client.passengers[':id']['set-default'].$post({
  433. param: { id: 999999 }
  434. },
  435. {
  436. headers: {
  437. 'Authorization': `Bearer ${testToken}`
  438. }
  439. });
  440. expect(response.status).toBe(404);
  441. if (response.status === 404) {
  442. const responseData = await response.json();
  443. expect(responseData.message).toContain('乘客不存在');
  444. }
  445. });
  446. it('应该拒绝设置其他用户的乘客为默认', async () => {
  447. const dataSource = await IntegrationTestDatabase.getDataSource();
  448. if (!dataSource) throw new Error('Database not initialized');
  449. // 创建另一个用户
  450. const otherUser = await TestDataFactory.createTestUser(dataSource);
  451. // 为其他用户创建乘客
  452. const otherPassenger = await TestDataFactory.createTestPassenger(dataSource, {
  453. userId: otherUser.id,
  454. name: '其他用户的乘客'
  455. });
  456. // 当前用户尝试设置其他用户的乘客为默认
  457. const response = await client.passengers[':id']['set-default'].$post({
  458. param: { id: otherPassenger.id }
  459. },
  460. {
  461. headers: {
  462. 'Authorization': `Bearer ${testToken}`
  463. }
  464. });
  465. // 应该返回403权限错误
  466. expect(response.status).toBe(403);
  467. if (response.status === 403) {
  468. const responseData = await response.json();
  469. expect(responseData.message).toContain('无权设置');
  470. }
  471. });
  472. it('设置默认乘客时应该取消其他乘客的默认状态', async () => {
  473. const dataSource = await IntegrationTestDatabase.getDataSource();
  474. if (!dataSource) throw new Error('Database not initialized');
  475. // 创建两个乘客,其中一个为默认
  476. const defaultPassenger = await TestDataFactory.createTestPassenger(dataSource, {
  477. userId: testUser.id,
  478. name: '原默认乘客',
  479. isDefault: true
  480. });
  481. const newDefaultPassenger = await TestDataFactory.createTestPassenger(dataSource, {
  482. userId: testUser.id,
  483. name: '新默认乘客',
  484. isDefault: false
  485. });
  486. // 设置新的默认乘客
  487. const response = await client.passengers[':id']['set-default'].$post({
  488. param: { id: newDefaultPassenger.id }
  489. },
  490. {
  491. headers: {
  492. 'Authorization': `Bearer ${testToken}`
  493. }
  494. });
  495. expect(response.status).toBe(200);
  496. // 验证新乘客为默认
  497. const getNewResponse = await client.passengers[':id'].$get({
  498. param: { id: newDefaultPassenger.id }
  499. },
  500. {
  501. headers: {
  502. 'Authorization': `Bearer ${testToken}`
  503. }
  504. });
  505. if (getNewResponse.status === 200) {
  506. const newPassengerData = await getNewResponse.json();
  507. expect(newPassengerData.isDefault).toBe(true);
  508. }
  509. // 验证原默认乘客不再是默认
  510. const getOldResponse = await client.passengers[':id'].$get({
  511. param: { id: defaultPassenger.id }
  512. },
  513. {
  514. headers: {
  515. 'Authorization': `Bearer ${testToken}`
  516. }
  517. });
  518. if (getOldResponse.status === 200) {
  519. const oldPassengerData = await getOldResponse.json();
  520. expect(oldPassengerData.isDefault).toBe(false);
  521. }
  522. });
  523. });
  524. describe('乘客搜索测试', () => {
  525. it('应该能够按乘客姓名搜索乘客', async () => {
  526. const dataSource = await IntegrationTestDatabase.getDataSource();
  527. if (!dataSource) throw new Error('Database not initialized');
  528. await TestDataFactory.createTestPassenger(dataSource, {
  529. userId: testUser.id,
  530. name: '搜索乘客1',
  531. phone: '13811111111'
  532. });
  533. await TestDataFactory.createTestPassenger(dataSource, {
  534. userId: testUser.id,
  535. name: '搜索乘客2',
  536. phone: '13822222222'
  537. });
  538. await TestDataFactory.createTestPassenger(dataSource, {
  539. userId: testUser.id,
  540. name: '其他乘客',
  541. phone: '13833333333'
  542. });
  543. const response = await client.passengers.$get({
  544. query: { keyword: '搜索乘客', page: 1, pageSize: 10 }
  545. },
  546. {
  547. headers: {
  548. 'Authorization': `Bearer ${testToken}`
  549. }
  550. });
  551. IntegrationTestAssertions.expectStatus(response, 200);
  552. if (response.status === 200) {
  553. const responseData = await response.json();
  554. expect(Array.isArray(responseData.data)).toBe(true);
  555. expect(responseData.data.length).toBe(2);
  556. // 验证搜索结果包含正确的乘客
  557. const names = responseData.data.map((passenger: any) => passenger.name);
  558. expect(names).toContain('搜索乘客1');
  559. expect(names).toContain('搜索乘客2');
  560. expect(names).not.toContain('其他乘客');
  561. }
  562. });
  563. it('应该能够按手机号搜索乘客', async () => {
  564. const dataSource = await IntegrationTestDatabase.getDataSource();
  565. if (!dataSource) throw new Error('Database not initialized');
  566. await TestDataFactory.createTestPassenger(dataSource, {
  567. userId: testUser.id,
  568. name: '乘客1',
  569. phone: '13811112222'
  570. });
  571. await TestDataFactory.createTestPassenger(dataSource, {
  572. userId: testUser.id,
  573. name: '乘客2',
  574. phone: '13811113333'
  575. });
  576. const response = await client.passengers.$get({
  577. query: { keyword: '1381111', page: 1, pageSize: 10 }
  578. },
  579. {
  580. headers: {
  581. 'Authorization': `Bearer ${testToken}`
  582. }
  583. });
  584. IntegrationTestAssertions.expectStatus(response, 200);
  585. if (response.status === 200) {
  586. const responseData = await response.json();
  587. expect(responseData.data.length).toBe(2);
  588. const phones = responseData.data.map((passenger: any) => passenger.phone);
  589. expect(phones).toContain('13811112222');
  590. expect(phones).toContain('13811113333');
  591. }
  592. });
  593. it('应该能够按证件号码搜索乘客', async () => {
  594. const dataSource = await IntegrationTestDatabase.getDataSource();
  595. if (!dataSource) throw new Error('Database not initialized');
  596. await TestDataFactory.createTestPassenger(dataSource, {
  597. userId: testUser.id,
  598. name: '乘客1',
  599. idNumber: '110101199001011111'
  600. });
  601. await TestDataFactory.createTestPassenger(dataSource, {
  602. userId: testUser.id,
  603. name: '乘客2',
  604. idNumber: '110101199001012222'
  605. });
  606. const response = await client.passengers.$get({
  607. query: { keyword: '11010119900101', page: 1, pageSize: 10 }
  608. },
  609. {
  610. headers: {
  611. 'Authorization': `Bearer ${testToken}`
  612. }
  613. });
  614. IntegrationTestAssertions.expectStatus(response, 200);
  615. if (response.status === 200) {
  616. const responseData = await response.json();
  617. expect(responseData.data.length).toBe(2);
  618. const idNumbers = responseData.data.map((passenger: any) => passenger.idNumber);
  619. expect(idNumbers).toContain('110101199001011111');
  620. expect(idNumbers).toContain('110101199001012222');
  621. }
  622. });
  623. });
  624. describe('权限控制测试', () => {
  625. it('应该拒绝未认证用户的访问', async () => {
  626. const response = await client.passengers.$get({
  627. query: { page: 1, pageSize: 10 }
  628. });
  629. expect(response.status).toBe(401);
  630. });
  631. it('应该拒绝无效token的访问', async () => {
  632. const response = await client.passengers.$get({
  633. query: { page: 1, pageSize: 10 }
  634. },
  635. {
  636. headers: {
  637. 'Authorization': 'Bearer invalid_token'
  638. }
  639. });
  640. expect(response.status).toBe(401);
  641. });
  642. });
  643. describe('性能测试', () => {
  644. it('乘客列表查询响应时间应小于200ms', async () => {
  645. const dataSource = await IntegrationTestDatabase.getDataSource();
  646. if (!dataSource) throw new Error('Database not initialized');
  647. // 创建一些测试数据
  648. for (let i = 0; i < 10; i++) {
  649. await TestDataFactory.createTestPassenger(dataSource, {
  650. userId: testUser.id,
  651. name: `性能测试乘客_${i}`,
  652. phone: `138${i.toString().padStart(8, '0')}`
  653. });
  654. }
  655. const startTime = Date.now();
  656. const response = await client.passengers.$get({
  657. query: { page: 1, pageSize: 10 }
  658. },
  659. {
  660. headers: {
  661. 'Authorization': `Bearer ${testToken}`
  662. }
  663. });
  664. const endTime = Date.now();
  665. const responseTime = endTime - startTime;
  666. IntegrationTestAssertions.expectStatus(response, 200);
  667. expect(responseTime).toBeLessThan(200); // 响应时间应小于200ms
  668. });
  669. });
  670. });