/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.metron.rest.user;


import static org.apache.metron.rest.user.UserSettingsClient.USER_SETTINGS_HBASE_CF;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.Supplier;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTableInterface;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

public class UserSettingsClientTest {

  @Rule
  public final ExpectedException exception = ExpectedException.none();

  private static ThreadLocal<ObjectMapper> _mapper = ThreadLocal.withInitial(() ->
          new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL));

  private HTableInterface userSettingsTable;
  private Supplier<Map<String, Object>> globalConfigSupplier;
  private UserSettingsClient userSettingsClient;
  private static byte[] cf = Bytes.toBytes("cf");

  @Before
  public void setUp() throws Exception {
    userSettingsTable = mock(HTableInterface.class);
    globalConfigSupplier = () -> new HashMap<String, Object>() {{
      put(USER_SETTINGS_HBASE_CF, "cf");
    }};
  }

  @Test
  public void shouldFindOne() throws Exception {
    Result result = mock(Result.class);
    when(result.getValue(cf, Bytes.toBytes("type"))).thenReturn("userSettings1String".getBytes());
    Get get = new Get("user1".getBytes());
    get.addFamily(cf);
    when(userSettingsTable.get(get)).thenReturn(result);

    UserSettingsClient userSettingsClient = new UserSettingsClient(userSettingsTable, cf);
    assertEquals("userSettings1String", userSettingsClient.findOne("user1", "type").get());
    assertFalse(userSettingsClient.findOne("missingUser", "type").isPresent());
  }

  @Test
  public void shouldFindAll() throws Exception {
    ResultScanner resultScanner = mock(ResultScanner.class);
    Result result1 = mock(Result.class);
    Result result2 = mock(Result.class);
    when(result1.getRow()).thenReturn("user1".getBytes());
    when(result2.getRow()).thenReturn("user2".getBytes());
    when(result1.getValue(cf, Bytes.toBytes("type"))).thenReturn("userSettings1String".getBytes());
    when(result2.getValue(cf, Bytes.toBytes("type"))).thenReturn("userSettings2String".getBytes());
    when(resultScanner.iterator()).thenReturn(Arrays.asList(result1, result2).iterator());
    when(userSettingsTable.getScanner(any(Scan.class))).thenReturn(resultScanner);

    UserSettingsClient userSettingsClient = new UserSettingsClient(userSettingsTable, cf);
    assertEquals(new HashMap<String, Optional<String>>() {{
      put("user1", Optional.of("userSettings1String"));
      put("user2", Optional.of("userSettings2String"));
    }}, userSettingsClient.findAll("type"));
  }

}
