diff --git a/tests/Feature/ReportTemplates/CreateReportTemplateTest.php b/tests/Feature/ReportTemplates/CreateReportTemplateTest.php new file mode 100644 index 000000000..8b5c5e520 --- /dev/null +++ b/tests/Feature/ReportTemplates/CreateReportTemplateTest.php @@ -0,0 +1,66 @@ +actingAs(User::factory()->create()) + ->post(route('report-templates.store')) + ->assertForbidden(); + } + + public function testSavingReportTemplateRequiresValidFields() + { + $this->actingAs(User::factory()->canViewReports()->create()) + ->post(route('report-templates.store'), [ + 'name' => '', + ]) + ->assertSessionHasErrors('name'); + } + + public function testRedirectingAfterValidationErrorRestoresInputs() + { + $this->actingAs(User::factory()->canViewReports()->create()) + // start on the custom report page + ->from(route('reports/custom')) + ->followingRedirects() + ->post(route('report-templates.store'), [ + 'name' => '', + // set some values to ensure they are still present + // when returning to the custom report page. + 'by_company_id' => [2, 3] + ])->assertViewHas(['template' => function (ReportTemplate $reportTemplate) { + return data_get($reportTemplate, 'options.by_company_id') === [2, 3]; + }]); + } + + public function testCanSaveAReportTemplate() + { + $user = User::factory()->canViewReports()->create(); + + $this->actingAs($user) + ->post(route('report-templates.store'), [ + 'name' => 'My Awesome Template', + 'company' => '1', + 'by_company_id' => ['1', '2'], + ]) + ->assertRedirect(); + + $template = $user->reportTemplates->first(function ($report) { + return $report->name === 'My Awesome Template'; + }); + + $this->assertNotNull($template); + $this->assertEquals('1', $template->options['company']); + $this->assertEquals(['1', '2'], $template->options['by_company_id']); + } +} diff --git a/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php b/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php new file mode 100644 index 000000000..5ff019491 --- /dev/null +++ b/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php @@ -0,0 +1,21 @@ +markTestIncomplete(); + } + + public function testCanDeleteAReportTemplate() + { + $this->markTestIncomplete(); + } +} diff --git a/tests/Feature/ReportTemplates/ReportTemplateTest.php b/tests/Feature/ReportTemplates/ReportTemplateTest.php deleted file mode 100644 index aa78d9a49..000000000 --- a/tests/Feature/ReportTemplates/ReportTemplateTest.php +++ /dev/null @@ -1,145 +0,0 @@ -actingAs(User::factory()->canViewReports()->create()) - ->get(route('reports/custom')) - ->assertOk() - ->assertViewHas(['template' => function (ReportTemplate $template) { - // the view should have an empty report by default - return $template->exists() === false; - }]); - } - - public function testSavedTemplatesAreScopedToTheUser() - { - // Given there is a saved template for one user - ReportTemplate::factory()->create(['name' => 'Report A']); - - // When loading reports/custom while acting as another user that also has a saved template - $user = User::factory()->canViewReports() - ->has(ReportTemplate::factory(['name' => 'Report B'])) - ->create(); - - // The user should not see the other user's template (in view as 'report_templates') - $this->actingAs($user) - ->get(route('reports/custom')) - ->assertViewHas(['report_templates' => function (Collection $reports) { - return $reports->pluck('name')->doesntContain('Report A'); - }]); - } - - public function testCanLoadASavedReportTemplate() - { - $user = User::factory()->canViewReports()->create(); - $reportTemplate = ReportTemplate::factory()->make(['name' => 'My Awesome Template']); - $user->reportTemplates()->save($reportTemplate); - - $this->actingAs($user) - ->get(route('report-templates.show', $reportTemplate)) - ->assertOk() - ->assertViewHas(['template' => function (ReportTemplate $templatePassedToView) use ($reportTemplate) { - return $templatePassedToView->is($reportTemplate); - }]); - } - - public function testCanSaveAReportTemplate() - { - $user = User::factory()->canViewReports()->create(); - - $this->actingAs($user) - ->post(route('report-templates.store'), [ - 'name' => 'My Awesome Template', - 'company' => '1', - 'by_company_id' => ['1', '2'], - ]) - ->assertRedirect(); - - $template = $user->reportTemplates->first(function ($report) { - return $report->name === 'My Awesome Template'; - }); - - $this->assertNotNull($template); - $this->assertEquals('1', $template->options['company']); - $this->assertEquals(['1', '2'], $template->options['by_company_id']); - } - - public function testSavingReportTemplateRequiresValidFields() - { - $this->actingAs(User::factory()->canViewReports()->create()) - ->post(route('report-templates.store'), [ - 'name' => '', - ]) - ->assertSessionHasErrors('name'); - } - - public function testCanUpdateAReportTemplate() - { - $this->markTestIncomplete(); - - $user = User::factory()->canViewReports()->create(); - - $reportTemplate = ReportTemplate::factory()->for($user)->create(); - - $this->actingAs($user) - ->get(route('report-templates.edit', $reportTemplate)) - ->assertOk(); - - // @todo: - } - - public function testRedirectingAfterValidationErrorRestoresInputs() - { - $this->actingAs(User::factory()->canViewReports()->create()) - // start on the custom report page - ->from(route('reports/custom')) - ->followingRedirects() - ->post(route('report-templates.store'), [ - 'name' => '', - // set some values to ensure they are still present - // when returning to the custom report page. - 'by_company_id' => [2, 3] - ])->assertViewHas(['template' => function (ReportTemplate $reportTemplate) { - return data_get($reportTemplate, 'options.by_company_id') === [2, 3]; - }]); - } - - public function testUpdatingReportTemplateRequiresValidFields() - { - $this->markTestIncomplete(); - } - - public function testSavingReportTemplateRequiresCorrectPermission() - { - $this->actingAs(User::factory()->create()) - ->post(route('report-templates.store')) - ->assertForbidden(); - } - - public function testUpdatingReportTemplateRequiresCorrectPermission() - { - $this->markTestIncomplete(); - } - - public function testCanDeleteAReportTemplate() - { - $this->markTestIncomplete(); - } - - public function testDeletingReportTemplateRequiresCorrectPermission() - { - $this->markTestIncomplete(); - } -} diff --git a/tests/Feature/ReportTemplates/ShowReportTemplateTest.php b/tests/Feature/ReportTemplates/ShowReportTemplateTest.php new file mode 100644 index 000000000..213bc32c8 --- /dev/null +++ b/tests/Feature/ReportTemplates/ShowReportTemplateTest.php @@ -0,0 +1,38 @@ +actingAs(User::factory()->canViewReports()->create()) + ->get(route('reports/custom')) + ->assertOk() + ->assertViewHas(['template' => function (ReportTemplate $template) { + // the view should have an empty report by default + return $template->exists() === false; + }]); + } + + public function testCanLoadASavedReportTemplate() + { + $user = User::factory()->canViewReports()->create(); + $reportTemplate = ReportTemplate::factory()->make(['name' => 'My Awesome Template']); + $user->reportTemplates()->save($reportTemplate); + + $this->actingAs($user) + ->get(route('report-templates.show', $reportTemplate)) + ->assertOk() + ->assertViewHas(['template' => function (ReportTemplate $templatePassedToView) use ($reportTemplate) { + return $templatePassedToView->is($reportTemplate); + }]); + } +} diff --git a/tests/Feature/ReportTemplates/UpdateReportTemplateTest.php b/tests/Feature/ReportTemplates/UpdateReportTemplateTest.php new file mode 100644 index 000000000..f8ef208f0 --- /dev/null +++ b/tests/Feature/ReportTemplates/UpdateReportTemplateTest.php @@ -0,0 +1,38 @@ +markTestIncomplete(); + } + + public function testUpdatingReportTemplateRequiresValidFields() + { + $this->markTestIncomplete(); + } + + public function testCanUpdateAReportTemplate() + { + $this->markTestIncomplete(); + + $user = User::factory()->canViewReports()->create(); + + $reportTemplate = ReportTemplate::factory()->for($user)->create(); + + $this->actingAs($user) + ->get(route('report-templates.edit', $reportTemplate)) + ->assertOk(); + + // @todo: + } +} diff --git a/tests/Unit/ReportTemplateTest.php b/tests/Unit/ReportTemplateTest.php index 465f167ad..80f6e689c 100644 --- a/tests/Unit/ReportTemplateTest.php +++ b/tests/Unit/ReportTemplateTest.php @@ -5,10 +5,33 @@ namespace Tests\Unit; use App\Models\Department; use App\Models\Location; use App\Models\ReportTemplate; +use App\Models\User; +use Illuminate\Database\Eloquent\Collection; +use Tests\Support\InteractsWithSettings; use Tests\TestCase; class ReportTemplateTest extends TestCase { + use InteractsWithSettings; + + public function testSavedTemplatesAreScopedToTheUser() + { + // Given there is a saved template for one user + ReportTemplate::factory()->create(['name' => 'Report A']); + + // When loading reports/custom while acting as another user that also has a saved template + $user = User::factory()->canViewReports() + ->has(ReportTemplate::factory(['name' => 'Report B'])) + ->create(); + + // The user should not see the other user's template (in view as 'report_templates') + $this->actingAs($user) + ->get(route('reports/custom')) + ->assertViewHas(['report_templates' => function (Collection $reports) { + return $reports->pluck('name')->doesntContain('Report A'); + }]); + } + public function testParsingValuesOnNonExistentReportTemplate() { $unsavedTemplate = new ReportTemplate;