Add feature tests for domain order management

- Implement AdminDomainOrderTest to cover admin functionalities for domain orders including listing, confirming registration, KYC updates, activation, rejection, and refunds.
- Implement ClientDomainOrderTest to cover client functionalities for placing domain orders, including validation for balance, duplicate orders, and domain normalization.
- Ensure proper handling of domain pricing and service statuses throughout the tests.
This commit is contained in:
baodev0
2026-07-10 14:16:35 +07:00
parent 61c0e026c8
commit dfb926055d
81 changed files with 35743 additions and 481 deletions
+103 -38
View File
@@ -3,6 +3,9 @@
use App\Http\Controllers\admin\VCenterManagerController;
use App\Http\Controllers\Api\Admin\Auth\AuthController;
use App\Http\Controllers\Api\Admin\Setting\SettingController as AdminSettingController;
use App\Http\Controllers\Api\Admin\Domain\AdminDomainOrderController;
use App\Http\Controllers\Api\Admin\Domain\AdminDomainPricingController;
use App\Http\Controllers\Api\Admin\Domain\InetDomainController;
use App\Http\Controllers\Api\QueueMonitorController;
use App\Http\Controllers\Api\Admin\Staff\StaffOnlineController;
use App\Http\Controllers\Api\Admin\Customer\CustomerController;
@@ -33,6 +36,7 @@ use App\Http\Controllers\Api\Admin\Transaction\AdminTransactionController;
use App\Http\Controllers\Api\Admin\Ticket\TicketController as AdminTicketController;
use App\Http\Controllers\Api\Admin\Docs\PostCategoryController as AdminPostCategoryController;
use App\Http\Controllers\Api\Admin\Docs\PostController as AdminPostController;
use App\Http\Controllers\Api\Admin\Media\MediaController as AdminMediaController;
use App\Http\Controllers\Api\NotificationController;
use App\Http\Controllers\Api\Admin\InfraManagement\InfraManagementController;
use App\Http\Services\Media;
@@ -41,6 +45,7 @@ use App\Models\ModuleVmware;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Barryvdh\DomPDF\Facade\Pdf;
/*
|--------------------------------------------------------------------------
@@ -62,7 +67,6 @@ Route::prefix('v1')
Route::post('{invoiceNumber}/send-email', 'sendInvoiceEmail');
Route::get('{invoiceNumber}/preview-pdf', 'previewInvoicePdf');
});
})
/* Api for Admin */
->group(function () {
@@ -116,19 +120,24 @@ Route::prefix('v1')
Route::delete('{uuid}/destroy', 'destroy')->middleware('perm:customer.destroy');
Route::post('{uuid}/reset-password', 'resetPassword')->middleware('perm:customer.edit');
Route::post('{uuid}/send-password', 'sendPasswordEmail')->middleware('perm:customer.edit');
Route::post('{uuid}/send-email', 'sendEmail')->middleware('perm:customer.edit');
Route::post('{uuid}/login-as', 'loginAs')->middleware('perm:customer.edit');
Route::post('{uuid}/add-credit', 'addCredit')->middleware('perm:customer.edit');
Route::post('{uuid}/add-total', 'addTotal')->middleware('perm:customer.edit');
Route::get('{uuid}/services', 'getServices')->middleware('perm:customer.view');
Route::post('{uuid}/services', 'createService')->middleware('perm:customer.edit');
Route::post('{uuid}/services/bulk-delete', 'bulkDeleteServices')->middleware('perm:customer.edit');
Route::post('{uuid}/services/bulk-delete', 'bulkDeleteServices')->middleware(
'perm:customer.edit',
);
Route::put('{uuid}/services/{serviceId}', 'updateService')->middleware('perm:customer.edit');
Route::get('{uuid}/orders', 'getOrders')->middleware('perm:customer.view');
Route::get('{uuid}/invoices', 'getInvoices')->middleware('perm:customer.view');
Route::get('{uuid}/transactions', 'getTransactions')->middleware('perm:customer.view');
Route::get('{uuid}/domains', 'getDomains')->middleware('perm:customer.view');
Route::get('{uuid}/dns-domains', 'getDnsDomains')->middleware('perm:customer.view');
Route::get('{uuid}/dns-domains/{domainId}/records', 'getDnsDomainRecords')->middleware('perm:customer.view');
Route::get('{uuid}/dns-domains/{domainId}/records', 'getDnsDomainRecords')->middleware(
'perm:customer.view',
);
Route::post('{uuid}/restore', 'restore')->middleware('perm:customer.edit');
Route::delete('{uuid}/force', 'forceDelete')->middleware('perm:customer.destroy');
});
@@ -380,6 +389,39 @@ Route::prefix('v1')
Route::delete('{id}', 'destroy')->middleware('perm:module-vcenter.manager');
});
// Domain Orders (module: order)
Route::prefix('domain-orders')
->controller(AdminDomainOrderController::class)
->group(function () {
Route::get('pending-count', 'pendingCount')->middleware('perm:order.view');
Route::get('/', 'index')->middleware('perm:order.view');
Route::get('{id}', 'show')->middleware('perm:order.view');
Route::post('{id}/confirm-registration', 'confirmRegistration')->middleware('perm:order.edit');
Route::patch('{id}/kyc', 'updateKyc')->middleware('perm:order.edit');
Route::patch('{id}/activate', 'activate')->middleware('perm:order.edit');
Route::post('{id}/reject-and-refund', 'rejectAndRefund')->middleware('perm:order.edit');
});
// Domain Pricing (module: settings)
Route::prefix('domain-pricing')
->controller(AdminDomainPricingController::class)
->group(function () {
Route::get('/', 'index');
Route::put('/', 'update');
Route::post('/reset', 'reset');
});
// Domain Tools — proxy tới iNET API (module: domain.manager)
Route::prefix('domain-tools')
->controller(InetDomainController::class)
->group(function () {
Route::get('whois/{domain}', 'whois')->middleware('perm:domain.manager');
Route::get('check-available', 'checkAvailable')->middleware('perm:domain.manager');
Route::post('bulk-check-available', 'bulkCheckAvailable')->middleware('perm:domain.manager');
Route::post('ai-suggest', 'aiSuggest')->middleware('perm:domain.manager');
Route::get('suffixes', 'suffixes')->middleware('perm:domain.manager');
});
// Settings (module: administrator)
Route::prefix('settings')
->controller(AdminSettingController::class)
@@ -388,25 +430,42 @@ Route::prefix('v1')
Route::put('/', 'update');
});
Route::prefix('media')
->controller(AdminMediaController::class)
->group(function () {
Route::get('/', 'index');
});
Route::post('media/upload', [AdminSettingController::class, 'uploadMedia']);
// Provider (active vCenter chain + provider settings — module: module-vcenter)
Route::prefix('provider')
->group(function () {
Route::get('active-chain', [\App\Http\Controllers\Api\Admin\Provider\ActiveInfraController::class, 'chain'])
->middleware('perm:module-vcenter.view');
Route::post('{type}/{id}/activate', [\App\Http\Controllers\Api\Admin\Provider\ActiveInfraController::class, 'activate'])
->whereIn('type', ['vcenter', 'datacenter', 'host', 'datastore', 'network'])
->middleware('perm:module-vcenter.edit');
Route::post('{type}/{id}/deactivate', [\App\Http\Controllers\Api\Admin\Provider\ActiveInfraController::class, 'deactivate'])
->whereIn('type', ['vcenter', 'datacenter', 'host', 'datastore', 'network'])
->middleware('perm:module-vcenter.edit');
Route::prefix('provider')->group(function () {
Route::get('active-chain', [
\App\Http\Controllers\Api\Admin\Provider\ActiveInfraController::class,
'chain',
])->middleware('perm:module-vcenter.view');
Route::post('{type}/{id}/activate', [
\App\Http\Controllers\Api\Admin\Provider\ActiveInfraController::class,
'activate',
])
->whereIn('type', ['vcenter', 'datacenter', 'host', 'datastore', 'network'])
->middleware('perm:module-vcenter.edit');
Route::post('{type}/{id}/deactivate', [
\App\Http\Controllers\Api\Admin\Provider\ActiveInfraController::class,
'deactivate',
])
->whereIn('type', ['vcenter', 'datacenter', 'host', 'datastore', 'network'])
->middleware('perm:module-vcenter.edit');
Route::get('settings', [\App\Http\Controllers\Api\Admin\Provider\ProviderSettingController::class, 'index'])
->middleware('perm:module-vcenter.view');
Route::put('settings', [\App\Http\Controllers\Api\Admin\Provider\ProviderSettingController::class, 'update'])
->middleware('perm:module-vcenter.edit');
});
Route::get('settings', [
\App\Http\Controllers\Api\Admin\Provider\ProviderSettingController::class,
'index',
])->middleware('perm:module-vcenter.view');
Route::put('settings', [
\App\Http\Controllers\Api\Admin\Provider\ProviderSettingController::class,
'update',
])->middleware('perm:module-vcenter.edit');
});
// Dashboard Stats
Route::prefix('dashboard')
@@ -456,27 +515,27 @@ Route::prefix('v1')
Route::prefix('email-templates')
->controller(EmailTemplateController::class)
->group(function () {
Route::get('/', 'index');
Route::post('/', 'store');
Route::get('email-settings', 'getEmailSettings');
Route::put('email-settings', 'updateEmailSettings');
Route::get('{id}', 'show');
Route::put('{id}', 'update');
Route::delete('{id}', 'destroy');
Route::get('{id}/preview-invoice','previewInvoiceJson');
Route::get('/', 'index');
Route::post('/', 'store');
Route::get('email-settings', 'getEmailSettings');
Route::put('email-settings', 'updateEmailSettings');
Route::get('{id}', 'show');
Route::put('{id}', 'update');
Route::delete('{id}', 'destroy');
Route::get('{id}/preview-invoice', 'previewInvoiceJson');
});
// Notification Email Templates — block-based editor
Route::prefix('notification-templates')
->controller(EmailNotificationTemplateController::class)
->group(function () {
Route::get('/', 'index');
Route::post('/', 'store');
Route::get('field-definitions','fieldDefinitions');
Route::get('{id}', 'show');
Route::put('{id}', 'update');
Route::delete('{id}', 'destroy');
Route::get('{id}/preview', 'preview');
Route::get('/', 'index');
Route::post('/', 'store');
Route::get('field-definitions', 'fieldDefinitions');
Route::get('{id}', 'show');
Route::put('{id}', 'update');
Route::delete('{id}', 'destroy');
Route::get('{id}/preview', 'preview');
});
// Transactions — manual deposit review (module: transaction)
@@ -527,9 +586,15 @@ Route::prefix('v1')
Route::prefix('notifications')
->controller(NotificationController::class)
->group(function () {
Route::get('/', fn () => app(NotificationController::class)->index(request(), 'admin'));
Route::patch('{id}/read', fn ($id) => app(NotificationController::class)->markRead(request(), 'admin', (int) $id));
Route::patch('read-all', fn () => app(NotificationController::class)->markAllRead(request(), 'admin'));
Route::get('/', fn() => app(NotificationController::class)->index(request(), 'admin'));
Route::patch(
'{id}/read',
fn($id) => app(NotificationController::class)->markRead(request(), 'admin', (int) $id),
);
Route::patch(
'read-all',
fn() => app(NotificationController::class)->markAllRead(request(), 'admin'),
);
});
// Activity Logs
@@ -633,8 +698,8 @@ Route::prefix('v1')
})->name('api.GetConsoleTicket');
});
Route::prefix('hello')->group(function () {
return 'heloo world';
Route::get('pdf-invoice', function () {
// return Pdf::loadView('pdf.invoice-pdf')->setPaper('a4', 'portrait')->stream('hoa-don-mau.pdf');
});
});