Skip to content

Commit 7155d35

Browse files
committed
feat(dart_frog): expose captured request params
1 parent cdc59d1 commit 7155d35

File tree

3 files changed

+80
-1
lines changed

3 files changed

+80
-1
lines changed

packages/dart_frog/lib/src/request.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,11 @@ class Request {
135135
);
136136
}
137137

138+
/// The url parameters captured by the router.
139+
/// Returns an empty map if no parameters are captured.
140+
/// The returned map is unmodifiable.
141+
Map<String, String> get params => _request.params;
142+
138143
/// Returns a [Stream] representing the body.
139144
Stream<List<int>> bytes() => _request.read();
140145

packages/dart_frog/test/src/request_test.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ ${HttpMethod.values.map((m) => m.value.toUpperCase()).join(', ')}.'''),
7979
expect(request.headers['foo'], equals(headers['foo']));
8080
});
8181

82+
test('has correct params (empty)', () {
83+
final request = Request('GET', localhost);
84+
expect(request.params, isEmpty);
85+
});
86+
8287
test('body can be read multiple times (sync)', () {
8388
final body = json.encode({'test': 'body'});
8489
final request = Request('GET', localhost, body: body);

packages/dart_frog/test/src/router_test.dart

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,10 +291,79 @@ void main() {
291291
expect(response.body, equals('hello'));
292292
});
293293

294+
test('request exposes captured params (empty)', () async {
295+
final context = _MockRequestContext();
296+
final app = Router()
297+
..get('/hello', (RequestContext context) {
298+
expect(context.request.params, isEmpty);
299+
return Response(body: 'hello world');
300+
});
301+
302+
server.mount((request) async {
303+
when(() => context.request).thenReturn(
304+
Request(request.method, request.requestedUri),
305+
);
306+
final response = await app(context);
307+
final body = await response.body();
308+
return shelf.Response(response.statusCode, body: body);
309+
});
310+
311+
final response = await http.get(Uri.parse('${server.url}/hello'));
312+
expect(response.statusCode, equals(HttpStatus.ok));
313+
expect(response.body, equals('hello world'));
314+
});
315+
316+
test('request exposes captured params (single)', () async {
317+
final context = _MockRequestContext();
318+
final app = Router()
319+
..get('/users/<id>/greet', (RequestContext context, String id) {
320+
expect(context.request.params['id'], equals(id));
321+
return Response(body: 'hello $id');
322+
});
323+
324+
server.mount((request) async {
325+
when(() => context.request).thenReturn(
326+
Request(request.method, request.requestedUri),
327+
);
328+
final response = await app(context);
329+
final body = await response.body();
330+
return shelf.Response(response.statusCode, body: body);
331+
});
332+
333+
final response = await http.get(Uri.parse('${server.url}/users/42/greet'));
334+
expect(response.statusCode, equals(HttpStatus.ok));
335+
expect(response.body, equals('hello 42'));
336+
});
337+
338+
test('request exposes captured params (multiple)', () async {
339+
final context = _MockRequestContext();
340+
final app = Router()
341+
..get('/users/<id>/greet/<name>',
342+
(RequestContext context, String id, String name) {
343+
expect(context.request.params['id'], equals(id));
344+
expect(context.request.params['name'], equals(name));
345+
return Response(body: 'hello $name ($id)');
346+
});
347+
348+
server.mount((request) async {
349+
when(() => context.request).thenReturn(
350+
Request(request.method, request.requestedUri),
351+
);
352+
final response = await app(context);
353+
final body = await response.body();
354+
return shelf.Response(response.statusCode, body: body);
355+
});
356+
357+
final response =
358+
await http.get(Uri.parse('${server.url}/users/42/greet/felangel'));
359+
expect(response.statusCode, equals(HttpStatus.ok));
360+
expect(response.body, equals('hello felangel (42)'));
361+
});
362+
294363
test('mount(Router)', () async {
295364
final context = _MockRequestContext();
296365
final api = Router()
297-
..all('/user/<user>/info', (RequestContext request, String user) {
366+
..all('/user/<user>/info', (RequestContext context, String user) {
298367
return Response(body: 'Hello $user');
299368
});
300369

0 commit comments

Comments
 (0)