支付功能+bugfix

Change-Id: I91a87ee5cb22aebe7ca8fc28722102c6f49f4c31
diff --git a/tests/services/post.test.ts b/tests/services/post.test.ts
index 8481bf6..d44ddb3 100644
--- a/tests/services/post.test.ts
+++ b/tests/services/post.test.ts
@@ -583,6 +583,202 @@
     });
   });
 
+  // 新推广支付流程测试
+  describe('new promotion payment flow', () => {
+    it('应该成功执行新推广流程:发布帖子 -> 创建支付 -> 确认支付', async () => {
+      // 1. 先发布帖子
+      const publishResponse = {
+        code: 200,
+        data: { postId: 123, message: '帖子发布成功' }
+      };
+      (request as jest.Mock).mockResolvedValueOnce(publishResponse);
+      
+      const postData = {
+        title: '推广帖子标题',
+        content: '推广帖子内容',
+        summary: '推广帖子摘要',
+        tags: 'tag1,tag2'
+      };
+      
+      const publishResult = await postService.publishPost(postData);
+      expect(publishResult).toEqual(publishResponse);
+      
+      // 2. 创建支付记录(使用真实的帖子ID)
+      const paymentResponse = {
+        code: 200,
+        data: {
+          paymentId: 1,
+          postId: 123, // 真实的帖子ID
+          planId: 1,
+          amount: 50.00,
+          paymentStatus: 'pending'
+        }
+      };
+      (request as jest.Mock).mockResolvedValueOnce(paymentResponse);
+      
+      const paymentData = {
+        postId: 123, // 使用发布帖子返回的ID
+        planId: 1,
+        amount: 50.00
+      };
+      
+      const paymentResult = await postService.createPayment(paymentData);
+      expect(paymentResult).toEqual(paymentResponse);
+      
+      // 3. 确认支付
+      const confirmResponse = { code: 200, msg: '支付成功,推广已生效' };
+      (request as jest.Mock).mockResolvedValueOnce(confirmResponse);
+      
+      const confirmResult = await postService.confirmPayment(1);
+      expect(confirmResult).toEqual(confirmResponse);
+      
+      // 验证API调用顺序和参数
+      expect(request).toHaveBeenCalledTimes(3);
+      expect(request).toHaveBeenNthCalledWith(1, '/api/post-center/publish', {
+        method: 'POST',
+        data: postData,
+      });
+      expect(request).toHaveBeenNthCalledWith(2, '/api/post-center/payment', {
+        method: 'POST',
+        data: paymentData,
+      });
+      expect(request).toHaveBeenNthCalledWith(3, '/api/post-center/payment/confirm/1', {
+        method: 'POST',
+      });
+    });
+
+    it('应该处理支付失败后重新尝试支付的场景', async () => {
+      // 第一次支付失败,第二次应该复用已创建的帖子
+      const paymentData = {
+        postId: 123, // 复用已创建的帖子ID
+        planId: 1,
+        amount: 50.00
+      };
+      
+      // 第一次支付失败
+      const failedPaymentResponse = { code: 400, msg: '支付处理失败' };
+      (request as jest.Mock).mockResolvedValueOnce(failedPaymentResponse);
+      
+      let result = await postService.createPayment(paymentData);
+      expect(result).toEqual(failedPaymentResponse);
+      
+      // 第二次支付成功
+      const successPaymentResponse = {
+        code: 200,
+        data: {
+          paymentId: 2,
+          postId: 123,
+          planId: 1,
+          amount: 50.00,
+          paymentStatus: 'pending'
+        }
+      };
+      (request as jest.Mock).mockResolvedValueOnce(successPaymentResponse);
+      
+      result = await postService.createPayment(paymentData);
+      expect(result).toEqual(successPaymentResponse);
+      
+      // 验证使用的是同一个帖子ID
+      expect(request).toHaveBeenCalledTimes(2);
+      expect(request).toHaveBeenNthCalledWith(1, '/api/post-center/payment', {
+        method: 'POST',
+        data: paymentData,
+      });
+      expect(request).toHaveBeenNthCalledWith(2, '/api/post-center/payment', {
+        method: 'POST',
+        data: paymentData,
+      });
+    });
+
+    it('应该成功删除取消发布的草稿帖子', async () => {
+      const deleteResponse = { code: 200, msg: '草稿帖子删除成功' };
+      (request as jest.Mock).mockResolvedValue(deleteResponse);
+      
+      const result = await postService.deletePost(123);
+      expect(result).toEqual(deleteResponse);
+      
+      expect(request).toHaveBeenCalledWith('/api/post-center/delete/123', {
+        method: 'DELETE',
+      });
+    });
+
+    it('应该处理发布帖子成功但创建支付失败的情况', async () => {
+      // 1. 发布帖子成功
+      const publishResponse = {
+        code: 200,
+        data: { postId: 123, message: '帖子发布成功' }
+      };
+      (request as jest.Mock).mockResolvedValueOnce(publishResponse);
+      
+      const postData = {
+        title: '推广帖子标题',
+        content: '推广帖子内容',
+        summary: '推广帖子摘要',
+        tags: 'tag1,tag2'
+      };
+      
+      await postService.publishPost(postData);
+      
+      // 2. 创建支付失败
+      const paymentResponse = { code: 400, msg: '该帖子已购买推广服务' };
+      (request as jest.Mock).mockResolvedValueOnce(paymentResponse);
+      
+      const paymentData = {
+        postId: 123,
+        planId: 1,
+        amount: 50.00
+      };
+      
+      const paymentResult = await postService.createPayment(paymentData);
+      expect(paymentResult).toEqual(paymentResponse);
+    });
+
+    it('应该处理发布帖子失败的情况', async () => {
+      const publishResponse = { code: 400, msg: '帖子标题不能为空' };
+      (request as jest.Mock).mockResolvedValue(publishResponse);
+      
+      const postData = {
+        title: '',
+        content: '内容',
+        summary: '摘要',
+        tags: 'tag1'
+      };
+      
+      const result = await postService.publishPost(postData);
+      expect(result).toEqual(publishResponse);
+    });
+
+    it('应该处理支付确认失败的情况', async () => {
+      const confirmResponse = { code: 400, msg: '支付记录中的帖子ID无效' };
+      (request as jest.Mock).mockResolvedValue(confirmResponse);
+      
+      const result = await postService.confirmPayment(1);
+      expect(result).toEqual(confirmResponse);
+    });
+
+    it('应该成功取消支付并返回发布页面', async () => {
+      const cancelResponse = { code: 200, msg: '支付已取消' };
+      (request as jest.Mock).mockResolvedValue(cancelResponse);
+      
+      const result = await postService.cancelPayment(1);
+      expect(result).toEqual(cancelResponse);
+    });
+
+    it('应该处理重复购买推广的情况', async () => {
+      const paymentResponse = { code: 400, msg: '该帖子已购买推广服务' };
+      (request as jest.Mock).mockResolvedValue(paymentResponse);
+      
+      const paymentData = {
+        postId: 123,
+        planId: 1,
+        amount: 50.00
+      };
+      
+      const result = await postService.createPayment(paymentData);
+      expect(result).toEqual(paymentResponse);
+    });
+  });
+
   // 举报相关测试
   describe('report operations', () => {
     it('应该成功举报帖子', async () => {