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 () => {
