<commit_before>/*
 * Copyright 2017 IBM Corp. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */
package com.ibm.watson.developer_cloud.assistant.v1;

import com.ibm.watson.developer_cloud.WatsonServiceUnitTest;
import com.ibm.watson.developer_cloud.assistant.v1.model.Context;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateCounterexample;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateDialogNode;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateDialogNodeOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateEntity;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateEntityOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateExample;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateIntent;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateIntentOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateValue;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateValueOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateWorkspaceOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.DeleteUserDataOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.DialogNodeAction;
import com.ibm.watson.developer_cloud.assistant.v1.model.InputData;
import com.ibm.watson.developer_cloud.assistant.v1.model.ListAllLogsOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.MessageOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.MessageResponse;
import com.ibm.watson.developer_cloud.assistant.v1.model.RuntimeEntity;
import com.ibm.watson.developer_cloud.assistant.v1.model.RuntimeIntent;
import com.ibm.watson.developer_cloud.assistant.v1.model.UpdateDialogNodeOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.UpdateEntityOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.UpdateIntentOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.UpdateValueOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.UpdateWorkspaceOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.WorkspaceSystemSettings;
import com.ibm.watson.developer_cloud.assistant.v1.model.WorkspaceSystemSettingsDisambiguation;
import com.ibm.watson.developer_cloud.assistant.v1.model.WorkspaceSystemSettingsTooling;
import com.ibm.watson.developer_cloud.http.HttpHeaders;
import okhttp3.mockwebserver.RecordedRequest;
import org.apache.commons.lang3.StringUtils;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

/**
 * Unit tests for the {@link Assistant}.
 */
public class AssistantTest extends WatsonServiceUnitTest {
  private Assistant service;
  private static final String FIXTURE = "src/test/resources/assistant/assistant.json";
  private static final String WORKSPACE_ID = "123";
  private static final String PATH_MESSAGE = "/v1/workspaces/" + WORKSPACE_ID + "/message";
  private static final String VERSION = "version";

  /*
   * (non-Javadoc)
   * @see com.ibm.watson.developer_cloud.WatsonServiceTest#setUp()
   */
  @Override
  @Before
  public void setUp() throws Exception {
    super.setUp();
    service = new Assistant("2018-02-16");
    service.setUsernameAndPassword("", "");
    service.setEndPoint(getMockWebServerUrl());

  }

  /**
   * Negative - Test constructor with null version date.
   */
  @Test(expected = IllegalArgumentException.class)
  public void testConstructorWithNullVersionDate() {
    new Assistant(null);
  }

  /**
   * Negative - Test constructor with empty version date.
   */
  @Test(expected = IllegalArgumentException.class)
  public void testConstructorWithEmptyVersionDate() {
    new Assistant("");
  }

  /**
   * Negative - Test assistant with null options.
   */
  @Test(expected = IllegalArgumentException.class)
  public void testAssistantWithNullOptions() {
    service.message(null).execute();
  }

  /**
   * Negative - Test assistant with null workspaceId.
   */
  @Test(expected = IllegalArgumentException.class)
  public void testAssistantWithNullWorkspaceId() {
    MessageOptions options = new MessageOptions.Builder().build();
    service.message(options).execute();
  }

  /**
   * Negative - Test assistant with empty workspaceId.
   */
  @Test(expected = IllegalArgumentException.class)
  public void testAssistantWithEmptyWorkspaceId() {
    MessageOptions options = new MessageOptions.Builder("").build();
    service.message(options).execute();
  }

