platform/packages/framework/test/routing_test.dart

226 lines
6.8 KiB
Dart
Raw Normal View History

import 'dart:convert';
import 'dart:io';
2018-08-19 15:33:25 +00:00
import 'package:angel_container/mirrors.dart';
2016-04-18 03:27:23 +00:00
import 'package:angel_framework/angel_framework.dart';
2018-10-22 15:54:41 +00:00
import 'package:angel_framework/http.dart';
2016-04-18 03:27:23 +00:00
import 'package:http/http.dart' as http;
import 'package:io/ansi.dart';
import 'package:logging/logging.dart';
2016-04-18 03:27:23 +00:00
import 'package:test/test.dart';
import 'common.dart';
2016-04-18 03:27:23 +00:00
@Middleware([interceptor])
testMiddlewareMetadata(RequestContext req, ResponseContext res) async {
return "This should not be shown.";
}
@Middleware([interceptService])
class QueryService extends Service {
@override
@Middleware([interceptor])
2021-03-20 08:11:18 +00:00
read(id, [Map? params]) async => params;
}
void interceptor(RequestContext req, ResponseContext res) {
res
..write('Middleware')
2018-08-21 01:57:26 +00:00
..close();
}
2018-11-11 01:07:09 +00:00
bool interceptService(RequestContext req, ResponseContext res) {
res.write("Service with ");
2018-11-11 01:07:09 +00:00
return true;
}
2016-04-18 03:27:23 +00:00
main() {
2021-03-20 08:11:18 +00:00
Angel? app;
Angel? nested;
Angel? todos;
String? url;
http.Client? client;
setUp(() async {
2019-05-02 22:48:31 +00:00
app = Angel(reflector: MirrorsReflector());
nested = Angel(reflector: MirrorsReflector());
todos = Angel(reflector: MirrorsReflector());
2016-10-22 20:41:36 +00:00
2021-03-20 08:11:18 +00:00
[app, nested, todos].forEach((Angel? app) {
app!.logger = Logger('routing_test')
..onRecord.listen((rec) {
if (rec.error != null) {
stdout
..writeln(cyan.wrap(rec.toString()))
..writeln(cyan.wrap(rec.error.toString()))
..writeln(cyan.wrap(rec.stackTrace.toString()));
}
});
2017-04-01 01:00:24 +00:00
});
2021-03-20 08:11:18 +00:00
todos!.get('/action/:action', (req, res) => res.json(req.params));
2016-10-22 20:41:36 +00:00
2021-03-20 08:11:18 +00:00
late Route ted;
2016-10-22 20:41:36 +00:00
2021-03-20 08:11:18 +00:00
ted = nested!.post('/ted/:route', (RequestContext req, res) {
2016-10-22 20:41:36 +00:00
print('Params: ${req.params}');
2017-11-28 18:14:50 +00:00
print('Path: ${ted.path}, uri: ${req.path}');
print('matcher: ${ted.parser}');
2016-10-22 20:41:36 +00:00
return req.params;
});
2021-03-20 08:11:18 +00:00
app!.mount('/nes', nested!);
app!.get('/meta', testMiddlewareMetadata);
app!.get('/intercepted', (req, res) => 'This should not be shown',
middleware: [interceptor]);
2021-03-20 08:11:18 +00:00
app!.get('/hello', (req, res) => 'world');
app!.get('/name/:first/last/:last', (req, res) => req.params);
app!.post(
2018-12-09 15:49:59 +00:00
'/lambda',
(RequestContext req, res) =>
req.parseBody().then((_) => req.bodyAsMap));
2021-03-20 08:11:18 +00:00
app!.mount('/todos/:id', todos!);
app!
.get('/greet/:name',
2016-10-22 20:41:36 +00:00
(RequestContext req, res) async => "Hello ${req.params['name']}")
2017-11-28 18:14:50 +00:00
.name = 'Named routes';
2021-03-20 08:11:18 +00:00
app!.get('/named', (req, ResponseContext res) async {
2019-04-19 07:46:44 +00:00
await res.redirectTo('Named routes', {'name': 'tests'});
2016-04-18 03:27:23 +00:00
});
2021-03-20 08:11:18 +00:00
app!.get('/log', (RequestContext req, res) async {
2018-12-09 15:49:59 +00:00
print("Query: ${req.queryParameters}");
return "Logged";
2016-04-18 03:27:23 +00:00
});
2016-10-22 20:41:36 +00:00
2021-03-20 08:11:18 +00:00
app!.get('/method', (req, res) => 'Only GET');
app!.post('/method', (req, res) => 'Only POST');
2017-10-04 14:09:12 +00:00
2021-03-20 08:11:18 +00:00
app!.use('/query', QueryService());
2017-10-04 14:09:12 +00:00
RequestHandler write(String message) {
return (req, res) {
2017-10-10 16:55:42 +00:00
res.write(message);
2018-11-11 01:07:09 +00:00
return true;
2017-10-10 16:55:42 +00:00
};
}
2021-03-20 08:11:18 +00:00
app!.chain([write('a')]).chain([write('b'), write('c')]).get(
2018-08-21 18:50:43 +00:00
'/chained', (req, res) => res.close());
2017-10-10 16:55:42 +00:00
2021-03-20 08:11:18 +00:00
app!.fallback((req, res) => 'MJ');
2016-04-18 03:27:23 +00:00
2018-11-11 01:07:09 +00:00
//app.dumpTree(header: "DUMPING ROUTES:", showMatchers: true);
2016-04-18 03:27:23 +00:00
2019-05-02 22:48:31 +00:00
client = http.Client();
2021-03-20 08:11:18 +00:00
HttpServer server = await AngelHttp(app).startServer('127.0.0.1', 0);
2018-02-07 05:36:24 +00:00
url = "http://${server.address.host}:${server.port}";
});
2016-04-18 03:27:23 +00:00
tearDown(() async {
2021-03-20 08:11:18 +00:00
await app!.close();
2016-11-28 00:49:27 +00:00
app = null;
nested = null;
todos = null;
2021-03-20 08:11:18 +00:00
client!.close();
client = null;
url = null;
});
test('Can match basic url', () async {
2021-03-20 08:11:18 +00:00
var response = await client!.get(Uri.parse("$url/hello"));
expect(response.body, equals('"world"'));
});
test('Can match url with multiple parameters', () async {
2021-03-20 08:11:18 +00:00
var response = await client!.get(Uri.parse('$url/name/HELLO/last/WORLD'));
2016-11-28 00:49:27 +00:00
print('Response: ${response.body}');
2018-06-08 07:06:26 +00:00
var json_ = json.decode(response.body);
expect(json_, const IsInstanceOf<Map>());
2018-06-08 07:06:26 +00:00
expect(json_['first'], equals('HELLO'));
expect(json_['last'], equals('WORLD'));
});
2017-10-10 16:55:42 +00:00
test('Chained routes', () async {
2021-03-20 08:11:18 +00:00
var response = await client!.get(Uri.parse("$url/chained"));
2017-10-10 16:55:42 +00:00
expect(response.body, equals('abc'));
});
test('Can nest another Angel instance', () async {
2021-03-20 08:11:18 +00:00
var response = await client!.post(Uri.parse('$url/nes/ted/foo'));
2018-06-08 07:06:26 +00:00
var json_ = json.decode(response.body);
expect(json_['route'], equals('foo'));
});
test('Can parse parameters from a nested Angel instance', () async {
2021-03-20 08:11:18 +00:00
var response = await client!.get(Uri.parse('$url/todos/1337/action/test'));
2018-06-08 07:06:26 +00:00
var json_ = json.decode(response.body);
print('JSON: $json_');
expect(json_['id'], equals('1337'));
expect(json_['action'], equals('test'));
});
test('Can add and use named middleware', () async {
2021-03-20 08:11:18 +00:00
var response = await client!.get(Uri.parse('$url/intercepted'));
expect(response.body, equals('Middleware'));
});
test('Middleware via metadata', () async {
// Metadata
2021-03-20 08:11:18 +00:00
var response = await client!.get(Uri.parse('$url/meta'));
expect(response.body, equals('Middleware'));
});
test('Can serialize function result as JSON', () async {
2018-07-09 14:54:50 +00:00
Map headers = <String, String>{'Content-Type': 'application/json'};
2018-06-08 07:06:26 +00:00
String postData = json.encode({'it': 'works'});
2021-03-20 08:11:18 +00:00
var response = await client!.post(Uri.parse("$url/lambda"),
2018-06-27 18:40:43 +00:00
headers: headers as Map<String, String>, body: postData);
2018-06-08 07:06:26 +00:00
print('Response: ${response.body}');
expect(json.decode(response.body)['it'], equals('works'));
});
test('Fallback routes', () async {
2021-03-20 08:11:18 +00:00
var response = await client!.get(Uri.parse('$url/my_favorite_artist'));
expect(response.body, equals('"MJ"'));
});
test('Can name routes', () {
2021-03-20 08:11:18 +00:00
Route foo = app!.get('/framework/:id', null)..name = 'frm';
2016-10-22 20:41:36 +00:00
print('Foo: $foo');
String uri = foo.makeUri({'id': 'angel'});
print(uri);
2016-10-22 20:41:36 +00:00
expect(uri, equals('framework/angel'));
});
test('Redirect to named routes', () async {
2021-03-20 08:11:18 +00:00
var response = await client!.get(Uri.parse('$url/named'));
print(response.body);
2018-06-08 07:06:26 +00:00
expect(json.decode(response.body), equals('Hello tests'));
});
test('Match routes, even with query params', () async {
2021-03-20 08:11:18 +00:00
var response = await client!
2021-03-06 14:28:33 +00:00
.get(Uri.parse("$url/log?foo=bar&bar=baz&baz.foo=bar&baz.bar=foo"));
print(response.body);
2018-06-08 07:06:26 +00:00
expect(json.decode(response.body), equals('Logged'));
2021-03-20 08:11:18 +00:00
response = await client!.get(Uri.parse("$url/query/foo?bar=baz"));
print(response.body);
2016-11-23 09:10:47 +00:00
expect(response.body, equals("Service with Middleware"));
2016-04-18 03:27:23 +00:00
});
2017-10-04 14:09:12 +00:00
test('only match route with matching method', () async {
2021-03-20 08:11:18 +00:00
var response = await client!.get(Uri.parse("$url/method"));
2017-10-04 14:09:12 +00:00
print(response.body);
expect(response.body, '"Only GET"');
2021-03-20 08:11:18 +00:00
response = await client!.post(Uri.parse("$url/method"));
2017-10-04 14:09:12 +00:00
print(response.body);
expect(response.body, '"Only POST"');
2021-03-20 08:11:18 +00:00
response = await client!.patch(Uri.parse("$url/method"));
2017-10-04 14:09:12 +00:00
print(response.body);
expect(response.body, '"MJ"');
});
}