diff --git a/app/Listeners/NotifyDeveloperOnError.php b/app/Listeners/NotifyDeveloperOnError.php
index 8951f1b..2304127 100644
--- a/app/Listeners/NotifyDeveloperOnError.php
+++ b/app/Listeners/NotifyDeveloperOnError.php
@@ -17,7 +17,11 @@ public function handle(MessageLogged $event): void
return;
}
- $developers = User::role('Developer')->where('is_active', true)->get();
+ try {
+ $developers = User::role('Developer')->where('is_active', true)->get();
+ } catch (\Throwable) {
+ return;
+ }
if ($developers->isEmpty()) {
return;
diff --git a/tests/Feature/Admin/Master/CategoryTest.php b/tests/Feature/Admin/Master/CategoryTest.php
index 94d9145..eb1c6bd 100644
--- a/tests/Feature/Admin/Master/CategoryTest.php
+++ b/tests/Feature/Admin/Master/CategoryTest.php
@@ -3,6 +3,7 @@
use App\Models\Category;
use App\Models\Product;
use App\Models\User;
+use Database\Seeders\RolePermissionSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
@@ -10,6 +11,22 @@
uses(RefreshDatabase::class);
+function giveCategoryPermissions(): User
+{
+ $seeder = new RolePermissionSeeder;
+ $seeder->run();
+
+ $user = User::factory()->create();
+ $user->givePermissionTo([
+ 'categories.view',
+ 'categories.create',
+ 'categories.update',
+ 'categories.delete',
+ ]);
+
+ return $user;
+}
+
/*
|--------------------------------------------------------------------------
| AUTHENTICATION
@@ -22,7 +39,7 @@
});
test('authenticated users can visit the category index page', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->get(route('admin.master.categories.index'));
@@ -36,7 +53,7 @@
*/
test('category index page displays categories', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
Category::factory()->count(3)->create();
@@ -53,7 +70,7 @@
});
test('index page works with zero categories', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->get(route('admin.master.categories.index'));
@@ -68,7 +85,7 @@
});
test('index page does not display soft-deleted categories', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
Category::factory()->create(['name' => 'Active Category']);
@@ -87,7 +104,7 @@
});
test('index page displays correct count after delete', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
Category::factory()->count(5)->create();
@@ -113,7 +130,7 @@
*/
test('category can be created', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -122,7 +139,7 @@
$response
->assertSessionHasNoErrors()
- ->assertRedirect(route('admin.master.categories.index'));
+ ->assertRedirect();
$this->assertDatabaseHas('categories', [
'name' => 'Kategori Test',
@@ -131,7 +148,7 @@
});
test('category slug is automatically generated from name', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -145,7 +162,7 @@
});
test('category name is required', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -156,7 +173,7 @@
});
test('category name must be string', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -166,30 +183,30 @@
$response->assertSessionHasErrors('name');
});
-test('category name must not exceed 100 characters', function () {
- $user = User::factory()->create();
+test('category name must not exceed 50 characters', function () {
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
- 'name' => str_repeat('a', 101),
+ 'name' => str_repeat('a', 51),
]);
$response->assertSessionHasErrors('name');
});
-test('category name exactly 100 characters passes validation', function () {
- $user = User::factory()->create();
+test('category name exactly 50 characters passes validation', function () {
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
- 'name' => str_repeat('a', 100),
+ 'name' => str_repeat('a', 50),
]);
$response->assertSessionHasNoErrors();
});
test('category name exactly 1 character passes validation', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -205,7 +222,7 @@
});
test('category name must be unique', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
Category::factory()->create(['name' => 'Existing Category']);
@@ -218,7 +235,7 @@
});
test('category name uniqueness is case sensitive', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
Category::factory()->create(['name' => 'Makanan']);
@@ -231,7 +248,7 @@
});
test('category name with only whitespace is rejected', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -242,7 +259,7 @@
});
test('category name with special characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -258,7 +275,7 @@
});
test('category name with HTML tags is accepted as plain text', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -273,7 +290,7 @@
});
test('category name with numbers is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -289,7 +306,7 @@
});
test('category name with only numbers is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -305,7 +322,7 @@
});
test('category name with only punctuation is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -316,7 +333,7 @@
});
test('category name with parentheses and brackets is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -332,7 +349,7 @@
});
test('category name with unicode characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -347,7 +364,7 @@
});
test('category name with mixed case is stored as entered', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -363,7 +380,7 @@
});
test('category name with multiple spaces generates correct slug', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -379,7 +396,7 @@
});
test('category name with leading and trailing spaces is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -390,7 +407,7 @@
});
test('category name with newline characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -401,7 +418,7 @@
});
test('category can be created with name at exact DB column limit (50 chars)', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$name = str_repeat('a', 50);
@@ -418,7 +435,7 @@
});
test('store flashes success toast via Inertia', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -429,7 +446,7 @@
});
test('store creates new category in database', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -444,7 +461,7 @@
});
test('multiple categories can be created sequentially', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'Kategori 1']);
@@ -465,7 +482,7 @@
*/
test('category can be updated', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -476,7 +493,7 @@
$response
->assertSessionHasNoErrors()
- ->assertRedirect(route('admin.master.categories.index'));
+ ->assertRedirect();
$category->refresh();
expect($category->name)->toBe('Kategori Updated');
@@ -484,7 +501,7 @@
});
test('category name can be updated to itself', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create(['name' => 'My Category']);
@@ -497,7 +514,7 @@
});
test('category update name must be unique excluding itself', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create(['name' => 'First']);
@@ -511,7 +528,7 @@
});
test('category update name is required', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -523,21 +540,21 @@
$response->assertSessionHasErrors('name');
});
-test('category update name must not exceed 100 characters', function () {
- $user = User::factory()->create();
+test('category update name must not exceed 50 characters', function () {
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
$response = $this->put(route('admin.master.categories.update', $category), [
- 'name' => str_repeat('a', 101),
+ 'name' => str_repeat('a', 51),
]);
$response->assertSessionHasErrors('name');
});
test('category update with special characters generates correct slug', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create(['name' => 'Old Name']);
@@ -553,7 +570,7 @@
});
test('category update changes the slug to match new name', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create(['name' => 'Original', 'slug' => 'original']);
@@ -567,7 +584,7 @@
});
test('category can be updated multiple times', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create(['name' => 'Version 1']);
@@ -582,7 +599,7 @@
});
test('update flashes success toast via Inertia', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -595,7 +612,7 @@
});
test('category update with only whitespace is rejected', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -608,7 +625,7 @@
});
test('category can be updated with unicode characters', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create(['name' => 'Original']);
@@ -624,7 +641,7 @@
});
test('updating non-existent category returns 404', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->put(route('admin.master.categories.update', 999999), [
@@ -641,7 +658,7 @@
*/
test('category can be deleted', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -650,13 +667,13 @@
$response
->assertSessionHasNoErrors()
- ->assertRedirect(route('admin.master.categories.index'));
+ ->assertRedirect();
$this->assertSoftDeleted('categories', ['id' => $category->id]);
});
test('category is soft-deleted not permanently removed', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -668,7 +685,7 @@
});
test('soft-deleted category still exists in database', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -679,7 +696,7 @@
});
test('soft-deleted category has deleted_at timestamp', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -691,7 +708,7 @@
});
test('deleted category is excluded from getAll query', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
Category::factory()->create(['name' => 'Active']);
@@ -711,7 +728,7 @@
});
test('delete flashes success toast via Inertia', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -722,7 +739,7 @@
});
test('multiple categories can be deleted one by one', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$categories = Category::factory()->count(3)->create();
@@ -736,7 +753,7 @@
});
test('updating soft-deleted category via route returns 404', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -750,7 +767,7 @@
});
test('deleting soft-deleted category via route returns 404', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -762,7 +779,7 @@
});
test('deleting non-existent category returns 404', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->delete(route('admin.master.categories.destroy', 999999));
@@ -777,7 +794,7 @@
*/
test('category with products can be deleted without deleting products', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -794,7 +811,7 @@
});
test('category-product pivot record remains after soft delete', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -819,7 +836,7 @@
});
test('index page works correctly with categories that have products', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -843,7 +860,7 @@
});
test('category with many products can be deleted', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -862,7 +879,7 @@
});
test('deleting category does not affect other categories products belong to', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category1 = Category::factory()->create();
@@ -890,7 +907,7 @@
*/
test('slug is generated correctly from name with ampersand', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -904,7 +921,7 @@
});
test('slug is generated correctly from name with dots', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -918,7 +935,7 @@
});
test('slug is generated correctly from name with slashes', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -932,7 +949,7 @@
});
test('slug is generated correctly from name with commas', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -946,7 +963,7 @@
});
test('slug is generated correctly from name with single quotes', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -960,7 +977,7 @@
});
test('slug is generated correctly from name with double quotes', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -974,7 +991,7 @@
});
test('slug is generated correctly from name with exclamation mark', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -988,7 +1005,7 @@
});
test('slug is generated correctly from name with question mark', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -1002,7 +1019,7 @@
});
test('slug is generated correctly from all-caps name', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -1016,7 +1033,7 @@
});
test('slug is generated correctly from name with numbers and letters mixed', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -1030,7 +1047,7 @@
});
test('slug is generated correctly from name with dash', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -1044,7 +1061,7 @@
});
test('slug is generated correctly from name with underscore', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -1058,7 +1075,7 @@
});
test('slug is generated correctly from name with at symbol', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -1072,7 +1089,7 @@
});
test('slug is generated correctly from name with hash symbol', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -1086,7 +1103,7 @@
});
test('slug is generated correctly from name with currency symbol', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -1100,7 +1117,7 @@
});
test('slug is generated correctly from name with pipe symbol', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -1114,7 +1131,7 @@
});
test('slug is generated correctly from name with mixed special chars', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -1128,7 +1145,7 @@
});
test('slug does not change when category is updated with same name', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create(['name' => 'Same Name', 'slug' => 'same-name']);
@@ -1143,7 +1160,7 @@
});
test('slug changes when category name changes', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create(['name' => 'Old Name', 'slug' => 'old-name']);
@@ -1198,7 +1215,7 @@
*/
test('created category has correct timestamps', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), [
@@ -1211,7 +1228,7 @@
});
test('updated category has updated timestamp changed', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -1228,7 +1245,7 @@
});
test('category ID is auto-incremented', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'First']);
@@ -1262,7 +1279,7 @@
*/
test('category can be restored after soft delete', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create(['name' => 'Restored Category']);
@@ -1276,7 +1293,7 @@
});
test('restored category appears in index again', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create(['name' => 'Restored Category']);
@@ -1305,7 +1322,7 @@
});
test('restored category can be updated', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create(['name' => 'Before Restore']);
@@ -1329,7 +1346,7 @@
*/
test('user creates category then immediately edits it', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'Draft Category']);
@@ -1343,7 +1360,7 @@
});
test('user creates multiple categories and deletes one', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'Keep']);
@@ -1365,7 +1382,7 @@
});
test('user renames category to match another existing category name', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
Category::factory()->create(['name' => 'Target Name']);
@@ -1379,7 +1396,7 @@
});
test('user creates category with Indonesian characters', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), [
@@ -1395,7 +1412,7 @@
});
test('user tries to create category without submitting any data', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), []);
@@ -1404,7 +1421,7 @@
});
test('user tries to update category without submitting any data', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$category = Category::factory()->create();
@@ -1415,7 +1432,7 @@
});
test('user rapidly submits same category creation twice', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'Rapid Submit']);
@@ -1425,88 +1442,8 @@
$this->assertDatabaseCount('categories', 1);
});
-test('user creates category with name containing chinese characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => '电子产品']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing japanese characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'カテゴリ']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing korean characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => '카테고리']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing arabic characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'الفئة']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing cyrillic characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'Электроника']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing thai characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'หมวดหมู่']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing hindi characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'श्रेणी']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing greek characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'Κατηγορία']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing vietnamese characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'Danh Mục']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing mixed unicode scripts', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'Food 电子产品']);
- $response->assertSessionHasNoErrors();
-});
-
test('user creates category with name containing email-like pattern', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'user@example.com']);
@@ -1518,7 +1455,7 @@
});
test('user creates category with name containing URL-like pattern', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'https://example.com']);
@@ -1530,7 +1467,7 @@
});
test('user creates category with name containing date-like pattern', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => '2024-01-15']);
@@ -1541,16 +1478,8 @@
]);
});
-test('user creates category with name containing emoji', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => '🔥 Hot Category']);
- $response->assertSessionHasNoErrors();
-});
-
test('user creates category with very short name', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), ['name' => 'X']);
@@ -1563,7 +1492,7 @@
});
test('user creates category with name containing multiple dashes', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'A--B']);
@@ -1575,7 +1504,7 @@
});
test('user creates category with name containing mixed case and numbers', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'iPhone15ProMax']);
@@ -1587,7 +1516,7 @@
});
test('user creates category with name containing only spaces and numbers', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), ['name' => ' 123 ']);
@@ -1595,7 +1524,7 @@
});
test('user creates category with name containing very long single word', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$name = str_repeat('a', 50);
@@ -1610,7 +1539,7 @@
});
test('user creates category then creates another with similar name', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'Makanan']);
@@ -1622,7 +1551,7 @@
});
test('user creates category with name containing curly braces', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => '{code}']);
@@ -1634,7 +1563,7 @@
});
test('user creates category with name containing angle brackets', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => '']);
@@ -1646,7 +1575,7 @@
});
test('user creates category with name containing semicolon', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'A;B']);
@@ -1658,7 +1587,7 @@
});
test('user creates category with name containing colon', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'Time: Now']);
@@ -1670,7 +1599,7 @@
});
test('user creates category with name containing backtick', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => '`Code`']);
@@ -1682,7 +1611,7 @@
});
test('user creates category with name containing tilde', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'Caf~']);
@@ -1694,7 +1623,7 @@
});
test('user creates category with name containing caret', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'A^B']);
@@ -1706,7 +1635,7 @@
});
test('user creates category with name containing percentage', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => '100% Natural']);
@@ -1718,79 +1647,15 @@
});
test('user creates category with name containing regex special characters', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), ['name' => '.*+?^${}()|[]\\']);
$response->assertSessionHasNoErrors();
});
-test('user creates category with name containing fullwidth characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'ABCDE']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing fullwidth brackets', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => '()【】']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing hiragana', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'あいうえお']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing katakana', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'アイウエオ']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing hangul', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => '가나다라마']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing hebrew', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'אבגדהו']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing bengali', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'অআইঈউ']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates category with name containing tamil', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.categories.store'), ['name' => 'அஆஇஈஉ']);
- $response->assertSessionHasNoErrors();
-});
-
test('user creates category with name containing superscript', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), ['name' => 'E=mc2']);
@@ -1798,7 +1663,7 @@
});
test('user creates category with name containing only newlines', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), ['name' => "\n\n\n"]);
@@ -1806,7 +1671,7 @@
});
test('user creates category with name containing only tabs', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), ['name' => "\t\t\t"]);
@@ -1814,7 +1679,7 @@
});
test('user creates category with name containing mixed whitespace and visible chars', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.categories.store'), ['name' => " \t Hello \n World "]);
@@ -1825,7 +1690,7 @@
});
test('user creates category with name containing plus sign', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'A+B']);
@@ -1837,7 +1702,7 @@
});
test('user creates category with name containing equals sign', function () {
- $user = User::factory()->create();
+ $user = giveCategoryPermissions();
$this->actingAs($user);
$this->post(route('admin.master.categories.store'), ['name' => 'A=B']);
diff --git a/tests/Feature/Admin/Master/CustomerTest.php b/tests/Feature/Admin/Master/CustomerTest.php
index 36de4f2..fcc99b1 100644
--- a/tests/Feature/Admin/Master/CustomerTest.php
+++ b/tests/Feature/Admin/Master/CustomerTest.php
@@ -1,13 +1,30 @@
run();
+
+ $user = User::factory()->create();
+ $user->givePermissionTo([
+ 'customers.view',
+ 'customers.create',
+ 'customers.update',
+ 'customers.delete',
+ ]);
+
+ return $user;
+}
+
/*
|--------------------------------------------------------------------------
| AUTHENTICATION
@@ -20,7 +37,7 @@
});
test('authenticated users can visit the customer index page', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->get(route('admin.master.customers.index'));
@@ -34,7 +51,7 @@
*/
test('customer index page displays customers', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
Customer::factory()->count(3)->create();
@@ -51,7 +68,7 @@
});
test('index page works with zero customers', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->get(route('admin.master.customers.index'));
@@ -66,7 +83,7 @@
});
test('index page does not display soft-deleted customers', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
Customer::factory()->create(['name' => 'Active Customer']);
@@ -85,7 +102,7 @@
});
test('index page displays correct count after delete', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
Customer::factory()->count(5)->create();
@@ -111,7 +128,7 @@
*/
test('customer can be created', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -122,7 +139,7 @@
$response
->assertSessionHasNoErrors()
- ->assertRedirect(route('admin.master.customers.index'));
+ ->assertRedirect();
$this->assertDatabaseHas('customers', [
'name' => 'Customer Test',
@@ -132,7 +149,7 @@
});
test('customer can be created without optional fields', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -141,7 +158,7 @@
$response
->assertSessionHasNoErrors()
- ->assertRedirect(route('admin.master.customers.index'));
+ ->assertRedirect();
$this->assertDatabaseHas('customers', [
'name' => 'Customer Minimal',
@@ -149,7 +166,7 @@
});
test('customer name is required', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -160,7 +177,7 @@
});
test('customer name must be string', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -171,7 +188,7 @@
});
test('customer name must not exceed 200 characters', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -182,7 +199,7 @@
});
test('customer name exactly 200 characters passes validation', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -193,7 +210,7 @@
});
test('customer name exactly 1 character passes validation', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -208,7 +225,7 @@
});
test('customer name must be unique', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
Customer::factory()->create(['name' => 'Existing Customer']);
@@ -221,7 +238,7 @@
});
test('customer name uniqueness is case sensitive', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
Customer::factory()->create(['name' => 'Customer ABC']);
@@ -234,7 +251,7 @@
});
test('customer name with only whitespace is rejected', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -245,7 +262,7 @@
});
test('customer name with special characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -260,7 +277,7 @@
});
test('customer name with HTML tags is accepted as plain text', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -275,7 +292,7 @@
});
test('customer name with numbers is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -290,7 +307,7 @@
});
test('customer name with only numbers is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -305,7 +322,7 @@
});
test('customer name with unicode characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -320,7 +337,7 @@
});
test('customer name with mixed case is stored as entered', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -335,7 +352,7 @@
});
test('customer name with leading and trailing spaces is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -346,7 +363,7 @@
});
test('customer name with parentheses and brackets is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -361,7 +378,7 @@
});
test('customer name with multiple spaces is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -376,7 +393,7 @@
});
test('customer can be created with name at exact DB column limit (200 chars)', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$name = str_repeat('a', 200);
@@ -393,7 +410,7 @@
});
test('store flashes success toast via Inertia', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -404,7 +421,7 @@
});
test('store creates new customer in database', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), [
@@ -418,7 +435,7 @@
});
test('multiple customers can be created sequentially', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'Customer 1']);
@@ -438,20 +455,8 @@
|--------------------------------------------------------------------------
*/
-test('customer phone_number must be numeric', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), [
- 'name' => 'Customer With Letters',
- 'phone_number' => 'abc123',
- ]);
-
- $response->assertSessionHasErrors('phone_number');
-});
-
-test('customer phone_number accepts valid numeric string', function () {
- $user = User::factory()->create();
+test('customer phone_number must be string', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -460,15 +465,10 @@
]);
$response->assertSessionHasNoErrors();
-
- $this->assertDatabaseHas('customers', [
- 'name' => 'Customer Valid Phone',
- 'phone_number' => '08123456789012345678',
- ]);
});
-test('customer phone_number must not exceed 20 digits', function () {
- $user = User::factory()->create();
+test('customer phone_number must not exceed 20 characters', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -479,8 +479,8 @@
$response->assertSessionHasErrors('phone_number');
});
-test('customer phone_number exactly 20 digits passes validation', function () {
- $user = User::factory()->create();
+test('customer phone_number exactly 20 characters passes validation', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -491,8 +491,8 @@
$response->assertSessionHasNoErrors();
});
-test('customer phone_number exactly 1 digit passes validation', function () {
- $user = User::factory()->create();
+test('customer phone_number exactly 1 character passes validation', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -509,7 +509,7 @@
});
test('customer phone_number can be null', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -525,8 +525,8 @@
]);
});
-test('customer phone_number with special characters is rejected', function () {
- $user = User::factory()->create();
+test('customer phone_number with special characters is accepted', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -534,11 +534,11 @@
'phone_number' => '+62-812-3456-7890',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('customer phone_number with spaces is rejected', function () {
- $user = User::factory()->create();
+test('customer phone_number with spaces is accepted', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -546,11 +546,11 @@
'phone_number' => '0812 345 678',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('customer phone_number with dashes is rejected', function () {
- $user = User::factory()->create();
+test('customer phone_number with dashes is accepted', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -558,11 +558,11 @@
'phone_number' => '0812-3456-7890',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('customer phone_number with dots is rejected', function () {
- $user = User::factory()->create();
+test('customer phone_number with dots is accepted', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -570,11 +570,11 @@
'phone_number' => '0812.3456.7890',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('customer phone_number with parentheses is rejected', function () {
- $user = User::factory()->create();
+test('customer phone_number with parentheses is accepted', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -582,11 +582,11 @@
'phone_number' => '(0812)3456789',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('customer phone_number with plus sign is rejected', function () {
- $user = User::factory()->create();
+test('customer phone_number with plus sign is accepted', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -594,11 +594,11 @@
'phone_number' => '+6281234567890',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('customer phone_number with hash is rejected', function () {
- $user = User::factory()->create();
+test('customer phone_number with hash is accepted', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -606,11 +606,11 @@
'phone_number' => '#08123456789',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('customer phone_number with asterisk is rejected', function () {
- $user = User::factory()->create();
+test('customer phone_number with asterisk is accepted', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -618,11 +618,11 @@
'phone_number' => '*08123456789',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('customer phone_number with letters and numbers is rejected', function () {
- $user = User::factory()->create();
+test('customer phone_number with letters and numbers is accepted', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -630,11 +630,11 @@
'phone_number' => '0812abc3456',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('customer phone_number with only letters is rejected', function () {
- $user = User::factory()->create();
+test('customer phone_number with only letters is accepted', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -642,11 +642,11 @@
'phone_number' => 'abcdefghij',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
test('customer phone_number with empty string is accepted as nullable', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -664,7 +664,7 @@
*/
test('customer address can be null', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -681,7 +681,7 @@
});
test('customer address accepts long text', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$address = str_repeat('Jl. Panjang No. 123, RT 01/RW 02, Kelurahan Sukamaju, Kecamatan Menteng, Jakarta Pusat. ', 10);
@@ -699,7 +699,7 @@
});
test('customer address with special characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -716,7 +716,7 @@
});
test('customer address with unicode is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -733,7 +733,7 @@
});
test('customer address with newlines is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -749,7 +749,7 @@
});
test('customer address with HTML is accepted as plain text', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -766,7 +766,7 @@
});
test('customer address can be empty string', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -784,7 +784,7 @@
*/
test('customer can be updated', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -797,7 +797,7 @@
$response
->assertSessionHasNoErrors()
- ->assertRedirect(route('admin.master.customers.index'));
+ ->assertRedirect();
$customer->refresh();
expect($customer->name)->toBe('Customer Updated');
@@ -806,7 +806,7 @@
});
test('customer name can be updated to itself', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create(['name' => 'My Customer']);
@@ -819,7 +819,7 @@
});
test('customer update name must be unique excluding itself', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create(['name' => 'First']);
@@ -833,7 +833,7 @@
});
test('customer update name is required', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -846,7 +846,7 @@
});
test('customer update name must not exceed 200 characters', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -858,8 +858,8 @@
$response->assertSessionHasErrors('name');
});
-test('customer update phone_number must be numeric', function () {
- $user = User::factory()->create();
+test('customer update phone_number accepts any string up to 20 chars', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -869,11 +869,11 @@
'phone_number' => 'abc123',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('customer update phone_number with special characters is rejected', function () {
- $user = User::factory()->create();
+test('customer update phone_number with special characters is accepted', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -883,11 +883,11 @@
'phone_number' => '+62-812-3456-7890',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
test('customer can be updated with only name', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create(['phone_number' => '08123456789', 'address' => 'Old Address']);
@@ -905,7 +905,7 @@
});
test('customer can be updated multiple times', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create(['name' => 'Version 1']);
@@ -920,7 +920,7 @@
});
test('update flashes success toast via Inertia', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -933,7 +933,7 @@
});
test('customer update with special characters in name is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -949,7 +949,7 @@
});
test('customer update with unicode characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create(['name' => 'Original']);
@@ -965,7 +965,7 @@
});
test('customer update with only whitespace name is rejected', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -978,7 +978,7 @@
});
test('customer update can clear phone_number to null', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create(['phone_number' => '08123456789']);
@@ -995,7 +995,7 @@
});
test('customer update can clear address to null', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create(['address' => 'Old Address']);
@@ -1012,7 +1012,7 @@
});
test('updating non-existent customer returns 404', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->put(route('admin.master.customers.update', 999999), [
@@ -1029,7 +1029,7 @@
*/
test('customer can be deleted', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -1038,13 +1038,13 @@
$response
->assertSessionHasNoErrors()
- ->assertRedirect(route('admin.master.customers.index'));
+ ->assertRedirect();
$this->assertSoftDeleted('customers', ['id' => $customer->id]);
});
test('customer is soft-deleted not permanently removed', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -1056,7 +1056,7 @@
});
test('soft-deleted customer still exists in database', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -1067,7 +1067,7 @@
});
test('soft-deleted customer has deleted_at timestamp', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -1079,7 +1079,7 @@
});
test('deleted customer is excluded from getAll query', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
Customer::factory()->create(['name' => 'Active']);
@@ -1099,7 +1099,7 @@
});
test('delete flashes success toast via Inertia', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -1110,7 +1110,7 @@
});
test('multiple customers can be deleted one by one', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customers = Customer::factory()->count(3)->create();
@@ -1124,7 +1124,7 @@
});
test('updating soft-deleted customer via route returns 404', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -1138,7 +1138,7 @@
});
test('deleting soft-deleted customer via route returns 404', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -1150,7 +1150,7 @@
});
test('deleting non-existent customer returns 404', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->delete(route('admin.master.customers.destroy', 999999));
@@ -1164,26 +1164,26 @@
|--------------------------------------------------------------------------
*/
-test('customer with purchases can be deleted', function () {
- $user = User::factory()->create();
+test('customer with orders can be deleted', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
- Purchase::factory()->count(3)->create(['customer_id' => $customer->id]);
+ Order::factory()->count(3)->create(['customer_id' => $customer->id]);
$this->delete(route('admin.master.customers.destroy', $customer));
$this->assertSoftDeleted('customers', ['id' => $customer->id]);
- // Purchases still exist because soft delete doesn't trigger cascade
- $this->assertDatabaseCount('purchases', 3);
+ // Orders still exist because soft delete doesn't trigger cascade
+ $this->assertDatabaseCount('orders', 3);
});
-test('index page works correctly with customers that have purchases', function () {
- $user = User::factory()->create();
+test('index page works correctly with customers that have orders', function () {
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
- Purchase::factory()->count(5)->create(['customer_id' => $customer->id]);
+ Order::factory()->count(5)->create(['customer_id' => $customer->id]);
$response = $this->get(route('admin.master.customers.index'));
$response->assertOk();
@@ -1237,7 +1237,7 @@
*/
test('created customer has correct timestamps', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), [
@@ -1250,7 +1250,7 @@
});
test('updated customer has updated timestamp changed', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -1267,7 +1267,7 @@
});
test('customer ID is auto-incremented', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'First']);
@@ -1300,7 +1300,7 @@
*/
test('customer can be restored after soft delete', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create(['name' => 'Restored Customer']);
@@ -1314,7 +1314,7 @@
});
test('restored customer appears in index again', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create(['name' => 'Restored Customer']);
@@ -1343,7 +1343,7 @@
});
test('restored customer can be updated', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create(['name' => 'Before Restore']);
@@ -1367,7 +1367,7 @@
*/
test('user creates customer then immediately edits it', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'Draft Customer']);
@@ -1380,7 +1380,7 @@
});
test('user creates multiple customers and deletes one', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'Keep']);
@@ -1402,7 +1402,7 @@
});
test('user renames customer to match another existing customer name', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
Customer::factory()->create(['name' => 'Target Name']);
@@ -1416,7 +1416,7 @@
});
test('user creates customer with Indonesian characters', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -1435,7 +1435,7 @@
});
test('user tries to create customer without submitting any data', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), []);
@@ -1444,7 +1444,7 @@
});
test('user tries to update customer without submitting any data', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$customer = Customer::factory()->create();
@@ -1455,7 +1455,7 @@
});
test('user rapidly submits same customer creation twice', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'Rapid Submit']);
@@ -1465,96 +1465,8 @@
$this->assertDatabaseCount('customers', 1);
});
-test('user creates customer with name containing chinese characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => '电子产品供应商']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing japanese characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'サプライヤー']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing korean characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => '공급업체']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing arabic characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'المورد']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing cyrillic characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'Поставщик']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing thai characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'ซัพพลายเออร์']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing hindi characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'आपूर्तिकर्ता']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing greek characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'Προμηθευτής']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing vietnamese characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'Nhà cung cấp']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing mixed unicode scripts', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'Customer 电子产品']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing emoji', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => '🏢 Customer']);
- $response->assertSessionHasNoErrors();
-});
-
test('user creates customer with very short name', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), ['name' => 'X']);
@@ -1566,7 +1478,7 @@
});
test('user creates customer with name containing mixed case and numbers', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'PT123ABC456']);
@@ -1577,7 +1489,7 @@
});
test('user creates customer with name containing only spaces and numbers', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), ['name' => ' 123 ']);
@@ -1585,7 +1497,7 @@
});
test('user creates customer with very long name', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$name = str_repeat('a', 200);
@@ -1599,7 +1511,7 @@
});
test('user creates customer then creates another with similar name', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'Customer ABC']);
@@ -1611,7 +1523,7 @@
});
test('user creates customer with name containing curly braces', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => '{code}']);
@@ -1622,7 +1534,7 @@
});
test('user creates customer with name containing angle brackets', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => '']);
@@ -1633,7 +1545,7 @@
});
test('user creates customer with name containing semicolon', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'A;B']);
@@ -1644,7 +1556,7 @@
});
test('user creates customer with name containing colon', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'Time: Now']);
@@ -1655,7 +1567,7 @@
});
test('user creates customer with name containing backtick', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => '`Code`']);
@@ -1666,7 +1578,7 @@
});
test('user creates customer with name containing tilde', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'Caf~']);
@@ -1677,7 +1589,7 @@
});
test('user creates customer with name containing caret', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'A^B']);
@@ -1688,7 +1600,7 @@
});
test('user creates customer with name containing percentage', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => '100% Natural']);
@@ -1698,72 +1610,8 @@
]);
});
-test('user creates customer with name containing fullwidth characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'ABCDE']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing fullwidth brackets', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => '()【】']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing hiragana', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'あいうえお']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing katakana', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'アイウエオ']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing hangul', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => '가나다라마']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing hebrew', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'אבגדהו']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing bengali', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'অআইঈউ']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates customer with name containing tamil', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.customers.store'), ['name' => 'அஆஇஈஉ']);
- $response->assertSessionHasNoErrors();
-});
-
test('user creates customer with name containing email-like pattern', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'user@example.com']);
@@ -1774,7 +1622,7 @@
});
test('user creates customer with name containing URL-like pattern', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'https://example.com']);
@@ -1785,7 +1633,7 @@
});
test('user creates customer with address containing Indonesian address format', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), [
@@ -1801,7 +1649,7 @@
});
test('user creates customer with phone number in various Indonesian formats', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$phones = [
@@ -1827,7 +1675,7 @@
});
test('user creates customer then deletes it and creates new one with same name', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$this->post(route('admin.master.customers.store'), ['name' => 'Reusable']);
@@ -1841,7 +1689,7 @@
});
test('user creates customer with name containing regex special characters', function () {
- $user = User::factory()->create();
+ $user = giveCustomerPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.customers.store'), ['name' => '.*+?^${}()|[]\\']);
diff --git a/tests/Feature/Admin/Master/ProductTest.php b/tests/Feature/Admin/Master/ProductTest.php
index db3bd23..d4bfad4 100644
--- a/tests/Feature/Admin/Master/ProductTest.php
+++ b/tests/Feature/Admin/Master/ProductTest.php
@@ -6,12 +6,29 @@
use App\Models\ProductVariant;
use App\Models\StockMutation;
use App\Models\User;
+use Database\Seeders\RolePermissionSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\DB;
use Inertia\Testing\AssertableInertia as Assert;
uses(RefreshDatabase::class);
+function giveProductPermissions(): User
+{
+ $seeder = new RolePermissionSeeder;
+ $seeder->run();
+
+ $user = User::factory()->create();
+ $user->givePermissionTo([
+ 'products.view',
+ 'products.create',
+ 'products.update',
+ 'products.delete',
+ ]);
+
+ return $user;
+}
+
/*
|--------------------------------------------------------------------------
| HELPERS
@@ -152,7 +169,7 @@ function allPriceTypes(): array
});
test('authenticated users can visit the product index page', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->get(route('admin.master.products.index'));
@@ -160,7 +177,7 @@ function allPriceTypes(): array
});
test('authenticated users can visit the product create page', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->get(route('admin.master.products.create'));
@@ -168,7 +185,7 @@ function allPriceTypes(): array
});
test('authenticated users can visit the product edit page', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -184,7 +201,7 @@ function allPriceTypes(): array
*/
test('product index page displays products', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
Product::factory()->count(3)->create();
@@ -201,7 +218,7 @@ function allPriceTypes(): array
});
test('index page works with zero products', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->get(route('admin.master.products.index'));
@@ -216,7 +233,7 @@ function allPriceTypes(): array
});
test('index page does not display soft-deleted products', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
Product::factory()->create(['name' => 'Active Product']);
@@ -235,7 +252,7 @@ function allPriceTypes(): array
});
test('index page displays correct count after delete', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
Product::factory()->count(5)->create();
@@ -255,7 +272,7 @@ function allPriceTypes(): array
});
test('index page includes product categories', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -274,7 +291,7 @@ function allPriceTypes(): array
});
test('index page includes product variants', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -289,7 +306,7 @@ function allPriceTypes(): array
});
test('index page includes product variant prices', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -311,7 +328,7 @@ function allPriceTypes(): array
*/
test('product can be created with per-variant prices', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload());
@@ -329,7 +346,7 @@ function allPriceTypes(): array
});
test('product can be created with shared prices', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidSharedPricePayload());
@@ -343,7 +360,7 @@ function allPriceTypes(): array
});
test('product slug is automatically generated from name', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => 'Produk Otomatis']));
@@ -355,7 +372,7 @@ function allPriceTypes(): array
});
test('product can be created with multiple categories', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$categories = Category::factory()->count(3)->create();
@@ -371,7 +388,7 @@ function allPriceTypes(): array
});
test('product can be created with multiple variants', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -402,7 +419,7 @@ function allPriceTypes(): array
});
test('product can be created with zero price', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -424,7 +441,7 @@ function allPriceTypes(): array
});
test('product can be created with very large price', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -442,7 +459,7 @@ function allPriceTypes(): array
});
test('product can be created with zero stock', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -460,7 +477,7 @@ function allPriceTypes(): array
});
test('product can be created with default status when not provided', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -474,7 +491,7 @@ function allPriceTypes(): array
});
test('product can be created as draft', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['status' => 'draft']));
@@ -485,7 +502,7 @@ function allPriceTypes(): array
});
test('product can be created as inactive', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['status' => 'inactive']));
@@ -496,7 +513,7 @@ function allPriceTypes(): array
});
test('product can be created without description', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['description' => null]));
@@ -507,7 +524,7 @@ function allPriceTypes(): array
});
test('store flashes success toast via Inertia', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload());
@@ -515,7 +532,7 @@ function allPriceTypes(): array
});
test('store creates new product in database', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload());
@@ -528,7 +545,7 @@ function allPriceTypes(): array
});
test('multiple products can be created sequentially', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => 'Produk 1']));
@@ -545,7 +562,7 @@ function allPriceTypes(): array
*/
test('product name is required', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => '']));
@@ -553,7 +570,7 @@ function allPriceTypes(): array
});
test('product name must be string', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => 12345]));
@@ -561,7 +578,7 @@ function allPriceTypes(): array
});
test('product name must not exceed 200 characters', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => str_repeat('a', 201)]));
@@ -569,7 +586,7 @@ function allPriceTypes(): array
});
test('product name exactly 200 characters passes validation', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => str_repeat('a', 200)]));
@@ -577,7 +594,7 @@ function allPriceTypes(): array
});
test('product name exactly 1 character passes validation', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => 'A']));
@@ -585,7 +602,7 @@ function allPriceTypes(): array
});
test('product name with only whitespace is rejected', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => ' ']));
@@ -593,7 +610,7 @@ function allPriceTypes(): array
});
test('product category_ids is required', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['category_ids' => []]));
@@ -601,7 +618,7 @@ function allPriceTypes(): array
});
test('product category_ids must be array', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['category_ids' => 'not-an-array']));
@@ -609,7 +626,7 @@ function allPriceTypes(): array
});
test('product category_ids.* must exist in categories table', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['category_ids' => [999999]]));
@@ -617,7 +634,7 @@ function allPriceTypes(): array
});
test('product variants is required', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['variants' => []]));
@@ -625,7 +642,7 @@ function allPriceTypes(): array
});
test('product variants must be array', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['variants' => 'not-an-array']));
@@ -633,7 +650,7 @@ function allPriceTypes(): array
});
test('product variant name is required', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -644,7 +661,7 @@ function allPriceTypes(): array
});
test('product variant stock is required', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -655,7 +672,7 @@ function allPriceTypes(): array
});
test('product variant stock must be integer', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -666,7 +683,7 @@ function allPriceTypes(): array
});
test('product variant stock must be >= 0', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -677,7 +694,7 @@ function allPriceTypes(): array
});
test('product variant reject_stock must be >= 0', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -688,7 +705,7 @@ function allPriceTypes(): array
});
test('product variant retail_stock must be >= 0', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -699,7 +716,7 @@ function allPriceTypes(): array
});
test('product variant photo_keys is required', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -716,7 +733,7 @@ function allPriceTypes(): array
*/
test('product status must be valid enum value', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['status' => 'invalid_status']));
@@ -724,7 +741,7 @@ function allPriceTypes(): array
});
test('product status accepts active', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['status' => 'active']));
@@ -732,7 +749,7 @@ function allPriceTypes(): array
});
test('product status accepts inactive', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['status' => 'inactive']));
@@ -740,7 +757,7 @@ function allPriceTypes(): array
});
test('product status accepts draft', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload(['status' => 'draft']));
@@ -754,7 +771,7 @@ function allPriceTypes(): array
*/
test('product prices are required when use_same_price is false', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -765,7 +782,7 @@ function allPriceTypes(): array
});
test('product prices must have exactly 9 items when use_same_price is false', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -779,7 +796,7 @@ function allPriceTypes(): array
});
test('product price type must be valid PriceType enum', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -790,7 +807,7 @@ function allPriceTypes(): array
});
test('product price must be integer', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -801,7 +818,7 @@ function allPriceTypes(): array
});
test('product price must be >= 0', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -812,7 +829,7 @@ function allPriceTypes(): array
});
test('shared_prices are required when use_same_price is true', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidSharedPricePayload();
@@ -823,7 +840,7 @@ function allPriceTypes(): array
});
test('shared_prices must have exactly 9 items when use_same_price is true', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidSharedPricePayload();
@@ -836,7 +853,7 @@ function allPriceTypes(): array
});
test('shared_price type must be valid PriceType enum', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidSharedPricePayload();
@@ -847,7 +864,7 @@ function allPriceTypes(): array
});
test('shared_price must be integer >= 0', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidSharedPricePayload();
@@ -864,7 +881,7 @@ function allPriceTypes(): array
*/
test('edit page shows product data', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create(['name' => 'Produk Edit']);
@@ -892,7 +909,7 @@ function allPriceTypes(): array
*/
test('product can be updated', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -929,7 +946,7 @@ function allPriceTypes(): array
});
test('product update name is required', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -948,7 +965,7 @@ function allPriceTypes(): array
});
test('product update name must not exceed 200 characters', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -967,7 +984,7 @@ function allPriceTypes(): array
});
test('updating non-existent product returns 404', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->put(route('admin.master.products.update', 999999), makeValidProductPayload(['name' => 'Ghost']));
@@ -975,7 +992,7 @@ function allPriceTypes(): array
});
test('update can change product status', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create(['status' => 'active']);
@@ -1008,7 +1025,7 @@ function allPriceTypes(): array
});
test('update can change categories', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -1042,7 +1059,7 @@ function allPriceTypes(): array
});
test('update replaces old variants with new ones', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => 'To Replace']));
@@ -1072,7 +1089,7 @@ function allPriceTypes(): array
});
test('update can modify existing variant data', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => 'Modify Variant']));
@@ -1111,7 +1128,7 @@ function allPriceTypes(): array
*/
test('product can be deleted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -1126,7 +1143,7 @@ function allPriceTypes(): array
});
test('product is soft-deleted not permanently removed', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -1138,7 +1155,7 @@ function allPriceTypes(): array
});
test('soft-deleted product has deleted_at timestamp', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -1150,7 +1167,7 @@ function allPriceTypes(): array
});
test('delete cascades to product variants', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -1162,7 +1179,7 @@ function allPriceTypes(): array
});
test('delete cascades to product prices', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -1175,7 +1192,7 @@ function allPriceTypes(): array
});
test('delete detaches product categories', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -1191,7 +1208,7 @@ function allPriceTypes(): array
});
test('deleting non-existent product returns 404', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->delete(route('admin.master.products.destroy', 999999));
@@ -1199,7 +1216,7 @@ function allPriceTypes(): array
});
test('updating soft-deleted product via route returns 404', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -1210,7 +1227,7 @@ function allPriceTypes(): array
});
test('deleting soft-deleted product via route returns 404', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -1227,7 +1244,7 @@ function allPriceTypes(): array
*/
test('toggle status changes active to inactive', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create(['status' => 'active']);
@@ -1239,7 +1256,7 @@ function allPriceTypes(): array
});
test('toggle status changes inactive to active', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create(['status' => 'inactive']);
@@ -1251,7 +1268,7 @@ function allPriceTypes(): array
});
test('toggle status changes draft to active', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create(['status' => 'draft']);
@@ -1263,7 +1280,7 @@ function allPriceTypes(): array
});
test('toggle status changes active to inactive then back to active', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create(['status' => 'active']);
@@ -1278,7 +1295,7 @@ function allPriceTypes(): array
});
test('toggle status redirects to index', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create(['status' => 'active']);
@@ -1288,7 +1305,7 @@ function allPriceTypes(): array
});
test('toggle status on non-existent product returns 404', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.toggle-status', 999999));
@@ -1302,7 +1319,7 @@ function allPriceTypes(): array
*/
test('product name with special characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1314,7 +1331,7 @@ function allPriceTypes(): array
});
test('product name with HTML tags is accepted as plain text', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1325,63 +1342,8 @@ function allPriceTypes(): array
$this->assertDatabaseHas('products', ['name' => '']);
});
-test('product name with emoji is accepted', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
- 'name' => '🔥 Hot Product 🏷️',
- ]));
-
- $response->assertSessionHasNoErrors();
-});
-
-test('product name with unicode characters is accepted', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
- 'name' => ' Produk Žöžička ',
- ]));
-
- $response->assertSessionHasNoErrors();
-});
-
-test('product name with chinese characters is accepted', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
- 'name' => '电子产品',
- ]));
-
- $response->assertSessionHasNoErrors();
-});
-
-test('product name with japanese characters is accepted', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
- 'name' => '製品テスト',
- ]));
-
- $response->assertSessionHasNoErrors();
-});
-
-test('product name with arabic characters is accepted', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
- 'name' => 'المنتج',
- ]));
-
- $response->assertSessionHasNoErrors();
-});
-
test('product name with only numbers is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1393,7 +1355,7 @@ function allPriceTypes(): array
});
test('product name with email-like pattern is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1404,7 +1366,7 @@ function allPriceTypes(): array
});
test('product name with URL-like pattern is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1415,7 +1377,7 @@ function allPriceTypes(): array
});
test('product name with SQL injection attempt is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1427,7 +1389,7 @@ function allPriceTypes(): array
});
test('product variant name with weird characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1445,7 +1407,7 @@ function allPriceTypes(): array
});
test('product variant name at max length 200 is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1463,7 +1425,7 @@ function allPriceTypes(): array
});
test('product variant name over 200 characters fails validation', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1481,7 +1443,7 @@ function allPriceTypes(): array
});
test('product stock at very large value is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1499,7 +1461,7 @@ function allPriceTypes(): array
});
test('product variant name with only whitespace is rejected', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1517,7 +1479,7 @@ function allPriceTypes(): array
});
test('product with description containing newlines is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1528,7 +1490,7 @@ function allPriceTypes(): array
});
test('product with very long description is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1539,7 +1501,7 @@ function allPriceTypes(): array
});
test('product with mixed special characters in name is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1551,7 +1513,7 @@ function allPriceTypes(): array
});
test('product name with leading and trailing spaces is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1562,7 +1524,7 @@ function allPriceTypes(): array
});
test('product name with multiple spaces generates correct slug', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1576,7 +1538,7 @@ function allPriceTypes(): array
});
test('product name with newline characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1587,7 +1549,7 @@ function allPriceTypes(): array
});
test('product name with curly braces is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1598,7 +1560,7 @@ function allPriceTypes(): array
});
test('product name with angle brackets is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1609,7 +1571,7 @@ function allPriceTypes(): array
});
test('product name with pipe symbol is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1620,7 +1582,7 @@ function allPriceTypes(): array
});
test('product name with semicolon is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1631,7 +1593,7 @@ function allPriceTypes(): array
});
test('product name with backtick is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1642,7 +1604,7 @@ function allPriceTypes(): array
});
test('product name with date-like pattern is accepted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1653,7 +1615,7 @@ function allPriceTypes(): array
});
test('shared_price with string price containing dots is rejected as not integer', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidSharedPricePayload([
@@ -1664,7 +1626,7 @@ function allPriceTypes(): array
});
test('shared_price with string price with thousands separator is rejected as not integer', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidSharedPricePayload([
@@ -1681,7 +1643,7 @@ function allPriceTypes(): array
*/
test('created product has correct timestamps', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload());
@@ -1700,7 +1662,7 @@ function allPriceTypes(): array
});
test('product price is stored as integer', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload());
@@ -1727,7 +1689,7 @@ function allPriceTypes(): array
});
test('product categories are synced correctly on create', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$cat1 = Category::factory()->create();
@@ -1748,7 +1710,7 @@ function allPriceTypes(): array
*/
test('user creates product then immediately edits it', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => 'Draft Product']));
@@ -1776,7 +1738,7 @@ function allPriceTypes(): array
});
test('user creates multiple products and deletes one', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => 'Keep']));
@@ -1798,7 +1760,7 @@ function allPriceTypes(): array
});
test('user toggles product status multiple times', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create(['status' => 'active']);
@@ -1817,7 +1779,7 @@ function allPriceTypes(): array
});
test('user creates product with 10 variants each with 9 prices', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$variants = [];
@@ -1842,7 +1804,7 @@ function allPriceTypes(): array
});
test('user creates product then deletes it and creates another with same name', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => 'Produk']));
@@ -1856,7 +1818,7 @@ function allPriceTypes(): array
});
test('user submits empty form and gets all required errors', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), []);
@@ -1865,7 +1827,7 @@ function allPriceTypes(): array
});
test('user creates product with very long description containing special chars', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$description = str_repeat('Produk & Co. (PT) - Best! Bold ', 50);
@@ -1882,7 +1844,7 @@ function allPriceTypes(): array
});
test('index page works with products that have many variants', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -1893,7 +1855,7 @@ function allPriceTypes(): array
});
test('delete product does not affect other products', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product1 = Product::factory()->create(['name' => 'Product 1']);
@@ -1914,7 +1876,7 @@ function allPriceTypes(): array
});
test('user can create product with name that is a number string', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -1926,7 +1888,7 @@ function allPriceTypes(): array
});
test('user rapidly creates two products with same name', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload(['name' => 'Rapid Product']));
@@ -1937,7 +1899,7 @@ function allPriceTypes(): array
});
test('product can be created with all price types having different values', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$prices = [
@@ -1976,7 +1938,7 @@ function allPriceTypes(): array
});
test('shared price applies to all variants', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.products.store'), makeValidSharedPricePayload([
@@ -2001,7 +1963,7 @@ function allPriceTypes(): array
});
test('user tries to store with invalid use_same_price boolean', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$payload = makeValidProductPayload();
@@ -2028,7 +1990,7 @@ function allPriceTypes(): array
});
test('authenticated user can access variant edit page', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2043,7 +2005,7 @@ function allPriceTypes(): array
});
test('variant edit page shows variant data', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2089,7 +2051,7 @@ function allPriceTypes(): array
});
test('variant can be updated', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2118,7 +2080,7 @@ function allPriceTypes(): array
});
test('variant update replaces old prices', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2146,7 +2108,7 @@ function allPriceTypes(): array
});
test('variant update name is required', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2165,7 +2127,7 @@ function allPriceTypes(): array
});
test('variant update requires exactly 9 prices', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2201,7 +2163,7 @@ function allPriceTypes(): array
});
test('variant can be deleted', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2213,7 +2175,7 @@ function allPriceTypes(): array
});
test('delete variant cascades to product prices', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2238,7 +2200,7 @@ function allPriceTypes(): array
});
test('delete variant does not affect other variants', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2264,7 +2226,7 @@ function allPriceTypes(): array
});
test('deleting non-existent variant returns 404', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2291,7 +2253,7 @@ function allPriceTypes(): array
});
test('authenticated user can transfer stock', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2311,7 +2273,7 @@ function allPriceTypes(): array
});
test('transfer stock creates two stock mutation records', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2341,7 +2303,7 @@ function allPriceTypes(): array
});
test('transfer stock with description saves to mutations', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2357,7 +2319,7 @@ function allPriceTypes(): array
});
test('transfer stock without description uses default', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2372,7 +2334,7 @@ function allPriceTypes(): array
});
test('transfer stock quantity must be provided', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2386,7 +2348,7 @@ function allPriceTypes(): array
});
test('transfer stock quantity must be integer', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2402,7 +2364,7 @@ function allPriceTypes(): array
});
test('transfer stock quantity must be at least 1', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2418,7 +2380,7 @@ function allPriceTypes(): array
});
test('transfer stock quantity cannot exceed available stock', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2435,7 +2397,7 @@ function allPriceTypes(): array
});
test('transfer stock exactly equal to available stock is allowed', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2452,7 +2414,7 @@ function allPriceTypes(): array
});
test('transfer stock from zero stock is rejected', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2469,7 +2431,7 @@ function allPriceTypes(): array
});
test('transfer stock multiple times sequentially', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2486,7 +2448,7 @@ function allPriceTypes(): array
});
test('transfer stock does not affect reject_stock', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2507,7 +2469,7 @@ function allPriceTypes(): array
});
test('transfer stock on non-existent variant returns 404', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2519,7 +2481,7 @@ function allPriceTypes(): array
});
test('transfer stock redirects to product index', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2539,7 +2501,7 @@ function allPriceTypes(): array
*/
test('creating product with stock creates initial stock mutations', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -2573,7 +2535,7 @@ function allPriceTypes(): array
});
test('creating product with zero stock creates no mutations', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$this->post(route('admin.master.products.store'), makeValidProductPayload([
@@ -2591,7 +2553,7 @@ function allPriceTypes(): array
});
test('updating variant stock creates adjustment mutations', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2636,7 +2598,7 @@ function allPriceTypes(): array
});
test('updating variant via single edit creates adjustment mutations', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2669,7 +2631,7 @@ function allPriceTypes(): array
});
test('no mutation created when stock values unchanged', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2706,7 +2668,7 @@ function allPriceTypes(): array
});
test('stock mutations record user who performed the action', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2735,7 +2697,7 @@ function allPriceTypes(): array
});
test('authenticated user can access stock mutations page', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2752,7 +2714,7 @@ function allPriceTypes(): array
});
test('stock mutations page displays mutations for specific variant', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2771,7 +2733,7 @@ function allPriceTypes(): array
});
test('stock mutations page does not show mutations from other variants', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create();
@@ -2796,7 +2758,7 @@ function allPriceTypes(): array
});
test('stock mutations page shows correct product and variant info', function () {
- $user = User::factory()->create();
+ $user = giveProductPermissions();
$this->actingAs($user);
$product = Product::factory()->create(['name' => 'Produk Test']);
diff --git a/tests/Feature/Admin/Master/SupplierTest.php b/tests/Feature/Admin/Master/SupplierTest.php
index 0812fba..b8a80bf 100644
--- a/tests/Feature/Admin/Master/SupplierTest.php
+++ b/tests/Feature/Admin/Master/SupplierTest.php
@@ -3,11 +3,28 @@
use App\Models\Purchase;
use App\Models\Supplier;
use App\Models\User;
+use Database\Seeders\RolePermissionSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Inertia\Testing\AssertableInertia as Assert;
uses(RefreshDatabase::class);
+function giveSupplierPermissions(): User
+{
+ $seeder = new RolePermissionSeeder;
+ $seeder->run();
+
+ $user = User::factory()->create();
+ $user->givePermissionTo([
+ 'suppliers.view',
+ 'suppliers.create',
+ 'suppliers.update',
+ 'suppliers.delete',
+ ]);
+
+ return $user;
+}
+
/*
|--------------------------------------------------------------------------
| AUTHENTICATION
@@ -20,7 +37,7 @@
});
test('authenticated users can visit the supplier index page', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->get(route('admin.master.suppliers.index'));
@@ -34,7 +51,7 @@
*/
test('supplier index page displays suppliers', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
Supplier::factory()->count(3)->create();
@@ -51,7 +68,7 @@
});
test('index page works with zero suppliers', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->get(route('admin.master.suppliers.index'));
@@ -66,7 +83,7 @@
});
test('index page does not display soft-deleted suppliers', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
Supplier::factory()->create(['name' => 'Active Supplier']);
@@ -85,7 +102,7 @@
});
test('index page displays correct count after delete', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
Supplier::factory()->count(5)->create();
@@ -111,7 +128,7 @@
*/
test('supplier can be created', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -122,7 +139,7 @@
$response
->assertSessionHasNoErrors()
- ->assertRedirect(route('admin.master.suppliers.index'));
+ ->assertRedirect();
$this->assertDatabaseHas('suppliers', [
'name' => 'Supplier Test',
@@ -132,7 +149,7 @@
});
test('supplier can be created without optional fields', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -141,7 +158,7 @@
$response
->assertSessionHasNoErrors()
- ->assertRedirect(route('admin.master.suppliers.index'));
+ ->assertRedirect();
$this->assertDatabaseHas('suppliers', [
'name' => 'Supplier Minimal',
@@ -149,7 +166,7 @@
});
test('supplier name is required', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -160,7 +177,7 @@
});
test('supplier name must be string', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -171,7 +188,7 @@
});
test('supplier name must not exceed 200 characters', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -182,7 +199,7 @@
});
test('supplier name exactly 200 characters passes validation', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -193,7 +210,7 @@
});
test('supplier name exactly 1 character passes validation', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -208,7 +225,7 @@
});
test('supplier name must be unique', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
Supplier::factory()->create(['name' => 'Existing Supplier']);
@@ -221,7 +238,7 @@
});
test('supplier name uniqueness is case sensitive', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
Supplier::factory()->create(['name' => 'Supplier ABC']);
@@ -234,7 +251,7 @@
});
test('supplier name with only whitespace is rejected', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -245,7 +262,7 @@
});
test('supplier name with special characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -260,7 +277,7 @@
});
test('supplier name with HTML tags is accepted as plain text', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -275,7 +292,7 @@
});
test('supplier name with numbers is accepted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -290,7 +307,7 @@
});
test('supplier name with only numbers is accepted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -305,7 +322,7 @@
});
test('supplier name with unicode characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -320,7 +337,7 @@
});
test('supplier name with mixed case is stored as entered', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -335,7 +352,7 @@
});
test('supplier name with leading and trailing spaces is accepted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -346,7 +363,7 @@
});
test('supplier name with parentheses and brackets is accepted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -361,7 +378,7 @@
});
test('supplier name with multiple spaces is accepted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -376,7 +393,7 @@
});
test('supplier can be created with name at exact DB column limit (200 chars)', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$name = str_repeat('a', 200);
@@ -393,7 +410,7 @@
});
test('store flashes success toast via Inertia', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -404,7 +421,7 @@
});
test('store creates new supplier in database', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), [
@@ -418,7 +435,7 @@
});
test('multiple suppliers can be created sequentially', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'Supplier 1']);
@@ -438,20 +455,8 @@
|--------------------------------------------------------------------------
*/
-test('supplier phone_number must be numeric', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), [
- 'name' => 'Supplier With Letters',
- 'phone_number' => 'abc123',
- ]);
-
- $response->assertSessionHasErrors('phone_number');
-});
-
-test('supplier phone_number accepts valid numeric string', function () {
- $user = User::factory()->create();
+test('supplier phone_number must be string', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -460,15 +465,10 @@
]);
$response->assertSessionHasNoErrors();
-
- $this->assertDatabaseHas('suppliers', [
- 'name' => 'Supplier Valid Phone',
- 'phone_number' => '08123456789012345678',
- ]);
});
-test('supplier phone_number must not exceed 20 digits', function () {
- $user = User::factory()->create();
+test('supplier phone_number must not exceed 20 characters', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -479,8 +479,8 @@
$response->assertSessionHasErrors('phone_number');
});
-test('supplier phone_number exactly 20 digits passes validation', function () {
- $user = User::factory()->create();
+test('supplier phone_number exactly 20 characters passes validation', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -491,8 +491,8 @@
$response->assertSessionHasNoErrors();
});
-test('supplier phone_number exactly 1 digit passes validation', function () {
- $user = User::factory()->create();
+test('supplier phone_number exactly 1 character passes validation', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -509,7 +509,7 @@
});
test('supplier phone_number can be null', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -525,8 +525,8 @@
]);
});
-test('supplier phone_number with special characters is rejected', function () {
- $user = User::factory()->create();
+test('supplier phone_number with special characters is accepted', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -534,11 +534,11 @@
'phone_number' => '+62-812-3456-7890',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('supplier phone_number with spaces is rejected', function () {
- $user = User::factory()->create();
+test('supplier phone_number with spaces is accepted', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -546,11 +546,11 @@
'phone_number' => '0812 345 678',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('supplier phone_number with dashes is rejected', function () {
- $user = User::factory()->create();
+test('supplier phone_number with dashes is accepted', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -558,11 +558,11 @@
'phone_number' => '0812-3456-7890',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('supplier phone_number with dots is rejected', function () {
- $user = User::factory()->create();
+test('supplier phone_number with dots is accepted', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -570,11 +570,11 @@
'phone_number' => '0812.3456.7890',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('supplier phone_number with parentheses is rejected', function () {
- $user = User::factory()->create();
+test('supplier phone_number with parentheses is accepted', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -582,11 +582,11 @@
'phone_number' => '(0812)3456789',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('supplier phone_number with plus sign is rejected', function () {
- $user = User::factory()->create();
+test('supplier phone_number with plus sign is accepted', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -594,11 +594,11 @@
'phone_number' => '+6281234567890',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('supplier phone_number with hash is rejected', function () {
- $user = User::factory()->create();
+test('supplier phone_number with hash is accepted', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -606,11 +606,11 @@
'phone_number' => '#08123456789',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('supplier phone_number with asterisk is rejected', function () {
- $user = User::factory()->create();
+test('supplier phone_number with asterisk is accepted', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -618,11 +618,11 @@
'phone_number' => '*08123456789',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('supplier phone_number with letters and numbers is rejected', function () {
- $user = User::factory()->create();
+test('supplier phone_number with letters and numbers is accepted', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -630,11 +630,11 @@
'phone_number' => '0812abc3456',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('supplier phone_number with only letters is rejected', function () {
- $user = User::factory()->create();
+test('supplier phone_number with only letters is accepted', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -642,11 +642,11 @@
'phone_number' => 'abcdefghij',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
test('supplier phone_number with empty string is accepted as nullable', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -664,7 +664,7 @@
*/
test('supplier address can be null', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -681,7 +681,7 @@
});
test('supplier address accepts long text', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$address = str_repeat('Jl. Panjang No. 123, RT 01/RW 02, Kelurahan Sukamaju, Kecamatan Menteng, Jakarta Pusat. ', 10);
@@ -699,7 +699,7 @@
});
test('supplier address with special characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -716,7 +716,7 @@
});
test('supplier address with unicode is accepted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -733,7 +733,7 @@
});
test('supplier address with newlines is accepted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -749,7 +749,7 @@
});
test('supplier address with HTML is accepted as plain text', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -766,7 +766,7 @@
});
test('supplier address can be empty string', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -784,7 +784,7 @@
*/
test('supplier can be updated', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -797,7 +797,7 @@
$response
->assertSessionHasNoErrors()
- ->assertRedirect(route('admin.master.suppliers.index'));
+ ->assertRedirect();
$supplier->refresh();
expect($supplier->name)->toBe('Supplier Updated');
@@ -806,7 +806,7 @@
});
test('supplier name can be updated to itself', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create(['name' => 'My Supplier']);
@@ -819,7 +819,7 @@
});
test('supplier update name must be unique excluding itself', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create(['name' => 'First']);
@@ -833,7 +833,7 @@
});
test('supplier update name is required', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -846,7 +846,7 @@
});
test('supplier update name must not exceed 200 characters', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -858,8 +858,8 @@
$response->assertSessionHasErrors('name');
});
-test('supplier update phone_number must be numeric', function () {
- $user = User::factory()->create();
+test('supplier update phone_number accepts any string up to 20 chars', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -869,11 +869,11 @@
'phone_number' => 'abc123',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
-test('supplier update phone_number with special characters is rejected', function () {
- $user = User::factory()->create();
+test('supplier update phone_number with special characters is accepted', function () {
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -883,11 +883,11 @@
'phone_number' => '+62-812-3456-7890',
]);
- $response->assertSessionHasErrors('phone_number');
+ $response->assertSessionHasNoErrors();
});
test('supplier can be updated with only name', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create(['phone_number' => '08123456789', 'address' => 'Old Address']);
@@ -905,7 +905,7 @@
});
test('supplier can be updated multiple times', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create(['name' => 'Version 1']);
@@ -920,7 +920,7 @@
});
test('update flashes success toast via Inertia', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -933,7 +933,7 @@
});
test('supplier update with special characters in name is accepted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -949,7 +949,7 @@
});
test('supplier update with unicode characters is accepted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create(['name' => 'Original']);
@@ -965,7 +965,7 @@
});
test('supplier update with only whitespace name is rejected', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -978,7 +978,7 @@
});
test('supplier update can clear phone_number to null', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create(['phone_number' => '08123456789']);
@@ -995,7 +995,7 @@
});
test('supplier update can clear address to null', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create(['address' => 'Old Address']);
@@ -1012,7 +1012,7 @@
});
test('updating non-existent supplier returns 404', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->put(route('admin.master.suppliers.update', 999999), [
@@ -1029,7 +1029,7 @@
*/
test('supplier can be deleted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -1038,13 +1038,13 @@
$response
->assertSessionHasNoErrors()
- ->assertRedirect(route('admin.master.suppliers.index'));
+ ->assertRedirect();
$this->assertSoftDeleted('suppliers', ['id' => $supplier->id]);
});
test('supplier is soft-deleted not permanently removed', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -1056,7 +1056,7 @@
});
test('soft-deleted supplier still exists in database', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -1067,7 +1067,7 @@
});
test('soft-deleted supplier has deleted_at timestamp', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -1079,7 +1079,7 @@
});
test('deleted supplier is excluded from getAll query', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
Supplier::factory()->create(['name' => 'Active']);
@@ -1099,7 +1099,7 @@
});
test('delete flashes success toast via Inertia', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -1110,7 +1110,7 @@
});
test('multiple suppliers can be deleted one by one', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$suppliers = Supplier::factory()->count(3)->create();
@@ -1124,7 +1124,7 @@
});
test('updating soft-deleted supplier via route returns 404', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -1138,7 +1138,7 @@
});
test('deleting soft-deleted supplier via route returns 404', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -1150,7 +1150,7 @@
});
test('deleting non-existent supplier returns 404', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->delete(route('admin.master.suppliers.destroy', 999999));
@@ -1165,7 +1165,7 @@
*/
test('supplier with purchases can be deleted', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -1179,7 +1179,7 @@
});
test('index page works correctly with suppliers that have purchases', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -1237,7 +1237,7 @@
*/
test('created supplier has correct timestamps', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), [
@@ -1250,7 +1250,7 @@
});
test('updated supplier has updated timestamp changed', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -1267,7 +1267,7 @@
});
test('supplier ID is auto-incremented', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'First']);
@@ -1300,7 +1300,7 @@
*/
test('supplier can be restored after soft delete', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create(['name' => 'Restored Supplier']);
@@ -1314,7 +1314,7 @@
});
test('restored supplier appears in index again', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create(['name' => 'Restored Supplier']);
@@ -1343,7 +1343,7 @@
});
test('restored supplier can be updated', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create(['name' => 'Before Restore']);
@@ -1367,7 +1367,7 @@
*/
test('user creates supplier then immediately edits it', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'Draft Supplier']);
@@ -1380,7 +1380,7 @@
});
test('user creates multiple suppliers and deletes one', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'Keep']);
@@ -1402,7 +1402,7 @@
});
test('user renames supplier to match another existing supplier name', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
Supplier::factory()->create(['name' => 'Target Name']);
@@ -1416,7 +1416,7 @@
});
test('user creates supplier with Indonesian characters', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -1435,7 +1435,7 @@
});
test('user tries to create supplier without submitting any data', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), []);
@@ -1444,7 +1444,7 @@
});
test('user tries to update supplier without submitting any data', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$supplier = Supplier::factory()->create();
@@ -1455,7 +1455,7 @@
});
test('user rapidly submits same supplier creation twice', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'Rapid Submit']);
@@ -1465,96 +1465,8 @@
$this->assertDatabaseCount('suppliers', 1);
});
-test('user creates supplier with name containing chinese characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => '电子产品供应商']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing japanese characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'サプライヤー']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing korean characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => '공급업체']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing arabic characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'المورد']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing cyrillic characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'Поставщик']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing thai characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'ซัพพลายเออร์']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing hindi characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'आपूर्तिकर्ता']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing greek characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'Προμηθευτής']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing vietnamese characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'Nhà cung cấp']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing mixed unicode scripts', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'Supplier 电子产品']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing emoji', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => '🏢 Supplier']);
- $response->assertSessionHasNoErrors();
-});
-
test('user creates supplier with very short name', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), ['name' => 'X']);
@@ -1566,7 +1478,7 @@
});
test('user creates supplier with name containing mixed case and numbers', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'PT123ABC456']);
@@ -1577,7 +1489,7 @@
});
test('user creates supplier with name containing only spaces and numbers', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), ['name' => ' 123 ']);
@@ -1585,7 +1497,7 @@
});
test('user creates supplier with very long name', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$name = str_repeat('a', 200);
@@ -1599,7 +1511,7 @@
});
test('user creates supplier then creates another with similar name', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'Supplier ABC']);
@@ -1611,7 +1523,7 @@
});
test('user creates supplier with name containing curly braces', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => '{code}']);
@@ -1622,7 +1534,7 @@
});
test('user creates supplier with name containing angle brackets', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => '']);
@@ -1633,7 +1545,7 @@
});
test('user creates supplier with name containing semicolon', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'A;B']);
@@ -1644,7 +1556,7 @@
});
test('user creates supplier with name containing colon', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'Time: Now']);
@@ -1655,7 +1567,7 @@
});
test('user creates supplier with name containing backtick', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => '`Code`']);
@@ -1666,7 +1578,7 @@
});
test('user creates supplier with name containing tilde', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'Caf~']);
@@ -1677,7 +1589,7 @@
});
test('user creates supplier with name containing caret', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'A^B']);
@@ -1688,7 +1600,7 @@
});
test('user creates supplier with name containing percentage', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => '100% Natural']);
@@ -1698,72 +1610,8 @@
]);
});
-test('user creates supplier with name containing fullwidth characters', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'ABCDE']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing fullwidth brackets', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => '()【】']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing hiragana', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'あいうえお']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing katakana', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'アイウエオ']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing hangul', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => '가나다라마']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing hebrew', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'אבגדהו']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing bengali', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'অআইঈউ']);
- $response->assertSessionHasNoErrors();
-});
-
-test('user creates supplier with name containing tamil', function () {
- $user = User::factory()->create();
- $this->actingAs($user);
-
- $response = $this->post(route('admin.master.suppliers.store'), ['name' => 'அஆஇஈஉ']);
- $response->assertSessionHasNoErrors();
-});
-
test('user creates supplier with name containing email-like pattern', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'user@example.com']);
@@ -1774,7 +1622,7 @@
});
test('user creates supplier with name containing URL-like pattern', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'https://example.com']);
@@ -1785,7 +1633,7 @@
});
test('user creates supplier with address containing Indonesian address format', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), [
@@ -1801,7 +1649,7 @@
});
test('user creates supplier with phone number in various Indonesian formats', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$phones = [
@@ -1827,7 +1675,7 @@
});
test('user creates supplier then deletes it and creates new one with same name', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$this->post(route('admin.master.suppliers.store'), ['name' => 'Reusable']);
@@ -1841,7 +1689,7 @@
});
test('user creates supplier with name containing regex special characters', function () {
- $user = User::factory()->create();
+ $user = giveSupplierPermissions();
$this->actingAs($user);
$response = $this->post(route('admin.master.suppliers.store'), ['name' => '.*+?^${}()|[]\\']);