  /**
   * Test send message.
   *
   * @throws IOException Signals that an I/O exception has occurred.
   * @throws InterruptedException the interrupted exception
   */
  @Test
  public void testSendMessage() throws IOException, InterruptedException {
    String text = "I would love to hear some jazz music.";

    MessageResponse mockResponse = loadFixture(FIXTURE, MessageResponse.class);
    server.enqueue(jsonResponse(mockResponse));

    InputData input = new InputData.Builder(text).build();
    RuntimeIntent intent = new RuntimeIntent();
    intent.setIntent("turn_on");
    intent.setConfidence(0.0);
    RuntimeEntity entity = new RuntimeEntity();
    entity.setEntity("genre");
    entity.setValue("jazz");
    MessageOptions options = new MessageOptions.Builder(WORKSPACE_ID)
        .input(input)
        .addIntent(intent)
        .addEntity(entity)
        .alternateIntents(true)
        .build();

    // execute first request
    MessageResponse serviceResponse = service.message(options).execute();

    // first request
    RecordedRequest request = server.takeRequest();

    String path = StringUtils.join(PATH_MESSAGE, "?", VERSION, "=2018-02-16");
    assertEquals(path, request.getPath());
    assertArrayEquals(new String[] { "Great choice! Playing some jazz for you." },
        serviceResponse.getOutput().getText().toArray(new String[0]));
    assertEquals(request.getMethod(), "POST");
    assertNotNull(request.getHeader(HttpHeaders.AUTHORIZATION));
    assertNotNull(serviceResponse.getOutput().getLogMessages());
    assertNotNull(serviceResponse.getOutput().getNodesVisited());
    assertNotNull(serviceResponse.getOutput().getNodesVisitedDetails());
    assertNotNull(serviceResponse.getOutput().getNodesVisitedDetails().get(0).getDialogNode());
    assertNotNull(serviceResponse.getOutput().getNodesVisitedDetails().get(0).getTitle());
    assertNotNull(serviceResponse.getOutput().getNodesVisitedDetails().get(0).getConditions());
    assertEquals(serviceResponse, mockResponse);
  }

  /**
   * Test send message. use some different MessageOptions options like context and other public methods
   *
   * @throws IOException Signals that an I/O exception has occurred.
   * @throws InterruptedException the interrupted exception
   */
  @Test
  public void testSendMessageWithAlternateIntents() throws IOException, InterruptedException {
    MessageResponse mockResponse = loadFixture(FIXTURE, MessageResponse.class);
    server.enqueue(jsonResponse(mockResponse));

    Context contextTemp = new Context();
    contextTemp.put("name", "Myname");
    InputData inputTemp = new InputData.Builder("My text").build();

    MessageOptions options = new MessageOptions.Builder(WORKSPACE_ID)
        .input(inputTemp)
        .alternateIntents(false)
        .context(contextTemp)
        .entities(null).intents(null).build();

    // execute first request
    MessageResponse serviceResponse = service.message(options).execute();

    // first request
    RecordedRequest request = server.takeRequest();

    String path = StringUtils.join(PATH_MESSAGE, "?", VERSION, "=2018-02-16");
    assertEquals(path, request.getPath());
    assertArrayEquals(new String[] { "Great choice! Playing some jazz for you." },
        serviceResponse.getOutput().getText().toArray(new String[0]));
    assertEquals(request.getMethod(), "POST");
    assertNotNull(request.getHeader(HttpHeaders.AUTHORIZATION));
    assertEquals(serviceResponse, mockResponse);
  }

  /**
   * Negative - Test message with null workspace id.
   *
   * @throws InterruptedException the interrupted exception
   */
  @Test(expected = IllegalArgumentException.class)
  public void testSendMessageWithNullWorkspaceId() throws InterruptedException {
    String text = "I'd like to get insurance to for my home";

    InputData input = new InputData.Builder(text).build();
    MessageOptions options = new MessageOptions.Builder().input(input).alternateIntents(true).build();

    service.message(options).execute();
  }

