blob: 7dda84f345f3946b5975c6efa13ea97dd19d99ed [file] [log] [blame]
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library json_rpc_2.test.server.batch_test;
import 'dart:convert';
import 'package:unittest/unittest.dart';
import 'package:json_rpc_2/error_code.dart' as error_code;
import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
import 'utils.dart';
void main() {
var controller;
setUp(() {
controller = new ServerController();
controller.server
..registerMethod('foo', () => 'foo')
..registerMethod('id', (params) => params.value)
..registerMethod('arg', (params) => params['arg'].value);
});
test('handles a batch of requests', () {
expect(controller.handleRequest([
{'jsonrpc': '2.0', 'method': 'foo', 'id': 1},
{'jsonrpc': '2.0', 'method': 'id', 'params': ['value'], 'id': 2},
{'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}, 'id': 3}
]), completion(equals([
{'jsonrpc': '2.0', 'result': 'foo', 'id': 1},
{'jsonrpc': '2.0', 'result': ['value'], 'id': 2},
{'jsonrpc': '2.0', 'result': 'value', 'id': 3}
])));
});
test('handles errors individually', () {
expect(controller.handleRequest([
{'jsonrpc': '2.0', 'method': 'foo', 'id': 1},
{'jsonrpc': '2.0', 'method': 'zap', 'id': 2},
{'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}, 'id': 3}
]), completion(equals([
{'jsonrpc': '2.0', 'result': 'foo', 'id': 1},
{
'jsonrpc': '2.0',
'id': 2,
'error': {
'code': error_code.METHOD_NOT_FOUND,
'message': 'Unknown method "zap".',
'data': {'request': {'jsonrpc': '2.0', 'method': 'zap', 'id': 2}},
}
},
{'jsonrpc': '2.0', 'result': 'value', 'id': 3}
])));
});
test('handles notifications individually', () {
expect(controller.handleRequest([
{'jsonrpc': '2.0', 'method': 'foo', 'id': 1},
{'jsonrpc': '2.0', 'method': 'id', 'params': ['value']},
{'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}, 'id': 3}
]), completion(equals([
{'jsonrpc': '2.0', 'result': 'foo', 'id': 1},
{'jsonrpc': '2.0', 'result': 'value', 'id': 3}
])));
});
test('returns nothing if every request is a notification', () {
expect(controller.handleRequest([
{'jsonrpc': '2.0', 'method': 'foo'},
{'jsonrpc': '2.0', 'method': 'id', 'params': ['value']},
{'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}}
]), completion(isNull));
});
test('returns an error if the batch is empty', () {
expectErrorResponse(controller, [], error_code.INVALID_REQUEST,
'A batch must contain at least one request.');
});
test('disallows nested batches', () {
expect(controller.handleRequest([
[{'jsonrpc': '2.0', 'method': 'foo', 'id': 1}]
]), completion(equals([{
'jsonrpc': '2.0',
'id': null,
'error': {
'code': error_code.INVALID_REQUEST,
'message': 'Request must be an Array or an Object.',
'data': {'request': [{'jsonrpc': '2.0', 'method': 'foo', 'id': 1}]}
}
}])));
});
}