@Test
  public void should_create_exception_model_from_business_exception() {

    // Arrange
    BusinessException exception =
        buildException(FooBusinessCode.FOO_02, null, "The user didn't show his passport.");
    ExceptionModel.Builder builder = new ExceptionModel.Builder("foo", exception);
    builder
        .withHelpLink("http://help")
        .withHttpCode(500, "desc")
        .withPath("/api/v1/resource")
        .withSessionId("abcd1234")
        .withContext("thread", "thread-name")
        .withPostBody("1234abcd");

    // Act
    ExceptionModel model = builder.build();

    // Assert
    assertNotNull(model);
    assertEquals("foo", model.getApplicationName());
    assertNotNull(model.getDateTime());
    assertEquals(exception.getMessage(), model.getMessage());
    assertEquals(exception.getClass().getName(), model.getExceptionClass());
    assertEquals(exception.getExceptionId(), model.getExceptionId());
    assertEquals(exception.getBusinessCodes().size(), model.getBusinessCodes().size());
    assertEquals(
        exception.getBusinessCodes().get(0).getDescription(),
        model.getBusinessCodes().get(exception.getBusinessCodes().get(0).getCode()));
    assertEquals("/api/v1/resource", model.getPath());
    assertEquals("abcd1234", model.getSessionId());
    assertEquals("http://help", model.getHelpLink());
    assertEquals(500, model.getHttpStatusCode());
    assertEquals("desc", model.getHttpStatusDescription());
    assertNotNull(model.getDateTime());
    assertEquals("exception-core-model", model.getMetadata());
    assertFalse(model.getExceptionChain().isEmpty());
    assertTrue(model.getParams().containsKey("user"));
    assertEquals(exception.getParams().get("user"), model.getParams().get("user"));
    assertEquals("ABCD12335", exception.getSpanId());
    assertTrue(model.getContext().containsKey("thread"));
    assertEquals("thread-name", model.getContext().get("thread"));
    assertEquals("1234abcd", model.getRequestBody());
  }
  @Test
  public void should_have_multiple_exceptions_chained() {

    BusinessException exception =
        buildException(
            FooBusinessCode.FOO_04,
            buildException(
                FooBusinessCode.FOO_03,
                buildIllegalArgException(),
                "Account locked due to too many failed password attempts."),
            "security");

    ExceptionModel.Builder builder = new ExceptionModel.Builder("foo", exception);
    builder
        .withHelpLink("http://help")
        .withHttpCode(500, "desc")
        .withPath("/api/v1/resource")
        .withSessionId("abcd1234");
    ExceptionModel model = builder.build();

    assertEquals(3, model.getExceptionChain().size());
  }
  @Test
  public void should_create_exception_model_from_non_business_exception() {

    // Arrange
    IllegalArgumentException exception = buildIllegalArgException();
    ExceptionModel.Builder builder = new ExceptionModel.Builder("foo", exception);
    builder
        .withHelpLink("http://help")
        .withHttpCode(500, "desc")
        .withPath("/api/v1/resource")
        .withSessionId("abcd1234");

    // Act
    ExceptionModel model = builder.build();

    // Assert
    assertNotNull(model);
    assertEquals("foo", model.getApplicationName());
    assertNotNull(model.getDateTime());
    assertEquals(exception.getMessage(), model.getMessage());
    assertEquals(exception.getClass().getName(), model.getExceptionClass());
    assertEquals("/api/v1/resource", model.getPath());
    assertEquals("abcd1234", model.getSessionId());
    assertEquals("http://help", model.getHelpLink());
    assertEquals(500, model.getHttpStatusCode());
    assertEquals("desc", model.getHttpStatusDescription());
    assertNotNull(model.getDateTime());
    assertEquals("exception-core-model", model.getMetadata());
    assertFalse(model.getExceptionChain().isEmpty());
    assertNotNull(model.getExceptionId());
    assertEquals(
        model.getExceptionChain().get(0).getCorrelationId(),
        "d99306bc-4b04-4a34-b7e7-f5554383f570");
    assertEquals(
        model.getExceptionChain().get(0).getMessage(),
        "Something went wrong here is the exception Id d99306bc-4b04-4a34-b7e7-f5554383f570");
  }