Created
February 18, 2024 04:03
-
-
Save owenconti/3f22d4825105a6ae3f364badd1156450 to your computer and use it in GitHub Desktop.
prompt for generating test classes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[ | |
{ | |
"role": "system", | |
"content": "You are a bot that generates Laravel Tests for given input files. You are an expert in your field. You prioritize standardization and consistency." | |
}, | |
{ | |
"role": "user", | |
"content": "I will provide to you a series of input files. I need you to generate a single Laravel test class as your output. Please put the contents of the generated test f | |
ile in a JSON object with the key: \"test_class\". Please also generate a file name for the test class and put it in the JSON object with the key: \"file_name\"." | |
}, | |
{ | |
"role": "user", | |
"content": "The test class will be output to the following location: app\/Configuration\/Tests\/Feature\/Programs. The namespace for the test class you generate should use t | |
he file's location in PSR-4 format." | |
}, | |
{ | |
"role": "user", | |
"content": "Custom intstructions from the user that you must follow:\n- Write tests using PHPUnit.\n- Write tests using camelCase method names.\n- Ensure you generate test cases for postive and negative scenarios.\n- Return `:void` for all test methods.\n- Use the `\/** @test *\/ | |
` annotation for all test methods.\n- Do not include the word \"Controller\" or \"Request\" in the name of the generated file.\n\nThe following helper methods are available to use when generating tests:\n\n```php\n public function assertPageTitle(): callable\n {\n return fun | |
ction (string $expectedTitle): TestResponse {\n \/* @var TestResponse $this *\/\n try {\n Assertable::fromTestResponse($this)->where('dialog.properties.meta.title', $expectedTitle);\n } catch (AssertionFailedError $e) {\n Ass | |
ertable::fromTestResponse($this)->where('view.properties.meta.title', $expectedTitle);\n }\n\n return $this;\n };\n }\n\n public function assertBreadcrumbsSize(): callable\n {\n return function (int $expectedSize): TestResponse {\n | |
\/* @var TestResponse $this *\/\n Assertable::fromTestResponse($this)->count('view.properties.meta.breadcrumbs', $expectedSize);\n\n return $this;\n };\n }\n\n public function assertBreadcrumb(): callable\n {\n return function (string $label, | |
?string $url): TestResponse {\n $expectedCrumbs = [['label' => $label, 'url' => $url]];\n\n \/* @var TestResponse $this *\/\n Assertable::fromTestResponse($this)->where('view.properties.meta.breadcrumbs', $expectedCrumbs);\n\n return $this;\n | |
};\n }\n\n public function assertBreadcrumbs(): callable\n {\n return function (...$expectedCrumbs): TestResponse {\n $expectedCrumbs = collect($expectedCrumbs)->map(fn ($crumb) => [\n 'label' => $crumb[0],\n 'url' => $crumb[ | |
1] ?? null,\n ])->toArray();\n\n try {\n Assertable::fromTestResponse($this)->where('dialog.properties.meta.breadcrumbs', $expectedCrumbs);\n } catch (AssertionFailedError $e) {\n Assertable::fromTestResponse($this)->where('v | |
iew.properties.meta.breadcrumbs', $expectedCrumbs);\n }\n\n return $this;\n };\n }\n\n public function assertSessionHasDangerToast(): callable\n {\n return $this->assertSessionHasToastWithType(ToastType::DANGER);\n }\n\n public function | |
assertSessionHasSuccessToast(): callable\n {\n return $this->assertSessionHasToastWithType(ToastType::SUCCESS);\n }\n\n public function assertSessionHasInfoToast(): callable\n {\n return $this->assertSessionHasToastWithType(ToastType::INFO);\n }\n\n protec | |
ted function createAdmin(): User\n {\n return $this->createUserWithRole(Role::ADMINISTRATOR);\n }\n\n protected function createAdminWithoutPowers(): User\n {\n $user = $this->createUserWithRole(Role::ADMINISTRATOR);\n\n $user->permissions()->delete();\n\n | |
return $user;\n }\n\n protected function createAdminWithoutPermission(Permission $permission): User\n {\n $user = $this->createUserWithRole(Role::ADMINISTRATOR);\n $user->roles->first()->removePermission($permission);\n\n return $user;\n }\n\n | |
protected function createUserWithPermissions(array $permissions): User\n {\n $role = RoleFactory::new()->create(['name' => Str::uuid()->toString()]);\n\n collect($permissions)->each(fn ($permission) => $role->addPermission($permission));\n\n $user = UserFactory::n | |
ew()->create();\n\n $user->roles()->sync([$role->id]);\n\n return $user;\n }\n\n protected function createRegionalDirector(): User\n {\n return $this->createUserWithRole(Role::REGIONAL_DIRECTOR);\n }\n\n protected function createProgramDirector(): User | |
\n {\n return $this->createUserWithRole(Role::PROGRAM_DIRECTOR);\n }\n\n protected function createAdviser(): User\n {\n return $this->createUserWithRole(Role::ADVISER);\n }\n\n protected function createUserWithRole(Role $role): User\n {\n return | |
UserFactory::new()->withRole($role)->create();\n }\n\n protected function createRole(): Role\n {\n return RoleFactory::new()->create();\n }\n\n protected function regionalDirectorRole(): Role\n {\n return Role::firstWhere(['name' => RoleEnum::REGIONAL_DIRE | |
CTOR]);\n }\n\n protected function adviserRole(): Role\n {\n return Role::firstWhere(['name' => RoleEnum::ADVISER]);\n }\n\n protected function createRoleWithPermissions(array $permissions): Role\n {\n return RoleFactory::new()->withPermissions($permission | |
s)->create();\n }\n```\n" | |
}, | |
{ | |
"role": "user", | |
"content": "The following message contains an example test file to mimic. Follow the patterns in these files as closely as you can." | |
}, | |
{ | |
"role": "user", | |
"content": "Example Test File\n```php\n<?php\n\nnamespace App\\Auth\\Tests\\Feature\\Users;\n\nuse App\\Auth\\Database\\Factories\\UserFactory;\nuse App\\Auth\\Models\\User;\nuse Illuminate\\Testing\\TestResponse;\nuse Tests\\TestCase;\n\nclass ShowUserTest extends TestCase\n{\n | |
\/** @test *\/\n public function itShouldRenderShowUserView(): void\n {\n \/\/ Arrange\n $record = UserFactory::new()->create();\n\n \/\/ Act\n $this->showUserController($record)\n ->assertSuccessful()\n ->assertHybrid()\n | |
->assertHybridDialog(baseUrl: route('users.index'), view: 'auth::users.ShowUser', properties: [\n 'user.id' => $record->id,\n ])\n ->assertPageTitle($record->name)\n ->assertBreadcrumbs(\n ['Users', route('users.index')] | |
,\n [$record->name, route('users.show', $record)]\n );\n }\n\n \/** @test *\/\n public function itValidatesUserHasViewUserPermissionWhenViewingUser(): void\n {\n \/\/ Arrange\n $record = UserFactory::new()->create();\n $user = $t | |
his->createAdviser();\n\n \/\/ Act\n $this->showUserController(record: $record, user: $user)\n ->assertForbidden();\n }\n\n private function showUserController(User $record, ?User $user = null): TestResponse\n {\n return $this\n ->actin | |
gAs($user ?: $this->createAdmin())\n ->get(route('users.show', ['user' => $record]));\n }\n}\n\n```" | |
}, | |
{ | |
"role": "user", | |
"content": "The following messages contain the input source files to generate the test class for." | |
}, | |
{ | |
"role": "user", | |
"content": "File #1\n```php\n<?php\n\nnamespace App\\Configuration\\Http\\Controllers\\Programs;\n\nuse App\\Base\\Data\\PageMetaData;\nuse App\\Base\\Http\\Controllers\\Controller;\nuse App\\Configuration\\Data\\ProgramData;\nuse App\\Configuration\\Http\\Requests\\Programs\\Sho | |
wProgramRequest;\nuse App\\Configuration\\Models\\Program;\nuse Hybridly\\View\\Factory as HybridlyViewFactory;\n\nclass ShowProgramController extends Controller\n{\n public function __invoke(ShowProgramRequest $request, Program $program): HybridlyViewFactory\n {\n $program$ | |
>loadMissing(['users', 'schools', 'region']);\n\n return hybridly('configuration::programs.ShowProgram', [\n 'meta' => PageMetaData::title($program->display_name)\n ->breadcrumb('Programs', route('programs.index'))\n ->breadcrumb($program-> | |
display_name, route('programs.show', $program)),\n 'program' => ProgramData::from($program),\n ])->base('programs.index');\n }\n}\n\n```" | |
}, | |
{ | |
"role": "user", | |
"content": "File #2\n```php\n<?php\n\nnamespace App\\Configuration\\Http\\Requests\\Programs;\n\nuse App\\Configuration\\Models\\Program;\nuse Illuminate\\Foundation\\Http\\FormRequest;\nuse Illuminate\\Support\\Facades\\Auth;\n\n\/**\n * @property Program $program\n *\/\nclass S | |
howProgramRequest extends FormRequest\n{\n public function authorize(): bool\n {\n return Auth::user()->can('view', $this->route('program'));\n }\n\n public function rules(): array\n {\n return [];\n }\n}\n\n```" | |
} | |
] |
Yea, I’ve not messed with separating into user and system - haven’t needed to.
@iambateman got it, I will experiment! thanks for your assistance
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@iambateman
Does that entire chunk of text get put in as a
user
message? Do you provide anysystem
message before that?