@Test
  public void testGetCategory() {
    String columnId = "my_test_column_id";
    LogicalModel logicalModel = mock(LogicalModel.class);

    doReturn(Collections.<Category>emptyList()).when(logicalModel).getCategories();
    Category result = spyMetadataServiceUtil.getCategory(columnId, logicalModel);
    assertNull(result);

    LogicalColumn mockColumn = mock(LogicalColumn.class);
    Category mockCat1 = mock(Category.class);
    Category mockCat2 = mock(Category.class);
    doReturn(null).when(mockCat1).findLogicalColumn(columnId);
    doReturn(mockColumn).when(mockCat2).findLogicalColumn(columnId);
    List<Category> listCategories = new ArrayList<Category>(2);
    listCategories.add(mockCat1);
    listCategories.add(mockCat2);
    doReturn(listCategories).when(logicalModel).getCategories();
    result = spyMetadataServiceUtil.getCategory(columnId, logicalModel);
    assertEquals(mockCat2, result);
  }
  @Test
  public void testCreateCdaJson() throws JSONException {
    String result = spyMetadataServiceUtil.createCdaJson(null, DEFAULT_LOCALE);
    assertNull(result);

    Object[][] headers = new Object[][] {{new String("Header_0"), new String("Header_1")}};
    IPentahoMetaData mockMetaData = mock(IPentahoMetaData.class);
    doReturn(headers).when(mockMetaData).getColumnHeaders();
    doReturn(DataType.STRING)
        .when(mockMetaData)
        .getAttribute(0, 0, IPhysicalColumn.DATATYPE_PROPERTY);
    doReturn(DataType.BOOLEAN)
        .when(mockMetaData)
        .getAttribute(0, 1, IPhysicalColumn.DATATYPE_PROPERTY);
    doReturn(new LocalizedString(DEFAULT_LOCALE, "name_0"))
        .when(mockMetaData)
        .getAttribute(0, 0, Concept.NAME_PROPERTY);
    doReturn(new LocalizedString(DEFAULT_LOCALE, "name_1"))
        .when(mockMetaData)
        .getAttribute(0, 1, Concept.NAME_PROPERTY);
    IPentahoResultSet mockResultSet = mock(IPentahoResultSet.class);
    doReturn(2).when(mockResultSet).getColumnCount();
    doReturn(2).when(mockResultSet).getRowCount();
    doReturn("val_00").when(mockResultSet).getValueAt(0, 0);
    doReturn("val_01").when(mockResultSet).getValueAt(0, 1);
    doReturn("val_10").when(mockResultSet).getValueAt(1, 0);
    doReturn("val_11").when(mockResultSet).getValueAt(1, 1);
    doReturn(mockMetaData).when(mockResultSet).getMetaData();

    result = spyMetadataServiceUtil.createCdaJson(mockResultSet, DEFAULT_LOCALE);
    assertNotNull(result);
    JSONObject resultObj = new JSONObject(result);
    assertTrue(resultObj.has("metadata"));
    assertTrue(resultObj.has("resultset"));
    JSONArray resultset = resultObj.getJSONArray("resultset");
    assertEquals("[[\"val_00\",\"val_01\"],[\"val_10\",\"val_11\"]]", resultset.toString());
    JSONArray metadata = resultObj.getJSONArray("metadata");
    makeMetadataObjectAssertions(metadata.getJSONObject(0), 0, "STRING");
    makeMetadataObjectAssertions(metadata.getJSONObject(1), 1, "BOOLEAN");
  }
  @Test
  public void testConvertQuery() {
    String domainName = "test_domain";
    String modelId = "model_id";
    String columnId = "column_id";
    LogicalColumn mockColumn = mock(LogicalColumn.class);
    doReturn(DataType.STRING).when(mockColumn).getDataType();
    doReturn(columnId).when(mockColumn).getId();
    LogicalModel mockModel = mock(LogicalModel.class);
    doReturn(mockColumn).when(mockModel).findLogicalColumn(columnId);
    Domain mockDomain = mock(Domain.class);
    doReturn(mockModel).when(mockDomain).findLogicalModel(modelId);
    IMetadataDomainRepository mockRepo = mock(IMetadataDomainRepository.class);
    doReturn(mockDomain).when(mockRepo).getDomain(domainName);
    org.pentaho.metadata.model.Category category = mock(org.pentaho.metadata.model.Category.class);
    doReturn(category).when(spyMetadataServiceUtil).getCategory(columnId, mockModel);
    doReturn(mockRepo).when(spyMetadataServiceUtil).getDomainRepository();

    Query srcQuery = createMockQuery(domainName, modelId, columnId);
    ModelInfo info = new ModelInfo();
    info.setGroupId(domainName);
    info.setModelId(modelId);

    org.pentaho.metadata.query.model.Query result =
        spyMetadataServiceUtil.convertQuery(srcQuery, info);

    assertNotNull(result);
    assertEquals(mockDomain, result.getDomain());
    assertFalse(result.getDisableDistinct());
    assertEquals(mockModel, result.getLogicalModel());
    assertEquals(1, result.getSelections().size());
    Selection selection = result.getSelections().get(0);
    assertEquals(mockColumn, selection.getLogicalColumn());
    assertEquals(category, selection.getCategory());
    assertEquals(AggregationType.SUM, selection.getActiveAggregationType());
    assertEquals(AggregationType.SUM, selection.getAggregationType());
    assertEquals(1, result.getConstraints().size());
    Constraint constraint = result.getConstraints().get(0);
    assertEquals(CombinationType.AND, constraint.getCombinationType());
    assertNull(constraint.getFormula());
    assertEquals(1, result.getOrders().size());
    org.pentaho.metadata.query.model.Order resOrder = result.getOrders().get(0);
    assertEquals(selection, resOrder.getSelection());
    assertEquals(Type.ASC, resOrder.getType());
    assertEquals(1, result.getParameters().size());
    org.pentaho.metadata.query.model.Parameter param = result.getParameters().get(0);
    assertEquals("parameter_name", param.getName());
    assertEquals("val_0", param.getDefaultValue());
    assertEquals(DataType.STRING, param.getType());
  }
 @Test
 public void testDeserializeJsonQuery() {
   String json =
       "{\"class\":\"org.pentaho.metadata.model.thin.Query\",\"conditions\":[{\"class\":\"org.pentaho.metadata.model.thin.Condition\","
           + "\"combinationType\":\"AND\",\"elementId\":\"MY_ELEM_ID\",\"operator\":\"EQUAL\",\"parameterized\":false,"
           + "\"parentId\":\"MY_PARENT_ID\",\"selectedAggregation\":\"SUM\",\"value\":[\"Val_0\"]}],\"defaultParameterMap\":null,"
           + "\"disableDistinct\":false,\"elements\":[{\"availableAggregations\":null,\"capabilities\":{},"
           + "\"class\":\"org.pentaho.metadata.model.thin.Element\",\"dataType\":null,\"defaultAggregation\":\"NONE\","
           + "\"description\":null,\"elementType\":null,\"formatMask\":null,\"hiddenForUser\":false,\"horizontalAlignment\":\"LEFT\","
           + "\"id\":\"MY_ELEM_ID\",\"isQueryElement\":true,\"name\":null,\"parentId\":\"PARENT_ID\",\"selectedAggregation\":\"SUM\"}],"
           + "\"orders\":[{\"class\":\"org.pentaho.metadata.model.thin.Order\",\"elementId\":\"MY_ELEM_ID\",\"orderType\":\"ASC\","
           + "\"parentId\":\"MY_PARENT_ID\"}],\"parameters\":[],\"sourceId\":\"MY_DOMAIN_ID\"}";
   Query result = spyMetadataServiceUtil.deserializeJsonQuery(json);
   assertNotNull(result);
   assertEquals("MY_DOMAIN_ID", result.getSourceId());
   assertFalse(result.getDisableDistinct());
   assertEquals(1, result.getElements().length);
   Element column = result.getElements()[0];
   assertEquals("MY_ELEM_ID", column.getId());
   assertNull(column.getName());
   assertNull(column.getDescription());
   assertNull(column.getElementType());
   assertNull(column.getFormatMask());
   assertNull(column.getDataType());
   assertFalse(column.isHiddenForUser());
   assertEquals("NONE", column.getDefaultAggregation());
   assertEquals("PARENT_ID", column.getParentId());
   assertEquals("LEFT", column.getHorizontalAlignment());
   assertEquals("SUM", column.getSelectedAggregation());
   assertEquals(1, result.getConditions().length);
   Condition condition = result.getConditions()[0];
   assertEquals("MY_PARENT_ID", condition.getParentId());
   assertEquals("MY_ELEM_ID", condition.getElementId());
   assertEquals("AND", condition.getCombinationType());
   assertEquals("EQUAL", condition.getOperator());
   assertFalse(condition.isParameterized());
   assertEquals("SUM", condition.getSelectedAggregation());
   Assert.assertArrayEquals(new String[] {"Val_0"}, condition.getValue());
   assertEquals(1, result.getOrders().length);
   Order order = result.getOrders()[0];
   assertEquals("MY_ELEM_ID", order.getElementId());
   assertEquals("MY_PARENT_ID", order.getParentId());
   assertEquals("ASC", order.getOrderType());
   assertEquals(0, result.getParameters().length);
 }
  @Test
  public void testCreateThinModel() {
    LogicalColumn column =
        createMockColumn(
            "id_column", "name_column", "description_column", DataType.STRING, FieldType.ATTRIBUTE);
    List<LogicalColumn> listColumns = new ArrayList<LogicalColumn>(1);
    listColumns.add(column);
    Category category =
        createMockCategory("id_category", "name_category", "description_category", listColumns);
    List<Category> listCategories = new ArrayList<Category>(1);
    listCategories.add(category);
    LogicalModel lmodel = createMockModel("id", "name", "description", listCategories);

    Model model = spyMetadataServiceUtil.createThinModel(lmodel, DOMAIN_ID);

    assertModels(lmodel, model, DOMAIN_ID);
    assertEquals(2, model.getElements().length);
    Element elemCat = model.getElements()[0];
    assertElements(category, elemCat);
    Element elemCol = model.getElements()[1];
    assertColumns(column, elemCol, category.getId());
  }