  /**
   * Test CreateWorkspace builder.
   */
  @Test
  public void testCreateWorkspaceBuilder() {

    String workspaceName = "Builder Test";
    String workspaceDescription = "Description of " + workspaceName;
    String workspaceLanguage = "en";

    // intents
    CreateIntent testIntent0 = new CreateIntent.Builder("testIntent0").build();
    CreateIntent testIntent1 = new CreateIntent.Builder("testIntent1").build();

    // entities
    CreateEntity testEntity0 = new CreateEntity.Builder("testEntity0").build();
    CreateEntity testEntity1 = new CreateEntity.Builder("testEntity1").build();

    // counterexamples
    CreateCounterexample testCounterexample0 = new CreateCounterexample.Builder("testCounterexample0").build();
    CreateCounterexample testCounterexample1 = new CreateCounterexample.Builder("testCounterexample1").build();

    // dialognodes
    CreateDialogNode testDialogNode0 = new CreateDialogNode.Builder("dialogNode0").build();
    CreateDialogNode testDialogNode1 = new CreateDialogNode.Builder("dialogNode1").build();

    // metadata
    Map<String, Object> workspaceMetadata = new HashMap<String, Object>();
    String metadataValue = "value for " + workspaceName;
    workspaceMetadata.put("key", metadataValue);

    // systemSettings
    WorkspaceSystemSettingsDisambiguation disambiguation = new WorkspaceSystemSettingsDisambiguation();
    disambiguation.setEnabled(true);
    disambiguation.setNoneOfTheAbovePrompt("none of the above");
    disambiguation.setPrompt("prompt");
    disambiguation.setSensitivity(WorkspaceSystemSettingsDisambiguation.Sensitivity.HIGH);
    WorkspaceSystemSettingsTooling tooling = new WorkspaceSystemSettingsTooling();
    tooling.setStoreGenericResponses(true);
    Map<String, String> humanAgentAssist = new HashMap<>();
    humanAgentAssist.put("help", "ok");
    WorkspaceSystemSettings systemSettings = new WorkspaceSystemSettings();
    systemSettings.setDisambiguation(disambiguation);
    systemSettings.setTooling(tooling);
    systemSettings.setHumanAgentAssist(humanAgentAssist);

    CreateWorkspaceOptions createOptions = new CreateWorkspaceOptions.Builder()
        .name(workspaceName)
        .description(workspaceDescription)
        .language(workspaceLanguage)
        .addIntent(testIntent0).addIntent(testIntent1)
        .addEntity(testEntity0).addEntity(testEntity1)
        .addCounterexample(testCounterexample0).addCounterexample(testCounterexample1)
        .addDialogNode(testDialogNode0).addDialogNode(testDialogNode1)
        .metadata(workspaceMetadata)
        .systemSettings(systemSettings)
        .build();

    assertEquals(createOptions.name(), workspaceName);
    assertEquals(createOptions.description(), workspaceDescription);
    assertEquals(createOptions.language(), workspaceLanguage);
    assertNotNull(createOptions.intents());
    assertEquals(createOptions.intents().size(), 2);
    assertEquals(createOptions.intents().get(0), testIntent0);
    assertEquals(createOptions.intents().get(1), testIntent1);
    assertNotNull(createOptions.entities());
    assertEquals(createOptions.entities().size(), 2);
    assertEquals(createOptions.entities().get(0), testEntity0);
    assertEquals(createOptions.entities().get(1), testEntity1);
    assertNotNull(createOptions.counterexamples());
    assertEquals(createOptions.counterexamples().size(), 2);
    assertEquals(createOptions.counterexamples().get(0), testCounterexample0);
    assertEquals(createOptions.counterexamples().get(1), testCounterexample1);
    assertNotNull(createOptions.dialogNodes());
    assertEquals(createOptions.dialogNodes().size(), 2);
    assertEquals(createOptions.dialogNodes().get(0), testDialogNode0);
    assertEquals(createOptions.dialogNodes().get(1), testDialogNode1);
    assertEquals(createOptions.systemSettings(), systemSettings);

    CreateWorkspaceOptions.Builder builder = createOptions.newBuilder();

    CreateIntent testIntent2 = new CreateIntent.Builder("testIntent2").build();
    CreateEntity testEntity2 = new CreateEntity.Builder("testEntity2").build();
    CreateCounterexample testCounterexample2 = new CreateCounterexample.Builder("testCounterexample2").build();
    CreateDialogNode testDialogNode2 = new CreateDialogNode.Builder("dialogNode2").build();

    builder.intents(Arrays.asList(testIntent2));
    builder.entities(Arrays.asList(testEntity2));
    builder.counterexamples(Arrays.asList(testCounterexample2));
    builder.dialogNodes(Arrays.asList(testDialogNode2));

    CreateWorkspaceOptions options2 = builder.build();

    assertNotNull(options2.intents());
    assertEquals(options2.intents().size(), 1);
    assertEquals(options2.intents().get(0), testIntent2);
    assertNotNull(options2.entities());
    assertEquals(options2.entities().size(), 1);
    assertEquals(options2.entities().get(0), testEntity2);
    assertNotNull(options2.counterexamples());
    assertEquals(options2.counterexamples().size(), 1);
    assertEquals(options2.counterexamples().get(0), testCounterexample2);
    assertNotNull(options2.dialogNodes());
    assertEquals(options2.dialogNodes().size(), 1);
    assertEquals(options2.dialogNodes().get(0), testDialogNode2);
  }

