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