Skip to content

Commit f282c52

Browse files
committed
test: fix and convert phpunit tests into pest tests
1 parent 2e94f59 commit f282c52

File tree

3 files changed

+108
-122
lines changed

3 files changed

+108
-122
lines changed

tests/Feature/API/V1/Article/GetArticlesControllerTest.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
->published()
1919
->create();
2020

21-
$response = $this->getJson('/api/v1/articles');
21+
$response = $this->getJson(route('api.v1.articles.index'));
2222

2323
$response->assertStatus(200)
2424
->assertJsonStructure([
@@ -75,7 +75,7 @@
7575
->published()
7676
->create();
7777

78-
$response = $this->getJson("/api/v1/articles?category_slug={$category->slug}");
78+
$response = $this->getJson(route('api.v1.articles.index', ['category_slug' => $category->slug]));
7979

8080
$response->assertStatus(200);
8181
expect($response->json('data.articles'))->toHaveCount(1);
@@ -102,7 +102,7 @@
102102
->published()
103103
->create();
104104

105-
$response = $this->getJson("/api/v1/articles?tag_slug={$tag->slug}");
105+
$response = $this->getJson(route('api.v1.articles.index', ['tag_slug' => $tag->slug]));
106106

107107
$response->assertStatus(200);
108108
expect($response->json('data.articles'))->toHaveCount(1);
@@ -124,7 +124,7 @@
124124
->published()
125125
->create(['title' => 'PHP Best Practices']);
126126

127-
$response = $this->getJson('/api/v1/articles?search=Laravel');
127+
$response = $this->getJson(route('api.v1.articles.index', ['search' => 'Laravel']));
128128

129129
$response->assertStatus(200);
130130
expect($response->json('data.articles'))->toHaveCount(1);
@@ -147,7 +147,7 @@
147147
->published()
148148
->create();
149149

150-
$response = $this->getJson("/api/v1/articles?created_by={$author1->id}");
150+
$response = $this->getJson(route('api.v1.articles.index', ['created_by' => $author1->id]));
151151

152152
$response->assertStatus(200);
153153
expect($response->json('data.articles'))->toHaveCount(1);
@@ -169,7 +169,7 @@
169169
->draft()
170170
->create();
171171

172-
$response = $this->getJson('/api/v1/articles?status=published');
172+
$response = $this->getJson(route('api.v1.articles.index', ['status' => 'published']));
173173

174174
$response->assertStatus(200);
175175
expect($response->json('data.articles'))->toHaveCount(1);
@@ -185,7 +185,7 @@
185185
->published()
186186
->create();
187187

188-
$response = $this->getJson('/api/v1/articles?per_page=5&page=2');
188+
$response = $this->getJson(route('api.v1.articles.index', ['per_page' => 5, 'page' => 2]));
189189

190190
$response->assertStatus(200);
191191
expect($response->json('data.articles'))->toHaveCount(5);
@@ -208,7 +208,7 @@
208208
->published()
209209
->create(['title' => 'Z Article']);
210210

211-
$response = $this->getJson('/api/v1/articles?sort_by=title&sort_direction=asc');
211+
$response = $this->getJson(route('api.v1.articles.index', ['sort_by' => 'title', 'sort_direction' => 'asc']));
212212

213213
$response->assertStatus(200);
214214
expect($response->json('data.articles.0.id'))->toBe($article1->id);
@@ -222,7 +222,7 @@
222222
->andThrow(new \Exception('Database connection failed'));
223223
});
224224

225-
$response = $this->getJson('/api/v1/articles');
225+
$response = $this->getJson(route('api.v1.articles.index'));
226226

