platform/test/server_test.dart

202 lines
5.1 KiB
Dart
Raw Normal View History

2016-11-25 23:22:33 +00:00
import 'dart:io';
import 'package:angel_route/angel_route.dart';
2018-06-04 01:46:44 +00:00
import 'package:dart2_constant/convert.dart';
2016-11-25 23:22:33 +00:00
import 'package:http/http.dart' as http;
import 'package:test/test.dart';
2017-01-28 04:17:42 +00:00
const List<Map<String, String>> people = const [
const {'name': 'John Smith'}
];
2016-11-25 23:22:33 +00:00
main() {
http.Client client;
2017-01-28 04:17:42 +00:00
2017-11-28 21:07:14 +00:00
final Router router = new Router();
2016-11-25 23:22:33 +00:00
HttpServer server;
String url;
router.get('/', (req, res) {
res.write('Root');
return false;
});
router.get('/hello', (req, res) {
res.write('World');
return false;
});
router.group('/people', (router) {
router.get('/', (req, res) {
2018-06-04 01:46:44 +00:00
res.write(json.encode(people));
2016-11-25 23:22:33 +00:00
return false;
});
router.group('/:id', (router) {
router.get('/', (req, res) {
// In a real application, we would take the param,
// but not here...
2018-06-04 01:46:44 +00:00
res.write(json.encode(people.first));
2016-11-25 23:22:33 +00:00
return false;
});
router.get('/name', (req, res) {
// In a real application, we would take the param,
// but not here...
2018-06-04 01:46:44 +00:00
res.write(json.encode(people.first['name']));
2016-11-25 23:22:33 +00:00
return false;
});
});
});
2016-11-27 04:04:47 +00:00
final beatles = new Router();
beatles.post('/spinal_clacker', (req, res) {
res.write('come ');
return true;
});
final yellow = new Router()
..get('/submarine', (req, res) {
res.write('we all live in a');
return false;
});
beatles.group('/big', (router) {
router.mount('/yellow', yellow);
});
beatles.all('*', (req, res) {
res.write('together');
return false;
});
router.mount('/beatles', beatles);
2016-11-25 23:22:33 +00:00
setUp(() async {
client = new http.Client();
router.dumpTree();
2018-06-04 01:46:44 +00:00
server = await HttpServer.bind('127.0.0.1', 0);
2016-11-25 23:22:33 +00:00
url = 'http://${server.address.address}:${server.port}';
server.listen((req) async {
final res = req.response;
// Easy middleware pipeline
2017-11-25 00:26:06 +00:00
final results =
router.resolveAbsolute(req.uri.toString(), method: req.method);
2016-11-25 23:22:33 +00:00
final pipeline = new MiddlewarePipeline(results);
if (pipeline.handlers.isEmpty) {
res
..statusCode = HttpStatus.NOT_FOUND
..writeln('404 Not Found');
} else {
for (final handler in pipeline.handlers) {
if (!await handler(req, res)) break;
}
}
await res.close();
});
});
tearDown(() async {
await server.close(force: true);
client.close();
client = null;
url = null;
});
group('top-level', () {
group('get', () {
test('root', () async {
final res = await client.get(url);
print('Response: ${res.body}');
expect(res.body, equals('Root'));
});
test('path', () async {
final res = await client.get('$url/hello');
print('Response: ${res.body}');
expect(res.body, equals('World'));
});
});
});
group('group', () {
group('top-level', () {
test('root', () async {
final res = await client.get('$url/people');
print('Response: ${res.body}');
2018-06-04 01:46:44 +00:00
expect(json.decode(res.body), equals(people));
2016-11-25 23:22:33 +00:00
});
group('param', () {
test('root', () async {
final res = await client.get('$url/people/0');
print('Response: ${res.body}');
2018-06-04 01:46:44 +00:00
expect(json.decode(res.body), equals(people.first));
2016-11-25 23:22:33 +00:00
});
test('path', () async {
final res = await client.get('$url/people/0/name');
print('Response: ${res.body}');
2018-06-04 01:46:44 +00:00
expect(json.decode(res.body), equals(people.first['name']));
2016-11-25 23:22:33 +00:00
});
});
});
});
2016-11-27 04:04:47 +00:00
group('mount', () {
group('path', () {
test('top-level', () async {
2016-11-27 14:46:13 +00:00
final res = await client.post('$url/beatles/spinal_clacker');
2016-11-27 04:04:47 +00:00
print('Response: ${res.body}');
expect(res.body, equals('come together'));
});
2016-11-27 14:46:13 +00:00
test('fallback', () async {
final res = await client.patch('$url/beatles/muddy_water');
print('Response: ${res.body}');
expect(res.body, equals('together'));
});
2016-11-27 22:24:30 +00:00
test('fallback', () async {
final res = await client.patch('$url/beatles/spanil_clakcer');
print('Response: ${res.body}');
expect(res.body, equals('together'));
});
2016-11-27 14:46:13 +00:00
});
test('deep nested', () async {
final res = await client.get('$url/beatles/big/yellow/submarine');
print('Response: ${res.body}');
expect(res.body, equals('we all live in a'));
});
group('fallback', () {});
});
group('404', () {
expect404(r) => r.then((res) {
print('Response (${res.statusCode}): ${res.body}');
expect(res.statusCode, equals(404));
});
test('path', () async {
await expect404(client.get('$url/foo'));
await expect404(client.get('$url/bye'));
await expect404(client.get('$url/people/0/age'));
await expect404(client.get('$url/beatles2'));
2016-11-27 04:04:47 +00:00
});
2016-11-27 14:46:13 +00:00
2016-11-27 22:24:30 +00:00
test('method', () async {
await expect404(client.head(url));
await expect404(client.patch('$url/people'));
await expect404(client.post('$url/people/0'));
await expect404(client.delete('$url/beatles2/spinal_clacker'));
});
2016-11-27 04:04:47 +00:00
});
2016-11-25 23:22:33 +00:00
}