322 lines
9.4 KiB
PHP
322 lines
9.4 KiB
PHP
<?php
|
|
/**
|
|
* 订阅流程测试脚本
|
|
*
|
|
* @package Yoone_Subscriptions
|
|
* @subpackage Tests
|
|
*/
|
|
|
|
// 防止直接访问
|
|
if (!defined('ABSPATH')) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* 订阅流程测试类
|
|
*/
|
|
class Yoone_Subscription_Flow_Test {
|
|
|
|
private $test_results = array();
|
|
private $customer_id;
|
|
private $product_id;
|
|
private $subscription_id;
|
|
|
|
/**
|
|
* 运行完整的订阅流程测试
|
|
*/
|
|
public function run_full_test() {
|
|
$this->log_test('开始订阅流程测试');
|
|
|
|
try {
|
|
// 1. 环境检查
|
|
$this->test_environment();
|
|
|
|
// 2. 创建测试数据
|
|
$this->setup_test_data();
|
|
|
|
// 3. 测试订阅创建
|
|
$this->test_subscription_creation();
|
|
|
|
// 4. 测试订阅激活
|
|
$this->test_subscription_activation();
|
|
|
|
// 5. 测试订阅暂停
|
|
$this->test_subscription_pause();
|
|
|
|
// 6. 测试订阅恢复
|
|
$this->test_subscription_resume();
|
|
|
|
// 7. 测试续费处理
|
|
$this->test_subscription_renewal();
|
|
|
|
// 8. 测试订阅取消
|
|
$this->test_subscription_cancellation();
|
|
|
|
// 9. 清理测试数据
|
|
$this->cleanup_test_data();
|
|
|
|
$this->log_test('订阅流程测试完成');
|
|
|
|
} catch (Exception $e) {
|
|
$this->log_test('测试失败: ' . $e->getMessage(), 'error');
|
|
$this->cleanup_test_data();
|
|
}
|
|
|
|
return $this->test_results;
|
|
}
|
|
|
|
/**
|
|
* 环境检查
|
|
*/
|
|
private function test_environment() {
|
|
$this->log_test('检查测试环境');
|
|
|
|
// 检查必要的类是否存在
|
|
$required_classes = array(
|
|
'Yoone_Subscription',
|
|
'Yoone_Subscription_Manager',
|
|
'Yoone_Payment_Token',
|
|
'WC_Product'
|
|
);
|
|
|
|
foreach ($required_classes as $class) {
|
|
if (!class_exists($class)) {
|
|
throw new Exception("必需的类 {$class} 不存在");
|
|
}
|
|
}
|
|
|
|
// 检查数据库表
|
|
global $wpdb;
|
|
$tables = array(
|
|
$wpdb->prefix . 'yoone_subscriptions',
|
|
$wpdb->prefix . 'yoone_subscription_items',
|
|
$wpdb->prefix . 'yoone_payment_tokens'
|
|
);
|
|
|
|
foreach ($tables as $table) {
|
|
$exists = $wpdb->get_var("SHOW TABLES LIKE '{$table}'");
|
|
if (!$exists) {
|
|
throw new Exception("数据库表 {$table} 不存在");
|
|
}
|
|
}
|
|
|
|
$this->log_test('环境检查通过', 'success');
|
|
}
|
|
|
|
/**
|
|
* 创建测试数据
|
|
*/
|
|
private function setup_test_data() {
|
|
$this->log_test('创建测试数据');
|
|
|
|
// 创建测试客户
|
|
$this->customer_id = Yoone_Test_Config::create_test_customer();
|
|
if (!$this->customer_id) {
|
|
throw new Exception('创建测试客户失败');
|
|
}
|
|
|
|
// 创建测试产品
|
|
$this->product_id = Yoone_Test_Config::create_test_product('subscription');
|
|
if (!$this->product_id) {
|
|
throw new Exception('创建测试产品失败');
|
|
}
|
|
|
|
$this->log_test("测试数据创建成功 - 客户ID: {$this->customer_id}, 产品ID: {$this->product_id}", 'success');
|
|
}
|
|
|
|
/**
|
|
* 测试订阅创建
|
|
*/
|
|
private function test_subscription_creation() {
|
|
$this->log_test('测试订阅创建');
|
|
|
|
$subscription = new Yoone_Subscription();
|
|
$subscription->set_customer_id($this->customer_id);
|
|
$subscription->set_status('pending');
|
|
$subscription->set_billing_period('month');
|
|
$subscription->set_billing_interval(1);
|
|
$subscription->set_start_date(current_time('mysql'));
|
|
$subscription->set_total(29.99);
|
|
$subscription->set_currency('CAD');
|
|
|
|
// 添加订阅商品
|
|
$subscription->add_item(array(
|
|
'product_id' => $this->product_id,
|
|
'quantity' => 1,
|
|
'line_total' => 29.99
|
|
));
|
|
|
|
// 保存订阅
|
|
$this->subscription_id = $subscription->save();
|
|
|
|
if (!$this->subscription_id) {
|
|
throw new Exception('订阅创建失败');
|
|
}
|
|
|
|
// 验证订阅数据
|
|
$saved_subscription = new Yoone_Subscription($this->subscription_id);
|
|
if ($saved_subscription->get_customer_id() !== $this->customer_id) {
|
|
throw new Exception('订阅数据验证失败');
|
|
}
|
|
|
|
$this->log_test("订阅创建成功 - ID: {$this->subscription_id}", 'success');
|
|
}
|
|
|
|
/**
|
|
* 测试订阅激活
|
|
*/
|
|
private function test_subscription_activation() {
|
|
$this->log_test('测试订阅激活');
|
|
|
|
$subscription = new Yoone_Subscription($this->subscription_id);
|
|
$result = $subscription->activate();
|
|
|
|
if (!$result) {
|
|
throw new Exception('订阅激活失败');
|
|
}
|
|
|
|
// 验证状态
|
|
$subscription = new Yoone_Subscription($this->subscription_id);
|
|
if ($subscription->get_status() !== 'active') {
|
|
throw new Exception('订阅状态验证失败');
|
|
}
|
|
|
|
$this->log_test('订阅激活成功', 'success');
|
|
}
|
|
|
|
/**
|
|
* 测试订阅暂停
|
|
*/
|
|
private function test_subscription_pause() {
|
|
$this->log_test('测试订阅暂停');
|
|
|
|
$subscription = new Yoone_Subscription($this->subscription_id);
|
|
$result = $subscription->pause();
|
|
|
|
if (!$result) {
|
|
throw new Exception('订阅暂停失败');
|
|
}
|
|
|
|
// 验证状态
|
|
$subscription = new Yoone_Subscription($this->subscription_id);
|
|
if ($subscription->get_status() !== 'on-hold') {
|
|
throw new Exception('订阅暂停状态验证失败');
|
|
}
|
|
|
|
$this->log_test('订阅暂停成功', 'success');
|
|
}
|
|
|
|
/**
|
|
* 测试订阅恢复
|
|
*/
|
|
private function test_subscription_resume() {
|
|
$this->log_test('测试订阅恢复');
|
|
|
|
$subscription = new Yoone_Subscription($this->subscription_id);
|
|
$result = $subscription->resume();
|
|
|
|
if (!$result) {
|
|
throw new Exception('订阅恢复失败');
|
|
}
|
|
|
|
// 验证状态
|
|
$subscription = new Yoone_Subscription($this->subscription_id);
|
|
if ($subscription->get_status() !== 'active') {
|
|
throw new Exception('订阅恢复状态验证失败');
|
|
}
|
|
|
|
$this->log_test('订阅恢复成功', 'success');
|
|
}
|
|
|
|
/**
|
|
* 测试续费处理
|
|
*/
|
|
private function test_subscription_renewal() {
|
|
$this->log_test('测试续费处理');
|
|
|
|
$subscription = new Yoone_Subscription($this->subscription_id);
|
|
|
|
// 设置下次付款日期为过去时间以触发续费
|
|
$past_date = date('Y-m-d H:i:s', strtotime('-1 day'));
|
|
$subscription->set_next_payment_date($past_date);
|
|
$subscription->save();
|
|
|
|
// 模拟续费处理
|
|
$renewal_result = $subscription->process_renewal();
|
|
|
|
if (!$renewal_result) {
|
|
// 续费可能因为没有支付方式而失败,这在测试中是正常的
|
|
$this->log_test('续费处理完成(可能因缺少支付方式而失败,这是正常的)', 'warning');
|
|
} else {
|
|
$this->log_test('续费处理成功', 'success');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 测试订阅取消
|
|
*/
|
|
private function test_subscription_cancellation() {
|
|
$this->log_test('测试订阅取消');
|
|
|
|
$subscription = new Yoone_Subscription($this->subscription_id);
|
|
$result = $subscription->cancel();
|
|
|
|
if (!$result) {
|
|
throw new Exception('订阅取消失败');
|
|
}
|
|
|
|
// 验证状态
|
|
$subscription = new Yoone_Subscription($this->subscription_id);
|
|
if ($subscription->get_status() !== 'cancelled') {
|
|
throw new Exception('订阅取消状态验证失败');
|
|
}
|
|
|
|
$this->log_test('订阅取消成功', 'success');
|
|
}
|
|
|
|
/**
|
|
* 清理测试数据
|
|
*/
|
|
private function cleanup_test_data() {
|
|
$this->log_test('清理测试数据');
|
|
|
|
// 删除测试订阅
|
|
if ($this->subscription_id) {
|
|
$subscription = new Yoone_Subscription($this->subscription_id);
|
|
$subscription->delete();
|
|
}
|
|
|
|
// 删除测试产品
|
|
if ($this->product_id) {
|
|
wp_delete_post($this->product_id, true);
|
|
}
|
|
|
|
// 删除测试客户
|
|
if ($this->customer_id) {
|
|
wp_delete_user($this->customer_id);
|
|
}
|
|
|
|
$this->log_test('测试数据清理完成', 'success');
|
|
}
|
|
|
|
/**
|
|
* 记录测试结果
|
|
*/
|
|
private function log_test($message, $type = 'info') {
|
|
$this->test_results[] = array(
|
|
'timestamp' => current_time('mysql'),
|
|
'message' => $message,
|
|
'type' => $type
|
|
);
|
|
|
|
// 同时记录到日志系统
|
|
Yoone_Logger::info('订阅流程测试: ' . $message);
|
|
}
|
|
|
|
/**
|
|
* 获取测试结果
|
|
*/
|
|
public function get_test_results() {
|
|
return $this->test_results;
|
|
}
|
|
} |