227227
$response->assertStatus(500)
228228
->assertJson([

tests/Feature/API/V1/Article/ShowArticleControllerTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
$article->categories()->attach($category->id);
2323
$article->tags()->attach($tag->id);
2424

25-
$response = $this->getJson("/api/v1/articles/{$article->slug}");
25+
$response = $this->getJson(route('api.v1.articles.show', ['slug' => $article->slug]));
2626

2727
$response->assertStatus(200)
2828
->assertJsonStructure([
@@ -46,7 +46,6 @@
4646
'author' => [
4747
'id',
4848
'name',
49-
'email',
5049
'avatar_url',
5150
'bio',
5251
],
@@ -76,6 +75,7 @@
7675
it('returns 404 when article not found by slug', function () {
7776
$response = $this->getJson('/api/v1/articles/non-existent-slug');
7877

78+
$response = $this->getJson(route('api.v1.articles.show', ['slug' => 'non-existent-slug']));
7979
$response->assertStatus(404)
8080
->assertJson([
8181
'status' => false,
@@ -93,7 +93,7 @@
9393
->andThrow(new \Exception('Database connection failed'));
9494
});
9595

96-
$response = $this->getJson('/api/v1/articles/test-slug');
96+
$response = $this->getJson(route('api.v1.articles.show', ['slug' => 'test-slug']));
9797

9898
$response->assertStatus(500)
9999
->assertJson([

tests/Feature/Middleware/ApiLoggerTest.php

Lines changed: 96 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -2,125 +2,111 @@
22

33
declare(strict_types=1);
44

5-
namespace Tests\Feature\Middleware;
6-
75
use Illuminate\Support\Facades\Config;
86
use Illuminate\Support\Facades\Log;
97
use Illuminate\Support\Facades\Route;
10-
use Tests\TestCase;
118

12-
class ApiLoggerTest extends TestCase
13-
{
14-
protected function setUp(): void
15-
{
16-
parent::setUp();
17-
// Ensure logging is enabled for tests
18-
Config::set('api-logger.enabled', true);
19-
// Create a test route using the middleware
20-
Route::middleware('api.logger')->post('/test-api-logger', function () {
21-
return response()->json(['success' => true, 'token' => 'shouldbemasked']);
22-
});
23-
}
9+
beforeEach(function () {
10+
// Ensure logging is enabled for tests
11+
Config::set('api-logger.enabled', true);
12+
// Create a test route using the middleware
13+
Route::middleware('api.logger')->post('/test-api-logger', function () {
14+
return response()->json(['success' => true, 'token' => 'shouldbemasked']);
15+
});
16+
});
2417

25-
public function test_logs_request_and_response_with_masking()
26-
{
27-
Log::spy();
28-
$payload = [
29-
'username' => 'testuser',
30-
'password' => 'supersecret',
31-
];
32-
$headers = [
33-
'Authorization' => 'Bearer sometoken',
34-
'X-Request-Id' => 'test-request-id-123',
35-
];
18+
test('logs request and response with masking', function () {
19+
Log::spy();
20+
$payload = [
21+
'username' => 'testuser',
22+
'password' => 'supersecret',
23+
];
24+
$headers = [
25+
'Authorization' => 'Bearer sometoken',
26+
'X-Request-Id' => 'test-request-id-123',
27+
];
3628

37-
$response = $this->postJson('/test-api-logger', $payload, $headers);
38-
$response->assertOk();
39-
$response->assertJson(['success' => true]);
29+
$response = $this->postJson('/test-api-logger', $payload, $headers);
30+
$response->assertOk();
31+
$response->assertJson(['success' => true]);
4032

41-
Log::shouldHaveReceived('info')->withArgs(function ($message, $context) use ($headers) {
42-
return $message === 'API Request'
43-
&& $context['request_id'] === $headers['X-Request-Id']
44-
&& $context['body']['password'] === '***MASKED***'
45-
&& $context['headers']['authorization'] === '***MASKED***'
46-
&& $context['response_body']['token'] === '***MASKED***';
47-
})->once();
48-
}
33+
Log::shouldHaveReceived('info')->withArgs(function ($message, $context) use ($headers) {
34+
return $message === 'API Request'
35+
&& $context['request_id'] === $headers['X-Request-Id']
36+
&& $context['body']['password'] === '***MASKED***'
37+
&& $context['headers']['authorization'] === '***MASKED***'
38+
&& $context['response_body']['token'] === '***MASKED***';
39+
})->once();
40+
});
4941

50-
public function test_does_not_log_when_disabled()
51-
{
52-
Config::set('api-logger.enabled', false);
53-
Log::spy();
54-
$response = $this->postJson('/test-api-logger', []);
55-
$response->assertOk();
56-
Log::shouldNotHaveReceived('info');
57-
}
42+
test('does not log when disabled', function () {
43+
Config::set('api-logger.enabled', false);
44+
Log::spy();
45+
$response = $this->postJson('/test-api-logger', []);
46+
$response->assertOk();
47+
Log::shouldNotHaveReceived('info');
48+
});
5849

59-
public function test_logs_with_custom_masked_headers_and_body_keys()
60-
{
61-
Config::set('api-logger.masked_headers', ['authorization', 'x-custom-header']);
62-
Config::set('api-logger.masked_body_keys', ['password', 'secret']);
63-
Log::spy();
64-
$payload = [
65-
'username' => 'testuser',
66-
'password' => 'supersecret',
67-
'secret' => 'topsecret',
68-
];
69-
$headers = [
70-
'Authorization' => 'Bearer sometoken',
71-
'X-Custom-Header' => 'customvalue',
72-
'X-Request-Id' => 'custom-id-456',
73-
];
74-
$response = $this->postJson('/test-api-logger', $payload, $headers);
75-
$response->assertOk();
76-
Log::shouldHaveReceived('info')->withArgs(function ($message, $context) {
77-
return $context['headers']['authorization'] === '***MASKED***'
78-
&& $context['headers']['x-custom-header'] === '***MASKED***'
79-
&& $context['body']['password'] === '***MASKED***'
80-
&& $context['body']['secret'] === '***MASKED***';
81-
})->once();
82-
}
50+
test('logs with custom masked headers and body keys', function () {
51+
Config::set('api-logger.masked_headers', ['authorization', 'x-custom-header']);
52+
Config::set('api-logger.masked_body_keys', ['password', 'secret']);
53+
Log::spy();
54+
$payload = [
55+
'username' => 'testuser',
56+
'password' => 'supersecret',
57+
'secret' => 'topsecret',
58+
];
59+
$headers = [
60+
'Authorization' => 'Bearer sometoken',
61+
'X-Custom-Header' => 'customvalue',
62+
'X-Request-Id' => 'custom-id-456',
63+
];
64+
$response = $this->postJson('/test-api-logger', $payload, $headers);
65+
$response->assertOk();
66+
Log::shouldHaveReceived('info')->withArgs(function ($message, $context) {
67+
return $context['headers']['authorization'] === '***MASKED***'
68+
&& $context['headers']['x-custom-header'] === '***MASKED***'
69+
&& $context['body']['password'] === '***MASKED***'
70+
&& $context['body']['secret'] === '***MASKED***';
71+
})->once();
72+
});
8373

84-
public function test_logs_all_context_fields()
85-
{
86-
Log::spy();
87-
$payload = ['username' => 'testuser'];
88-
$headers = [
89-
'X-Request-Id' => 'all-fields-id',
90-
];
91-
$response = $this->postJson('/test-api-logger', $payload, $headers);
92-
$response->assertOk();
93-
Log::shouldHaveReceived('info')->withArgs(function ($message, $context) use ($headers) {
94-
return $context['request_id'] === $headers['X-Request-Id']
95-
&& isset($context['ip'])
96-
&& $context['method'] === 'POST'
97-
&& str_contains($context['uri'], '/test-api-logger')
98-
&& $context['response_status'] === 200
99-
&& is_numeric($context['duration_ms']);
100-
})->once();
101-
}
74+
test('logs all context fields', function () {
75+
Log::spy();
76+
$payload = ['username' => 'testuser'];
77+
$headers = [
78+
'X-Request-Id' => 'all-fields-id',
79+
];
80+
$response = $this->postJson('/test-api-logger', $payload, $headers);
81+
$response->assertOk();
82+
Log::shouldHaveReceived('info')->withArgs(function ($message, $context) use ($headers) {
83+
return $context['request_id'] === $headers['X-Request-Id']
84+
&& isset($context['ip'])
85+
&& $context['method'] === 'POST'
86+
&& str_contains($context['uri'], '/test-api-logger')
87+
&& $context['response_status'] === 200
88+
&& is_numeric($context['duration_ms']);
89+
})->once();
90+
});
10291

103-
public function test_logs_non_json_response()
104-
{
105-
Route::middleware('api.logger')->get('/test-non-json', function () {
106-
return 'plain text response';
107-
});
108-
Log::spy();
109-
$response = $this->get('/test-non-json');
110-
$response->assertOk();
111-
$response->assertSee('plain text response');
112-
Log::shouldHaveReceived('info')->withArgs(function ($message, $context) {
113-
return $context['response_body'] === 'plain text response';
114-
})->once();
115-
}
92+
test('logs non json response', function () {
93+
Route::middleware('api.logger')->get('/test-non-json', function () {
94+
return 'plain text response';
95+
});
96+
Log::spy();
97+
$response = $this->get('/test-non-json');
98+
$response->assertOk();
99+
$response->assertSee('plain text response');
100+
Log::shouldHaveReceived('info')->withArgs(function ($message, $context) {
101+
return $context['response_body'] === 'plain text response';
102+
})->once();
103+
});
116104

117-
public function test_logs_with_empty_headers_and_body()
118-
{
119-
Log::spy();
120-
$response = $this->postJson('/test-api-logger', [], []);
121-
$response->assertOk();
122-
Log::shouldHaveReceived('info')->withArgs(function ($message, $context) {
123-
return is_array($context['headers']) && is_array($context['body']);
124-
})->once();
125-
}
126-
}
105+
test('logs with empty headers and body', function () {
106+
Log::spy();
107+
$response = $this->postJson('/test-api-logger', [], []);
108+
$response->assertOk();
109+
Log::shouldHaveReceived('info')->withArgs(function ($message, $context) {
110+
return is_array($context['headers']) && is_array($context['body']);
111+
})->once();
112+
});

0 commit comments

Comments
 (0)