Skip to content

Commit 6484b1e

Browse files
committed
Add unit tests for AcceptJsonMiddleware to validate JSON request handling
1 parent c2d099a commit 6484b1e

File tree

1 file changed

+160
-0
lines changed

1 file changed

+160
-0
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
<?php
2+
3+
test('AcceptJsonMiddleware accepts requests without Accept header (Laravel default)', function () {
4+
// Laravel's acceptsJson() returns true when no Accept header is present
5+
$middleware = new \App\Http\Middleware\AcceptJsonMiddleware();
6+
7+
$request = \Illuminate\Http\Request::create('/api/test', 'GET');
8+
9+
$response = $middleware->handle($request, function () {
10+
return response()->json(['success' => true]);
11+
});
12+
13+
expect($response->getStatusCode())->toBe(200);
14+
15+
$content = json_decode($response->getContent(), true);
16+
expect($content['success'])->toBe(true);
17+
});
18+
19+
test('AcceptJsonMiddleware accepts requests with Accept: application/json header', function () {
20+
$middleware = new \App\Http\Middleware\AcceptJsonMiddleware();
21+
22+
$request = \Illuminate\Http\Request::create('/api/test', 'GET', [], [], [], [
23+
'HTTP_ACCEPT' => 'application/json'
24+
]);
25+
26+
$response = $middleware->handle($request, function () {
27+
return response()->json(['success' => true]);
28+
});
29+
30+
expect($response->getStatusCode())->toBe(200);
31+
32+
$content = json_decode($response->getContent(), true);
33+
expect($content['success'])->toBe(true);
34+
});
35+
36+
test('AcceptJsonMiddleware rejects requests with Accept: */json header', function () {
37+
// Laravel's acceptsJson() returns false for */json
38+
$middleware = new \App\Http\Middleware\AcceptJsonMiddleware();
39+
40+
$request = \Illuminate\Http\Request::create('/api/test', 'GET', [], [], [], [
41+
'HTTP_ACCEPT' => '*/json'
42+
]);
43+
44+
$response = $middleware->handle($request, function () {
45+
return response()->json(['success' => true]);
46+
});
47+
48+
expect($response->getStatusCode())->toBe(406);
49+
50+
$content = json_decode($response->getContent(), true);
51+
expect($content['message'])->toBe('This endpoint only accepts JSON. Please include "Accept: application/json" in your request headers.');
52+
expect($content['error'])->toBe('Unsupported Media Type');
53+
});
54+
55+
test('AcceptJsonMiddleware accepts requests with Accept: application/* header', function () {
56+
$middleware = new \App\Http\Middleware\AcceptJsonMiddleware();
57+
58+
$request = \Illuminate\Http\Request::create('/api/test', 'GET', [], [], [], [
59+
'HTTP_ACCEPT' => 'application/*'
60+
]);
61+
62+
$response = $middleware->handle($request, function () {
63+
return response()->json(['success' => true]);
64+
});
65+
66+
expect($response->getStatusCode())->toBe(200);
67+
});
68+
69+
test('AcceptJsonMiddleware accepts requests with multiple Accept headers including application/json', function () {
70+
$middleware = new \App\Http\Middleware\AcceptJsonMiddleware();
71+
72+
$request = \Illuminate\Http\Request::create('/api/test', 'GET', [], [], [], [
73+
'HTTP_ACCEPT' => 'text/html,application/json,application/xml;q=0.9,*/*;q=0.8'
74+
]);
75+
76+
$response = $middleware->handle($request, function () {
77+
return response()->json(['success' => true]);
78+
});
79+
80+
expect($response->getStatusCode())->toBe(200);
81+
});
82+
83+
test('AcceptJsonMiddleware rejects requests with only non-JSON Accept headers', function () {
84+
$middleware = new \App\Http\Middleware\AcceptJsonMiddleware();
85+
86+
$request = \Illuminate\Http\Request::create('/api/test', 'GET', [], [], [], [
87+
'HTTP_ACCEPT' => 'text/html,application/xml'
88+
]);
89+
90+
$response = $middleware->handle($request, function () {
91+
return response()->json(['success' => true]);
92+
});
93+
94+
expect($response->getStatusCode())->toBe(406);
95+
96+
$content = json_decode($response->getContent(), true);
97+
expect($content['message'])->toBe('This endpoint only accepts JSON. Please include "Accept: application/json" in your request headers.');
98+
expect($content['error'])->toBe('Unsupported Media Type');
99+
});
100+
101+
test('AcceptJsonMiddleware sets Content-Type header to application/json when not already set', function () {
102+
$middleware = new \App\Http\Middleware\AcceptJsonMiddleware();
103+
104+
$request = \Illuminate\Http\Request::create('/api/test', 'GET', [], [], [], [
105+
'HTTP_ACCEPT' => 'application/json'
106+
]);
107+
108+
$response = $middleware->handle($request, function () {
109+
return response(['success' => true]);
110+
});
111+
112+
expect($response->headers->get('Content-Type'))->toBe('application/json');
113+
});
114+
115+
test('AcceptJsonMiddleware preserves existing application/json Content-Type header', function () {
116+
$middleware = new \App\Http\Middleware\AcceptJsonMiddleware();
117+
118+
$request = \Illuminate\Http\Request::create('/api/test', 'GET', [], [], [], [
119+
'HTTP_ACCEPT' => 'application/json'
120+
]);
121+
122+
$response = $middleware->handle($request, function () {
123+
return response()->json(['success' => true]);
124+
});
125+
126+
expect($response->headers->get('Content-Type'))->toContain('application/json');
127+
});
128+
129+
test('AcceptJsonMiddleware rejects requests that only accept HTML', function () {
130+
$middleware = new \App\Http\Middleware\AcceptJsonMiddleware();
131+
132+
$request = \Illuminate\Http\Request::create('/api/test', 'GET', [], [], [], [
133+
'HTTP_ACCEPT' => 'text/html'
134+
]);
135+
136+
$response = $middleware->handle($request, function () {
137+
return response()->json(['success' => true]);
138+
});
139+
140+
expect($response->getStatusCode())->toBe(406);
141+
142+
$content = json_decode($response->getContent(), true);
143+
expect($content['message'])->toBe('This endpoint only accepts JSON. Please include "Accept: application/json" in your request headers.');
144+
expect($content['error'])->toBe('Unsupported Media Type');
145+
});
146+
147+
test('AcceptJsonMiddleware accepts requests with */* Accept header', function () {
148+
// Laravel's acceptsJson() returns true for */*
149+
$middleware = new \App\Http\Middleware\AcceptJsonMiddleware();
150+
151+
$request = \Illuminate\Http\Request::create('/api/test', 'GET', [], [], [], [
152+
'HTTP_ACCEPT' => '*/*'
153+
]);
154+
155+
$response = $middleware->handle($request, function () {
156+
return response()->json(['success' => true]);
157+
});
158+
159+
expect($response->getStatusCode())->toBe(200);
160+
});

0 commit comments

Comments
 (0)