  /**
   * Test UpdateWorkspaceOptions builder.
   */
  @Test
  public void testUpdateWorkspaceOptionsBuilder() {

    String workspaceName = "Builder Test";
    String workspaceDescription = "Description of " + workspaceName;
    String workspaceLanguage = "en";

    // intents
    CreateIntent testIntent = new CreateIntent.Builder("testIntent").build();

    // entities
    CreateEntity testEntity = new CreateEntity.Builder("testEntity").build();

    // counterexamples
    CreateCounterexample testCounterexample = new CreateCounterexample.Builder("testCounterexample").build();

    // dialognodes
    CreateDialogNode testDialogNode = new CreateDialogNode.Builder("dialogNode").build();

    // metadata
    Map<String, Object> workspaceMetadata = new HashMap<String, Object>();
    String metadataValue = "value for " + workspaceName;
    workspaceMetadata.put("key", metadataValue);

    UpdateWorkspaceOptions.Builder builder = new UpdateWorkspaceOptions.Builder(WORKSPACE_ID);
    builder.name(workspaceName);
    builder.description(workspaceDescription);
    builder.language(workspaceLanguage);
    builder.addIntent(testIntent);
    builder.addEntity(testEntity);
    builder.addCounterexample(testCounterexample);
    builder.addDialogNode(testDialogNode);
    builder.metadata(workspaceMetadata);

    UpdateWorkspaceOptions options = builder.build();

    assertEquals(options.name(), workspaceName);
    assertEquals(options.description(), workspaceDescription);
    assertEquals(options.language(), workspaceLanguage);
    assertNotNull(options.intents());
    assertEquals(options.intents().size(), 1);
    assertEquals(options.intents().get(0), testIntent);
    assertNotNull(options.entities());
    assertEquals(options.entities().size(), 1);
    assertEquals(options.entities().get(0), testEntity);
    assertNotNull(options.counterexamples());
    assertEquals(options.counterexamples().size(), 1);
    assertEquals(options.counterexamples().get(0), testCounterexample);
    assertNotNull(options.dialogNodes());
    assertEquals(options.dialogNodes().size(), 1);
    assertEquals(options.dialogNodes().get(0), testDialogNode);
    assertNotNull(options.metadata());
    assertEquals(options.metadata(), workspaceMetadata);

    UpdateWorkspaceOptions.Builder builder2 = options.newBuilder();

    CreateIntent testIntent2 = new CreateIntent.Builder("testIntent2").build();
    CreateEntity testEntity2 = new CreateEntity.Builder("testEntity2").build();
    CreateCounterexample testCounterexample2 = new CreateCounterexample.Builder("testCounterexample2").build();
    CreateDialogNode testDialogNode2 = new CreateDialogNode.Builder("dialogNode2").build();

    builder2.intents(new ArrayList<CreateIntent>());
    builder2.addIntent(testIntent2);
    builder2.entities(new ArrayList<CreateEntity>());
    builder2.addEntity(testEntity2);
    builder2.counterexamples(new ArrayList<CreateCounterexample>());
    builder2.addCounterexample(testCounterexample2);
    builder2.dialogNodes(new ArrayList<CreateDialogNode>());
    builder2.addDialogNode(testDialogNode2);

    UpdateWorkspaceOptions options2 = builder2.build();

    assertNotNull(options2.intents());
    assertEquals(options2.intents().size(), 1);
    assertEquals(options2.intents().get(0), testIntent2);
    assertNotNull(options2.entities());
    assertEquals(options2.entities().size(), 1);<commit_msg>test(Assistant): Add unit test for new UpdateWorkspaceOptions prop<commit_after>/*
 * Copyright 2017 IBM Corp. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */
package com.ibm.watson.developer_cloud.assistant.v1;

import com.ibm.watson.developer_cloud.WatsonServiceUnitTest;
import com.ibm.watson.developer_cloud.assistant.v1.model.Context;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateCounterexample;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateDialogNode;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateDialogNodeOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateEntity;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateEntityOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateExample;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateIntent;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateIntentOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateValue;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateValueOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.CreateWorkspaceOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.DeleteUserDataOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.DialogNodeAction;
import com.ibm.watson.developer_cloud.assistant.v1.model.InputData;
import com.ibm.watson.developer_cloud.assistant.v1.model.ListAllLogsOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.MessageOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.MessageResponse;
import com.ibm.watson.developer_cloud.assistant.v1.model.RuntimeEntity;
import com.ibm.watson.developer_cloud.assistant.v1.model.RuntimeIntent;
import com.ibm.watson.developer_cloud.assistant.v1.model.UpdateDialogNodeOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.UpdateEntityOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.UpdateIntentOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.UpdateValueOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.UpdateWorkspaceOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.WorkspaceSystemSettings;
import com.ibm.watson.developer_cloud.assistant.v1.model.WorkspaceSystemSettingsDisambiguation;
import com.ibm.watson.developer_cloud.assistant.v1.model.WorkspaceSystemSettingsTooling;
import com.ibm.watson.developer_cloud.http.HttpHeaders;
import okhttp3.mockwebserver.RecordedRequest;
import org.apache.commons.lang3.StringUtils;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

/**
 * Unit tests for the {@link Assistant}.
 */
public class AssistantTest extends WatsonServiceUnitTest {
  private Assistant service;
  private static final String FIXTURE = "src/test/resources/assistant/assistant.json";
  private static final String WORKSPACE_ID = "123";
  private static final String PATH_MESSAGE = "/v1/workspaces/" + WORKSPACE_ID + "/message";
  private static final String VERSION = "version";

  /*
   * (non-Javadoc)
   * @see com.ibm.watson.developer_cloud.WatsonServiceTest#setUp()
   */
  @Override
  @Before
  public void setUp() throws Exception {
    super.setUp();
    service = new Assistant("2018-02-16");
    service.setUsernameAndPassword("", "");
    service.setEndPoint(getMockWebServerUrl());

  }

  /**
   * Negative - Test constructor with null version date.
   */
  @Test(expected = IllegalArgumentException.class)
  public void testConstructorWithNullVersionDate() {
    new Assistant(null);
  }

  /**
   * Negative - Test constructor with empty version date.
   */
  @Test(expected = IllegalArgumentException.class)
  public void testConstructorWithEmptyVersionDate() {
    new Assistant("");
  }

  /**
   * Negative - Test assistant with null options.
   */
  @Test(expected = IllegalArgumentException.class)
  public void testAssistantWithNullOptions() {
    service.message(null).execute();
  }

  /**
   * Negative - Test assistant with null workspaceId.
   */
  @Test(expected = IllegalArgumentException.class)
  public void testAssistantWithNullWorkspaceId() {
    MessageOptions options = new MessageOptions.Builder().build();
    service.message(options).execute();
  }

  /**
   * Negative - Test assistant with empty workspaceId.
   */
  @Test(expected = IllegalArgumentException.class)
  public void testAssistantWithEmptyWorkspaceId() {
    MessageOptions options = new MessageOptions.Builder("").build();
    service.message(options).execute();
  }

  /**
   * Test send message.
   *
   * @throws IOException Signals that an I/O exception has occurred.
   * @throws InterruptedException the interrupted exception
   */
  @Test
  public void testSendMessage() throws IOException, InterruptedException {
    String text = "I would love to hear some jazz music.";

    MessageResponse mockResponse = loadFixture(FIXTURE, MessageResponse.class);
    server.enqueue(jsonResponse(mockResponse));

    InputData input = new InputData.Builder(text).build();
    RuntimeIntent intent = new RuntimeIntent();
    intent.setIntent("turn_on");
    intent.setConfidence(0.0);
    RuntimeEntity entity = new RuntimeEntity();
    entity.setEntity("genre");
    entity.setValue("jazz");
    MessageOptions options = new MessageOptions.Builder(WORKSPACE_ID)
        .input(input)
        .addIntent(intent)
        .addEntity(entity)
        .alternateIntents(true)
        .build();

    // execute first request
    MessageResponse serviceResponse = service.message(options).execute();

    // first request
    RecordedRequest request = server.takeRequest();

    String path = StringUtils.join(PATH_MESSAGE, "?", VERSION, "=2018-02-16");
    assertEquals(path, request.getPath());
    assertArrayEquals(new String[] { "Great choice! Playing some jazz for you." },
        serviceResponse.getOutput().getText().toArray(new String[0]));
    assertEquals(request.getMethod(), "POST");
    assertNotNull(request.getHeader(HttpHeaders.AUTHORIZATION));
    assertNotNull(serviceResponse.getOutput().getLogMessages());
    assertNotNull(serviceResponse.getOutput().getNodesVisited());
    assertNotNull(serviceResponse.getOutput().getNodesVisitedDetails());
    assertNotNull(serviceResponse.getOutput().getNodesVisitedDetails().get(0).getDialogNode());
    assertNotNull(serviceResponse.getOutput().getNodesVisitedDetails().get(0).getTitle());
    assertNotNull(serviceResponse.getOutput().getNodesVisitedDetails().get(0).getConditions());
    assertEquals(serviceResponse, mockResponse);
  }

  /**
   * Test send message. use some different MessageOptions options like context and other public methods
   *
   * @throws IOException Signals that an I/O exception has occurred.
   * @throws InterruptedException the interrupted exception
   */
  @Test
  public void testSendMessageWithAlternateIntents() throws IOException, InterruptedException {
    MessageResponse mockResponse = loadFixture(FIXTURE, MessageResponse.class);
    server.enqueue(jsonResponse(mockResponse));

    Context contextTemp = new Context();
    contextTemp.put("name", "Myname");
    InputData inputTemp = new InputData.Builder("My text").build();

    MessageOptions options = new MessageOptions.Builder(WORKSPACE_ID)
        .input(inputTemp)
        .alternateIntents(false)
        .context(contextTemp)
        .entities(null).intents(null).build();

    // execute first request
    MessageResponse serviceResponse = service.message(options).execute();

    // first request
    RecordedRequest request = server.takeRequest();

    String path = StringUtils.join(PATH_MESSAGE, "?", VERSION, "=2018-02-16");
    assertEquals(path, request.getPath());
    assertArrayEquals(new String[] { "Great choice! Playing some jazz for you." },
        serviceResponse.getOutput().getText().toArray(new String[0]));
    assertEquals(request.getMethod(), "POST");
    assertNotNull(request.getHeader(HttpHeaders.AUTHORIZATION));
    assertEquals(serviceResponse, mockResponse);
  }

  /**
   * Negative - Test message with null workspace id.
   *
   * @throws InterruptedException the interrupted exception
   */
  @Test(expected = IllegalArgumentException.class)
  public void testSendMessageWithNullWorkspaceId() throws InterruptedException {
    String text = "I'd like to get insurance to for my home";

    InputData input = new InputData.Builder(text).build();
    MessageOptions options = new MessageOptions.Builder().input(input).alternateIntents(true).build();

    service.message(options).execute();
  }

  /**
   * Test CreateWorkspace builder.
   */
  @Test
  public void testCreateWorkspaceBuilder() {

    String workspaceName = "Builder Test";
    String workspaceDescription = "Description of " + workspaceName;
    String workspaceLanguage = "en";

    // intents
    CreateIntent testIntent0 = new CreateIntent.Builder("testIntent0").build();
    CreateIntent testIntent1 = new CreateIntent.Builder("testIntent1").build();

    // entities
    CreateEntity testEntity0 = new CreateEntity.Builder("testEntity0").build();
    CreateEntity testEntity1 = new CreateEntity.Builder("testEntity1").build();

    // counterexamples
    CreateCounterexample testCounterexample0 = new CreateCounterexample.Builder("testCounterexample0").build();
    CreateCounterexample testCounterexample1 = new CreateCounterexample.Builder("testCounterexample1").build();

    // dialognodes
    CreateDialogNode testDialogNode0 = new CreateDialogNode.Builder("dialogNode0").build();
    CreateDialogNode testDialogNode1 = new CreateDialogNode.Builder("dialogNode1").build();

    // metadata
    Map<String, Object> workspaceMetadata = new HashMap<String, Object>();
    String metadataValue = "value for " + workspaceName;
    workspaceMetadata.put("key", metadataValue);

    // systemSettings
    WorkspaceSystemSettingsDisambiguation disambiguation = new WorkspaceSystemSettingsDisambiguation();
    disambiguation.setEnabled(true);
    disambiguation.setNoneOfTheAbovePrompt("none of the above");
    disambiguation.setPrompt("prompt");
    disambiguation.setSensitivity(WorkspaceSystemSettingsDisambiguation.Sensitivity.HIGH);
    WorkspaceSystemSettingsTooling tooling = new WorkspaceSystemSettingsTooling();
    tooling.setStoreGenericResponses(true);
    Map<String, String> humanAgentAssist = new HashMap<>();
    humanAgentAssist.put("help", "ok");
    WorkspaceSystemSettings systemSettings = new WorkspaceSystemSettings();
    systemSettings.setDisambiguation(disambiguation);
    systemSettings.setTooling(tooling);
    systemSettings.setHumanAgentAssist(humanAgentAssist);

    CreateWorkspaceOptions createOptions = new CreateWorkspaceOptions.Builder()
        .name(workspaceName)
        .description(workspaceDescription)
        .language(workspaceLanguage)
        .addIntent(testIntent0).addIntent(testIntent1)
        .addEntity(testEntity0).addEntity(testEntity1)
        .addCounterexample(testCounterexample0).addCounterexample(testCounterexample1)
        .addDialogNode(testDialogNode0).addDialogNode(testDialogNode1)
        .metadata(workspaceMetadata)
        .systemSettings(systemSettings)
        .build();

    assertEquals(createOptions.name(), workspaceName);
    assertEquals(createOptions.description(), workspaceDescription);
    assertEquals(createOptions.language(), workspaceLanguage);
    assertNotNull(createOptions.intents());
    assertEquals(createOptions.intents().size(), 2);
    assertEquals(createOptions.intents().get(0), testIntent0);
    assertEquals(createOptions.intents().get(1), testIntent1);
    assertNotNull(createOptions.entities());
    assertEquals(createOptions.entities().size(), 2);
    assertEquals(createOptions.entities().get(0), testEntity0);
    assertEquals(createOptions.entities().get(1), testEntity1);
    assertNotNull(createOptions.counterexamples());
    assertEquals(createOptions.counterexamples().size(), 2);
    assertEquals(createOptions.counterexamples().get(0), testCounterexample0);
    assertEquals(createOptions.counterexamples().get(1), testCounterexample1);
    assertNotNull(createOptions.dialogNodes());
    assertEquals(createOptions.dialogNodes().size(), 2);
    assertEquals(createOptions.dialogNodes().get(0), testDialogNode0);
    assertEquals(createOptions.dialogNodes().get(1), testDialogNode1);
    assertEquals(createOptions.systemSettings(), systemSettings);

    CreateWorkspaceOptions.Builder builder = createOptions.newBuilder();

    CreateIntent testIntent2 = new CreateIntent.Builder("testIntent2").build();
    CreateEntity testEntity2 = new CreateEntity.Builder("testEntity2").build();
    CreateCounterexample testCounterexample2 = new CreateCounterexample.Builder("testCounterexample2").build();
    CreateDialogNode testDialogNode2 = new CreateDialogNode.Builder("dialogNode2").build();

    builder.intents(Arrays.asList(testIntent2));
    builder.entities(Arrays.asList(testEntity2));
    builder.counterexamples(Arrays.asList(testCounterexample2));
    builder.dialogNodes(Arrays.asList(testDialogNode2));

    CreateWorkspaceOptions options2 = builder.build();

    assertNotNull(options2.intents());
    assertEquals(options2.intents().size(), 1);
    assertEquals(options2.intents().get(0), testIntent2);
    assertNotNull(options2.entities());
    assertEquals(options2.entities().size(), 1);
    assertEquals(options2.entities().get(0), testEntity2);
    assertNotNull(options2.counterexamples());
    assertEquals(options2.counterexamples().size(), 1);
    assertEquals(options2.counterexamples().get(0), testCounterexample2);
    assertNotNull(options2.dialogNodes());
    assertEquals(options2.dialogNodes().size(), 1);
    assertEquals(options2.dialogNodes().get(0), testDialogNode2);
  }

  /**
   * Test UpdateWorkspaceOptions builder.
   */
  @Test
  public void testUpdateWorkspaceOptionsBuilder() {

    String workspaceName = "Builder Test";
    String workspaceDescription = "Description of " + workspaceName;
    String workspaceLanguage = "en";

    // intents
    CreateIntent testIntent = new CreateIntent.Builder("testIntent").build();

    // entities
    CreateEntity testEntity = new CreateEntity.Builder("testEntity").build();

    // counterexamples
    CreateCounterexample testCounterexample = new CreateCounterexample.Builder("testCounterexample").build();

    // dialognodes
    CreateDialogNode testDialogNode = new CreateDialogNode.Builder("dialogNode").build();

    // metadata
    Map<String, Object> workspaceMetadata = new HashMap<String, Object>();
    String metadataValue = "value for " + workspaceName;
    workspaceMetadata.put("key", metadataValue);

    // systemSettings
    WorkspaceSystemSettingsDisambiguation disambiguation = new WorkspaceSystemSettingsDisambiguation();
    disambiguation.setEnabled(true);
    disambiguation.setNoneOfTheAbovePrompt("none of the above");
    disambiguation.setPrompt("prompt");
    disambiguation.setSensitivity(WorkspaceSystemSettingsDisambiguation.Sensitivity.HIGH);
    WorkspaceSystemSettingsTooling tooling = new WorkspaceSystemSettingsTooling();
    tooling.setStoreGenericResponses(true);
    Map<String, String> humanAgentAssist = new HashMap<>();
    humanAgentAssist.put("help", "ok");
    WorkspaceSystemSettings systemSettings = new WorkspaceSystemSettings();
    systemSettings.setDisambiguation(disambiguation);
    systemSettings.setTooling(tooling);
    systemSettings.setHumanAgentAssist(humanAgentAssist);

    UpdateWorkspaceOptions.Builder builder = new UpdateWorkspaceOptions.Builder(WORKSPACE_ID);
    builder.name(workspaceName);
    builder.description(workspaceDescription);
    builder.language(workspaceLanguage);
    builder.addIntent(testIntent);
    builder.addEntity(testEntity);
    builder.addCounterexample(testCounterexample);
    builder.addDialogNode(testDialogNode);
    builder.metadata(workspaceMetadata);
    builder.systemSettings(systemSettings);

    UpdateWorkspaceOptions options = builder.build();

    assertEquals(options.name(), workspaceName);
    assertEquals(options.description(), workspaceDescription);
    assertEquals(options.language(), workspaceLanguage);
    assertNotNull(options.intents());
    assertEquals(options.intents().size(), 1);
    assertEquals(options.intents().get(0), testIntent);
    assertNotNull(options.entities());
    assertEquals(options.entities().size(), 1);
    assertEquals(options.entities().get(0), testEntity);
    assertNotNull(options.counterexamples());
    assertEquals(options.counterexamples().size(), 1);
    assertEquals(options.counterexamples().get(0), testCounterexample);
    assertNotNull(options.dialogNodes());
    assertEquals(options.dialogNodes().size(), 1);
    assertEquals(options.dialogNodes().get(0), testDialogNode);
    assertNotNull(options.metadata());
    assertEquals(options.metadata(), workspaceMetadata);
    assertEquals(options.systemSettings(), systemSettings);

    UpdateWorkspaceOptions.Builder builder2 = options.newBuilder();

    CreateIntent testIntent2 = new CreateIntent.Builder("testIntent2").build();
    CreateEntity testEntity2 = new CreateEntity.Builder("testEntity2").build();
    CreateCounterexample testCounterexample2 = new CreateCounterexample.Builder("testCounterexample2").build();
    CreateDialogNode testDialogNode2 = new CreateDialogNode.Builder("dialogNode2").build();

    builder2.intents(new ArrayList<CreateIntent>());
    builder2.addIntent(testIntent2);
    builder2.entities(new ArrayList<CreateEntity>());
    builder2.addEntity(testEntity2);
    builder2.counterexamples(new ArrayList<CreateCounterexample>());
    builder2.addCounterexample(testCounterexample2);
    builder2.dialogNodes(new ArrayList<CreateDialogNode>());
    builder2.addDialogNode(testDialogNode2);

    UpdateWorkspaceOptions options2 = builder2.build();

    assertNotNull(options2.intents());
    assertEquals(options2.intents().size(), 1);
    assertEquals(options2.intents().get(0), testIntent2);
    assertNotNull(options2.entities());
    assertEquals(options2.entities().size(), 1);
{'fraction_non_alphanumeric': 0.11342844696144631, 'fraction_numerical': 0.010618601611849271, 'mean_word_length': 5.190628687004888, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5650340', 'n_tokens_mistral': 10077, 'n_tokens_neox': 9892, 'n_words': 1788}