private void assertIssues(Message message, CharSequence expectedIssues) { try { validator.consume(message); Assert.fail("Expected InvalidMessageException: " + expectedIssues + "."); } catch (MessageIssueException e) { String expected = expectedIssues.toString(); String actual = LineEndings.toSystemLineEndings(e.getMessage()); // The expectation may be a prefix of the actual exception message if (!actual.startsWith(expected)) Assert.assertEquals(expected, actual); } } }
@Test public void testSkipJsonElement() { final AtomicBoolean result = new AtomicBoolean(false); ReflectiveMessageValidator validator = new ReflectiveMessageValidator((message) -> { result.set(true); }); NotificationMessage message = new NotificationMessage(); message.setMethod("foo"); message.setParams(new JsonObject()); validator.consume(message); Assert.assertTrue(result.get()); }
@Test public void testRequestValidation() { ReflectiveMessageValidator validator = new ReflectiveMessageValidator(); RequestMessage message = new RequestMessage(); message.setId("1"); message.setParams(new Object()); try { validator.consume(message); Assert.fail(); } catch (MessageIssueException e) { Assert.assertEquals("The accessor 'RequestMessage.getMethod()' must return a non-null value. Path: $.method", e.getMessage()); } }
@Test public void testNoViolation() { ReflectiveMessageValidator validator = new ReflectiveMessageValidator(); NotificationMessage message = new NotificationMessage(); message.setMethod("foo"); Foo foo = new Foo(); foo.nonNullString = "test"; foo.nested = new Foo() {{ nonNullString = "something"; }}; message.setParams(foo); validator.consume(message); }
@Test public void testReflectionOnPropertiesOnly() { ReflectiveMessageValidator validator = new ReflectiveMessageValidator(); NotificationMessage message = new NotificationMessage(); message.setMethod("foo"); Foo foo = new Foo(); foo.nonNullString = "test"; foo.nested = new Foo() {{ nonNullString = "something"; }}; foo.foos = new ArrayList<>(); foo.foos.add(new Foo()); message.setParams(foo); try { validator.consume(message); Assert.fail(); } catch (MessageIssueException e) { Assert.assertEquals("The accessor 'Foo.getNonNullString()' must return a non-null value. Path: $.params.foos[0].nonNullString", e.getMessage()); } }
@Test public void testNonNullViolated() { ReflectiveMessageValidator validator = new ReflectiveMessageValidator(); NotificationMessage message = new NotificationMessage(); message.setMethod("foo"); message.setParams(new Foo()); try { validator.consume(message); Assert.fail(); } catch (MessageIssueException e) { Assert.assertEquals("The accessor 'Foo.getNonNullString()' must return a non-null value. Path: $.params.nonNullString", e.getMessage()); } }
@Test public void testRecursionViolation() { ReflectiveMessageValidator validator = new ReflectiveMessageValidator(); NotificationMessage message = new NotificationMessage(); message.setMethod("foo"); Foo foo = new Foo(); foo.nonNullString = "test"; foo.nested = foo; message.setParams(foo); try { validator.consume(message); Assert.fail(); } catch (MessageIssueException e) { Assert.assertEquals("An element of the message has a direct or indirect reference to itself. Path: $.params.nested", e.getMessage()); } }
@Test public void testNonNullViolated_nested() { ReflectiveMessageValidator validator = new ReflectiveMessageValidator(); NotificationMessage message = new NotificationMessage(); message.setMethod("foo"); Foo foo = new Foo(); foo.nonNullString = "test"; foo.nested = new Foo(); message.setParams(foo); try { validator.consume(message); Assert.fail(); } catch (MessageIssueException e) { Assert.assertEquals("The accessor 'Foo.getNonNullString()' must return a non-null value. Path: $.params.nested.nonNullString", e.getMessage()); } }