package com.devicehive.dao;
/*
* #%L
* DeviceHive Dao Riak Implementation
* %%
* Copyright (C) 2016 DataArt
* %%
* 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.
* #L%
*/
import com.devicehive.dao.riak.UserNetworkDaoRiakImpl;
import com.devicehive.dao.riak.model.UserNetwork;
import com.devicehive.vo.NetworkVO;
import com.devicehive.vo.NetworkWithUsersAndDevicesVO;
import com.devicehive.vo.UserVO;
import org.apache.commons.lang3.RandomStringUtils;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
public class NetworkDaoTest {
@Autowired
private NetworkDao networkDao;
@Autowired
private UserDao userDao;
@Autowired(required = false)
private UserNetworkDaoRiakImpl userNetworkDao;
@Autowired
private ApplicationContext context;
@Before
public void beforeMethod() {
Assume.assumeTrue(context.getEnvironment().acceptsProfiles("riak"));
}
@Test
public void shouldCreateNetwork() throws Exception {
NetworkVO network = new NetworkVO();
network.setKey(RandomStringUtils.randomAlphabetic(10));
network.setName(RandomStringUtils.randomAlphabetic(10));
networkDao.persist(network);
NetworkVO created = networkDao.find(network.getId());
assertThat(created, notNullValue());
assertThat(created.getKey(), equalTo(network.getKey()));
assertThat(created.getName(), equalTo(network.getName()));
}
@Test
public void shouldUpdateNetwork() throws Exception {
NetworkVO network = new NetworkVO();
network.setKey(RandomStringUtils.randomAlphabetic(10));
networkDao.persist(network);
NetworkVO created = networkDao.find(network.getId());
assertThat(created, notNullValue());
assertThat(created.getKey(), equalTo(network.getKey()));
created.setKey(RandomStringUtils.randomAlphabetic(20));
networkDao.merge(created);
NetworkVO updated = networkDao.find(created.getId());
assertThat(updated, notNullValue());
assertThat(updated.getId(), equalTo(created.getId()));
assertThat(updated.getKey(), equalTo(created.getKey()));
assertThat(updated.getKey(), not(equalTo(network.getKey())));
}
@Test
public void shouldDeleteNetwork() throws Exception {
NetworkVO network = new NetworkVO();
network.setKey(RandomStringUtils.randomAlphabetic(10));
networkDao.persist(network);
assertNotNull(networkDao.find(network.getId()));
networkDao.deleteById(network.getId());
assertNull(networkDao.find(network.getId()));
}
@Test
public void shouldFindByName() throws Exception {
String name = RandomStringUtils.randomAlphabetic(10);
int count = 0;
for (int i = 0; i < 100; i++) {
NetworkVO network = new NetworkVO();
network.setKey(RandomStringUtils.randomAlphabetic(20));
network.setDescription(RandomStringUtils.randomAlphabetic(20));
if (i % 2 == 0) {
network.setName(name);
count++;
} else {
network.setName(RandomStringUtils.randomAlphabetic(10));
}
networkDao.persist(network);
}
List<NetworkVO> networks = networkDao.findByName(name);
assertThat(networks, hasSize(count));
Set<String> names = networks.stream().map(NetworkVO::getName).collect(Collectors.toSet());
assertThat(names, hasSize(1));
assertThat(names, hasItem(name));
}
@Test
public void shouldFindById() throws Exception {
NetworkVO network = new NetworkVO();
network.setKey(RandomStringUtils.randomAlphabetic(10));
networkDao.persist(network);
assertThat(network.getId(), notNullValue());
NetworkVO found = networkDao.find(network.getId());
assertThat(found, notNullValue());
assertThat(network.getId(), equalTo(found.getId()));
assertThat(network.getKey(), equalTo(found.getKey()));
}
@Test
public void shouldGetNetworksByIdsSet() throws Exception {
Set<Long> networkIds = new HashSet<>();
for (int i = 0; i < 100; i++) {
NetworkVO network = new NetworkVO();
network.setKey(RandomStringUtils.randomAlphabetic(10));
networkDao.persist(network);
if (i % 2 == 0) {
networkIds.add(network.getId());
}
}
List<NetworkWithUsersAndDevicesVO> networks = networkDao.getNetworksByIdsAndUsers(null, networkIds, null);
assertNotNull(networks);
assertThat(networks, hasSize(networkIds.size()));
Set<Long> returnedIds = networks.stream().map(NetworkWithUsersAndDevicesVO::getId).collect(Collectors.toSet());
assertThat(networkIds, equalTo(returnedIds));
}
@Test
public void shouldGetNetworksWithUserFilter() throws Exception {
UserVO user = new UserVO();
user.setLogin(RandomStringUtils.randomAlphabetic(10));
userDao.persist(user);
assertNotNull(user.getId());
Set<Long> networkIds = new HashSet<>();
for (int i = 0; i < 100; i++) {
NetworkVO network = new NetworkVO();
network.setKey(RandomStringUtils.randomAlphabetic(10));
networkDao.persist(network);
if (i % 2 == 0) {
UserNetwork un = new UserNetwork();
un.setNetworkId(network.getId());
un.setUserId(user.getId());
userNetworkDao.persist(un);
}
networkIds.add(network.getId());
}
List<NetworkWithUsersAndDevicesVO> networks = networkDao.getNetworksByIdsAndUsers(user.getId(), networkIds, null);
assertNotNull(networks);
assertThat(networks, hasSize(50));
networks.forEach(n -> {
assertNotNull(n.getUsers());
assertThat(n.getUsers(), hasSize(1));
assertThat(n.getUsers().stream().findFirst().get().getId(), equalTo(user.getId()));
});
}
@Test
public void shouldGetOnlyPermittedNetworks() throws Exception {
Set<Long> networkIds = new HashSet<>();
Set<Long> permitted = new HashSet<>();
for (int i = 0; i < 100; i++) {
NetworkVO network = new NetworkVO();
network.setKey(RandomStringUtils.randomAlphabetic(10));
networkDao.persist(network);
if (i % 2 == 0) {
permitted.add(network.getId());
}
networkIds.add(network.getId());
}
List<NetworkWithUsersAndDevicesVO> networks = networkDao.getNetworksByIdsAndUsers(null, networkIds, permitted);
assertNotNull(networks);
assertThat(networks, hasSize(permitted.size()));
Set<Long> returned = networks.stream().map(NetworkVO::getId).collect(Collectors.toSet());
assertThat(permitted, equalTo(returned));
}
@Test
public void shouldListByNameWithSortingAndLimit() throws Exception {
String name = RandomStringUtils.randomAlphabetic(10);
for (int i = 0; i < 100; i++) {
NetworkVO network = new NetworkVO();
network.setKey(RandomStringUtils.randomAlphabetic(10));
if (i % 2 == 0) {
network.setName(name);
} else {
network.setName(RandomStringUtils.randomAlphabetic(10));
}
network.setEntityVersion((long) i);
networkDao.persist(network);
}
List<NetworkVO> networks = networkDao.list(name, null, "entityVersion", true, 10, 0, Optional.empty());
assertThat(networks, hasSize(10));
networks.forEach(n -> assertEquals(name, n.getName()));
networks.stream().reduce((last, current) -> {
if (last.getEntityVersion() > current.getEntityVersion())
Assert.fail("Not sorted");
return current;
});
}
}