| // 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.parameters_test; |
| |
| import 'package:unittest/unittest.dart'; |
| import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc; |
| |
| import 'utils.dart'; |
| |
| void main() { |
| group("with named parameters", () { |
| var parameters; |
| setUp(() { |
| parameters = new json_rpc.Parameters("foo", { |
| "num": 1.5, |
| "int": 1, |
| "bool": true, |
| "string": "zap", |
| "list": [1, 2, 3], |
| "date-time": "1990-01-01 00:00:00.000", |
| "uri": "http://dartlang.org", |
| "invalid-uri": "http://[::1", |
| "map": { |
| "num": 4.2, |
| "bool": false |
| } |
| }); |
| }); |
| |
| test("value returns the wrapped value", () { |
| expect(parameters.value, equals({ |
| "num": 1.5, |
| "int": 1, |
| "bool": true, |
| "string": "zap", |
| "list": [1, 2, 3], |
| "date-time": "1990-01-01 00:00:00.000", |
| "uri": "http://dartlang.org", |
| "invalid-uri": "http://[::1", |
| "map": { |
| "num": 4.2, |
| "bool": false |
| } |
| })); |
| }); |
| |
| test("[int] throws a parameter error", () { |
| expect(() => parameters[0], |
| throwsInvalidParams('Parameters for method "foo" must be passed by ' |
| 'position.')); |
| }); |
| |
| test("[].value returns existing parameters", () { |
| expect(parameters['num'].value, equals(1.5)); |
| }); |
| |
| test("[].valueOr returns existing parameters", () { |
| expect(parameters['num'].valueOr(7), equals(1.5)); |
| }); |
| |
| test("[].value fails for absent parameters", () { |
| expect(() => parameters['fblthp'].value, |
| throwsInvalidParams('Request for method "foo" is missing required ' |
| 'parameter "fblthp".')); |
| }); |
| |
| test("[].valueOr succeeds for absent parameters", () { |
| expect(parameters['fblthp'].valueOr(7), equals(7)); |
| }); |
| |
| test("[].exists returns true for existing parameters", () { |
| expect(parameters['num'].exists, isTrue); |
| }); |
| |
| test("[].exists returns false for missing parameters", () { |
| expect(parameters['fblthp'].exists, isFalse); |
| }); |
| |
| test("[].asNum returns numeric parameters", () { |
| expect(parameters['num'].asNum, equals(1.5)); |
| expect(parameters['int'].asNum, equals(1)); |
| }); |
| |
| test("[].asNumOr returns numeric parameters", () { |
| expect(parameters['num'].asNumOr(7), equals(1.5)); |
| }); |
| |
| test("[].asNum fails for non-numeric parameters", () { |
| expect(() => parameters['bool'].asNum, |
| throwsInvalidParams('Parameter "bool" for method "foo" must be a ' |
| 'number, but was true.')); |
| }); |
| |
| test("[].asNumOr fails for non-numeric parameters", () { |
| expect(() => parameters['bool'].asNumOr(7), |
| throwsInvalidParams('Parameter "bool" for method "foo" must be a ' |
| 'number, but was true.')); |
| }); |
| |
| test("[].asNum fails for absent parameters", () { |
| expect(() => parameters['fblthp'].asNum, |
| throwsInvalidParams('Request for method "foo" is missing required ' |
| 'parameter "fblthp".')); |
| }); |
| |
| test("[].asNumOr succeeds for absent parameters", () { |
| expect(parameters['fblthp'].asNumOr(7), equals(7)); |
| }); |
| |
| test("[].asInt returns integer parameters", () { |
| expect(parameters['int'].asInt, equals(1)); |
| }); |
| |
| test("[].asIntOr returns integer parameters", () { |
| expect(parameters['int'].asIntOr(7), equals(1)); |
| }); |
| |
| test("[].asInt fails for non-integer parameters", () { |
| expect(() => parameters['bool'].asInt, |
| throwsInvalidParams('Parameter "bool" for method "foo" must be an ' |
| 'integer, but was true.')); |
| }); |
| |
| test("[].asIntOr succeeds for absent parameters", () { |
| expect(parameters['fblthp'].asIntOr(7), equals(7)); |
| }); |
| |
| test("[].asBool returns boolean parameters", () { |
| expect(parameters['bool'].asBool, isTrue); |
| }); |
| |
| test("[].asBoolOr returns boolean parameters", () { |
| expect(parameters['bool'].asBoolOr(false), isTrue); |
| }); |
| |
| test("[].asBoolOr fails for non-boolean parameters", () { |
| expect(() => parameters['int'].asBool, |
| throwsInvalidParams('Parameter "int" for method "foo" must be a ' |
| 'boolean, but was 1.')); |
| }); |
| |
| test("[].asBoolOr succeeds for absent parameters", () { |
| expect(parameters['fblthp'].asBoolOr(false), isFalse); |
| }); |
| |
| test("[].asString returns string parameters", () { |
| expect(parameters['string'].asString, equals("zap")); |
| }); |
| |
| test("[].asStringOr returns string parameters", () { |
| expect(parameters['string'].asStringOr("bap"), equals("zap")); |
| }); |
| |
| test("[].asString fails for non-string parameters", () { |
| expect(() => parameters['int'].asString, |
| throwsInvalidParams('Parameter "int" for method "foo" must be a ' |
| 'string, but was 1.')); |
| }); |
| |
| test("[].asStringOr succeeds for absent parameters", () { |
| expect(parameters['fblthp'].asStringOr("bap"), equals("bap")); |
| }); |
| |
| test("[].asList returns list parameters", () { |
| expect(parameters['list'].asList, equals([1, 2, 3])); |
| }); |
| |
| test("[].asListOr returns list parameters", () { |
| expect(parameters['list'].asListOr([5, 6, 7]), equals([1, 2, 3])); |
| }); |
| |
| test("[].asList fails for non-list parameters", () { |
| expect(() => parameters['int'].asList, |
| throwsInvalidParams('Parameter "int" for method "foo" must be an ' |
| 'Array, but was 1.')); |
| }); |
| |
| test("[].asListOr succeeds for absent parameters", () { |
| expect(parameters['fblthp'].asListOr([5, 6, 7]), equals([5, 6, 7])); |
| }); |
| |
| test("[].asMap returns map parameters", () { |
| expect(parameters['map'].asMap, equals({"num": 4.2, "bool": false})); |
| }); |
| |
| test("[].asMapOr returns map parameters", () { |
| expect(parameters['map'].asMapOr({}), |
| equals({"num": 4.2, "bool": false})); |
| }); |
| |
| test("[].asMap fails for non-map parameters", () { |
| expect(() => parameters['int'].asMap, |
| throwsInvalidParams('Parameter "int" for method "foo" must be an ' |
| 'Object, but was 1.')); |
| }); |
| |
| test("[].asMapOr succeeds for absent parameters", () { |
| expect(parameters['fblthp'].asMapOr({}), equals({})); |
| }); |
| |
| test("[].asDateTime returns date/time parameters", () { |
| expect(parameters['date-time'].asDateTime, equals(new DateTime(1990))); |
| }); |
| |
| test("[].asDateTimeOr returns date/time parameters", () { |
| expect(parameters['date-time'].asDateTimeOr(new DateTime(2014)), |
| equals(new DateTime(1990))); |
| }); |
| |
| test("[].asDateTime fails for non-date/time parameters", () { |
| expect(() => parameters['int'].asDateTime, |
| throwsInvalidParams('Parameter "int" for method "foo" must be a ' |
| 'string, but was 1.')); |
| }); |
| |
| test("[].asDateTimeOr succeeds for absent parameters", () { |
| expect(parameters['fblthp'].asDateTimeOr(new DateTime(2014)), |
| equals(new DateTime(2014))); |
| }); |
| |
| test("[].asDateTime fails for non-date/time parameters", () { |
| expect(() => parameters['int'].asDateTime, |
| throwsInvalidParams('Parameter "int" for method "foo" must be a ' |
| 'string, but was 1.')); |
| }); |
| |
| test("[].asDateTime fails for invalid date/times", () { |
| expect(() => parameters['string'].asDateTime, |
| throwsInvalidParams('Parameter "string" for method "foo" must be a ' |
| 'valid date/time, but was "zap".')); |
| }); |
| |
| test("[].asUri returns URI parameters", () { |
| expect(parameters['uri'].asUri, equals(Uri.parse('http://dartlang.org'))); |
| }); |
| |
| test("[].asUriOr returns URI parameters", () { |
| expect(parameters['uri'].asUriOr(Uri.parse('http://google.com')), |
| equals(Uri.parse('http://dartlang.org'))); |
| }); |
| |
| test("[].asUri fails for non-URI parameters", () { |
| expect(() => parameters['int'].asUri, |
| throwsInvalidParams('Parameter "int" for method "foo" must be a ' |
| 'string, but was 1.')); |
| }); |
| |
| test("[].asUriOr succeeds for absent parameters", () { |
| expect(parameters['fblthp'].asUriOr(Uri.parse('http://google.com')), |
| equals(Uri.parse('http://google.com'))); |
| }); |
| |
| test("[].asUri fails for non-URI parameters", () { |
| expect(() => parameters['int'].asUri, |
| throwsInvalidParams('Parameter "int" for method "foo" must be a ' |
| 'string, but was 1.')); |
| }); |
| |
| test("[].asUri fails for invalid URIs", () { |
| expect(() => parameters['invalid-uri'].asUri, |
| throwsInvalidParams('Parameter "invalid-uri" for method "foo" must ' |
| 'be a valid URI, but was "http://[::1".\n' |
| 'Bad end of IPv6 host')); |
| }); |
| |
| group("with a nested parameter map", () { |
| var nested; |
| setUp(() => nested = parameters['map']); |
| |
| test("[int] fails with a type error", () { |
| expect(() => nested[0], |
| throwsInvalidParams('Parameter "map" for method "foo" must be an ' |
| 'Array, but was {"num":4.2,"bool":false}.')); |
| }); |
| |
| test("[].value returns existing parameters", () { |
| expect(nested['num'].value, equals(4.2)); |
| expect(nested['bool'].value, isFalse); |
| }); |
| |
| test("[].value fails for absent parameters", () { |
| expect(() => nested['fblthp'].value, |
| throwsInvalidParams('Request for method "foo" is missing required ' |
| 'parameter map.fblthp.')); |
| }); |
| |
| test("typed getters return correctly-typed parameters", () { |
| expect(nested['num'].asNum, equals(4.2)); |
| }); |
| |
| test("typed getters fail for incorrectly-typed parameters", () { |
| expect(() => nested['bool'].asNum, |
| throwsInvalidParams('Parameter map.bool for method "foo" must be ' |
| 'a number, but was false.')); |
| }); |
| }); |
| |
| group("with a nested parameter list", () { |
| var nested; |
| setUp(() => nested = parameters['list']); |
| |
| test("[string] fails with a type error", () { |
| expect(() => nested['foo'], |
| throwsInvalidParams('Parameter "list" for method "foo" must be an ' |
| 'Object, but was [1,2,3].')); |
| }); |
| |
| test("[].value returns existing parameters", () { |
| expect(nested[0].value, equals(1)); |
| expect(nested[1].value, equals(2)); |
| }); |
| |
| test("[].value fails for absent parameters", () { |
| expect(() => nested[5].value, |
| throwsInvalidParams('Request for method "foo" is missing required ' |
| 'parameter list[5].')); |
| }); |
| |
| test("typed getters return correctly-typed parameters", () { |
| expect(nested[0].asInt, equals(1)); |
| }); |
| |
| test("typed getters fail for incorrectly-typed parameters", () { |
| expect(() => nested[0].asBool, |
| throwsInvalidParams('Parameter list[0] for method "foo" must be ' |
| 'a boolean, but was 1.')); |
| }); |
| }); |
| }); |
| |
| group("with positional parameters", () { |
| var parameters; |
| setUp(() => parameters = new json_rpc.Parameters("foo", [1, 2, 3, 4, 5])); |
| |
| test("value returns the wrapped value", () { |
| expect(parameters.value, equals([1, 2, 3, 4, 5])); |
| }); |
| |
| test("[string] throws a parameter error", () { |
| expect(() => parameters['foo'], |
| throwsInvalidParams('Parameters for method "foo" must be passed by ' |
| 'name.')); |
| }); |
| |
| test("[].value returns existing parameters", () { |
| expect(parameters[2].value, equals(3)); |
| }); |
| |
| test("[].value fails for out-of-range parameters", () { |
| expect(() => parameters[10].value, |
| throwsInvalidParams('Request for method "foo" is missing required ' |
| 'parameter 11.')); |
| }); |
| |
| test("[].exists returns true for existing parameters", () { |
| expect(parameters[0].exists, isTrue); |
| }); |
| |
| test("[].exists returns false for missing parameters", () { |
| expect(parameters[10].exists, isFalse); |
| }); |
| }); |
| |
| test("with a complex parameter path", () { |
| var parameters = new json_rpc.Parameters("foo", { |
| 'bar baz': [0, 1, 2, {'bang.zap': {'\n': 'qux'}}] |
| }); |
| |
| expect(() => parameters['bar baz'][3]['bang.zap']['\n']['bip'], |
| throwsInvalidParams('Parameter "bar baz"[3]."bang.zap"."\\n" for ' |
| 'method "foo" must be an Object, but was "qux".')); |
| }); |
| } |