Skip to content

Commit 9ac860f

Browse files
committed
tests: added mokable elements to improve testability
1 parent aff841b commit 9ac860f

File tree

6 files changed

+178
-4
lines changed

6 files changed

+178
-4
lines changed

README.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Please visit the original [https://registro.sportesalute.eu](https://registro.sp
2929
- [Pagination](#pagination)
3030
- [Order](#order)
3131
- [Getting Organization Details](#getting-organization-details)
32-
- [Frontend Integration](#frontend-integration)
32+
- [Test](#faking)
3333
- [Testing](#testing)
3434
- [Contributing](#contributing)
3535
- [License](#license)
@@ -133,6 +133,19 @@ echo $details['Codice Fiscale'];
133133
// etc.
134134
```
135135

136+
### Faking
137+
138+
You can `fake` the facade so you can focus on testing your own code.
139+
140+
```php
141+
use CarloEusebi\RegistroSportESalute\Facades\RegistroSportESalute;
142+
143+
RegistroSportESalute::fake(
144+
count: 2 // how may mock Organizations should return; will return one by default
145+
shouldThrowHttpException: true, // it should simulate an HttpClientException
146+
);
147+
```
148+
136149
## Testing
137150

138151
This package includes a comprehensive test suite. To run the tests:

src/Facades/RegistroSportESalute.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace CarloEusebi\RegistroSportESalute\Facades;
66

77
use CarloEusebi\RegistroSportESalute\Organization;
8+
use CarloEusebi\RegistroSportESalute\Testing\Fakes\RegistroSportESaluteFake;
89
use Illuminate\Support\Collection;
910
use Illuminate\Support\Facades\Facade;
1011

@@ -26,4 +27,11 @@ protected static function getFacadeAccessor(): string
2627
{
2728
return \CarloEusebi\RegistroSportESalute\RegistroSportESalute::class;
2829
}
30+
31+
public static function fake(int $count = 1, bool $shouldThrowHttpException = false): RegistroSportESaluteFake
32+
{
33+
return tap(new RegistroSportESaluteFake($count, $shouldThrowHttpException), function ($fake): void {
34+
static::swap($fake);
35+
});
36+
}
2937
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace CarloEusebi\RegistroSportESalute\Factories;
4+
5+
use CarloEusebi\RegistroSportESalute\Organization;
6+
use Faker\Factory;
7+
8+
class OrganizationFactory
9+
{
10+
public static function create(): Organization
11+
{
12+
$faker = Factory::create('it_IT');
13+
14+
return Organization::fromArray([
15+
'id' => $faker->numberBetween(100000, 999999),
16+
'id_pad' => str_pad((string) $faker->numberBetween(100000, 999999), 8, '0', STR_PAD_LEFT),
17+
'presentazione_data' => $faker->dateTimeBetween('-5 years', '-1 year')->format('Y-m-d\TH:i:sP'),
18+
'approvazione_data' => $faker->dateTimeBetween('-1 year', 'now')->format('Y-m-d\TH:i:sP'),
19+
'societa__codiceFiscale' => $faker->regexify('[0-9]{11}'),
20+
'societa__iconaVcf' => 'static/icons/age_'.$faker->numberBetween(1, 10).'.png',
21+
'organismi_affiliazioni_attive' => [
22+
'static/os/asi.png',
23+
],
24+
'statoIstruttoria__descrizione' => $faker->randomElement(['Domanda accolta', 'In attesa', 'Domanda respinta']),
25+
'utenza' => $faker->optional(0.7, '')->userName,
26+
'societa__natura_giuridica' => $faker->randomElement(['Società a Responsabilità Limitata', 'Associazione Sportiva Dilettantistica', 'Società Sportiva Dilettantistica']),
27+
'societa__denominazione' => $faker->company,
28+
'societa__sedeLegale__regione__denominazione' => $faker->citySuffix,
29+
'societa__sedeLegale__comune__denominazione' => $faker->city,
30+
'affiliazione_scaduta_organismo_icona' => $faker->optional(0.3, '')->imageUrl(50, 50),
31+
'richiestaIntegrazioni_prima_data' => $faker->dateTimeBetween('-1 year', '-6 months')->format('Y-m-d\TH:i:sP'),
32+
'richiestaIntegrazioni_ultima_data' => $faker->dateTimeBetween('-6 months', '-3 months')->format('Y-m-d\TH:i:sP'),
33+
'invioIntegrazioni_prima_data' => $faker->dateTimeBetween('-3 months', '-2 months')->format('Y-m-d\TH:i:sP'),
34+
'invioIntegrazioni_ultima_data' => $faker->dateTimeBetween('-2 months', '-1 month')->format('Y-m-d\TH:i:sP'),
35+
'richiestaAggiornamenti_ultima_data' => $faker->dateTimeBetween('-1 month', 'now')->format('Y-m-d\TH:i:sP'),
36+
'richiestaAggiornamenti_icona' => [
37+
'icona' => $faker->randomElement(['fa-solid fa-check', 'fa-solid fa-times', 'fa-solid fa-exclamation']),
38+
'colore' => $faker->randomElement(['verde', 'rosso', 'giallo']),
39+
],
40+
'invioAggiornamenti_ultima_data' => $faker->dateTimeBetween('-1 month')->format('Y-m-d\TH:i:sP'),
41+
'tipoIstruttoria' => $faker->numberBetween(1, 3),
42+
'statoIstruttoria_icona' => [
43+
'icona' => $faker->randomElement(['fa-solid fa-check', 'fa-solid fa-times', 'fa-solid fa-exclamation']),
44+
'colore' => $faker->randomElement(['verde', 'rosso', 'giallo']),
45+
],
46+
]);
47+
}
48+
}

src/RegistroSportESalute.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
namespace CarloEusebi\RegistroSportESalute;
66

77
use Carbon\Carbon;
8+
use Illuminate\Http\Client\RequestException;
89
use Illuminate\Support\Arr;
910
use Illuminate\Support\Collection;
1011
use Illuminate\Support\Facades\Cache;
1112
use Illuminate\Support\Facades\Http;
12-
use JsonException;
1313

1414
/**
1515
* @phpstan-type OrganizationsData array{
@@ -79,7 +79,7 @@ public function page(int $page = 1, int $pageSize = 10): self
7979
/**
8080
* @return Collection<int, Organization>
8181
*
82-
* @throws JsonException
82+
* @throws RequestException
8383
*/
8484
public function get(): Collection
8585
{
@@ -106,7 +106,9 @@ public function get(): Collection
106106
}
107107

108108
/**
109-
* @return array<string, int|string>
109+
* @return array<string, int|string|null>
110+
*
111+
* @throws RequestException
110112
*/
111113
public function getById(int $id): array
112114
{
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<?php
2+
3+
namespace CarloEusebi\RegistroSportESalute\Testing\Fakes;
4+
5+
use CarloEusebi\RegistroSportESalute\Factories\OrganizationFactory;
6+
use CarloEusebi\RegistroSportESalute\RegistroSportESalute;
7+
use Faker\Factory;
8+
use Illuminate\Support\Collection;
9+
use Illuminate\Support\Facades\Http;
10+
use Illuminate\Support\Testing\Fakes\Fake;
11+
12+
/**
13+
* @internal
14+
*/
15+
class RegistroSportESaluteFake extends RegistroSportESalute implements Fake
16+
{
17+
public function __construct(
18+
private readonly int $count = 1,
19+
private readonly bool $shouldThrowHttpException = false,
20+
) {}
21+
22+
public function get(): Collection
23+
{
24+
if ($this->shouldThrowHttpException) {
25+
Http::fake([
26+
'*' => Http::response(body: 'Internal Server Error', status: 500),
27+
]);
28+
29+
return parent::get();
30+
}
31+
32+
return collect(array_fill(0, $this->count, OrganizationFactory::create()));
33+
}
34+
35+
public function getById(int $id): array
36+
{
37+
if ($this->shouldThrowHttpException) {
38+
Http::fake([
39+
'*' => Http::response(body: 'Internal Server Error', status: 500),
40+
]);
41+
42+
return parent::getById($id);
43+
}
44+
45+
$faker = Factory::create('it_IT');
46+
47+
return [
48+
'Codice Fiscale' => $faker->regexify('[0-9]{11}'),
49+
'Denominazione' => $faker->company,
50+
'Legale rappresentante' => strtoupper($faker->name),
51+
'Regione' => $faker->city,
52+
'Comune' => $faker->city,
53+
'Organismi sportivi attivi' => $faker->paragraph(),
54+
'Data presentazione' => $faker->dateTimeBetween('-5 years', '-1 year')->format('Y-m-d\TH:i:sP'),
55+
'Discipline attive' => $faker->paragraph(),
56+
"Nr. attività sportive organizzate nell'ultimo anno" => $faker->numberBetween(0, 20),
57+
"Nr. partecipazioni attività sportive nell'ultimo anno" => $faker->numberBetween(0, 1000),
58+
"Nr. attività didattiche organizzate nell'ultimo anno" => $faker->numberBetween(0, 10),
59+
'Nr. partecipazioni attività didattiche' => $faker->optional(0.7, null)->numberBetween(0, 500),
60+
"Nr. attività formative organizzate nell'ultimo anno" => $faker->numberBetween(0, 5),
61+
'Nr. tesserati attivi' => $faker->numberBetween(10, 2000),
62+
'Personalità Giuridica' => 'Società a Responsabilità Limitata',
63+
];
64+
}
65+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
use CarloEusebi\RegistroSportESalute\Facades\RegistroSportESalute;
4+
use CarloEusebi\RegistroSportESalute\Organization;
5+
use Illuminate\Http\Client\HttpClientException;
6+
7+
it('throws exceptions works on get', function (): void {
8+
RegistroSportESalute::fake(shouldThrowHttpException: true);
9+
10+
RegistroSportESalute::filterByCodiceFiscale('codice_fiscale')->get();
11+
})->throws(HttpClientException::class);
12+
13+
it('throws exceptions works on getById', function (): void {
14+
RegistroSportESalute::fake(shouldThrowHttpException: true);
15+
16+
RegistroSportESalute::getById(2);
17+
})->throws(HttpClientException::class);
18+
19+
it('returns fake data on get', function (): void {
20+
RegistroSportESalute::fake();
21+
22+
expect(RegistroSportESalute::get())
23+
->toHaveCount(1)
24+
->each->toBeInstanceOf(Organization::class);
25+
});
26+
27+
test('returns correct amount of organizations', function (): void {
28+
RegistroSportESalute::fake(3);
29+
30+
expect(RegistroSportESalute::get())->toHaveCount(3);
31+
});
32+
33+
test('get by id', function (): void {
34+
RegistroSportESalute::fake();
35+
36+
expect(RegistroSportESalute::getById(1))
37+
->toBeArray();
38+
});

0 commit comments

Comments
 (0)